-2

ACDOCA、、、などのテーブルBSIDMARA使用して ABAP CDS ビューを作成しました。MAKT現在、私の CDS ビューには、顧客のリストとその未処理 (FI) ドキュメントが含まれています。

これらの顧客、FI ドキュメント、その他の特定のパラメーターに対して、特定のデータをカスタム テーブルに保持しています。

左外部結合を使用して、この CDS ビューをカスタム テーブルに接続します。問題は、この結合が内部結合のように機能することです。そのため、カスタム テーブルが空白の場合、出力は値なしで表示されますが、CDS ビューはそのまま表示され、カスタム テーブル フィールドは空白として表示されます。

Web上の同様の問題に基づいて、調査を行い、いくつかの有用なポイントを見つけました。

  1. 右側のテーブルのすべての条件が最大で ON 結合条件に含まれます

  2. 右側のカスタム テーブルからも null 値を含めようとしました。

  3. 結合条件で 1 つのパラメーターのみを使用して結果を確認しようとしました (まだ内部結合として機能しています)

これが私の完全な選択ステートメントです。

  1. ZPD1ACDOCABSDI... テーブルの ABAP CDS ビューです

  2. ZPD_HSL顧客ごとの GL 金額計算用の ABAP CDS ビューです。

  3. ZFI_PDRATE_MAP顧客/FI ドキュメントの組み合わせの料金を含むカスタム テーブルです。

この声明のどこが間違っている可能性がありますか?

SELECT
      FROM ZPD1( PBUKRS   = @BUKRS-LOW ,
                 POSTFROM = @COL_DATE-LOW ,
                 POSTTO   = @COL_DATE-HIGH ) AS A

      LEFT OUTER JOIN ZFI_PDRATE_MAP  AS F
            ON  A~PROD_CATEGORY =  F~PROD_CATEGORY
            AND A~OD_DATE       GE F~POST_DT_FROM 
            AND A~OD_DATE       LE F~POST_DT_TO
            AND F~COL_DT_FROM   GE @COL_DATE-LOW  
            AND F~COL_DT_TO     LE @COL_DATE-HIGH
            AND F~SALES_OFFICE  =  @VKBUR-LOW
            AND CASE WHEN A~ARREAR_DAYS <= 0 THEN 'NOD' 
                     WHEN A~ARREAR_DAYS > 0 THEN 'OD' 
                END             =  F~OD

      INNER JOIN KNA1 AS H 
            ON H~KUNNR = A~KUNNR

      INNER JOIN TVKBT AS I 
            ON  I~VKBUR = F~SALES_OFFICE 
            AND I~SPRAS = @SY-LANGU

      LEFT OUTER JOIN SKAT AS J 
            ON  J~SAKNR = A~HKONT 
            AND J~SPRAS = 'E' 
            AND J~KTOPL = '1000'

      LEFT OUTER JOIN MAKT AS K 
            ON  K~MATNR = A~MATNR 
            AND K~SPRAS = 'E'

      LEFT OUTER JOIN T001W AS L 
             ON L~WERKS = A~WERKS


      FIELDS
      A~RBUKRS  AS BUKRS,
      A~KUNNR,
      H~NAME1,
      F~SALES_OFFICE,
      I~BEZEI,
      A~BELNR AS COL_BELNR,
      A~GJAHR AS COL_GJAHR,
      A~HSL AS COL_AMT,
      A~BUDAT AS COL_DATE,
      A~KEY_DATE AS KEY_OS_DATE,
      A~OD_DOC AS OS_BELNR,
      A~OD_YR AS OS_GJAHR,
      A~BLART ,
      A~OD_DATE AS OS_DATE,
      CASE WHEN A~SHKZG = 'H' THEN CAST( A~WRBTR * -1 AS CURR( 12, 2 ) ) 
           ELSE A~WRBTR 
      END AS OS_AMT ,
      A~DUE_DATE,
      A~ARREAR_DAYS,
      CASE WHEN A~ARREAR_DAYS <= 0 THEN 'NOD'
           WHEN A~ARREAR_DAYS > 0 THEN 'OD'
           ELSE ' '
      END AS OD_IND,
      A~HKONT,
      J~TXT50,
      A~PROD_CATEGORY,
      A~MATNR,
      K~MAKTX,
      A~WERKS ,
      L~NAME1,
      A~BWTAR,
      A~PROFIT_CENTRE AS PRCTR,
      COALESCE( F~PD_RATE , 0 ) AS RATE,
      0 AS PD_AMT,
      CASE WHEN A~ARREAR_DAYS > 0 THEN
             CAST( 
               DIVISION( 
                 ( CAST( A~WRBTR * F~PD_RATE AS CURR( 15 ,2 ) ) ) ,
                 100 ,
                 3 ) 
               AS CURR( 15, 2 ) )
             * -1
           ELSE 
             DIVISION( 
               ( CAST( A~WRBTR * F~PD_RATE AS CURR( 15 , 2 ) ) ) , 
               100 ,
               3 ) 
      END AS ITEM_PD_AMT,  "DISCOUNT_RATE,
      0 AS ITEM_PD_AMT1,
      A~MAIN_TYPE

      WHERE A~KUNNR IN @KUNNR
        AND NOT EXISTS (
            SELECT * 
            FROM ZFI_PAYMENT_DISC 
            WHERE BELNR = A~BELNR
              AND GJAHR = A~GJAHR 
              AND BUKRS = A~RBUKRS 
              AND SALES_OFFICE = @VKBUR-LOW 
              AND A~KUNNR IN @KUNNR 
              AND OS_BELNR EQ A~OD_DOC )
        AND A~ARREAR_DAYS <= @OD
        AND ( F~COL_AMT_FROM LE ( 
            SELECT SUM( COLLECT ) 
            FROM ZPD_HSL( BUKRS     = @BUKRS-LOW ,
                          BUDATFROM = @COL_DATE-LOW ,
                          BUDATO    = @COL_DATE-HIGH ) 
            WHERE KUNNR = A~KUNNR )
        AND F~COL_AMT_TO GE ( 
            SELECT SUM( COLLECT ) 
            FROM ZPD_HSL( BUKRS     = @BUKRS-LOW ,
                          BUDATFROM = @COL_DATE-LOW ,
                          BUDATO    = @COL_DATE-HIGH ) 
            WHERE KUNNR = A~KUNNR )
      )
    
      ORDER BY A~KUNNR, A~BELNR ,A~DUE_DATE ASCENDING
    
      INTO TABLE @PROV_POST.
4

1 に答える 1

2

セットアップが複雑なため、実際の例を再現するのが難しいため、これは単なる推測です。

私の仮定は、INNER JOIN TVKBT AS I ON I~VKBUR = F~SALES_OFFICEが邪魔になっているということです。としてエイリアス化されたカスタム テーブルに内部結合しF、結合順序が間違って解釈されると、レコードが過剰に削減される可能性があります。

その結合を削除して、基本的な結合結果が修正されるかどうかを確認することをお勧めします。

いずれにせよ、括弧を追加し、結合句を並べ替えて、方程式の「左」側が何であるかを明確にし、解釈者と読者の両方にとってあいまいさを取り除くことをお勧めします。

于 2020-06-22T14:03:14.950 に答える