1

私は 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 と通常の選​​択クエリのこの違いの理由を誰か教えてもらえますか?

4

3 に答える 3

2

多くの個別の有用な部分が提供されましたが、私は質問に対する包括的な回答を提供するためにここにいます.

まず第一に、ABAP CDS ビューは、OpenSQL で行われるようにクライアント データを自動的に尊重しません。ところで、同じことがHANA CDSにも当てはまりますが、質問の間接的な指標から判断すると、HANA CDSではなく、HANAバックエンドに基づくABAP CDSについてでした。Y A?

ABAP CDS ビューでクライアントを処理する適切な方法は何ですか?

  1. @ClientHandling.type #CLIENT_DEPENDENTビューに注釈を追加する必要があります。デフォルトの型は です#INHERITEDが、より簡単にするためには、明示的に依存させる方がよいでしょう。
  2. @ClientHandling.algorithmはオプションのフィールドであり、省略できます。クライアントの計算方法を決定する複雑なルールのセットがありますが、あなたのケースではそれを指定することはできません。暗黙的#AUTOMATEDな方法が使用され、クライアント列がONJOINの条件に暗黙的に追加されます。
  3. クライアント列がビューに存在する必要があり、次のいずれかである必要があります

    • 名前またはエイリアスのいずれかを使用して SELECT ステートメントで選択

    • MANDT 名を手動で設定する

    • 後者が存在しない場合、CLIENT 列が使用されます

    • CLIENT 列も MANDT 列も見つからない場合、構文エラーがスローされます

  4. 他のアクションは必要ありません。クライアントは、OpenSQL の場合のように暗黙的にアドレス指定されます。

しかし!ここでは、単純な CDS ではなく、AMDP 手順について話しているため、より注意が必要です。

何よりもまず、これらすべてを機能させるには、メソッド シグネチャで特別なCDS SESSION CLIENT CURRENT AMDP 宣言が必須です。

 AMDP OPTIONS READ-ONLY     
              CDS SESSION CLIENT CURRENT

宣言は、$session.clientvar を AMDP プロシージャの実装に暗黙的に渡します。デフォルトのCURRENT構文バリアントではsy-mandt、ABAP AS の値と同じです。

その後、$session.clientAMDP内のテーブルで明示的に使用できます

SELECT * FROM vbak WHERE vbak.mandt = $session.client;

またはクライアント依存のビューで暗黙的に

lt_vbak = APPLY_FILTER ("Z_CDS_VIEW", :iv_where);
于 2020-04-20T13:26:19.910 に答える