受注から入金まで:請求・請求書発行のデータテンプレート
受注から入金まで:請求・請求書発行のデータテンプレート
- 詳細な分析に推奨される属性
- 追跡すべき主要なプロセスステップと節目
- SAP ECCからデータを抽出するための具体的なガイダンス
受注から入金まで:請求・請求書発行の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ ActivityName | 請求書のライフサイクルで発生した業務イベントまたはステップの名称です。 | ||
| 説明 この属性は、「請求書が作成される」「請求書が転記される」「顧客から入金される」など、請求プロセスにおける特定のアクションやステータス変更を示します。アクティビティは、さまざまなシステムイベント、伝票のステータス変更、ユーザーが実行した特定のトランザクションコードから概念的に導出されます。 これらのアクティビティの順序がプロセスフローを形成し、プロセスマイニング分析の基礎になります。アクティビティを調べることで、組織はどのステップがどの順序で、どの頻度で実行されているかを把握し、設計されたプロセスと実際の実行状況の違いを明らかにできます。 重要な理由 プロセスマップ上のステップを定義し、プロセスフロー、逸脱、ボトルネックを可視化・分析できます。 入手先 トランザクションコード(CDHDR-TCODE)、伝票ステータスの変更(VBUK-FKSTK)、会計伝票の転記など、複数の情報源から導出される概念上の属性です。 例 請求書が作成される請求書が転記される支払督促が発行される請求書が消し込まれる | |||
| 請求書番号 InvoiceNumber | 請求伝票を一意に識別する番号で、請求書発行プロセスの主なケースIDとして機能します。 | ||
| 説明 SAPで請求伝票番号と呼ばれる請求書番号は、各請求書を一意に識別します。プロセスマイニングではCaseIdとして機能し、作成、転記、送付、入金、消込など、関連するすべてのアクティビティを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における独立した法人・会計単位を表します。請求書を含むすべての財務取引は、特定の会社コードに転記されます。基本的な組織データ要素の1つです。 プロセスマイニングでは、企業内の異なる法人間で請求プロセスのパフォーマンスを分析・比較するために使います。ある法人のベストプラクティスを他の法人に適用できるかを検討し、企業の組織構造に沿った分析を行えます。 重要な理由 異なる法人間でプロセスをフィルタリングして比較できます。財務分析と組織間のベンチマーキングに欠かせない機能です。 入手先 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 | |||
| 手戻り IsRework | アクティビティが手戻りまたは修正の工程であるかを示すフラグです。 | ||
| 説明 「請求書修正」や伝票の取消など、手戻りに該当するアクティビティを特定する計算属性です。通常は、アクティビティ名、または修正・取消に関連する取引コードから真偽値として算出します。請求伝票を取り消す「VF11」などが該当します。 プロセスマイニングでは、請求プロセスで発生する手戻りの量を定量化するうえで非常に役立ちます。請求書修正率などのKPIを直接支援し、プロセスマップ上で手戻りループを可視化できます。これにより、業務コストの増加や支払いの遅延につながる非効率や品質上の問題を把握できます。 重要な理由 エラー修正にどれだけの作業が費やされているかを示し、プロセスの非効率や品質上の問題を定量化します。手戻りKPIの算出にも直接役立ちます。 入手先 アクティビティ名または取引コードから算出します。例:IF ActivityName = 'Invoice Corrected' OR TransactionCode = 'VF11' THEN true ELSE false。 例 truefalse | |||
| 支払条件 PaymentTerms | 販売者が販売を完了する際の条件で、支払スケジュールなどが含まれます。 | ||
| 説明 支払条件は、「Net 30」や「Net 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はこの属性から直接計算できます。 重要な理由 自動請求率の計算を直接支援し、プロセス効率の測定や自動化プロジェクトの効果の追跡に役立ちます。 入手先 ユーザー名属性から算出します。ロジックは次のようになります:IF UserName IN ('BATCH', 'SYSTEM', 'RFCUSER') THEN true ELSE false。 例 truefalse | |||
| 請求書支払期日 InvoiceDueDate | 顧客が支払いを行う予定の日付です。 | ||
| 説明 請求書支払期日は、支払条件で定められた支払いの期限です。売上債権を管理し、回収業務を開始するうえで基本となる日付です。 実際の支払日と比較することで、期日どおりの支払率KPIを計算できます。支払期日ごとに請求書を分析すると、キャッシュフローを予測し、近日中に期限を迎える支払いや期限超過の支払いに対する回収の優先順位を決められます。通常は基準日と支払条件から算出します。 重要な理由 期日どおりの支払実績を測る基準となり、売上債権の管理やキャッシュフロー予測に欠かせません。 入手先 基準日(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 | 伝票を財務会計帳簿に転記した日付です。 | ||
| 説明 転記日付は、取引を総勘定元帳に記録する会計期間を決定します。会計処理や財務レポートにおいて重要な日付です。伝票の作成日と転記日付の間に遅延がある場合、請求書処理における社内業務の非効率を示している可能性があります。 プロセスマイニングの観点では、転記日付は請求書ライフサイクルの重要な節目となります。請求書の作成から転記までの時間差は、請求部門の処理効率を測る重要なKPIです。 重要な理由 財務処理上の重要な節目を示し、会計処理に欠かせません。請求書の作成から転記までの時間差は、社内処理の効率を測る重要な指標です。 入手先 SAP ECCテーブル:BKPF、フィールド:BUDAT 例 2023-04-152023-04-172023-05-21 | |||
| 通貨 Currency | 請求書に記載された金額の通貨コードです。 | ||
| 説明 USD、EUR、JPYなど、取引に使用される通貨を示す属性です。請求書合計金額など、金額データを解釈するために必要な情報を提供します。 多国籍の組織からデータを分析する場合、財務数値を正しく解釈・換算するうえで通貨フィールドは欠かせません。通貨換算を行わずに金額を集計すると財務分析を誤る可能性がありますが、このフィールドにより、レポートの一貫性を保ち、正確な分析を行えます。 重要な理由 すべての金額データを正しく解釈するために必要な情報を提供し、複数通貨の環境でも正確な財務分析を可能にします。 入手先 SAP ECCテーブル:VBRK、フィールド:WAERK 例 USDEURGBPJPY | |||
受注から入金まで:請求・請求書発行のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 請求書が作成される | システム上で請求伝票が作成されたことを示します。請求書用の特定の伝票タイプで、会計伝票ヘッダー・テーブル(BKPF)に新しいエントリが作成された時点で、このイベントを取得します。 | ||
| 重要な理由 請求書発行プロセス全体の開始点です。このイベントからの経過時間を分析することで、請求書作成サイクル時間を測定し、売上債権回転日数(DSO)を算出する基礎にできます。 入手先 テーブルBKPFに記録されます。特定の伝票番号(BELNR)に対する作成日(CPUDT)と作成時刻(CPUTM)がこのイベントを示します。伝票タイプ(BLART)によって請求書であることを識別します。 取得 請求書伝票について、テーブルBKPFの作成タイムスタンプ(CPUDT)から取得します。 イベントタイプ explicit | |||
| 請求書が消し込まれる | 支払またはクレジットメモによって未消込明細がクローズされた、支払済み請求書の最終ステータスです。請求書が完全に決済されたことを示します。 | ||
| 重要な理由 請求書に関する受注から入金までのサイクルが正常に完了したことを示します。請求書サイクル時間の全体平均を測定する際の主な終了イベントです。 入手先 BSEGテーブルの請求書明細に、消込伝票(AUGBL)と消込日(AUGDT)が設定された時点で発生します。 取得 BSEGテーブルの請求書明細に記録された消込日(AUGDT)に発生します。 イベントタイプ explicit | |||
| 請求書が転記される | 請求書が売掛金補助元帳と総勘定元帳に正式に記録されます。このイベントにより請求書が法的に有効となり、顧客の債務が反映されます。 | ||
| 重要な理由 回収期間の起点となる重要なマイルストーンです。作成から転記までの時間から、キャッシュフローに影響する社内処理の遅延を把握できます。 入手先 テーブルBKPFに記録されます。伝票番号(BELNR)の転記日(BUDAT)がこのイベントを示します。仮保存された伝票の場合は、転記済み伝票に変換された時点です。 取得 請求書伝票について、テーブルBKPFの転記日(BUDAT)から取得します。 イベントタイプ explicit | |||
| 請求書が顧客に送付される | 印刷、メール、EDIなど、定義された出力チャネルを通じて請求書が顧客に送付されたことを示します。通常は、出力管理システムのログから取得します。 | ||
| 重要な理由 顧客の支払条件に基づく支払期間の起点となる重要なマイルストーンです。ここでの遅延は、入金が見込まれる時期に直接影響し、入金回収効率にも影響します。 入手先 請求書に対応する出力タイプについて、メッセージステータス・テーブル(NAST)に記録された処理日時から推定できます。 取得 処理ステータスが「1」(正常に処理済み)のNASTテーブルエントリから推定します。 イベントタイプ inferred | |||
| 顧客から入金される | 顧客から入金があり、現金受領または銀行預金としてシステムに転記されたことを示します。請求書にはまだ消し込まれていない、個別の入金伝票が作成されます。 | ||
| 重要な理由 キャッシュコンバージョンサイクルにおける主要なマイルストーンです。請求書の送付から入金までの時間は、売上債権回転日数(DSO)の主要な構成要素です。 入手先 通常、顧客入金を示す伝票タイプ(「DZ」など)で、BKPFとBSEGに新しい伝票として記録されます。転記日(BUDAT)がイベントを示します。 取得 顧客入金伝票のBKPFに記録された転記日から取得します。 イベントタイプ explicit | |||
| 入金が請求書に消し込まれる | 受け取った顧客入金が特定の未消込請求書と照合され、消込対象として適用されたことを示します。入金と債務を関連付ける照合ステップです。 | ||
| 重要な理由 入金消込サイクル時間の測定に欠かせないアクティビティです。入金消込の遅延により、実際の売掛金の状況が正しく反映されず、利用可能な現金が見えなくなる可能性があります。 入手先 請求書明細の消込項目に値を設定するF-32などの消込トランザクションから推定します。イベントのタイムスタンプには消込日を使用します。 取得 請求書明細テーブル(BSEG)の消込日(AUGDT)に値が設定されたことから推定します。 イベントタイプ inferred | |||
| 支払督促が発行される | システムが、支払期日を過ぎた請求書について督促通知または支払リマインダーを作成し、顧客に送付したことを示します。督促履歴のログから取得します。 | ||
| 重要な理由 回収戦略の効果を評価するのに役立ちます。督促から入金までの時間を分析することは、支払督促効果KPIの算出に重要です。 入手先 督促データ・テーブル、具体的には督促データヘッダーのMHNKと督促データ明細のMHNDに記録されます。これらは督促実行(トランザクションF150)によって生成されます。 取得 支払期日を過ぎた明細に対して督促実行(F150)を実行した時点で記録されます。 イベントタイプ explicit | |||
| 紛争案件が作成される | 通常は顧客からの苦情を理由として、請求書に対する正式な紛争が登録されたことを示します。SAP Dispute Managementシステムに記録されます。 | ||
| 重要な理由 支払遅延のリスクがある請求書を特定し、顧客満足度の低下につながる根本的な問題を明らかにします。重要な例外対応プロセスの開始点となります。 入手先 請求書の会計伝票に関連付けられた紛争案件テーブル(UDM_CASE)で、案件が作成された時点から取得します。 取得 ユーザーがトランザクションUDM_DISPUTEを使って紛争案件を作成した時点で記録されます。 イベントタイプ explicit | |||
| 請求書が仮保存される | 請求書伝票が総勘定元帳に転記される前の仮の状態で保存されています。情報が不足している場合や、最終転記前に確認が必要な場合によく使われます。 | ||
| 重要な理由 転記前の手順と遅延の可能性を追跡します。仮保存状態が長く続く場合、データ品質の問題や事前承認プロセスのボトルネックを示している可能性があります。 入手先 仮保存された伝票はテーブルVBKPFに保存されます。後で転記される伝票がここで作成されたことが、このアクティビティを示します。 取得 FV70などのトランザクションを使って仮保存された伝票を保存した時点で記録されます。 イベントタイプ explicit | |||
| 請求書が償却される | 請求不能と判断された請求書について、未回収額を貸倒勘定に振り替えて消し込む、別の最終ステータスです。顧客からの入金なしで請求書をクローズします。 | ||
| 重要な理由 プロセス上の望ましくない結果と収益損失を示します。これらのイベントを追跡することで、貸倒れの理由を分析し、与信管理方針を改善できます。 入手先 請求書の消込トランザクションを分析して推定します。消込伝票が特定の貸倒損失G/L勘定に転記されている場合、請求書は償却されたと判断します。 取得 消込トランザクションが指定された貸倒損失G/L勘定への転記を伴う場合に推定します。 イベントタイプ inferred | |||
| 請求書が承認される | 請求書が正式に承認され、転記または顧客への送付が可能になったことを示します。通常は、仮保存された伝票が転記済み伝票に変換された時点から推定します。 | ||
| 重要な理由 社内承認ワークフローを追跡します。承認ワークフローは、ボトルネックが発生しやすい箇所です。このアクティビティを分析することで、承認に時間がかかっている担当者を特定し、Invoice Approval Flow Analysisダッシュボードを支援できます。 入手先 VBKPFの仮保存ステータスからBKPFの転記済みステータスへの伝票の遷移から推定できます。ワークフローシステムを使用している場合は、ワークフローのログに明示的なイベントとして記録されることもあります。 取得 仮保存伝票(VBKPF)の作成日と、最終伝票(BKPF)の転記日を比較します。 イベントタイプ inferred | |||
| 請求書が訂正される | 最初に作成した請求書に誤りが見つかり、その後取り消された場合の手戻りアクティビティを示します。元の請求書に関連付けられた取消伝票を特定して取得します。 | ||
| 重要な理由 プロセスの非効率と品質上の問題を明らかにします。訂正の頻度が高い場合、上流の販売データや請求データに問題があることを示しており、Invoice Rework And Error Ratesダッシュボードの分析に役立ちます。 入手先 BKPF-STBLGが元の伝票を指している取消伝票を特定します。この取消伝票の作成がイベントとなります。 取得 FB08などを使って取消伝票が作成された時点で記録されます。 イベントタイプ explicit | |||
| 請求書の支払期日を迎える | 支払条件に基づき、請求書の支払期日となる日を示す計算上のイベントです。ユーザーやシステムが実行するアクティビティではなく、重要な時点を示します。 | ||
| 重要な理由 支払行動とコンプライアンスの分析に欠かせません。期日どおりの支払いと遅延支払いを判定し、期日内支払率KPIを算出する基準になります。 入手先 現在日と正味支払期日を比較して導出します。支払期日は、項目BSEG-ZFBDTに記録されるか、基準日と支払条件から算出されます。 取得 システム日付と、請求書明細(BSEG)の正味支払期日項目を比較します。 イベントタイプ calculated | |||
抽出ガイド
ステップ
- ABAP Editorにアクセス:SAP ECCシステムにログインします。トランザクションコード
SE38を使ってABAP Editorを開きます。 - プログラムを作成:Programフィールドに新しいプログラム名を入力します。例:
Z_PM_O2C_INVOICE_EXTRACT。その後、Createボタンをクリックします。説明的なタイトルを入力し、プログラムのTypeに「Executable Program」を設定します。 - Selection Screenを定義:プログラムのソースコードでSelection Screenのパラメータを定義します。これにより、抽出するデータを絞り込めます。主なパラメータは、伝票作成日の範囲(
S_ERDAT)、会社コード(S_BUKRS)、請求伝票タイプ(S_VBTYP)です。 - データ構造を定義:最終的なイベントログデータを格納する内部テーブル構造を宣言します。この構造には、
InvoiceNumber、ActivityName、EventTimeのほか、UserName、BillingDocumentType、CustomerNumber、CompanyCode、TotalInvoiceAmountなどの推奨属性を含めます。 - データ選択ロジックを実装:データを選択するABAPの中核ロジックを記述します。まず、Selection Screenで指定された条件に基づき、
VBRKとBKPFから主要な請求伝票を選択します。選択結果は一時的な内部テーブルに格納します。 - アクティビティを抽出:最初に取得した請求伝票の一覧をループ処理します。各伝票について、複数のテーブルから追加のデータを選択し、必要な13のアクティビティを特定します。たとえば、「Invoice Sent To Customer」イベントには
NAST、「Invoice Cleared」や「Payment Applied」などの消込情報にはBSEG、「Payment Reminder Issued」などの督促データには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(Dispute Management用)など、FIおよびSDのテーブルを読み取る権限も必要です。 - 日付範囲の選択:プログラムには、通常は伝票作成日(VBRK/BKPFの
ERDAT)に基づく必須の日付範囲パラメータを設定します。初回の抽出では、データ量を抑えるため、3~6か月の範囲を推奨します。 - 主なフィルター:抽出範囲を限定するため、必ず会社コード(
BUKRS)で絞り込みます。請求伝票タイプ(VBRKのVBTYP)または会計伝票タイプ(BKPFのBLART)で絞り込み、標準的な会計請求書(例:「RV」)だけを対象にし、クレジットメモなどの伝票を除外することも強く推奨します。 - パフォーマンスに関する考慮事項:数か月を超える大規模なデータを扱う場合は、セッションタイムアウトを避けるため、プログラムをバックグラウンドジョブとして実行します。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]:Dispute Managementの設定で請求書番号の保存に使う属性名を指定します。例:「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認定Connectorを備えたライセンス済みのETLツール(例:SAP Connector対応のInformatica PowerCenter、SAP Connector対応の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」を固定値として設定し、日付とタイムスタンプを正しい形式に整えます。
- 複雑なアクティビティに対応:「Invoice Due Date Reached」などの計算イベントでは、基準支払日(ZFBDT)と支払条件のロジックを使って支払期日を計算するか、BSEGから正味支払期日(NETDT)を取得します。「Invoice Approved」など変更ログから導出するイベントでは、伝票番号と日付に基づき、BKPFとCDHDR/CDPOSを結合する必要がある場合があります。
- アクティビティデータを統合:ETLツールの「Union」または「Merge」変換を使い、13個の個別データフローの出力を1つのデータセットにまとめます。Unionの前に、すべてのフローで列名とデータ型が一致していることを確認します。
- 出力先を設定:イベントログの最終的な出力先を定義します。フラットファイル(CSV)、データベーステーブル、ステージング領域への直接接続などを指定できます。
- 抽出スケジュールを設定:抽出の日付範囲パラメータを設定します。初回ロードでは6~12か月分を抽出し、以降の差分ロードでは前回の実行日以降のデータを抽出する設定にします。
- 実行してエクスポート:ETLジョブを実行します。完了後、出力ファイルが必要な形式になっていることを確認します。最終的な出力は、各行が1つのイベントを表す単一のCSVファイルで、ProcessMindにアップロードできる状態にします。
設定
- SAP接続:対象のSAP ECCシステムへのアプリケーションサーバー接続が必要です。SAPユーザーには、VBRK、BKPF、BSEG、NASTなど、クエリで指定されたテーブルへのRFCアクセス権と権限が必要です。
- ETLツールのライセンス:商用ETLツールと、そのSAP Connectorに対する有効なライセンスが必須です。
- 日付範囲:システム負荷を過度に高めず、分析に適したサンプルを確保するため、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 始める準備はできていますか?
このテンプレートを使ってデータ準備を効率化し、請求・請求書発行プロセスに関する価値ある情報を見つけ出してください。キャッシュフローを早期に改善する取り組みを、今すぐ始められます。
キャッシュフローを早期に改善:請求・請求書発行を今すぐ最適化
非効率をなくし、サイクルタイムを30%短縮して、キャッシュフローを改善します。
クレジットカードは不要です。数分で最適化を開始できます。