AMDP выбирает ложные записи в отличие от OpenSQL - PullRequest
1 голос
/ 16 апреля 2020

Я изучаю AMDP и обнаружил, что полученный из этого результат сильно отличается от обычного запроса выбора в ABAP AS. Я использую код ниже в AMDP:

ex_gt_data = select a.vbeln,
                   a.kunnr,
                   a.bukrs_vf,
                   b.erdat,
                   b.lsmeng,
                   b.posnr,
                   b.matnr
                   from vbak as a
                   join vbap as b
                   on a.vbeln = b.vbeln;

с последующей функцией APPLY_FILTER. Этот запрос возвращает несколько значений в поле BUKRS_VF. Если я использую обычный запрос на выборку, как показано ниже:

SELECT a~vbeln,
     a~bukrs_vf,
     a~kunnr,
     b~erdat,
     b~lsmeng,
     b~posnr,
     b~matnr
     FROM vbak AS a
     JOIN vbap AS b
     ON a~vbeln = b~vbeln
     INTO TABLE @DATA(lt_vbak)
     WHERE a~vbeln IN @s_vbeln.

, он генерирует требуемый результат.

Кто-нибудь может сказать мне, почему эта разница между AMDP и обычным запросом выбора?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2020

Я только что узнал, что добавление поля

MANDT решает проблему. Я добавил в метод параметр передачи по значению и использовал в запросе

, где a.mandt = im_mandt.

Не знаю, является ли это правильным решением. Пожалуйста, сообщите.

2 голосов
/ 20 апреля 2020

Было дано много отдельных полезных частей, но я здесь, чтобы дать исчерпывающий ответ на вопрос.

Прежде всего, представления ABAP CDS не автоматически уважают данные клиента, как это делается в Open SQL. Кстати, то же самое относится и к HANA CDS, но, судя по косвенным показателям вашего вопроса, речь шла о ABAP CDS на основе бэкэнда HANA, а не HANA CDS. Да?

Как правильно обрабатывать клиента в представлениях ABAP CDS?

  1. @ClientHandling.type #CLIENT_DEPENDENT необходимо добавить аннотацию для просмотра. Тип по умолчанию #INHERITED, но для большей простоты лучше сделать его явно зависимым.
  2. @ClientHandling.algorithm - необязательное поле и может быть опущено. Существует сложный набор правил , который определяет, как рассчитывается клиент, но в вашем случае вы можете просто не указывать его, будет использоваться неявный способ #AUTOMATED, а столбец клиента будет неявно добавляться к ON условия вашего JOIN.
  3. Столбец клиента должен существовать в поле зрения и должен быть

    • выбран с помощью инструкции SELECT с именем или псевдонимом

    • имеют имя MANDT, установленное вручную

    • , если последний отсутствует, используется столбец CLIENT

    • , если ни один из КЛИЕНТОВ ни столбец MANDT не найден, синтаксическая ошибка выдается

  4. Никаких других действий не требуется, клиент обращается неявно, как в случае 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);
1 голос
/ 20 апреля 2020

Вы НЕ ДОЛЖНЫ добавлять параметр MANDT для получения номера клиента в AMDP / сгенерированном SQL скрипте. Скорее, вы можете использовать SESSION_CONTEXT ('CLIENT')

Итак, ваш приведенный выше запрос будет выглядеть следующим образом:

ex_gt_data = select a.vbeln,
                   a.kunnr,
                   a.bukrs_vf,
                   b.erdat,
                   b.lsmeng,
                   b.posnr,
                   b.matnr
                   from vbak as a
                   join vbap as b
                   on a.vbeln = b.vbeln
                   and a.mandt = SESSION_CONTEXT('CLIENT');

Есть еще много вещей, которые вы можете достичь с помощью SESSION_CONTEXT. При правильном использовании это мощный инструмент в вашем распоряжении.

С наилучшими пожеланиями, Гопал Наир.

...