3

どこから始めればよいか、正しい出力を得る方法がわかりません。ABAPコーディングは初めてです。Infoset クエリを作成しようとしていますが、SQ02 で少しコーディングする必要があります。

結合された 2 つのテーブルがあります。1 つは Invoice Receipts のヘッダーとして RBKP で、もう 1 つはInvoice Document Itemsの RBDRSEG です。

クエリは、いくつかの無関係なパラメーター/バリアントに従って実行する必要がありますが、その場合は---

RBDRSEG ですべて同じドキュメント番号を探します RBKP-BELNR EQ RBDRSEG-RBLNR

そうすることで、RBDRSEG は各 Doc No. に対して複数行の結果を持つ場合と持たない場合があります。

Doc No. Result ごとにフィールド RBDRSEG-DMBTRを合計する必要があります。(Doc. No. に 5 行ある場合、合計する必要があるそれぞれの DMBTR の値は異なります)

この時点で、各 Doc の DMBTR フィールドの SUM を含む 1 行のみを (RBKP の他のフィールドと共に) 表示する出力が必要です。いいえ。

次に、フィールド RBKP - RMWWWR の差を示す別のフィールドが必要です。これは、請求書の合計と、そのドキュメントに対して以前に計算された合計です。フィールド DMBTR の番号。

もしあなたが助けてくれたら、私は信じられないほど感謝しています.

4

1 に答える 1

3

最初に、選択データを含む構造を定義する必要があります。要件の構造の例は次のようになります。

ここに画像の説明を入力

構造をアクティブにして、エラーが含まれていないことを確認することを忘れないでください。

次に、選択レポートを作成します。レポートをデータ選択方法として使用するには、2 つのコメントを追加する必要があり*<QUERY_HEAD>ます*<QUERY_BODY>。選択した行を SE11 で定義した構造と同じ名前の内部テーブルに入れるループ内で、*<QUERY_HEAD>selecton の開始が通常行く場所に配置する必要があります。*<QUERY_BODY>

これがどのように機能するかを示すために、レポートの例を作成しました。

REPORT  ZSTACK_RBKP_INFOSET_QUERY.

tables:
  rbkp,
  ZSTACK_RBKP_INFOSET_STR.

select-OPTIONS:
  so_belnr for rbkp-belnr,
  so_gjahr for rbkp-gjahr.

data:
      itab type standard table of ZSTACK_RBKP_INFOSET_STR,
      wa_itab type ZSTACK_RBKP_INFOSET_STR.

data:
      lv_diff type dmbtr.

*here your selection starts.

*<QUERY_HEAD>

select rbkp~belnr
   rbkp~gjahr
   rbkp~rmwwr
   rbkp~waers
   sum( RBDRSEG~DMBTR ) as DMBTR
   from RBKP left outer join RBDRSEG
     on RBDRSEG~RBLNR eq RBKP~BELNR and
        RBDRSEG~RJAHR eq RBKP~GJAHR
   into corresponding fields of table itab
  where rbkp~belnr in so_belnr and
    rbkp~gjahr in so_gjahr
  group by rbkp~belnr rbkp~gjahr rbkp~rmwwr rbkp~waers.


loop at itab into wa_itab.

  lv_diff = wa_itab-dmbtr - wa_itab-rmwwr.

  move lv_diff to wa_itab-diff.
  modify itab from wa_itab.

endloop.



* this is the part that forwards your result set to the infoset
LOOP AT itab INTO ZSTACK_RBKP_INFOSET_STR.


*<QUERY_BODY>

ENDLOOP.

サンプル レポートでは、最初に の各ドキュメントRBKPの合計とともに行が選択されます。その後、 は、選択した列との差で列を更新します。RBDRSEG-DMBTRRBKPloopDIFFRMWWRDMBTR

残念ながら、私たちの SAP システムではテーブルRBDRSEGが空なので、レポートのその部分をテストできません。ただし、最初のブレーク ポイントの前にブレーク ポイントを追加しloopてレポートを開始するだけで、システムでレポートをテストできます。次に、内部テーブルで選択した行を見て、選択が期待どおりに機能するかどうかを確認できるはずITABです。

サンプル レポートの注意事項: と の両方が異なる通貨フィールドRBKPを参照しています。したがって、値が異なる通貨RBDRSEGである可能性がありますRMWWR(ドキュメントの通貨であり、デフォルトの会社の通貨のようです)。その場合は、差額を計算する前に適切な通貨に換算する必要があります。/の文書番号と/の年の両方を使用して、必ず参加してください( のフィールドはであり、 にも存在します)。DMBTRRMWWRDMBTRRBKPRBDRSEGBELNRRBLNRGJAHRRJAHRRBDRSEGRJAHRGJAHRGJAHRRBDRSEG

レポートが期待どおりに機能したら、レポートに基づいて情報セットを作成します。その後、他の情報セットと同じように情報セットを使用できます。

更新: ABAP を初めて使用することについて書いたので、情報セットのレポートを作成する必要があるとすぐに思いました。実際の要件によっては、これが当てはまらない場合があります。テーブル RBKP に対して単純な infoset クエリを作成し、infoset エディターを使用して行の合計と差の 2 つのフィールドを追加し、RBDRSEG 内の対応するすべての行の合計を選択して RMWWR の差を計算する abap コードを追加します。そしてその合算。これは、RBKP の行ごとに選択を繰り返す必要があるため、カスタマイズされた abap レポートよりもおそらく遅くなります。そのため、ユーザーがクエリしようとしているデータの量に大きく依存します。カスタマイズされた ABAP レポートは問題ありません。


infoset デザイナーを使用したバリアントに関する追加情報

最初に、テーブル RBKP のみを読み取る単純な infoset を作成します (そのため、infoset 定義にテーブル結合はありません)。次に、アプリケーション固有の機能強化に進みます。

ここに画像の説明を入力

私の例では、すでに 2 つのフィールドLINETOTALDIFFERENCE. どちらも と同じプロパティを持っていますRBDRSEG-DMBTRRBDRSEG-DMBTRの合計を含むフィールドが、差を含むフィールドよりも低いシーケンス (ここでは「1」) であることを確認してください。順序によって、最初に計算されるフィールドが決まります。

最初のフィールドのコーディング ボタンをクリックし、コーディングを追加して、1 つのRBKPエントリの合計を選択します。

ここに画像の説明を入力

次に、difference フィールドに対して同じ操作を行います。

ここに画像の説明を入力

フィールド リストで両方のフィールドを使用できるようになったので、右側のフィールド グループに追加できます。

ここに画像の説明を入力

前述のように、入力したコードは RBKP の各行に対して処理されます。そのため、最初の結果セットのサイズによっては、実行時のパフォーマンスに大きな影響を与える可能性があります。

于 2014-10-31T10:56:02.093 に答える