Order to Cash - 請求・入金データテンプレート
Order to Cash - 請求・入金データテンプレート
- 包括的な分析のための推奨属性
- 追跡すべき主要なプロセスステップとマイルストーン
- SAP ECC向け実践的データ抽出ガイド
受注から入金まで - 請求・売掛金管理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ ActivityName | 請求書ライフサイクル内で発生したビジネスイベントまたはステップの名称。 | ||
| 説明 この属性は、「請求書生成済み」、「請求書記帳済み」、または「顧客による支払い受領済み」など、請求プロセスにおける特定の行動やステータス変更を表します。これらのアクティビティは、様々なシステムイベント、伝票のステータス変更、またはユーザーによって実行される特定のトランザクションコードから概念的に導き出されます。 これらのアクティビティのシーケンスがプロセスフローを形成し、それがプロセスマイニング分析の基盤となります。アクティビティを検証することで、組織はどのステップが、どのような順序で、どのくらいの頻度で実行されているかを理解し、設計されたプロセスと比較して実際のプロセス実行状況を明らかにすることができます。 その重要性 プロセスマップ内の各ステップを定義し、プロセスフロー、逸脱、ボトルネックの可視化と分析を可能にします。 取得元 トランザクションコード(CDHDR-TCODE)、伝票ステータス変更(VBUK-FKSTK)、会計伝票転記など、複数のソースから導出される概念的な属性です。 例 請求書生成済み請求書仕訳計上済み支払い督促発行請求書 消込済み | |||
| 請求書番号 InvoiceNumber | 請求伝票の一意の識別子であり、請求プロセスにおける主要なケースIDとして機能します。 | ||
| 説明 請求書番号(SAPでは請求伝票番号として知られる)は、各請求書を一意に識別します。プロセスマイニングでは、作成、記帳、送付、支払い、消込といった関連する全てのアクティビティを単一のエンドツーエンドのプロセスインスタンスにまとめるCaseIdとして機能します。 請求書番号別にプロセスを分析することで、各請求取引のライフサイクル全体を、発生から最終的な決済まで完全に把握できます。これは、売上債権回転日数(DSO)や全体的な請求書サイクルタイムなどの主要業績評価指標(KPI)を計算するために不可欠であり、パフォーマンス測定と改善のための明確な基盤を提供します。 その重要性 請求書全体の経路を追跡するための不可欠な鍵であり、個々の請求取引におけるサイクルタイム、ボトルネック、およびバリエーションの分析を可能にします。 取得元 SAP ECCテーブル: VBRK, フィールド: VBELN 例 90001234900012359000123690001237 | |||
| 開始時刻 EventTime | 特定のアクティビティまたはイベントが発生した時刻を示すタイムスタンプ。 | ||
| 説明 イベントタイムは、請求書ライフサイクルにおける各アクティビティの正確な日付と時刻を記録します。このタイムスタンプは、サイクルタイムの計算、ボトルネックの特定、サービスレベル契約に対するプロセスパフォーマンスの監視など、プロセスマイニングにおけるすべての時間ベースの分析にとって不可欠です。 この属性は通常、転記日(BUDAT)のような日付フィールドと、変更や伝票作成を記録するさまざまなSAPテーブルからの時刻フィールド(UZEIT)を組み合わせて構築されます。正確なタイムスタンプは、信頼性の高いイベントログを構築し、あらゆるパフォーマンス分析の妥当性を確保するために重要です。 その重要性 この属性は、すべてのパフォーマンス分析の基盤であり、サイクルタイム、期間、プロセスステップ間の待機時間の計算を可能にします。 取得元 BKPF(BUDAT、CPUTM)、VBRK(ERDAT、ERZET)などの複数のテーブルのさまざまな日付および時刻フィールド、およびCDHDR(UDATE、UTIME)などの変更ログテーブルから構築されます。 例 2023-04-15T10:30:00Z2023-04-16T11:00:00Z2023-05-20T09:00:00Z | |||
| ユーザー名 UserName | アクティビティを実行した、または伝票を作成したユーザーのID。 | ||
| 説明 この属性は、請求書の作成や支払いの記帳など、特定のイベントを担当したSAPユーザーIDを捕捉します。これはプロセスの人的要素を分析するために不可欠です。 このデータにより、ユーザー間やチーム間のパフォーマンスのばらつきを調査し、トレーニングの必要性を特定し、潜在的なコンプライアンス問題を検出することが可能です。また、人間が行う手動アクティビティと、システムまたはバッチユーザーによって実行される自動ステップを区別するためにも使用され、これは自動化率を計算する上で鍵となります。 その重要性 ユーザーのパフォーマンス、ワークロードの配分を分析し、手動アクティビティと自動化アクティビティを区別するのに役立ち、自動化および効率化の取り組みを支援します。 取得元 SAP ECCテーブル: VBRK, フィールド: ERNAM (登録者) または BKPF, フィールド: USNAM (ユーザー名) または CDHDR, フィールド: USERNAME (ユーザー)。 例 JSMITHBW_BATCHLROSSIMKUMAR | |||
| 会社コード CompanyCode | 請求書を発行した法人を識別するID。 | ||
| 説明 会社コードは、SAPにおける独立した法的・会計上の単位を表します。請求書を含むすべての財務取引は、特定の会社コードに記帳されます。これは基本的な組織データ要素です。 プロセスマイニングの文脈では、会社コードは企業内の異なる法人間で請求プロセスパフォーマンスを分析・比較するために使用されます。これにより、ある法人におけるベストプラクティスを他の法人に適用できるかを特定し、分析が会社の組織構造を尊重していることを保証します。 その重要性 異なる法人間のプロセスをフィルタリングおよび比較することを可能にし、財務分析および組織のベンチマークにとって不可欠です。 取得元 SAP ECCテーブル: VBRK, フィールド: BUKRS 例 10002000US01DE01 | |||
| 請求伝票タイプ BillingDocumentType | 請求書、クレジットメモ、デビットメモなど、請求伝票のタイプを分類するコードです。 | ||
| 説明 請求伝票タイプは、ビジネス目的に基づいて取引を個別のカテゴリに分類します。例えば、「F2」は標準的な顧客請求書であり、「G2」はクレジットメモを表します。この分類は、SAPで異なる請求伝票がどのように処理されるかを制御するために設定されます。 プロセスマイニングにとって、この属性は異なる請求シナリオをフィルタリングし、比較するために不可欠です。アナリストは、標準請求書とクレジットメモのプロセスを個別に調査し、それぞれの固有のフロー、サイクルタイム、課題を理解することで、より的を絞ったプロセス改善につなげることができます。 その重要性 標準請求書とクレジットメモのように、プロセスフローが大きく異なることが多いさまざまな請求プロセスをセグメント化して分析できます。 取得元 SAP ECCテーブル: VBRK, フィールド: FKART 例 F2G2L2IV | |||
| 請求書合計金額 TotalInvoiceAmount | 請求伝票の合計正味金額。 | ||
| 説明 この属性は、税抜き後の請求書の合計正味金額を表します。請求金額は、請求プロセスに関連する重要な財務データの一部です。 プロセスフローが異なるかどうかを確認するために、請求書を高額と低額のカテゴリに分類するなど、様々な分析に使用されます。また、回収活動の優先順位付けや、高額請求書の承認や支払いに時間がかかる理由を調査するためにも使用できます。この財務的なコンテキストは、プロセス分析に重要な深みをもたらします。 その重要性 請求書金額に基づく分析を可能にする、不可欠な財務コンテキストを提供します。例えば、高額請求書が異なるプロセスをたどるか、消込に時間がかかるかを特定するのに役立ちます。 取得元 SAP ECCテーブル: VBRK, フィールド: NETWR 例 1500.7525000.00500.0012345.67 | |||
| 顧客番号 CustomerNumber | 請求書が発行された顧客を一意に識別する番号です。 | ||
| 説明 顧客番号は、請求書を特定のクライアントまたはビジネスパートナーにリンクします。この属性は、顧客特性に基づいて請求プロセスをセグメント化し、分析するために不可欠です。 アナリストは、このフィールドを使用して、異なる顧客間での売上債権回転日数(DSO)を比較したり、どの顧客が頻繁に支払い遅延をするかを特定したり、支払い条件の遵守状況を分析したりできます。これらのパターンを理解することは、顧客関係を管理し、異なる顧客セグメントに合わせた現金回収戦略を改善するための鍵となります。 その重要性 顧客中心の分析を可能にし、支払行動の特定、顧客別DSOの評価、および債権回収戦略の調整に役立ちます。 取得元 SAP ECCテーブル: VBRK, フィールド: KUNRG (支払人) または KUNAG (得意先)。 例 100023200541CUST-A487910345 | |||
| ソースシステム SourceSystem | データが抽出されたソースシステムを特定します。 | ||
| 説明 この属性は、データが生成された記録システムを指定します。複数のERPインスタンスや統合システムが存在する企業環境において、このフィールドは異なるソースからのデータを区別するのに役立ちます。 プロセスマイニングにとって、データ検証や異なるシステムまたは組織単位間のプロセスを比較する分析に不可欠です。通常、データ抽出プロセス中にデータセットをラベリングするための静的な値として入力されます。 その重要性 データの発生源に関するコンテキストを提供します。これは、複数のシステムが存在する環境において、データ整合性の確保とシステム固有の分析を可能にする上で不可欠です。 取得元 これは通常、データ抽出、変換、ロード(ETL)プロセス中に付加される静的な値であり、特定のSAP ECCインスタンス(例:「ECC_PROD_NA」)を識別します。 例 SAP_ECC_PRODECC_EU_100SAP_US_FIN | |||
| トランザクションコード TransactionCode | アクティビティを実行するために使用されたSAPトランザクションコード。 | ||
| 説明 トランザクションコード(T-Code)は、SAPにおける特定の機能やプログラムの一意の識別子であり、例えば「VF01」は請求伝票の作成に使用されます。各イベントのT-Codeを捕捉することで、プロセスがどのように実行されたかに関する技術的でシステムレベルのビューが提供されます。 この情報は根本原因分析に非常に価値があります。例えば、エラーが頻繁に発生する場合、アナリストは非標準のトランザクションコードが使用されていないかを確認できます。また、アクティビティ名の導出や、プロセスでどのシステム機能が使用されているかを理解するのにも役立ちます。 その重要性 アクティビティがどのように実行されたかに関する技術的コンテキストを提供し、プロセス逸脱の根本原因分析を可能にし、非標準的なユーザーアクションの特定に役立ちます。 取得元 SAP ECCテーブル: CDHDR, フィールド: TCODE 例 VF01VF02FB01F-28 | |||
| 伝票日付 DocumentDate | ベンダーまたは作成者によって提供された、元伝票上の日付。 | ||
| 説明 伝票日付は、元の伝票が発行された日付です。請求においては、通常、請求書が作成された日付であり、支払い期日を計算するための基準として頻繁に使用されます。 この日付は、財務報告および売上債権回転日数(DSO)などの主要な指標を計算するために不可欠です。顧客の視点から見た回収期間の開始点を表します。伝票日付と転記日付の間の不一致を分析することで、請求書処理における内部遅延が明らかになることがあります。 その重要性 請求書発行からの期間とDSO(売上債権回転日数)を計算するための基準となり、財務分析および支払い条件分析の重要な参照点を提供します。 取得元 SAP ECCテーブル: VBRK, フィールド: FKDAT (請求日付) 例 2023-04-152023-04-162023-05-20 | |||
| 最終データ更新 LastDataUpdate | ソースシステムからの最新のデータ更新/抽出時点を示すタイムスタンプ。 | ||
| 説明 この属性は、データセットがソースシステムから最後に更新された時間を示します。これはあらゆる分析にとって極めて重要なコンテキストを提供し、ユーザーが閲覧しているデータの鮮度を確実に理解できるようにします。 ダッシュボードやレポートにおいて、このタイムスタンプは関係者に対してデータの適時性を伝え、ごく最近の取引の可視性に関する期待値を管理するのに役立ちます。通常、データ抽出プロセスの終わりに生成されます。 その重要性 データの適時性についてユーザーに通知します。これは、分析に基づいた運用上の意思決定を行う上で非常に重要です。 取得元 データ抽出、変換、ロード(ETL)プロセス中に生成および保存されます。 例 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| 営業組織 SalesOrganization | 製品やサービスの販売を担当する組織単位。 | ||
| 説明 販売組織は、SAPにおける組織単位であり、商品やサービスの配布、販売条件の交渉を担当します。販売および流通業務を構築するための重要なフィールドです。 プロセスマイニングでは、この属性により、販売構造の観点から請求プロセスを分析することができます。異なる販売組織間でのパフォーマンス比較を可能にし、どの地域や事業ラインが請求プロセスにおいてより効率的であるかを特定し、ベストプラクティスを標準化する取り組みを支援します。 その重要性 異なる営業部門や地域間でのパフォーマンスベンチマークと分析を可能にし、ベストプラクティスと改善領域を特定するのに役立ちます。 取得元 SAP ECCテーブル: VBRK, フィールド: VKORG 例 1000NA01EU01AP01 | |||
| 手戻り IsRework | あるアクティビティが再作業または修正ステップであるかを示すフラグです。 | ||
| 説明 この計算属性は、「請求書修正済み」や伝票取り消しなど、手戻りを表すアクティビティを識別します。これは通常、アクティビティ名または請求伝票のキャンセルに使用される「VF11」のような修正およびキャンセルに関連するトランザクションコードから導き出されるブールフラグです。 プロセスマイニングにおいて、このフラグは請求プロセスにおける手戻りの量を定量化するために非常に価値があります。「請求書修正率」のようなKPIを直接サポートし、プロセスマップ内の手戻りループを視覚化するのに役立ち、運用コストを増加させ支払い遅延を引き起こす非効率性や品質問題を浮き彫りにします。 その重要性 エラー修正に費やされる労力を明確にし、プロセスの非効率性や品質問題を定量化するのに役立ち、「手戻り」KPIを直接サポートします。 取得元 アクティビティ名またはトランザクションコードから導出されます。例えば、「アクティビティ名 = 'Invoice Corrected' または トランザクションコード = 'VF11' の場合、true、それ以外の場合はfalse」といった形です。 例 truefalse | |||
| 支払条件 PaymentTerms | 売り手が販売を完了する条件。支払いスケジュールも含む。 | ||
| 説明 支払い条件は、「正味30日」や「正味60日」のように、支払いがいつ期日を迎えるかのルールを定義します。これらの条件は顧客と合意され、キャッシュフローを決定する上で重要な要素です。 支払い条件別にプロセスを分析することで、特定の条件がより長い支払いサイクルや高い支払い遅延率に関連しているかを明らかにできます。この洞察は、企業が顧客とより良い条件を交渉したり、財務計画を調整したりするのに役立ちます。また、請求書の期日を計算するための重要な入力情報でもあります。 その重要性 顧客の支払い行動と交渉済み契約条件に基づくキャッシュフローへの影響を分析し、商取引の最適化に役立つ洞察を提供します。 取得元 SAP ECCテーブル: VBRK, フィールド: ZTERM 例 Z030Z060Z001 | |||
| 決済日 ClearingDate | 支払いを受領し、売掛金から請求書が消込された日付。 | ||
| 説明 消込日付とは、請求書のような未決済項目が財務システム上で支払い済み、つまり「消込済み」とマークされる日付です。この日付は、実質的に現金が回収され、照合された時点を表します。 これは受注から入金までのサイクルにおいて最も重要な日付の一つです。売上債権回転日数(DSO)および請求書から現金までの全体サイクルタイムを計算するための終点として機能します。消込日付を分析することで、回収プロセスの有効性を測定するのに役立ちます。 その重要性 請求書ライフサイクルの最終ステップを示し、DSOおよび全体的なサイクルタイム計算の終了日として機能し、現金回収の効率を反映します。 取得元 SAP ECCテーブル: BSAD, フィールド: AUGDT 例 2023-05-142023-06-012023-06-25 | |||
| 自動化 IsAutomated | あるアクティビティがシステムユーザーによって実行されたか、または自動化によって実行されたかを示すフラグです。 | ||
| 説明 この計算属性は、手動アクティビティと自動アクティビティを区別するブールフラグです。通常、「BATCHUSER」や「SAPSYSTEM」のような既知のシステムまたはバッチユーザーIDのリストとユーザー名属性を照合することによって導き出されます。 このフラグは、請求プロセスにおける自動化レベルを測定するために不可欠であり、多くの組織が効率向上とコスト削減を目指す上での主要な目標です。「自動請求率」KPIは、この属性から直接計算され、自動化イニシアティブの進捗状況を追跡するのに役立ちます。 その重要性 自動請求率の計算を直接サポートし、プロセス効率の測定や自動化プロジェクトの影響追跡に役立ちます。 取得元 ユーザー名属性から導出されます。ロジックは、「ユーザー名が ('BATCH', 'SYSTEM', 'RFCUSER') のいずれかに含まれる場合、true、それ以外の場合はfalse」のようになります。 例 truefalse | |||
| 計上日 PostingDate | 伝票が財務会計帳簿に転記される日付。 | ||
| 説明 転記日付は、取引が総勘定元帳に記録される会計期間を決定します。これは会計および財務報告にとって重要な日付です。伝票作成日と転記日の間の遅延は、請求伝票の内部処理における非効率性を示している可能性があります。 プロセスマイニングの観点から見ると、転記日付は請求書ライフサイクルにおける重要なマイルストーンとなります。請求書生成から転記までの時間差は、請求部門の効率性を示す主要な業績評価指標となり得ます。 その重要性 重要な財務上のマイルストーンを示し、会計にとって不可欠です。請求書作成から記帳までの時間差は、内部処理効率の主要な指標となります。 取得元 SAP ECCテーブル: BKPF, フィールド: BUDAT 例 2023-04-152023-04-172023-05-21 | |||
| 請求書の支払期日 InvoiceDueDate | 顧客が支払いを行うと予想される期日。 | ||
| 説明 請求書の期日は、支払い条件によって指定される支払いの締め切り日です。この日付は、売掛金管理と回収活動の開始にとって基本的です。 この属性は、実際の支払い日と比較することで、期日内支払い率KPIを計算するために使用されます。期日別に請求書を分析することで、キャッシュフローの予測や、期日が迫っている支払いまたは延滞支払いの回収努力の優先順位付けに役立ちます。これは通常、基準日と支払い条件から導き出されます。 その重要性 これは期日内支払いパフォーマンスを測定するためのベンチマークであり、売掛金管理とキャッシュフロー予測に不可欠です。 取得元 基準日(BSEG-ZFBDT)と支払条件(BSEG-ZTERM)に基づいて計算されます。直接的なフィールドに常に保存されているわけではありません。 例 2023-05-152023-05-302023-06-20 | |||
| 販売伝票番号 SalesDocumentNumber | 請求書につながった元となる販売注文のID。 | ||
| 説明 この属性は、請求書から取引を開始した販売注文への直接リンクを提供します。このトレーサビリティは、完全なエンドツーエンドの受注から入金までの分析にとって不可欠です。 請求プロセスと先行する販売注文プロセスを接続することで、組織は顧客注文から現金受領までの総サイクルタイムを分析できます。これにより、請求の遅延が販売、履行、または請求部門自体の問題によって引き起こされているかを特定するのに役立ち、プロセス全体のより包括的な視点を提供します。 その重要性 請求プロセスを販売注文にリンクさせ、真のエンドツーエンドの受注から入金までの分析を可能にし、部門間の遅延特定に役立ちます。 取得元 SAP ECCテーブル: VBRP, フィールド: VGBEL 例 100000451000004610000047 | |||
| 通貨 Currency | 請求書に記載されている金額の通貨コード。 | ||
| 説明 この属性は、USD、EUR、JPYなど、取引の通貨を示します。請求書の合計金額のようなあらゆる金銭的価値に必要なコンテキストを提供します。 多国籍企業のデータを分析する際、通貨フィールドは財務数値を正確に解釈し、換算するために不可欠です。これにより、一貫したレポート作成が可能となり、適切な通貨換算なしに金額が合計されることがなく、誤った財務分析につながることを防ぎます。 その重要性 すべての金額に必要なコンテキストを提供し、特に多通貨環境において正確な財務分析を保証します。 取得元 SAP ECCテーブル: VBRK, フィールド: WAERK 例 USDEURGBPJPY | |||
受注から入金まで - 請求・売掛金管理の活動
| アクティビティ | 説明 | ||
|---|---|---|---|
| 請求書 消込済み | 正常に支払われた請求書の最終ステータスであり、対応する支払いまたはクレジットメモによって未決済項目が閉じられたことを示します。請求書は完全に決済されたと見なされます。 | ||
| その重要性 請求書に対する受注から入金までのサイクルが正常に完了したことを示します。これは、全体的な平均請求書サイクルタイムを測定するための主要な終了イベントです。 取得元 BSEGテーブルの請求書明細において、消込伝票(AUGBL)および消込日付(AUGDT)フィールドが入力されたときに発生します。 取得 請求書明細のBSEGテーブルに記録された消込日(AUGDT)にイベントが発生します。 イベントタイプ explicit | |||
| 請求書仕訳計上済み | 請求書が正式に売掛金補助元帳および総勘定元帳に記録されます。このイベントにより、請求書は法的に拘束力を持つものとなり、顧客が負う債務を反映します。 | ||
| その重要性 これは、回収期間のカウントを正式に開始する重要なマイルストーンです。生成から転記までの時間は、キャッシュフローに影響を与える内部処理の遅延を浮き彫りにします。 取得元 BKPFテーブルに記録されます。伝票番号(BELNR)に対する転記日付(BUDAT)がこのイベントを示します。仮保存伝票の場合、これは記帳済み伝票に変換された時点です。 取得 請求書伝票のテーブルBKPF内の転記日(BUDAT)から。 イベントタイプ explicit | |||
| 請求書生成済み | システムにおける請求伝票の作成を示します。このイベントは、会計伝票ヘッダテーブル(BKPF)に請求書用の特定の伝票タイプで新しいエントリが作成されたときに捕捉されます。 | ||
| その重要性 これは請求プロセス全体の開始点です。このイベントからの時間を分析することは、請求書作成サイクルタイムを測定し、売上債権回転日数(DSO)を計算する基礎となります。 取得元 BKPFテーブルに記録されます。特定の伝票番号(BELNR)に対する作成日付(CPUDT)と時間(CPUTM)がこのイベントを示します。伝票タイプ(BLART)が請求書であることを識別します。 取得 請求書伝票のテーブルBKPF内の作成タイムスタンプ(CPUDT)から。 イベントタイプ explicit | |||
| 顧客からの入金受領 | 顧客から支払いが受領され、現金受領または銀行預金としてシステムに記帳されました。これにより、特定の請求書にはまだ適用されていない別の支払伝票が作成されます。 | ||
| その重要性 これはキャッシュコンバージョンサイクルにおける主要なマイルストーンです。請求書送付から支払い受領までの時間は、売上債権回転日数(DSO)の主要な構成要素です。 取得元 BKPFおよびBSEGに新しい伝票として記録され、通常は顧客支払いを示す伝票タイプ(例:「DZ」)が使用されます。転記日付(BUDAT)がこのイベントを示します。 取得 BKPFの顧客支払伝票の転記日から。 イベントタイプ explicit | |||
| 顧客へ請求書送付 | 請求書が印刷、メール、EDIなどの定義された出力チャネルを通じて顧客に送付されたことを示します。これは通常、出力管理システムのログから取得されます。 | ||
| その重要性 このイベントは、顧客の支払い条件の期限計算を開始させる重要なマイルストーンです。ここでの遅延は、支払いがいつ期待できるかに直接影響し、支払い回収効率に影響を及ぼします。 取得元 請求書に対応する出力タイプのメッセージステータステーブル(NAST)内の処理日時から推測できます。 取得 NASTテーブルのエントリで処理ステータス「1」(正常処理済み)から推測されます。 イベントタイプ inferred | |||
| 支払いが請求書に適用済み | 受領した顧客支払いが特定の未決済請求書と照合・適用され、消込対象としてマークされたことを示します。これは、支払いと債務を関連付ける照合ステップです。 | ||
| その重要性 このアクティビティは、キャッシュアプリケーションサイクルタイムを測定するために不可欠です。現金適用における遅延は、実際の売掛金状況を誤解させ、利用可能な現金を隠してしまう可能性があります。 取得元 消込取引(例: F-32)によって請求書明細の消込項目が入力されることから推測されます。イベントタイムスタンプは消込日付です。 取得 請求書明細テーブル(BSEG)に消込日付(AUGDT)が入力されていることから推測されます。 イベントタイプ inferred | |||
| 支払い督促発行 | システムが延滞請求書に対して顧客に督促状または支払い督促を生成し、送付したことを示します。これは督促履歴ログから捕捉されます。 | ||
| その重要性 回収戦略の有効性評価に役立ちます。督促から支払い受領までの期間を分析することは、「支払い督促の有効性」KPIにとって重要です。 取得元 督促データテーブル、具体的には督促実行(トランザクションF150)によって生成されるMHNK(督促データヘッダ)およびMHND(督促データ明細)に記録されます。 取得 延滞項目に対する督促実行(F150)の際に記録されます。 イベントタイプ explicit | |||
| 異議申し立てケース作成 | 通常、顧客からの苦情により、請求書に対して正式な異議が申し立てられました。これはSAP Dispute Managementシステムに記録されます。 | ||
| その重要性 支払い遅延のリスクがある請求書を特定し、顧客不満の原因となっている根本的な問題を明らかにします。これは重要な例外処理プロセスの開始を示します。 取得元 請求書の会計伝票にリンクされた係争案件テーブル(UDM_CASE)でのケース作成から取得されます。 取得 ユーザーがトランザクションUDM_DISPUTE経由で異議申し立てケースを作成する際に記録されます。 イベントタイプ explicit | |||
| 請求書仮登録 | 請求伝票が総勘定元帳に転記されずに、仮の状態として保存されたことを示します。これは、情報が不完全である場合や、最終転記前にレビューが必要な場合によく使用されます。 | ||
| その重要性 記帳前のステップと潜在的な遅延を追跡します。仮保存状態での長い期間は、データ品質の問題や事前承認プロセスにおけるボトルネックを示している可能性があります。 取得元 仮保存伝票はVBKPFテーブルに格納されます。ここに伝票が作成され、後に記帳されることがこのアクティビティを示します。 取得 FV70のようなトランザクションを使用して仮保存伝票を保存する際に記録されます。 イベントタイプ explicit | |||
| 請求書修正済み | 最初の請求書が不正確であることが判明し、その後取り消された手戻りアクティビティを表します。これは、元の請求書にリンクされた反対仕訳伝票を識別することによって捕捉されます。 | ||
| その重要性 プロセスの非効率性や品質問題を浮き彫りにします。修正頻度が高いことは、上流の販売データや請求データに問題があることを示唆し、「請求書手戻りおよびエラー率」ダッシュボードをサポートします。 取得元 BKPF-STBLGが元の伝票を指す反対仕訳伝票を見つけることで特定されます。この反対仕訳伝票の作成がイベントとなります。 取得 反対仕訳伝票が作成された際(例:FB08経由)に記録されます。 イベントタイプ explicit | |||
| 請求書償却済み | 請求書が回収不能と見なされ、未回収金額が貸倒引当金勘定に振り替えられて消し込まれる代替の最終ステータスです。これにより、顧客からの支払いなしで請求書がクローズされます。 | ||
| その重要性 負のプロセス結果と収益損失を表します。これらのイベントを追跡することは、貸倒の原因を分析し、与信管理ポリシーを改善するのに役立ちます。 取得元 請求書の消込取引を分析することで推測されます。消込伝票が特定の貸倒損失勘定に記帳される場合、その請求書は貸倒処理されたとみなされます。 取得 消込取引が指定された貸倒勘定への記帳を伴う場合に推測されます。 イベントタイプ inferred | |||
| 請求書承認済み | 請求書の正式な承認を表し、記帳または顧客への送付を可能にします。これは、仮保存伝票が記帳済み伝票に変換されたときにしばしば推測されます。 | ||
| その重要性 内部承認ワークフローを追跡します。これはボトルネックの一般的な原因です。このアクティビティを分析することは、遅延している承認者を特定することで「請求書承認フロー分析」ダッシュボードをサポートするのに役立ちます。 取得元 伝票が仮保存ステータス(VBKPF)から転記済みステータス(BKPF)に移行することで推測できます。あるいは、ワークフローシステムが使用されている場合、これはワークフローログ内の明示的なイベントである可能性があります。 取得 仮保存伝票(VBKPF)の作成日と最終伝票(BKPF)の転記日を比較します。 イベントタイプ inferred | |||
| 請求書支払期日到達 | 支払条件に従って請求書の支払いが正式に期限となる日を示す計算されたイベントです。これはユーザーまたはシステムによって実行されるアクティビティではなく、時間における重要なポイントです。 | ||
| その重要性 支払行動とコンプライアンスの分析に不可欠です。期日内支払いと遅延支払いを判断し、期日内支払率KPIを計算するための基準となります。 取得元 現在の日付と正味支払期日を比較することで導出されます。支払期日はBSEG-ZFBDTフィールドに記載されているか、基準日と支払条件から計算されます。 取得 システム日付を請求書明細(BSEG)の正味支払期日フィールドと比較します。 イベントタイプ calculated | |||
抽出ガイド
ステップ
- ABAPエディタへのアクセス: SAP ECCシステムにログインします。トランザクションコード
SE38を使用してABAPエディタに移動します。 - プログラムの作成: プログラムフィールドに新しいプログラム名(例:
Z_PM_O2C_INVOICE_EXTRACT)を入力し、「作成」ボタンをクリックします。記述的なタイトルを提供し、プログラムタイプを「実行可能プログラム」に設定します。 - 選択画面の定義: プログラムのソースコードで選択画面パラメータを定義します。これにより、ユーザーは抽出するデータをフィルタリングできます。主要なパラメータには、伝票作成日範囲(
S_ERDAT)、会社コード(S_BUKRS)、および請求伝票タイプ(S_VBTYP)が含まれます。 - データ構造の定義: 最終的なイベントログデータを保持する内部テーブル構造を宣言します。この構造には、
InvoiceNumber、ActivityName、EventTime、およびUserName、BillingDocumentType、CustomerNumber、CompanyCode、TotalInvoiceAmountなどの推奨属性のフィールドが含まれている必要があります。 - データ選択ロジックの実装: データを抽出するコアのABAPロジックを記述します。まず、ユーザーの選択画面入力に基づいて、テーブル
VBRKおよびBKPFから主要な請求伝票を選択します。これらを一時的な内部テーブルに保存します。 - アクティビティの抽出: 請求伝票の初期リストをループします。各伝票について、さまざまなテーブルから後続の選択を実行し、必要な13のアクティビティを識別します。例えば、「顧客へ請求書送付」イベントのためにテーブル
NASTを照会し、消込情報(「請求書消込済」、「支払適用済」)のためにBSEGを、督促データ(「支払催促発行」)のためにMHNKを照会します。 - イベントログテーブルの構築: 前のステップで見つかった各アクティビティについて、最終的なイベントログ内部テーブルに新しいレコードを入力します。
InvoiceNumber、ActivityName、EventTime、およびその他の属性がソーステーブルから正しくマッピングされていることを確認してください。 - アプリケーションサーバーへの書き込み: ループが完了し、最終的なイベントログテーブルが完全に作成されたら、
OPEN DATASET、LOOP AT... TRANSFER、CLOSE DATASETステートメントを使用して、内部テーブルの内容をSAPアプリケーションサーバー上のフラットファイルに書き込みます。アクセス可能な論理ファイルパスを指定してください。 - ファイルの取得: トランザクションコード
AL11を使用してアプリケーションサーバーのディレクトリを移動し、生成されたファイルを特定します。SAP Basisチームと連携し、サーバーからローカルマシンまたは共有ネットワークの場所にファイルをダウンロードしてください。 - 最終フォーマット: ダウンロードしたファイルを開き、ヘッダー行を含むカンマ区切り値(CSV)ファイルであることを確認します。ProcessMindでのアップロードと互換性があるように、ファイルがUTF-8エンコーディングで保存されていることを確認してください。
設定
- 前提条件: ABAPプログラムの作成および実行アクセス権(トランザクションコードSE38)が必要です。FIおよびSDテーブル(
VBRK、VBRP、BKPF、BSEG、NAST、MHNK、およびUDM_CASE_ATTR00(紛争管理用)を含む)からの読み取り権限が必要です。 - 日付範囲の選択: プログラムは必須の日付範囲パラメータを持つべきであり、通常は伝票作成日(VBRK/BKPFの
ERDAT)に基づきます。初回抽出では、データセットを管理しやすくするため、3~6ヶ月の範囲を推奨します。 - 主要フィルター: 抽出範囲を限定するために、常に
CompanyCode(BUKRS)でフィルタリングしてください。また、関連する請求書タイプ(例:標準会計請求書の場合は'RV')のみを含め、クレジットメモやその他の伝票を除外するために、請求伝票タイプ(VBRKのVBTYP)または会計伝票タイプ(BKPFのBLART)でフィルタリングすることを強く推奨します。 - パフォーマンスに関する考慮事項: 数ヶ月を超える大規模なデータセットの場合、セッションタイムアウトを避けるため、プログラムはバックグラウンドジョブとして実行されるべきです。ABAPロジックは、インデックス付きテーブル読み取りを使用するように最適化され、データベース選択を伴うネストされたループを避けるべきです。データをまず内部テーブルに選択し、その後処理することが推奨されるアプローチです。
- 出力ファイル設定: ABAPコードは、アプリケーションサーバー上の出力ファイルパスと、CSVファイルの区切り文字(通常はカンマまたはセミコロン)を指定する必要があります。パスがグローバルに設定され、アクセス可能なディレクトリであることを確認してください。
a クエリ例 abap
REPORT Z_PM_O2C_INVOICE_EXTRACT.
*&---------------------------------------------------------------------*
*& Tables
*&---------------------------------------------------------------------*
TABLES: VBRK, BKPF.
*&---------------------------------------------------------------------*
*& Type Definitions for Event Log Output
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoicenumber TYPE vbrk-vbeln,
activityname TYPE string,
eventtime TYPE timestamp,
username TYPE xubname,
billingdocumenttype TYPE vbrk-vbtyp,
customernumber TYPE vbrk-kunnr,
companycode TYPE vbrk-bukrs,
totalinvoiceamount TYPE vbrk-netwr,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: gt_event_log TYPE TABLE OF ty_event_log,
gs_event_log TYPE ty_event_log.
DATA: BEGIN OF gs_invoice,
vbeln TYPE vbrk-vbeln, " SD Doc (Invoice)
awkey TYPE bkpf-awkey, " Accounting Doc Reference Key
bukrs TYPE vbrk-bukrs, " Company Code
kunnr TYPE vbrk-kunnr, " Customer
vbtyp TYPE vbrk-vbtyp, " SD Doc Type
netwr TYPE vbrk-netwr, " Net Value
waerk TYPE vbrk-waerk, " Currency
fkdat TYPE vbrk-fkdat, " Billing Date
erdat TYPE vbrk-erdat, " Creation Date
erzet TYPE vbrk-erzet, " Creation Time
ernam TYPE vbrk-ernam, " Creator
belnr TYPE bkpf-belnr, " Acct Doc
gjahr TYPE bkpf-gjahr, " Fiscal Year
cpudt TYPE bkpf-cpudt, " Acct Doc Entry Date
cputm TYPE bkpf-cputm, " Acct Doc Entry Time
usnam TYPE bkpf-usnam, " Acct Doc User
stblg TYPE bkpf-stblg, " Reversal Doc
END OF gs_invoice.
DATA: gt_invoices LIKE TABLE OF gs_invoice.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbrk-erdat OBLIGATORY,
s_bukrs FOR vbrk-bukrs OBLIGATORY,
s_vbtyp FOR vbrk-vbtyp.
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/trans/tmp/invoice_extract.csv' OBLIGATORY.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" 1. Select base set of invoices
SELECT vbrk~vbeln, vbrk~bukrs, vbrk~kunnr, vbrk~vbtyp, vbrk~netwr, vbrk~waerk,
vbrk~fkdat, vbrk~erdat, vbrk~erzet, vbrk~ernam,
bkpf~belnr, bkpf~gjahr, bkpf~cpudt, bkpf~cputm, bkpf~usnam, bkpf~stblg, bkpf~awkey
INTO CORRESPONDING FIELDS OF TABLE gt_invoices
FROM vbrk
INNER JOIN bkpf ON bkpf~awkey = vbrk~vbeln AND bkpf~awtyp = 'VBRK'
WHERE vbrk~erdat IN s_erdat
AND vbrk~bukrs IN s_bukrs
AND vbrk~vbtyp IN s_vbtyp.
IF gt_invoices IS INITIAL.
MESSAGE 'No invoices found for the selected criteria.' TYPE 'I'.
RETURN.
ENDIF.
LOOP AT gt_invoices INTO gs_invoice.
CLEAR gs_event_log.
gs_event_log-invoicenumber = gs_invoice-vbeln.
gs_event_log-billingdocumenttype = gs_invoice-vbtyp.
gs_event_log-customernumber = gs_invoice-kunnr.
gs_event_log-companycode = gs_invoice-bukrs.
gs_event_log-totalinvoiceamount = gs_invoice-netwr.
" Activity: Invoice Generated (using accounting doc creation)
gs_event_log-activityname = 'Invoice Generated'.
gs_event_log-username = gs_invoice-usnam.
CONCATENATE gs_invoice-cpudt gs_invoice-cputm INTO DATA(lv_ts_gen).
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Posted (same as generated for non-parked docs)
gs_event_log-activityname = 'Invoice Posted'.
gs_event_log-username = gs_invoice-usnam.
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Approved (inferred by posting)
gs_event_log-activityname = 'Invoice Approved'.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Sent To Customer
SELECT SINGLE addat, aduhr FROM nast
INTO (DATA(lv_nast_date), DATA(lv_nast_time))
WHERE kappl = 'V3' AND objky = gs_invoice-vbeln AND vszst > '0'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Sent To Customer'.
gs_event_log-username = sy-uname.
CONVERT DATE lv_nast_date TIME lv_nast_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Corrected / Reversed
IF gs_invoice-stblg IS NOT INITIAL.
SELECT SINGLE cpudt, cputm, usnam FROM bkpf
INTO (DATA(lv_rev_date), DATA(lv_rev_time), DATA(lv_rev_user))
WHERE belnr = gs_invoice-stblg AND gjahr = gs_invoice-gjahr.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Corrected'.
gs_event_log-username = lv_rev_user.
CONVERT DATE lv_rev_date TIME lv_rev_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
" Activity: Payment Applied, Cleared, Due Date, Written Off (from BSEG)
SELECT SINGLE augdt, augbl, zfBDT, hkont FROM bseg
INTO (DATA(lv_augdt), DATA(lv_augbl), DATA(lv_zfbdt), DATA(lv_hkont))
WHERE bukrs = gs_invoice-bukrs
AND belnr = gs_invoice-belnr
AND gjahr = gs_invoice-gjahr
AND koart = 'D'. " Customer line
IF sy-subrc = 0.
" Due Date Reached (Calculated event)
IF lv_zfbdt IS NOT INITIAL.
gs_event_log-activityname = 'Invoice Due Date Reached'.
gs_event_log-username = 'System'.
CONVERT DATE lv_zfbdt INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Cleared, Applied, Write-Off
IF lv_augdt IS NOT INITIAL.
SELECT SINGLE usnam, cpudt, cputm, blart FROM bkpf
INTO (DATA(lv_clear_user), DATA(lv_clear_date), DATA(lv_clear_time), DATA(lv_clear_type))
WHERE belnr = lv_augbl AND bukrs = gs_invoice-bukrs.
IF sy-subrc = 0.
gs_event_log-username = lv_clear_user.
CONVERT DATE lv_clear_date TIME lv_clear_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
IF lv_clear_type = 'DZ'. " Standard Customer Payment
gs_event_log-activityname = 'Customer Payment Received'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Payment Applied To Invoice'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Invoice Cleared'. APPEND gs_event_log TO gt_event_log.
ELSE. " Assuming other clearing doc types could be write-offs
gs_event_log-activityname = 'Invoice Written Off'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
" Activity: Payment Reminder Issued (Dunning)
SELECT COUNT(*) FROM mhnk WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
IF sy-subrc = 0 AND sy-dbcnt > 0.
SELECT SINGLE lafdn FROM mhnk
INTO DATA(lv_dunning_date)
WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
gs_event_log-activityname = 'Payment Reminder Issued'.
gs_event_log-username = 'System'.
CONVERT DATE lv_dunning_date INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Parked (Example from VBKPF, may require system specific logic)
SELECT SINGLE cpudt, cputm, usnam FROM vbkpf
INTO (DATA(lv_park_date), DATA(lv_park_time), DATA(lv_park_user))
WHERE awkey = gs_invoice-vbeln AND awsys = 'LOG' AND bstat = 'V'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Parked'.
gs_event_log-username = lv_park_user.
CONVERT DATE lv_park_date TIME lv_park_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Dispute Case Created (Requires Dispute Management module)
SELECT SINGLE create_date, create_time, create_user FROM udm_case_attr00
INTO (DATA(lv_disp_date), DATA(lv_disp_time), DATA(lv_disp_user))
WHERE [Your logic to link invoice to dispute case, e.g., via a custom field or object link].
IF sy-subrc = 0.
gs_event_log-activityname = 'Dispute Case Created'.
gs_event_log-username = lv_disp_user.
CONVERT DATE lv_disp_date TIME lv_disp_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Write data to file
*&---------------------------------------------------------------------*
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
" Header
DATA(lv_header) = 'InvoiceNumber,ActivityName,EventTime,UserName,BillingDocumentType,CustomerNumber,CompanyCode,TotalInvoiceAmount'.
TRANSFER lv_header TO p_path.
LOOP AT gt_event_log INTO gs_event_log.
DATA(lv_line) = |
{ gs_event_log-invoicenumber }|
,{ gs_event_log-activityname }|
,{ gs_event_log-eventtime }|
,{ gs_event_log-username }|
,{ gs_event_log-billingdocumenttype }|
,{ gs_event_log-customernumber }|
,{ gs_event_log-companycode }|
,{ gs_event_log-totalinvoiceamount }|.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: 'Extraction complete. File created at:', p_path. ステップ
- 前提条件とアクセス: クエリで指定された
VBRK、BKPF、BSAD、NAST、CDHDR、CDPOS、SCASEなど、必要なSAP ECCテーブルへの読み取り専用アクセス権を持つデータベースユーザーがいることを確認してください。このアクセスレベルは通常、システム管理者または特定のデータ分析チームにのみ付与されます。 - データベースへの接続: DBeaver、Oracle SQL Developer、Microsoft SQL Server Management Studioなどの標準的なSQLクライアントツールを使用して、SAP ECCデータベースへの接続を確立します。
- SQLクエリの準備: 「query」セクションに提供されている完全なSQLクエリをSQLクライアントのエディタにコピーします。
- プレースホルダーのカスタマイズ: クエリには、お使いの環境に固有の値に置き換える必要があるいくつかのプレースホルダーが含まれています。これらには以下が含まれます。
'YYYYMMDD': 分析したい期間の開始日と終了日で、すべてのインスタンスを置き換えます。データを管理しやすい期間にフィルタリングすることが重要です。'XXXX': 分析したい特定の会社コードに置き換えます。[Your Invoice Output Type]: 顧客に請求書を送信するために使用される出力タイプコード(例: 'RD00')を指定します。[Your Bad Debt G/L Account]: 回収不能な請求書を貸倒処理するために使用される勘定科目コードを入力します。[Your Dispute Case Invoice Attribute]: 紛争管理設定で請求書番号を保存するために使用される属性名(例: 'INVOICE_ID')を指定します。
- タイムスタンプ関数の確認: クエリは汎用的な
CAST(CONCAT(date_field, time_field) AS TIMESTAMP)構文を使用しています。お使いのデータベースシステムに合わせて調整する必要がある場合があります(例: Oracleの場合はTO_TIMESTAMP、SQL Serverの場合はDATETIMEFROMPARTSを使用)。 - クエリの実行: 修正したクエリを実行します。SAPテーブルのサイズと選択された日付範囲によっては、実行にかなりの時間がかかる場合があります。
- 結果の確認: クエリが完了したら、出力が期待される列(InvoiceNumber、ActivityName、EventTime、および推奨される属性)を含んでいることを確認するために出力をレビューします。エラーや空の結果がないか確認してください。
- CSVへのエクスポート: SQLクライアントから完全な結果セットをCSVファイルにエクスポートします。特殊文字の問題を防ぐため、ファイルがUTF-8エンコーディングを使用していることを確認してください。
- アップロードの準備: プロセスマイニングツールにアップロードする前に、CSVの列ヘッダーが必須属性名(例: InvoiceNumber、ActivityName、EventTime、UserName)と完全に一致していることを確認してください。
設定
- データベース接続: 基盤となるSAP ECCデータベースへの直接的な読み取り専用SQL接続が必要です。この方法では、SAPアプリケーション層を完全にバイパスします。
- 認証: データベースユーザーは、FI、SD、場合によってはFSCMモジュールにわたるクエリで使用されるすべてのテーブルに対して
SELECT権限を持つ必要があります。 - 日付範囲: 妥当なパフォーマンスとデータ量を確保するため、特定の期間でクエリをフィルタリングすることが不可欠です。3〜6ヶ月の期間から始めることを推奨します。日付フィルターのプレースホルダー
'YYYYMMDD'は、クエリの複数の箇所で設定する必要があります。 - 会社コードフィルター: クエリは会社コード(
BUKRS)でフィルタリングされるように設計されています。一度に1つまたは少数の会社コードを分析するのが標準的なプラクティスです。 - 伝票タイプ設定: 請求書修正、貸倒処理、送信済伝票などのイベントを識別するロジックは、標準のSAP設定に依存します。貴社がこれらのプロセスにカスタム伝票タイプ(
BLART)、出力タイプ(KSCHL)、またはG/L勘定を使用している場合、クエリを調整する必要があるかもしれません。 - パフォーマンスに関する考慮事項: 稼働中の本番SAPシステムに対してこのクエリを実行すると、かなりのリソースを消費し、運用パフォーマンスに影響を与える可能性があります。大規模なデータ抽出は、オフピーク時間帯に実行するか、データベースの専用レポーティングレプリカに対して実行することを強く推奨します。
a クエリ例 sql
WITH InvoiceBase AS (
SELECT
VBRK.VBELN AS InvoiceNumber,
VBRK.FKART AS BillingDocumentType,
VBRK.KUNRG AS CustomerNumber,
VBRK.BUKRS AS CompanyCode,
VBRK.NETWR AS TotalInvoiceAmount,
VBRK.ERNAM AS CreatorName,
VBRK.ERDAT AS CreationDate,
VBRK.ERZET AS CreationTime
FROM VBRK
WHERE VBRK.ERDAT BETWEEN '20230101' AND '20231231' -- Filter by Invoice Creation Date
AND VBRK.BUKRS IN ('1000') -- Filter by Company Code
AND VBRK.FKART NOT IN ('S1', 'S2') -- Exclude cancelled invoices
)
-- 1. Invoice Generated
SELECT
ib.InvoiceNumber,
'Invoice Generated' AS ActivityName,
CAST(CONCAT(ib.CreationDate, ib.CreationTime) AS TIMESTAMP) AS EventTime,
ib.CreatorName AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM InvoiceBase ib
UNION ALL
-- 2. Invoice Parked
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Parked' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = 'V' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 3. Invoice Posted
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Posted' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = '' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 4. Invoice Approved (from Parked to Posted)
SELECT
SUBSTRING(h.OBJECTID, 4, 10) AS InvoiceNumber,
'Invoice Approved' as ActivityName,
CAST(CONCAT(h.UDATE, h.UTIME) AS TIMESTAMP) AS EventTime,
h.USERNAME AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM CDHDR h
JOIN CDPOS p ON h.MANDANT = p.MANDANT AND h.OBJECTCLAS = p.OBJECTCLAS AND h.OBJECTID = p.OBJECTID AND h.CHANGENR = p.CHANGENR
JOIN InvoiceBase ib ON SUBSTRING(h.OBJECTID, 4, 10) = ib.InvoiceNumber
WHERE h.OBJECTCLAS = 'BELEGV'
AND p.TABNAME = 'BKPF'
AND p.FNAME = 'BSTAT'
AND p.VALUE_OLD = 'V'
AND p.VALUE_NEW = ' '
AND h.UDATE BETWEEN '20230101' AND '20231231'
UNION ALL
-- 5. Invoice Sent To Customer
SELECT
n.OBJKY AS InvoiceNumber,
'Invoice Sent To Customer' AS ActivityName,
CAST(CONCAT(n.DATVR, n.UHRVR) AS TIMESTAMP) AS EventTime,
n.VSTAT AS UserName, -- User who processed is not directly available, using processing status as a proxy
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM NAST n
JOIN InvoiceBase ib ON n.OBJKY = ib.InvoiceNumber
WHERE n.KSCHL = '[Your Invoice Output Type]' -- E.g., 'RD00'
AND n.VSTAT = '1' -- Processed successfully
AND n.DATVR BETWEEN '20230101' AND '20231231'
UNION ALL
-- 6. Invoice Corrected (Reversed)
SELECT
SUBSTRING(orig_doc.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Corrected' AS ActivityName,
CAST(CONCAT(rev_doc.CPUDT, rev_doc.CPUTM) AS TIMESTAMP) AS EventTime,
rev_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
rev_doc.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF orig_doc
JOIN BKPF rev_doc ON orig_doc.STBLG = rev_doc.BELNR AND orig_doc.BUKRS = rev_doc.BUKRS AND orig_doc.GJAHR = rev_doc.STJAH
JOIN InvoiceBase ib ON SUBSTRING(orig_doc.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE orig_doc.AWTYP = 'VBRK' AND orig_doc.STBLG IS NOT NULL AND rev_doc.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 7. Invoice Due Date Reached
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Due Date Reached' AS ActivityName,
CAST(CONCAT(bs.ZFBDT, '000000') AS TIMESTAMP) AS EventTime,
'System' AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSEG bs
JOIN BKPF b ON bs.MANDT = b.MANDT AND bs.BUKRS = b.BUKRS AND bs.BELNR = b.BELNR AND bs.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND bs.KOART = 'D' AND bs.ZFBDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 8. Payment Reminder Issued
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Payment Reminder Issued' AS ActivityName,
CAST(CONCAT(h.LAUFD, '000000') AS TIMESTAMP) AS EventTime,
h.LAUFI AS UserName, -- Dunning Run ID
ib.BillingDocumentType,
ib.CustomerNumber,
d.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM MHND d
JOIN MHNK h ON d.MANDT = h.MANDT AND d.LAUFD = h.LAUFD AND d.LAUFI = h.LAUFI
JOIN BKPF b ON d.MANDT = b.MANDT AND d.BUKRS = b.BUKRS AND d.BELNR = b.BELNR AND d.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE h.LAUFD BETWEEN '20230101' AND '20231231'
UNION ALL
-- 9. Dispute Case Created
SELECT
attr.ATTR_VALUE AS InvoiceNumber,
'Dispute Case Created' AS ActivityName,
sc.CREATE_TIME AS EventTime,
sc.CREATED_BY AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM SCMG_T_CASE_ATTR attr
JOIN SCASE sc ON attr.CASE_GUID = sc.CASE_GUID
JOIN InvoiceBase ib ON attr.ATTR_VALUE = ib.InvoiceNumber
WHERE attr.ATTR_NAME = '[Your Dispute Case Invoice Attribute]' -- e.g., 'INVOICE_ID'
AND CAST(sc.CREATE_TIME AS DATE) BETWEEN '20230101' AND '20231231'
UNION ALL
-- 10, 11, 12. Clearing Events (Payment, Clearing, Write-Off)
SELECT
InvoiceNumber,
ActivityName,
EventTime,
UserName,
BillingDocumentType,
CustomerNumber,
CompanyCode,
TotalInvoiceAmount
FROM (
SELECT
bsad.XBLNR AS InvoiceNumber,
CASE
WHEN clearing_item.HKONT = '[Your Bad Debt G/L Account]' THEN 'Invoice Written Off'
ELSE 'Customer Payment Received'
END AS ActivityName,
CAST(CONCAT(clearing_doc.CPUDT, clearing_doc.CPUTM) AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
LEFT JOIN BSEG clearing_item ON clearing_doc.MANDT = clearing_item.MANDT AND clearing_doc.BUKRS = clearing_item.BUKRS AND clearing_doc.BELNR = clearing_item.BELNR AND clearing_doc.GJAHR = clearing_item.GJAHR AND clearing_item.HKONT = '[Your Bad Debt G/L Account]' -- e.g. '148000'
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Payment Applied To Invoice' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '000000') AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Invoice Cleared' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '235959') AS TIMESTAMP) AS EventTime, -- Add time to separate from 'Payment Applied'
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
) AS ClearingEvents ステップ
- 前提条件: 認定SAPコネクタを備えたライセンスETLツール(例: Informatica PowerCenter with SAP Connector、Talend with SAP Connectorなど)をお持ちであることを確認してください。必要な財務、販売、システムテーブル(BKPF、BSEG、VBRK、NAST、MHNK、UDM_CASE_ATTR00、CDHDR、CDPOS)から読み取るための必要な権限を持つSAPユーザー認証情報があることを確認してください。
- SAP接続の確立: ETLツールで、SAP ECCシステムへの新しい接続を作成します。アプリケーションサーバー、システム番号、クライアント、ユーザー、パスワードなどの接続詳細を設定します。接続が成功することを確認するためにテストを実行します。
- データソースの定義: 抽出する各アクティビティについて、対応するSAPテーブルをETLジョブのデータソースとして定義します。例えば、請求書生成のためにVBRKを、転記イベントのためにBKPFを、顧客コミュニケーションのためにNASTを追加します。
- 各アクティビティの抽出ロジックの構築: 必要な13のアクティビティそれぞれについて、個別のデータフローまたは変換を作成します。各フローで、関連するレコードを選択するためのフィルターを適用します。例えば、会社コード(BUKRS)、伝票タイプ(BLART)、および特定の日付範囲(例: 作成日ERDAT)でフィルタリングします。
- フィールドのマッピングとデータ変換: 各データフローで、ソースSAPテーブルフィールドをターゲットイベントログ構造(InvoiceNumber、ActivityName、EventTime、UserName、およびその他の推奨属性)にマッピングします。各フローの「ActivityName」をハードコードし、日付とタイムスタンプを正しくフォーマットするために変換ロジックを使用します。
- 複雑なアクティビティの処理: 「請求書支払期日到達」のような計算イベントの場合、基準支払日(ZFBDT)と支払条件ロジックを使用して支払期日を計算するか、BSEGから純支払期日(NETDT)を直接取得します。「請求書承認済み」のような変更ログから導出されるイベントの場合、伝票番号と日付に基づいてBKPFやCDHDR/CDPOSなどのテーブルを結合する必要がある場合があります。
- アクティビティデータの結合: ETLツールで「Union」または「Merge」変換を使用して、13の個別のデータフローすべての出力を単一のデータセットに結合します。結合する前に、すべてのフローで列名とデータ型が一致していることを確認してください。
- ターゲット宛先の設定: イベントログの最終的な出力先を定義します。これはフラットファイル(CSV)、データベーステーブル、またはステージングエリアへの直接接続である可能性があります。
- 抽出スケジュールの設定: 抽出の日付範囲パラメータを設定します。初回ロードでは、6〜12ヶ月のデータを抽出する場合があります。その後の差分ロードでは、前回の実行日からデータを抽出するようにジョブを設定します。
- 実行とエクスポート: ETLジョブを実行します。完了後、出力ファイルが必須形式を満たしていることを確認するために検査します。最終出力は、ProcessMindにアップロードする準備ができた、各行が固有のイベントを表す単一のCSVファイルである必要があります。
設定
- SAP接続: ターゲットのSAP ECCシステムへのアプリケーションサーバー接続が必要です。SAPユーザーは、RFCアクセスと、VBRK、BKPF、BSEG、NAST、その他クエリで指定されたテーブルへの権限が必要です。
- ETLツールライセンス: 市販のETLツールとその特定のSAPコネクタの有効なライセンスが必須です。
- 日付範囲: 過度なシステム負荷を引き起こすことなく、分析のための代表的なサンプルを確保するため、3〜6ヶ月間のデータを抽出することを推奨します。開始日と終了日には設定可能なパラメータを使用してください。
- 主要フィルター: 抽出範囲を限定するために、常に会社コード(BUKRS)でフィルタリングしてください。また、標準請求書のみを含め、クレジットメモや内部伝票などの他の伝票タイプを除外するために、関連する請求伝票タイプ(VBRK-FKART)と会計伝票タイプ(BKPF-BLART)でフィルタリングすることが重要です。
- パフォーマンス: BSEGのような大きなテーブルからの抽出は遅くなる可能性があります。選択的なフィルターを使用し、不要なフィールドの抽出を避け、オフピーク時間帯に抽出をスケジュールして、SAPソースシステムへのパフォーマンス影響を最小限に抑えてください。
a クエリ例 config
// ETL Data Extraction Logic for SAP Order-to-Cash Invoicing
// This represents the configuration logic within a graphical ETL tool.
// == Global Parameters ==
// $StartDate: '[Start Date]' (e.g., '2023-01-01')
// $EndDate: '[End Date]' (e.g., '2023-06-30')
// $CompanyCodes: '[Company Code(s)]' (e.g., '1000', '2000')
// $BillingDocTypes: '[Billing Document Type(s)]' (e.g., 'F1', 'F2')
// == Source 1: Invoice Generated ==
// Tables: VBRK
DATA_SOURCE generated_invoices FROM VBRK WHERE
ERDAT >= $StartDate AND ERDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND FKART IN ($BillingDocTypes)
MAP {
InvoiceNumber: VBELN,
ActivityName: 'Invoice Generated',
EventTime: ERDAT + ERZET, // Combine date and time
UserName: ERNAM,
BillingDocumentType: FKART,
CustomerNumber: KUNAG,
CompanyCode: BUKRS,
TotalInvoiceAmount: NETWR
}
// == Source 2: Invoice Posted ==
// Tables: BKPF joined with VBRK
DATA_SOURCE posted_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Posted',
EventTime: A.BUDAT + A.CPUTM, // Posting date and entry time
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 3: Invoice Parked ==
// Tables: BKPF joined with VBRK
DATA_SOURCE parked_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.CPUDT >= $StartDate AND A.CPUDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = 'V'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Parked',
EventTime: A.CPUDT + A.CPUTM,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 4: Invoice Approved (Transition from Parked to Posted) ==
// Tables: BKPF joined with VBRK
DATA_SOURCE approved_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
AND EXISTS (SELECT 1 FROM VBELEGV C WHERE C.BELNR = A.BELNR) // Check if it was ever parked
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Approved',
EventTime: A.BUDAT + A.CPUTM, // Use posting date as approval date
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 5: Invoice Sent To Customer ==
// Tables: NAST joined with VBRK
DATA_SOURCE sent_invoices FROM NAST as A
INNER JOIN VBRK as B ON (A.OBJKY = B.VBELN)
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND B.BUKRS IN ($CompanyCodes)
AND A.VSTAT = '1' // Successfully processed
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Sent To Customer',
EventTime: A.ERDAT + A.ERUHR,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: B.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 6: Invoice Corrected (Reversed) ==
// Tables: VBRK (for the reversal document)
DATA_SOURCE corrected_invoices FROM VBRK as A
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.SFAKN <> '' // SFAKN is the original cancelled invoice
MAP {
InvoiceNumber: A.SFAKN, // Case ID is the original invoice
ActivityName: 'Invoice Corrected',
EventTime: A.ERDAT + A.ERZET,
UserName: A.ERNAM,
BillingDocumentType: A.FKART,
CustomerNumber: A.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: NULL // Amount belongs to the reversal doc, not original
}
// == Source 7: Invoice Due Date Reached ==
// Tables: BSEG joined with VBRK
DATA_SOURCE due_invoices FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.NETDT >= $StartDate AND A.NETDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.KOART = 'D' // Customer line item
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Due Date Reached',
EventTime: A.NETDT, // Net due date
UserName: 'System',
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 8: Payment Reminder Issued ==
// Tables: MHNK, MHND, VBRK
DATA_SOURCE reminders FROM MHNK as A
INNER JOIN MHND as D ON (A.LAUFD = D.LAUFD AND A.LAUFI = D.LAUFI)
INNER JOIN VBRK as B ON (SUBSTRING(D.XBLNR, 1, 10) = B.VBELN) // XBLNR may need parsing
WHERE A.LAUFD >= $StartDate AND A.LAUFD <= $EndDate
AND D.BUKRS IN ($CompanyCodes)
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Reminder Issued',
EventTime: A.LAUFD, // Dunning date
UserName: A.IDAPS,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: D.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 9: Dispute Case Created ==
// Tables: UDM_CASE_ATTR00
DATA_SOURCE disputes FROM UDM_CASE_ATTR00 as A
WHERE A.CREATE_TIMESTAMP >= $StartDate // Timestamp format may vary
AND A.FIN_COMP_CODE IN ($CompanyCodes)
AND A.PROCESS = 'FIN_FSCM_DIS'
MAP {
InvoiceNumber: A.BILL_DOC_ID,
ActivityName: 'Dispute Case Created',
EventTime: A.CREATE_TIMESTAMP,
UserName: A.CREATE_USER,
BillingDocumentType: NULL,
CustomerNumber: A.BP_NUMBER,
CompanyCode: A.FIN_COMP_CODE,
TotalInvoiceAmount: A.DISPUTED_AMOUNT
}
// == Source 10: Customer Payment Received ==
// Tables: BKPF
DATA_SOURCE payments FROM BKPF
WHERE BUDAT >= $StartDate AND BUDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND BLART = 'DZ' // Example for Customer Payment
MAP {
InvoiceNumber: NULL, // Invoice not yet known
ActivityName: 'Customer Payment Received',
EventTime: BUDAT + CPUTM,
UserName: USNAM,
BillingDocumentType: NULL,
CustomerNumber: NULL, // Requires join to BSEG to get customer
CompanyCode: BUKRS,
TotalInvoiceAmount: NULL
}
// == Source 11 & 12: Payment Applied To Invoice & Invoice Cleared ==
// Tables: BSEG joined with VBRK
DATA_SOURCE cleared_items FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.AUGBL <> ''
// Generate two records from this source
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Applied To Invoice',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM, // User from header of original invoice doc
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
UNION WITH {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Cleared',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 13: Invoice Written Off ==
// Tables: BSEG (for the invoice line) and BKPF (for clearing doc type)
DATA_SOURCE written_off FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
INNER JOIN BKPF as C ON (A.AUGBL = C.BELNR AND A.BUKRS = C.BUKRS AND A.AUGGJ = C.GJAHR)
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND C.BLART = '[Your Write-Off Document Type]' // e.g., 'AB'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Written Off',
EventTime: A.AUGDT,
UserName: C.USNAM, // User who posted the write-off
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Final Union of all sources ==
OUTPUT generated_invoices
UNION ALL posted_invoices
UNION ALL parked_invoices
UNION ALL approved_invoices
UNION ALL sent_invoices
UNION ALL corrected_invoices
UNION ALL due_invoices
UNION ALL reminders
UNION ALL disputes
UNION ALL payments
UNION ALL cleared_items
UNION ALL written_off