Было дано много отдельных полезных частей, но я здесь, чтобы дать исчерпывающий ответ на вопрос.
Прежде всего, представления ABAP CDS не автоматически уважают данные клиента, как это делается в Open SQL. Кстати, то же самое относится и к HANA CDS, но, судя по косвенным показателям вашего вопроса, речь шла о ABAP CDS на основе бэкэнда HANA, а не HANA CDS. Да?
Как правильно обрабатывать клиента в представлениях ABAP CDS?
@ClientHandling.type #CLIENT_DEPENDENT
необходимо добавить аннотацию для просмотра. Тип по умолчанию #INHERITED
, но для большей простоты лучше сделать его явно зависимым. @ClientHandling.algorithm
- необязательное поле и может быть опущено. Существует сложный набор правил , который определяет, как рассчитывается клиент, но в вашем случае вы можете просто не указывать его, будет использоваться неявный способ #AUTOMATED
, а столбец клиента будет неявно добавляться к ON
условия вашего JOIN. Столбец клиента должен существовать в поле зрения и должен быть
выбран с помощью инструкции SELECT с именем или псевдонимом
имеют имя MANDT, установленное вручную
, если последний отсутствует, используется столбец CLIENT
, если ни один из КЛИЕНТОВ ни столбец MANDT не найден, синтаксическая ошибка выдается
Никаких других действий не требуется, клиент обращается неявно, как в случае Open SQL.
Но! Здесь мы говорим о процедуре AMDP, а не о простых CDS, так что все сложнее.
Прежде всего, для всего этого работает специальная CDS SESSION CLIENT CURRENT AMDP декларация обязательно в сигнатуре метода:
AMDP OPTIONS READ-ONLY
CDS SESSION CLIENT CURRENT
объявление делает неявную передачу $session.client
var в реализацию процедуры AMDP. В синтаксисе по умолчанию CURRENT
он равен sy-mandt
значению ABAP AS.
После этого вы можете явно использовать $session.client
с таблицами внутри AMDP
SELECT * FROM vbak WHERE vbak.mandt = $session.client;
или неявно с клиент-зависимыми представлениями
lt_vbak = APPLY_FILTER ("Z_CDS_VIEW", :iv_where);