受注から入金までの請求・請求書発行向けデータテンプレート
受注から入金までの請求・請求書発行向けデータテンプレート
- 詳細な分析に推奨される属性
- 記録すべき主なプロセスのステップとマイルストーン
- SAP ECCからのデータ抽出ガイド
受注から入金までの請求・請求書発行の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ ActivityName | 請求書のライフサイクルで発生した業務イベントまたはステップの名称です。 | ||
| 説明 この属性は、請求プロセスにおける特定の処理やステータス変更を表します。たとえば、「請求書を生成」「請求書を転記」「顧客から入金」などです。これらのアクティビティは、さまざまなシステムイベント、伝票のステータス変更、ユーザーが実行した特定のトランザクションコードから概念的に導き出されます。 アクティビティの順序がプロセスフローを形成し、プロセスマイニング分析の基盤となります。アクティビティを調べることで、組織は実際にどのステップがどの順序で、どの程度の頻度で行われているかを把握できます。これにより、設計されたプロセスと実際の実行状況を比較できます。 重要な理由 プロセスマップ上のステップを定義し、プロセスフロー、逸脱、ボトルネックを可視化して分析できます。 入手先 トランザクションコード(CDHDR-TCODE)、伝票のステータス変更(VBUK-FKSTK)、会計伝票の転記など、複数の情報源から導き出される概念上の属性です。 例 請求書作成請求書の転記支払いリマインダー送付請求書の消込完了 | |||
| 請求書番号 InvoiceNumber | 請求伝票を一意に識別する番号で、請求プロセスの主なケースIDとして使用されます。 | ||
| 説明 請求書番号は、SAPでは請求伝票番号と呼ばれ、各請求書を一意に識別します。プロセスマイニングではケースIDとして機能し、作成、転記、送付、支払、消込など、関連するすべてのアクティビティを1つのエンドツーエンドのプロセスインスタンスにまとめます。 請求書番号を基準にプロセスを分析すると、請求取引の開始から最終決済まで、ライフサイクル全体を把握できます。売上債権回転日数(DSO)や請求書のサイクルタイムなどの重要業績評価指標を算出でき、パフォーマンスの測定と改善に役立ちます。 重要な理由 請求書の全行程を追跡するための基本となるキーです。請求取引ごとのサイクルタイム、ボトルネック、ばらつきを分析できます。 入手先 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 | 請求書を発行した法人を識別するコードです。 | ||
| 説明 会社コードは、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コード)は、SAPの特定の機能やプログラムを識別するコードです。たとえば、請求伝票の作成には「VF01」を使用します。各イベントのTコードを記録すると、プロセスがどのように実行されたかをシステムレベルで把握できます。 この情報は根本原因の分析に役立ちます。たとえば、エラーが頻発する場合、標準外のトランザクションコードが使われていないかを確認できます。また、アクティビティ名の導出や、プロセスで使用されているシステム機能の把握にも役立ちます。 重要な理由 アクティビティの実行方法を技術的な観点から把握できます。プロセス逸脱の根本原因を分析し、標準外のユーザー操作を特定するのに役立ちます。 入手先 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 | |||
| 手戻りかどうか IsRework | アクティビティが手戻りまたは修正のステップかを示すフラグです。 | ||
| 説明 この計算属性は、「請求書を修正」や伝票の取消など、手戻りに該当するアクティビティを特定します。通常、アクティビティ名や、請求伝票の取消に使う「VF11」など、修正や取消に関連するトランザクションコードから真偽値のフラグとして導き出します。 プロセスマイニングでは、このフラグを使って請求プロセスの手戻り量を定量化できます。請求書修正率などの重要業績評価指標の算出に役立つほか、プロセスマップ上で手戻りのループを可視化できます。これにより、業務コストの増加や支払の遅れにつながる非効率や品質上の問題を把握できます。 重要な理由 エラー修正にどれだけの作業が費やされているかを示し、プロセスの非効率や品質上の問題を定量化できます。手戻りに関する重要業績評価指標の算出にも役立ちます。 入手先 アクティビティ名またはトランザクションコードから導き出します。たとえば、IF ActivityName = 'Invoice Corrected' OR TransactionCode = 'VF11' THEN true ELSE false.のように判定します。 例 truefalse | |||
| 支払条件 PaymentTerms | 支払スケジュールなど、販売者が販売を完了する際の条件です。 | ||
| 説明 支払条件は、「30日以内」や「60日以内」など、支払期日を定めるルールです。顧客と合意する条件であり、キャッシュフローを左右する要素です。 支払条件ごとにプロセスを分析すると、支払サイクルが長くなりやすい条件や、支払遅延率が高い条件を特定できます。この情報は、顧客との条件交渉や財務計画の見直しに役立ちます。また、請求書の支払期日を算出する際にも使用します。 重要な理由 合意した支払条件に基づいて顧客の支払傾向やキャッシュフローへの影響を分析し、取引条件の見直しに役立てられます。 入手先 SAP ECCテーブル:VBRK、項目:ZTERM 例 Z030Z060Z001 | |||
| 消込日 ClearingDate | 入金を受領し、請求書を売掛金から消し込んだ日付です。 | ||
| 説明 消込日は、請求書などの未消込明細が財務システムで支払済み、つまり消込済みとして処理された日付です。この日付は、入金が回収され、照合された日を表します。 受注から入金までのプロセスで特に重要な日付の1つです。売上債権回転日数(DSO)や請求から入金までのサイクルタイムを算出する際の終了日となります。消込日を分析すると、回収プロセスの有効性を測定できます。 重要な理由 請求書のライフサイクルの最終ステップを示します。売上債権回転日数(DSO)や全体のサイクルタイムを算出する終了日となり、入金回収の効率も把握できます。 入手先 SAP ECCテーブル:BSAD、項目:AUGDT 例 2023-05-142023-06-012023-06-25 | |||
| 自動処理かどうか IsAutomated | アクティビティがシステムユーザーまたは自動処理によって実行されたかを示すフラグです。 | ||
| 説明 この計算属性は、手動のアクティビティと自動処理を区別する真偽値のフラグです。通常、「BATCHUSER」や「SAPSYSTEM」など、既知のシステムユーザーまたはバッチユーザーのIDとユーザー名属性を照合して判定します。 このフラグは、請求プロセスの自動化率を測定するうえで欠かせません。効率向上とコスト削減を目指す多くの組織にとって、自動化率は重要な目標です。自動請求率の重要業績評価指標はこの属性から直接算出でき、自動化の取り組みの進捗を追跡できます。 重要な理由 自動請求率の算出に直接役立ち、プロセスの効率や自動化プロジェクトの効果を測定できます。 入手先 ユーザー名属性から導き出します。たとえば、IF UserName IN ('BATCH', 'SYSTEM', 'RFCUSER') THEN true ELSE false.のようなロジックを使用します。 例 truefalse | |||
| 請求書の支払期日 InvoiceDueDate | 顧客による支払期限の日付です。 | ||
| 説明 請求書の支払期日は、支払条件で定められた支払期限です。売掛金の管理や回収業務の開始に欠かせない日付です。 実際の支払日と比較して、期日どおりの支払率を算出するために使用します。支払期日ごとに請求書を分析すると、キャッシュフローの予測や、支払期日が近い請求書または支払遅延の請求書の回収優先順位付けに役立ちます。通常、基準日と支払条件から算出します。 重要な理由 期日どおりの支払状況を測る基準です。売掛金の管理やキャッシュフローの予測に欠かせません。 入手先 基準日(BSEG-ZFBDT)と支払条件(BSEG-ZTERM)に基づいて算出します。直接対応する項目に保存されているとは限りません。 例 2023-05-152023-05-302023-06-20 | |||
| 販売伝票番号 SalesDocumentNumber | 請求書につながる元の受注を識別する番号です。 | ||
| 説明 この属性を使うと、請求書から取引の起点となった受注を直接たどれます。エンドツーエンドの受注から入金までの分析に欠かせない情報です。 請求プロセスとその前段階の受注プロセスを関連付けることで、顧客の注文から入金までの全体のサイクルタイムを分析できます。請求の遅れが、販売、履行、請求部門のどこで発生しているかを特定し、プロセス全体を把握するのに役立ちます。 重要な理由 請求プロセスを受注に結び付け、受注から入金までをエンドツーエンドで分析できます。部門をまたぐ遅延の特定にも役立ちます。 入手先 SAP ECCテーブル:VBRP、項目:VGBEL 例 100000451000004610000047 | |||
| 販売組織 SalesOrganization | 製品やサービスの販売を担当する組織単位です。 | ||
| 説明 販売組織は、SAPにおいて商品やサービスの販売と販売条件の交渉を担う組織単位です。販売・流通業務を構成するための主要な項目です。 プロセスマイニングでは、この属性を使って販売体制の観点から請求プロセスを分析できます。販売組織間でパフォーマンスを比較し、請求処理の効率が高い地域や事業部門を特定できます。また、優れた取り組みの標準化にも役立ちます。 重要な理由 販売部門や地域ごとのパフォーマンスを比較・分析し、優れた取り組みや改善が必要な領域を特定できます。 入手先 SAP ECCテーブル:VBRK、項目:VKORG 例 1000NA01EU01AP01 | |||
| 転記日 PostingDate | 伝票が財務会計帳簿に転記された日付です。 | ||
| 説明 転記日は、取引を総勘定元帳に記録する会計期間を決定します。会計処理と財務報告に欠かせない日付です。伝票の作成日から転記日までの遅れは、請求伝票の社内処理に非効率な点があることを示す場合があります。 プロセスマイニングでは、転記日は請求書のライフサイクルにおける重要な節目となります。請求書の生成から転記までの時間は、請求部門の業務効率を測る重要業績評価指標となります。 重要な理由 財務上の重要な節目を示し、会計処理に欠かせない日付です。請求書の作成から転記までの時間は、社内処理の効率を測る重要な指標です。 入手先 SAP ECCテーブル:BKPF、項目:BUDAT 例 2023-04-152023-04-172023-05-21 | |||
| 通貨 Currency | 請求書に記載された金額の通貨コードです。 | ||
| 説明 この属性は、USD、EUR、JPYなど、取引に使用された通貨を示します。請求書の合計金額など、金額を正しく解釈するために必要な情報です。 多国籍組織のデータを分析する際、通貨項目は財務数値を正しく解釈し、換算するために欠かせません。一貫性のあるレポートを作成でき、適切な通貨換算をせずに金額を集計して誤った財務分析を行うことを防げます。 重要な理由 すべての金額を正しく解釈するための情報です。複数の通貨を扱う環境で、正確な財務分析に役立ちます。 入手先 SAP ECCテーブル:VBRK、項目:WAERK 例 USDEURGBPJPY | |||
受注から入金までの請求・請求書発行のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 請求書の消込完了 | 支払いが完了した請求書の最終状態です。対応する入金またはクレジットメモによって未決済明細が消し込まれ、請求書が全額決済されたことを示します。 | ||
| 重要な理由 請求書に関する受注から入金までのサイクルが完了したことを示します。請求書の平均サイクルタイム全体を測定する際の主な終了イベントです。 入手先 BSEGテーブルの請求書明細に、消込伝票(AUGBL)と消込日(AUGDT)が入力された時点で発生します。 記録 BSEGテーブルの請求書明細に記録された消込日(AUGDT)に発生します。 イベントタイプ explicit | |||
| 請求書の転記 | 請求書が売掛金補助元帳と総勘定元帳に正式に記録されます。このイベントにより請求書が法的に有効となり、顧客の債務として反映されます。 | ||
| 重要な理由 債権回収の起算点となる重要な節目です。請求書の作成から転記までの時間を分析すると、キャッシュフローに影響する社内処理の遅れを把握できます。 入手先 テーブルBKPFに記録されます。伝票番号(BELNR)の転記日付(BUDAT)が、このイベントの発生時点を示します。仮保存伝票の場合は、正式に転記された時点を指します。 記録 請求伝票のテーブルBKPFに記録された転記日付(BUDAT)を使用します。 イベントタイプ explicit | |||
| 請求書を顧客に送付 | 印刷、メール、EDIなど、定められた出力チャネルを通じて請求書が顧客に送付されたことを示します。通常は出力管理システムのログから記録します。 | ||
| 重要な理由 顧客の支払い条件に基づく期間の起点となる重要な節目です。ここでの遅れは、入金の見込み時期に直接影響し、債権回収の効率を左右します。 入手先 請求書に対応する出力タイプについて、メッセージステータステーブル(NAST)に記録された処理日時から推定できます。 記録 処理ステータスが「1」(正常に処理済み)のNASTテーブルのレコードから推定します。 イベントタイプ inferred | |||
| 請求書作成 | システムで請求伝票が作成されたことを示します。会計伝票ヘッダーテーブル(BKPF)に、請求書を示す特定の伝票タイプで新しいレコードが作成された時点で、このイベントを記録します。 | ||
| 重要な理由 請求書発行プロセス全体の開始点です。このイベントからの所要時間を分析すると、請求書作成のサイクルタイムを測定でき、売上債権回転日数(DSO)の算出にも役立ちます。 入手先 テーブルBKPFに記録されます。特定の伝票番号(BELNR)に対する作成日(CPUDT)と作成時刻(CPUTM)が、このイベントの発生時点を示します。伝票タイプ(BLART)で請求書かどうかを判別します。 記録 請求伝票のテーブルBKPFに記録された作成日時(CPUDT)を使用します。 イベントタイプ explicit | |||
| 顧客からの入金 | 顧客から入金があり、現金受領または銀行預金としてシステムに転記されたことを示します。この時点では、特定の請求書にはまだ消し込まれていない別個の入金伝票が作成されます。 | ||
| 重要な理由 現金化サイクルにおける重要な節目です。請求書の送付から入金までの時間は、売上債権回転日数(DSO)を構成する主な要素です。 入手先 通常、顧客からの入金を示す伝票タイプ(「DZ」など)で、BKPFとBSEGに新しい伝票として記録されます。転記日付(BUDAT)がイベントの発生時点を示します。 記録 BKPFに記録された顧客入金伝票の転記日付を使用します。 イベントタイプ explicit | |||
| 入金を請求書に消し込み | 受け取った顧客からの入金を特定の未決済請求書に照合して消し込み、明細を決済対象として処理します。入金と債務を結び付ける照合のステップです。 | ||
| 重要な理由 入金消込のサイクルタイムを測定するうえで重要なアクティビティです。消込が遅れると、売掛金の実際の状況が正しく反映されず、利用可能な現金も把握しにくくなります。 入手先 F-32などの消込トランザクションから推定します。この処理により請求書明細の消込項目が入力されます。イベントのタイムスタンプには消込日を使用します。 記録 請求書明細テーブル(BSEG)の消込日(AUGDT)が入力されたことから推定します。 イベントタイプ inferred | |||
| 支払いリマインダー送付 | 支払期日を過ぎた請求書について、システムが督促通知または支払いリマインダーを作成し、顧客に送付したことを示します。督促履歴ログから記録します。 | ||
| 重要な理由 債権回収施策の効果を評価できます。リマインダーの送付から入金までの時間を分析することは、支払いリマインダー効果の重要業績評価指標(KPI)を把握するうえで重要です。 入手先 督促データテーブル、具体的には督促実行(トランザクションF150)で作成されるMHNK(督促データヘッダー)とMHND(督促データ明細)に記録されます。 記録 支払期日を過ぎた明細に対して督促実行(F150)を行った時点で記録されます。 イベントタイプ explicit | |||
| 紛争案件の作成 | 通常は顧客からの苦情を受け、請求書に関する正式な紛争が登録されたことを示します。SAPの紛争管理システムに記録されます。 | ||
| 重要な理由 支払いが遅れるリスクのある請求書を特定し、顧客の不満につながる根本的な問題を明らかにします。重要な例外処理プロセスの開始点となります。 入手先 請求書の会計伝票に関連付けられた紛争案件テーブル(UDM_CASE)に、案件が作成された時点で記録します。 記録 ユーザーがトランザクションUDM_DISPUTEで紛争案件を作成した時点で記録されます。 イベントタイプ explicit | |||
| 請求書の仮保存 | 請求伝票が、総勘定元帳に転記されていない仮の状態で保存されています。情報が不足している場合や、正式な転記の前に確認が必要な場合に使われます。 | ||
| 重要な理由 転記前の手順と遅延の可能性を追跡します。仮保存の状態が長く続く場合、データ品質の問題や承認前のプロセスにおけるボトルネックが考えられます。 入手先 仮保存された伝票はテーブルVBKPFに保存されます。後に転記される伝票がこのテーブルに作成された時点を、該当するアクティビティとして記録します。 記録 FV70などのトランザクションを使って、仮保存伝票を保存した時点で記録されます。 イベントタイプ explicit | |||
| 請求書の承認 | 請求書が正式に承認され、転記または顧客への送付が可能になったことを示します。仮保存伝票が正式な転記伝票に変わった時点から、このイベントを推定する場合があります。 | ||
| 重要な理由 ボトルネックが発生しやすい社内承認ワークフローを追跡します。このアクティビティを分析すると、承認に時間がかかる担当者を特定でき、請求書承認フロー分析ダッシュボードに役立ちます。 入手先 VBKPFの仮保存状態からBKPFの転記済み状態への伝票の移行から推定できます。ワークフローシステムを使用している場合は、ワークフローログに明示的なイベントとして記録されていることもあります。 記録 仮保存伝票(VBKPF)の作成日と、最終伝票(BKPF)の転記日を比較します。 イベントタイプ inferred | |||
| 請求書の支払期日到来 | 支払い条件に基づき、請求書の支払期日を示す計算上のイベントです。ユーザーやシステムが実行するアクティビティではなく、重要な時点を表します。 | ||
| 重要な理由 支払い行動とコンプライアンスの分析に欠かせません。期日どおりの支払いと遅延支払いを判定する基準となり、期日内支払い率の重要業績評価指標(KPI)の算出にも使われます。 入手先 現在の日付と正味支払期日を比較して算出します。支払期日は項目BSEG-ZFBDTで確認するか、基準日と支払い条件から計算します。 記録 システム日付と、請求書明細(BSEG)の正味支払期日項目を比較します。 イベントタイプ calculated | |||
| 請求書の訂正 | 最初に作成した請求書に誤りが見つかり、その後取り消された場合の手戻りを示します。元の請求書に関連付けられた取消伝票を特定して記録します。 | ||
| 重要な理由 プロセスの非効率や品質上の問題を明らかにします。訂正が頻繁に発生する場合、上流の販売データや請求データに問題がある可能性があり、請求書の手戻りとエラー率ダッシュボードの分析に役立ちます。 入手先 BKPF-STBLGが元の伝票を参照する取消伝票を特定します。この取消伝票が作成された時点をイベントとして記録します。 記録 FB08などを使って取消伝票が作成された時点で記録されます。 イベントタイプ explicit | |||
| 請求書の貸倒処理 | 回収不能と判断された請求書の最終状態です。未回収額を貸倒勘定に振り替えて消し込みます。顧客からの入金がないまま請求書を終了します。 | ||
| 重要な理由 望ましくないプロセス結果であり、収益の損失を示します。これらのイベントを追跡すると、貸倒れの原因を分析し、与信管理方針の改善に役立てられます。 入手先 請求書の消込取引を分析して判定します。消込伝票が特定の貸倒費用総勘定元帳勘定に転記されている場合、その請求書は償却済みとみなされます。 記録 消込取引で指定された貸倒総勘定元帳勘定への転記が行われた場合に判定します。 イベントタイプ inferred | |||
データ抽出ガイド
ステップ
- 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)が必要です。また、
VBRK、VBRP、BKPF、BSEG、NAST、MHNK、および(紛争管理用の)UDM_CASE_ATTR00など、FIおよびSDのテーブルを読み取る権限が必要です。 - 日付範囲の選択:プログラムには必須の日付範囲パラメーターを設定します。通常は伝票作成日(VBRK/BKPFの
ERDAT)を基準にします。初回の抽出では、データ量を扱いやすくするため、3~6か月の範囲をおすすめします。 - 主なフィルター:抽出対象を絞るため、必ず
CompanyCode(BUKRS)でフィルターします。関連する請求書のみを対象にするには、請求伝票タイプ(VBRKのVBTYP)または会計伝票タイプ(BKPFのBLART)で絞り込むことも強くおすすめします。たとえば、標準的な会計請求書には「RV」を指定し、クレジットメモなどは除外します。 - パフォーマンスに関する考慮事項:数か月を超える大規模なデータを抽出する場合は、セッションタイムアウトを避けるため、プログラムをバックグラウンドジョブとして実行します。ABAPロジックでは、インデックスを使ったテーブル読み取りを行い、データベース選択を伴う入れ子のループを避けるよう最適化します。まず内部テーブルにデータを選択し、その後に処理する方法が推奨されます。
- 出力ファイルの設定:ABAPコードで、アプリケーションサーバー上の出力ファイルパスとCSVの区切り文字(通常はカンマまたはセミコロン)を指定します。パスには、全体で設定され、アクセス可能なディレクトリを指定してください。
クエリの例 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のアプリケーション層を介さずにデータを取得します。
- 権限:データベースユーザーには、クエリで使用するすべてのテーブルに対する
SELECT権限が必要です。対象テーブルはFI、SD、および場合によってはFSCMの各モジュールにまたがります。 - 日付範囲:適切なパフォーマンスとデータ量を保つため、特定の日付範囲でクエリを絞り込む必要があります。まずは3~6か月の期間をおすすめします。クエリ内の複数箇所にある日付フィルターのプレースホルダー
'YYYYMMDD'を設定してください。 - 会社コードのフィルター:このクエリでは、会社コード(
BUKRS)での絞り込みを想定しています。一度に分析する会社コードは、1つまたは少数に絞るのが一般的です。 - 伝票タイプの設定:請求書の修正、償却、送信済み伝票などのイベントを特定するロジックは、標準的なSAP設定に基づいています。組織で独自の伝票タイプ(
BLART)、出力タイプ(KSCHL)、またはこれらのプロセスに使う総勘定元帳勘定を設定している場合は、クエリの調整が必要になることがあります。 - パフォーマンスに関する考慮事項:稼働中のSAP本番システムでこのクエリを実行すると、多くのリソースを消費し、業務パフォーマンスに影響する可能性があります。大規模な抽出は、負荷の低い時間帯に実行するか、専用のデータベースレポート用レプリカで実行することを強くおすすめします。
クエリの例 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ツール(例:SAP Connectorを備えたInformatica PowerCenterやTalendなど)を用意します。必要な財務、販売、システムテーブル(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個のデータフローの出力を1つのデータセットにまとめます。統合する前に、すべてのフローで列名とデータ型が一致していることを確認します。
- 出力先を設定する:イベントログの最終的な出力先を定義します。フラットファイル(CSV)、データベーステーブル、またはステージング領域への直接接続を指定できます。
- 抽出スケジュールを設定する:抽出する日付範囲のパラメーターを設定します。初回の読み込みでは、6~12か月分のデータを抽出できます。以降の差分読み込みでは、前回の実行日以降のデータを抽出するように設定します。
- 実行してエクスポートする:ETLジョブを実行します。完了後、出力ファイルが必要な形式になっていることを確認します。最終出力は、各行が1つのイベントを表す単一のCSVファイルで、ProcessMindにアップロードできる状態です。
設定
- SAP接続:対象のSAP ECCシステムへのアプリケーションサーバー接続が必要です。SAPユーザーにはRFCアクセス権と、VBRK、BKPF、BSEG、NASTなど、クエリで指定されたテーブルへのアクセス権が必要です。
- ETLツールのライセンス:商用ETLツールと、そのSAPコネクターの有効なライセンスが必要です。
- 日付範囲:過度なシステム負荷を避けながら分析に適したサンプルを得るため、3~6か月分のデータを抽出することをおすすめします。開始日と終了日を設定できるパラメーターを使用してください。
- 主なフィルター:抽出対象を絞るため、必ず会社コード(BUKRS)でフィルターします。標準的な請求書のみを対象にし、クレジットメモや社内伝票などを除外するには、関連する請求伝票タイプ(VBRK-FKART)と会計伝票タイプ(BKPF-BLART)で絞り込むことも重要です。
- パフォーマンス:BSEGなどの大規模なテーブルからの抽出には時間がかかる場合があります。対象を絞るフィルターを使い、不要な項目の抽出を避け、SAPのソースシステムへの影響を抑えるため、負荷の低い時間帯に実行してください。
クエリの例 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 始める準備はできていますか?
このテンプレートを使ってデータ準備を効率化し、請求・請求書発行のプロセスに関するインサイトを見つけましょう。キャッシュフローの早期改善に向けて、今すぐ始められます。
キャッシュフローの早期改善へ:請求・請求書発行を今すぐ見直しましょう。
非効率な部分をなくし、サイクルタイムを30%短縮して、キャッシュフローを改善しましょう。
クレジットカードは不要です。数分で改善に取り組めます。