買掛金の支払処理向けデータテンプレート
買掛金の支払処理向けデータテンプレート
- 仕入先と支払いの分析に必要な主要属性
- 支払サイクルで記録すべき重要な節目
- SAP S/4HANA向けの専用抽出ロジック
買掛金の支払処理に関する属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ Activity | 請求書に記録された特定のタスク、またはイベントのステータス変更です。 | ||
| 説明 この属性は、請求書のライフサイクルで発生する個々のプロセスステップを表します。請求書の作成、転記、ブロック、承認、支払消込などのイベントを記録します。アクティビティ名は、ソースシステムに記録されたトランザクションコード、変更ログ、またはワークフローのステータス更新から取得します。 分析では、プロセスフローのバリアントをマッピングするために欠かせないフィールドです。プロセスマイニングエンジンでステップの順序を可視化し、手戻りのループを特定して、プロセスが標準的な理想経路から外れる箇所を把握できます。イベントログの中核となる要素です。 重要な理由 プロセスマップのノードを定義し、ワークフローとボトルネックを可視化できます。 入手先 トランザクションコード(TCODE)、または変更伝票ヘッダー(CDHDR)と明細(CDPOS)から取得 例 請求書の転記支払いブロックの設定支払実行請求書消込 | |||
| イベント時刻 EventTime | アクティビティが発生した正確なタイムスタンプです。 | ||
| 説明 イベント時刻は、アクティビティがSAPデータベースに記録された日時を示します。ケース内のイベントを時系列に並べるために必要な時間情報を提供します。このタイムスタンプは通常、システムログまたは伝票ヘッダーのCPU日付とCPU時刻のフィールドを組み合わせて作成します。 分析では、サイクルタイム、所要時間、処理量の計算に欠かせない属性です。請求書の受領から最終承認までにかかった時間など、ステップ間の時間差を測定できます。ボトルネックの特定や、請求書承認時間の平均などの重要業績評価指標(KPI)の評価に役立ちます。 重要な理由 イベントの時系列を示し、時間に基づくすべてのパフォーマンス計算の基礎となります。 入手先 SAPのBKPFテーブルのCPUDT(入力日)およびCPUTM(入力時刻)フィールド、またはCDHDRテーブルのUDATEおよびUTIMEフィールド 例 2023-10-12T08:30:00.000Z2023-10-12T14:15:22.000Z2023-10-15T09:00:00.000Z | |||
| 請求書番号 InvoiceNumber | 処理対象の仕入先請求書を一意に識別する番号です。 | ||
| 説明 請求書番号は、SAP S/4HANAシステムで買掛金項目のライフサイクルを追跡するための主キーです。具体的には、請求書を総勘定元帳に転記した際に生成される会計伝票番号を指します。SAPの標準用語では、特定の会社コードと会計年度における伝票番号(BELNR)に相当します。 プロセス分析では、この属性をケースIDとして使用します。請求書の受領や仮登録から、各種承認ブロックや変更を経て、最終的な支払消込に至るまで、個別に記録されたすべてのアクティビティを関連付けます。この番号でイベントをグループ化すると、支払債務ごとの一連の履歴を再構成できます。 重要な理由 確定的なケースIDとして機能し、支払プロセスの流れを最初から最後まで再構成できます。 入手先 SAPのBKPFテーブル(会計伝票ヘッダー)のBELNRフィールド、またはACDOCAテーブルのBELNRフィールド 例 1900000523510000289119000006015100003002 | |||
| ソースシステム SourceSystem | データの取得元であるSAP S/4HANAインスタンスの識別子です。 | ||
| 説明 この属性は、プロセスデータの抽出元となったERPのインストール環境またはクライアントを識別します。複数のSAPインスタンスや旧システムが並行稼働する環境では、データの来歴を維持し、システム間の比較を可能にします。 分析では、上位レベルのフィルターとして機能します。地域ごとに異なるシステム環境のパフォーマンスを比較する場合や、システム移行時にデータの整合性を検証する場合に、データを分けて確認できます。また、システム設定に起因するプロセスの違いを適切なコンテキストで捉えられます。 重要な理由 複数システムの環境でデータソースを区別し、正確なセグメント分けを可能にします。 入手先 SAPのインストール環境におけるシステムID(SY-SYSID) 例 SAP_PROD_01S4H_NA_100ERP_EU_200 | |||
| 最終データ更新 LastDataUpdate | レコードが最後に抽出または更新された日時を示すタイムスタンプです。 | ||
| 説明 最終データ更新は、データがプロセスマイニングプラットフォームに正常に読み込まれた時点を示します。業務イベントの発生時刻ではなく、データセットの更新状況を表します。分析ダッシュボードへの信頼を保つうえで重要です。 分析では、表示中の情報がどの時点のものかを把握するのに役立ちます。支払ブロック分析のようなほぼリアルタイムのダッシュボードを監視する場合に特に重要で、SAP S/4HANAシステムの最新状態に基づいた意思決定を支えます。 重要な理由 データの更新状況を示し、業務ダッシュボードの確認に役立ちます。 入手先 ETL/抽出処理によって生成 例 2023-10-27T23:59:59.000Z2023-11-01T06:00:00.000Z | |||
| ユーザー名 UserName | 特定のアクティビティを実行したユーザーのIDです。 | ||
| 説明 ユーザー名には、プロセスステップを実行した担当者またはシステムエージェントのログインIDが記録されます。データを入力するユーザーの場合もあれば、バックグラウンドジョブID(例:「BATCH_USER」)のように自動処理を実行する場合もあります。 この属性を使って、アクティビティの自動化率を計算できます。人間のユーザーとシステムアカウントを区別することで、プロセスの自動化レベルを測定できます。また、手動作業の分布を示すダッシュボードで、チームごとの作業負荷を評価する際にも使用します。 重要な理由 手動作業と自動処理を区別し、自動化率の計算を可能にします。 入手先 SAPのBKPFテーブルのUSNAMフィールド、またはCDHDRテーブルのUSERNAMEフィールド 例 BSMITHWF-BATCHRJONES | |||
| 人的介入なし IsTouchless | 請求書が手作業を介さずに処理されたかどうかを示す真偽値です。 | ||
| 説明 この属性は、ケースのイベントの流れを分析して算出します。自動処理のアクティビティ(例:「system」ユーザーによる処理や、特定のバックグラウンドTCODE)のみで構成され、手動変更やブロックがない場合、そのケースは人的介入なしと判定されます。 分析では、この属性を人的介入なしの請求書率を示す重要業績評価指標(KPI)の中心的な指標として使用します。自動化施策の効果を組織全体で追跡し、仕入先や地域などのケース種別ごとに、人の手を介さずシステム内を処理できているものを特定できます。 重要な理由 プロセスの自動化と効率を測る主要な指標です。 入手先 アクティビティの順序とユーザー種別に基づいて算出 例 truefalse | |||
| 仕入先番号 VendorNumber | 請求書に関連付けられた仕入先を一意に識別する番号です。 | ||
| 説明 仕入先番号は、SAP補助元帳における特定の債権者勘定に対応します。支払条件、銀行情報、連絡先情報を含むマスターデータと請求書を関連付けます。S/4HANAではビジネスパートナーの概念に関連付けられることが多い一方、多くのテーブルで従来のフィールド名LIFNRが引き続き使われています。 分析では、この属性は仕入先支払条件コンプライアンスのダッシュボードに欠かせません。仕入先ごとにプロセスのパフォーマンスを集計し、ブロック、価格差異、遅延が繰り返し発生する仕入先を特定できます。戦略的な調達の意思決定や仕入先との関係管理にも役立ちます。 重要な理由 仕入先ごとのパフォーマンス集計を可能にし、遅延の根本原因の特定に役立ちます。 入手先 SAPのBKPFテーブルのLIFNRフィールド、またはACDOCAテーブルのLIFNRフィールド 例 100050VEND-US-99200400 | |||
| 会社コード CompanyCode | 貸借対照表と損益計算書を作成する組織単位です。 | ||
| 説明 会社コードは、企業内で独立した会計単位を表します。外部会計における中心的な組織単位であり、財務データの構成に使用します。各請求書は、必ず1つの会社コードに割り当てられます。 分析では、この属性を使って法人または地域ごとに重要業績評価指標(KPI)を分けて確認できます。ダッシュボードで、子会社ごとに買掛金チームの効率を比較する際にも使用します。たとえば、特定の拠点で手動の支払ブロックが全社標準より多く発生しているかを特定できます。 重要な理由 法人ごとにプロセスを分け、社内ベンチマークを可能にします。 入手先 SAPのBKPFテーブルのBUKRSフィールド 例 US01DE1010002000 | |||
| 伝票タイプ DocumentType | 会計伝票を分類します(例:仕入先請求書、支払、クレジットメモ)。 | ||
| 説明 伝票タイプは、SAPで会計取引を分類する2文字のコードです。一般的なタイプには、仕入先請求書の「KR」、仕入先への支払の「KZ」、請求書受領総額の「RE」などがあります。伝票の番号範囲とフィールドステータスを決定します。 分析では、プロセスの対象範囲を絞り込むために使用します。たとえば、支払処理の効率だけを確認するために、クレジットメモを除外できます。また、処理対象となる取引タイプの内訳を把握し、プロセスバリアントの複雑さを示すダッシュボードにも役立ちます。 重要な理由 ケースを請求書とクレジットメモに分類し、対象を絞った分析を可能にします。 入手先 SAPのBKPFテーブルのBLARTフィールド 例 KRREKZKG | |||
| 支払ブロック理由 PaymentBlockReason | 請求書が支払ブロックされている理由を示すコードです。 | ||
| 説明 この属性には、自動支払実行の対象から請求書を除外する理由コードが記録されます。例として、支払ブロックを示す「A」、請求書照合を示す「R」、ユーザーが設定した手動ブロックなどがあります。 このフィールドは、手動支払ブロック分析のダッシュボードで主に使用します。ブロック理由ごとの発生頻度を集計すると、価格差異の頻発や入庫記録の不足など、支払処理を滞らせる組織的な問題を特定できます。 重要な理由 プロセスが停止する具体的な原因を特定し、対象を絞った根本原因分析を可能にします。 入手先 SAPのBSEGテーブルのZLSPRフィールド 例 ABR* | |||
| 支払条件 PaymentTerms | 合意した支払条件と割引条件を示すキーです。 | ||
| 説明 支払条件は、請求書の支払期日と早期支払割引の適用有無を定めます。このコード(例:「Z001」)は、「30日以内に全額支払」や「10日以内に支払えば2%割引、正味30日」などのルールに対応します。仕入先マスターから請求書に引き継がれますが、手動で変更することもできます。 この属性は、早期支払割引の最適化や仕入先支払条件コンプライアンスのダッシュボードで中心的な役割を果たします。基準となる支払期日を計算し、割引を得られる最適な期間内に支払われたかを特定できます。 重要な理由 支払予定と金銭的な優遇条件を定め、割引分析の基礎となります。 入手先 SAPのBSEGテーブルのZTERMフィールド 例 Z001NT300001 | |||
| 支払遅延 IsLatePayment | 支払期日を過ぎてから支払いが行われたかどうかを示す真偽値です。 | ||
| 説明 この計算属性は、消込日が正味支払期日より後の場合にtrueになります。プロセスのパフォーマンスを二値で判定するために使用します。 分析では、このフラグを使って、支払遅延ペナルティ発生頻度の重要業績評価指標(KPI)に該当するケース数を集計します。可視化の段階で複雑な日付計算を行わず、trueの件数を数えるだけで済むため、ダッシュボードを簡単に作成できます。 重要な理由 支払いが期日どおりに行われたかを示す重要業績評価指標(KPI)の計算を簡単にします。 入手先 計算式:消込日 > 正味支払期日 例 truefalse | |||
| 正味支払期日 NetDueDate | ペナルティを避けるために請求書を支払う必要がある計算上の日付です。 | ||
| 説明 正味支払期日は、支払の最終期限です。基準日に最大支払条件日数を加算して計算します。明示的に保存される場合もありますが、分析ビューで計算されることもよくあります。 分析では、支払遅延とペナルティの追跡における主な基準となります。実際の消込日と正味支払期日を比較して「支払遅延日数」を算出し、買掛金チームの効率や仕入先との関係悪化のリスクを把握できます。 重要な理由 プロセスの目標期限です。期限を過ぎると信用格付けに影響し、費用が発生します。 入手先 計算式:基準日+最大支払条件日数(ZBD1T/ZBD2T/ZBD3T) 例 2023-11-302023-12-01 | |||
| 消込日 ClearingDate | 支払によって請求書が消し込まれた日付です。 | ||
| 説明 消込日は、買掛金元帳の未消込明細が消し込まれた日付を記録します。通常は支払実行または手動の支払転記によって消し込まれ、債務の終了を示します。 分析では、プロセスの最終サイクルタイムの計算に使用します。「支払消込」アクティビティのタイムスタンプとして、正味支払期日と比較し、期日どおりに支払われたかを判定します。支払消込効率のダッシュボードにも直接反映されます。 重要な理由 支払プロセスの完了を示し、支払時期の評価に使用します。 入手先 SAPのBSEGテーブルまたはAUGDTフィールドのAUGDT 例 2023-11-012023-11-15 | |||
| 請求書金額 InvoiceAmount | 伝票通貨で記録された請求書の税込総額です。 | ||
| 説明 この属性は、ソース伝票に記録された請求書の金額を表します。仕入先に支払う必要のある債務額を示します。SAP S/4HANAでは通常、「伝票通貨額」フィールドに保存されます。 分析では、請求書金額を使って作業の優先順位を決めます。手動作業の分布などのダッシュボードでは、工数のかかる手動アクティビティが少額の請求書に費やされていないかを確認できます。金額の大きい取引ではプロセスの失敗による財務リスクも大きくなるため、組織は改善の取り組みを優先できます。 重要な理由 ケースの財務上の重要度を示し、金額の大きいプロセスの非効率を優先的に確認できます。 入手先 SAPのBKPFテーブルまたはBSEGテーブルのWRBTRフィールド 例 1500.00250.5010000.00 | |||
| 会計年度 FiscalYear | 請求書が属する会計年度です。 | ||
| 説明 会計年度は、財務報告に使用する期間です。会社コードおよび伝票番号とともに、SAPの財務伝票の複合主キーを構成します。 分析では、ケースを一意に識別するために必要な技術上の項目です。また、前年比の報告にも役立ちます。長年にわたるデータ履歴でも、「請求書番号」のケースIDが一意になるようにします。 重要な理由 SAP FIでケースを一意に識別するための技術要件です。 入手先 SAPのBKPFテーブルのGJAHRフィールド 例 20232024 | |||
| 基準日 BaselineDate | 支払条件の適用と支払期日の計算の起点となる日付です。 | ||
| 説明 基準日は、正味支払期日と現金割引期間を計算する起点です。設定や仕入先マスターデータに応じて、通常は請求書日付または転記日付が使われます。 分析では、「期限超過」ステータスの計算に必要な技術上の前提となります。基準日に誤りがあると、早すぎる支払いによるキャッシュフローへの影響や、支払遅延によるペナルティにつながることがあります。この日付の正確性の確認は、仕入先支払条件コンプライアンス分析の一部です。 重要な理由 すべての支払期日計算の起点となります。 入手先 SAPのBSEGテーブルのZFBDTフィールド 例 2023-10-012023-10-15 | |||
| 未取得の割引額 DiscountLostAmount | 利用できたものの、適用されなかった現金割引の金額です。 | ||
| 説明 この計算属性は、本来得られたはずの割引額を表します。支払いが割引期限を過ぎていたかを確認し、期限を過ぎていた場合は、請求書金額に割引率を適用して未取得の割引額を算出します。 分析では、早期支払割引の最適化における重要な財務指標です。プロセスの非効率による損失を金額で示し、改善の必要性を明確にできます。 重要な理由 プロセスの遅延による直接的な金銭的損失を数値化します。 入手先 計算式:消込日 > 割引日なら、請求書金額 × 割引率 例 30.000.00150.00 | |||
| 現金割引日数1 CashDiscountDays1 | 基準日から数えて、最初の現金割引が適用される期間の日数です。 | ||
| 説明 最も有利な支払条件が適用される期間を定めます(例:「2%割引、正味30日」の「10」)。請求書明細に保存された支払条件から取得します。 分析では、早期支払割引の最適化における「目標日」の判定に役立ちます。この期間内に請求書を消し込むと、割引が適用されます。このフィールドを使って、処理サイクルの遅れによる機会損失を測定できます。 重要な理由 金銭的な節約につながる機会の期間を定めます。 入手先 SAPのBSEGテーブルのZBD1Tフィールド 例 10140 | |||
| 現金割引率1 CashDiscountPercentage1 | 最初の割引期間内に支払った場合に適用される割引率です。 | ||
| 説明 この属性は、仕入先が早期支払に対して提示する金銭的な優遇率を表します(例:「2%割引、10日以内」の「2」)。 分析では、「現金割引の潜在額」の計算に使用します。この割合を請求書金額に掛けることで、プロセスの非効率によって得られなかった割引額をダッシュボードで可視化できます。自動化の投資対効果を検討する際にも役立ちます。 重要な理由 節約できる可能性のある割合を数値化し、投資対効果の計算に役立ちます。 入手先 SAPのBSEGテーブルのZBD1Pフィールド 例 2.03.00.0 | |||
| 購買伝票 PurchasingDocument | 請求書に関連付けられた購買発注番号です。 | ||
| 説明 この属性は、請求書を上流の調達プロセスに関連付けます。請求書との照合に使われる購買発注(PO)番号が記録されます。雑費など、PO参照のない請求書もあります。 このフィールドは、3点照合率の分析に欠かせません。POに基づく請求書とPOに基づかない請求書を分けて確認できます。通常、両者では承認ワークフローが大きく異なります。また、買掛金データと調達データを関連付け、プロセスを最初から最後まで分析できます。 重要な理由 買掛金と調達を関連付け、3点照合の分析とプロセス範囲の拡張を可能にします。 入手先 SAPのBSEGテーブルのEBELNフィールド 例 45000012344500009876 | |||
| 通貨 Currency | 請求書金額に適用される通貨コードです。 | ||
| 説明 通貨属性は、請求書金額の通貨単位(USD、EUR、GBPなど)を示します。財務数値を正しく解釈するために必要であり、複数の国際会社コードにまたがるデータを集計する際にも欠かせません。 分析では、財務上の重要業績評価指標(KPI)を正しく計算するために使用します。グローバルダッシュボードでは、報告通貨に換算する際にもよく使われます。この属性がないと、複数通貨の環境では総支出額や請求書の平均金額などの集計指標を正しく解釈できません。 重要な理由 財務金額の通貨を示し、グローバルな報告の正確性を支えます。 入手先 SAPのBKPFテーブルのWAERSフィールド 例 USDEURGBPJPY | |||
買掛金の支払処理に関するアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 支払いブロックの解除 | 以前設定された支払いブロックが解除され、請求書が支払い可能になったことを示します。BSEGのZLSPR項目が値ありからNULLまたは空欄に変わった場合に特定します。 | ||
| 重要な理由 明示的なワークフローログがないシステムでは、請求書の承認を示す代替指標として使われることがあります。ボトルネック期間の終了を示します。 入手先 CDPOSおよびCDHDRテーブルで、BSEG-ZLSPRが空欄に変わったことを確認します。 記録 CDPOSでZLSPRの削除記録時に記録 イベントタイプ explicit | |||
| 支払いブロックの設定 | 請求書の明細項目に支払いブロックが設定され、支払い処理の対象から除外されたことを示します。変更文書を通じてBSEGテーブルのZLSPR項目の変更を監視し、記録します。 | ||
| 重要な理由 支払いブロックは、支払い遅延やプロセスの停滞を招く主な原因です。手動支払いブロック分析ダッシュボードに直接反映されます。 入手先 CDPOSおよびCDHDRテーブル(変更文書)で、BSEG-ZLSPR項目の更新を確認します。 記録 CDPOSでZLSPRのレコード変更時に記録 イベントタイプ explicit | |||
| 支払伝票作成 | 銀行勘定を貸方、仕入先勘定を借方に記録する会計伝票の生成を示します。BKPFテーブルで、支払伝票タイプ(例:ZP、KZ)を使って確認できます。 | ||
| 重要な理由 支払が財務上実行されたことを示し、買掛金回転日数(DPO)の計算に使用します。 入手先 BKPFテーブル。支払に固有の伝票タイプ(BLART)で絞り込みます。 記録 BKPFの支払伝票作成時に記録 イベントタイプ explicit | |||
| 支払実行 | 支払実行の処理を示します。この処理では送金指示が生成されます。REGUHテーブルまたはREGUPテーブルのステータス更新によって追跡します。 | ||
| 重要な理由 支払を実行する業務上の確定時点です。支払の一括処理の効率を分析するうえで重要です。 入手先 REGUHテーブル。通常、実行日と識別情報を関連付けて確認します。 記録 支払実行のステータス更新時に記録 イベントタイプ explicit | |||
| 支払消込 | 仕入先勘定の未消込明細を支払と照合する最終消込を示します。BSEGテーブルのAUGDT(消込日)フィールドから取得します。 | ||
| 重要な理由 プロセスの最終状態を示し、処理が完了して帳簿が一致したことを表します。手動消込の割合が高い場合、照合に非効率が生じている可能性があります。 入手先 BSEGテーブルのAUGDTフィールド(消込日)。 記録 AUGDTフィールドへの入力時に記録 イベントタイプ explicit | |||
| 請求書の転記 | 総勘定元帳に債務を正式に記録したことを示します。このアクティビティは、BKPFテーブルの作成タイムスタンプ、またはACDOCAテーブルの入力日から取得します。 | ||
| 重要な理由 財務上の期間を測る主な起点です。支払期日や滞留期間分析のベースラインになります。 入手先 BKPFテーブルのCPUDT(入力日)およびCPUTM(入力時刻)。 記録 BKPFレコードの作成時に記録 イベントタイプ explicit | |||
| 価格差異を検出 | 請求書の価格と発注書の価格の不一致を示す推定アクティビティです。転記時に特定の支払いブロックキー(通常、請求書照合を示す「R」)が自動設定されたことから判定します。 | ||
| 重要な理由 手戻りの根本原因を特定し、3点照合率分析に役立ちます。 入手先 転記時のBSEG-ZLSPRの値「R」(または価格ブロックに関するシステム固有の設定)から推定します。 記録 ZLSPRの値が「R」かどうかを比較 イベントタイプ inferred | |||
| 支払い提案の作成 | 請求書が支払い提案の実行(F110)に含まれたことを示します。これは自動支払いプログラムの最初の段階です。決済データを保存するREGUHテーブルから取得します。 | ||
| 重要な理由 請求書が支払い対象に選ばれ、支払いプログラム内の有効性チェックに合格したことを示します。 入手先 REGUHテーブルの作成タイムスタンプ(キー:LAUFD、LAUFI)。 記録 REGUHレコードの作成時に記録 イベントタイプ explicit | |||
| 支払い条件の変更 | 未決済の請求書に設定された支払い条件の更新を記録します。支払期日や割引の適用可否が変わる場合があります。BSEGテーブルのZTERM項目の変更ログを通じて追跡します。 | ||
| 重要な理由 頻繁な変更は、マスターデータの誤りや手動上書きの可能性を示します。資金繰り予測や仕入先支払い条件のコンプライアンスに影響することがあります。 入手先 CDPOSおよびCDHDRテーブルで、BSEG-ZTERM項目の更新を確認します。 記録 CDPOSでZTERMのレコード変更時に記録 イベントタイプ explicit | |||
| 数量差異を検出 | 請求書の数量と入庫数量の不一致を示す推定アクティビティです。明細項目に特定の支払いブロックキー(通常、数量差異を示す「M」)が設定されたことから判定します。 | ||
| 重要な理由 照合の効率とサプライチェーンのデータ品質を分析するうえで重要です。 入手先 BSEG-ZLSPRの値「M」(または数量ブロックに関するシステム固有の設定)から推定します。 記録 ZLSPRの値が「M」かどうかを比較 イベントタイプ inferred | |||
| 現金割引の適用期限切れ | 現金割引の適用期限が切れた日を示す計算イベントです。割引の支払期日と現在の日付または支払日を比較して算出します。 | ||
| 重要な理由 早期支払い割引最適化で、失われた割引機会を可視化するために必要です。 入手先 計算式:BSEG-ZFBDT + BSEG-ZBD1T(割引日数1)。 記録 日付と割引支払期日の比較から算出 イベントタイプ calculated | |||
| 請求書の仮登録 | 請求書がSAPに入力されたものの、総勘定元帳にはまだ転記されていない状態を示します。通常、予備的なデータ入力に使われます。VBKPFテーブルから直接取得するか、BKPFで転記前の仮登録ステータスコードが設定された伝票を特定します。 | ||
| 重要な理由 仮登録はデータ入力段階の開始を示し、請求書の受領から債務の計上までの遅れを測るのに役立ちます。 入手先 仮登録伝票のヘッダーデータを含むVBKPFテーブル、または特定の伝票ステータス(BSTAT = V)が設定されたBKPF。 記録 VBKPFのレコード作成時に記録 イベントタイプ explicit | |||
| 請求書の支払期日 | 請求書の正味支払期日に達した時点を示す計算済みタイムスタンプです。BSEGテーブルの基準日に支払い条件の日数を加算して算出します。 | ||
| 重要な理由 期日どおりの支払い実績と支払い遅延違約金トラッカーの基準点になります。 入手先 計算式:BSEG-ZFBDT(基準日)+ BSEG-ZBD1T/ZBD2T/ZBD3T(日数)。 記録 現在の日付と正味支払期日の比較から算出 イベントタイプ calculated | |||
| 請求書取消 | 請求書伝票が取り消されたことを示します。BKPFテーブルのSTBLG(取消伝票)フィールドを確認して取得します。 | ||
| 重要な理由 手戻りやプロセスの失敗を示し、無駄や重複作業の可能性を特定します。 入手先 BKPFテーブルのSTBLGフィールドが空でない場合。 記録 STBLGフィールドへの入力時に記録 イベントタイプ explicit | |||
データ抽出ガイド
ステップ
必要なCDSビューの確認:標準のSAP S/4HANA CDSビューが利用できることを確認します。主に必要となるビューは、I_JournalEntry(ヘッダー)、I_OperationalAcctgDocItem(明細、BSEG相当)、I_SupplierInvoice(ロジスティクス)、I_PaymentProposalItem(F110)、I_ChangeDocument(変更ログ用)です。
ユーザー権限の設定:データベースユーザーまたは技術サービスユーザーに、CDSエンティティに関連付けられたDDL SQLビューへのSELECT権限があることを確認します。通常、SAP HANA StudioまたはABAP Eclipse Development Tools(ADT)で設定します。
SQL環境の準備:SQLインターフェース(SAP HANA Studio、HANAに接続したDBeaver、SQLに対応するプロセスマイニングコネクターなど)を開きます。この方法では、CDSビューがビューとして公開されているHANAレイヤーに直接SQLでアクセスできることを前提とします。
対象範囲の指定:データ量を抑えるため、会社コード(CompanyCode)と会計年度の範囲を指定します。Operational Accounting Document Itemビューを照会する際のパフォーマンス確保に欠かせません。
アクティビティのロジック設定:以下のSQLクエリをコピーします。このクエリはUNION ALLを使い、異なる14個のロジックブロックを1つのイベントログ構造にまとめます。各ブロックは、請求書転記や支払消込など、特定のアクティビティを対象とします。
変更伝票の処理:クエリには、支払条件の変更とブロック操作に関する処理が含まれています。これらはI_ChangeDocumentビューを参照します。使用中のS/4リリースでこのビューが有効でない場合は、基になるテーブル(CDHDR/CDPOS)をカスタムCDSビューでラップする必要があります。
計算イベントの確認:「請求書支払期日」と「現金割引の未取得」のロジックを確認します。これらは、業務明細ビューにある基準日に日数を加算して生成される計算イベントです。
データの抽出:クエリを実行します。大規模なデータセットでは、メモリ不足を避けるため、会計年度または会社コードごとに分割して抽出することを強く推奨します。
日付形式の確認:EventTime列がYYYY-MM-DD HH:MM:SS形式であることを確認します。SAP HANA SQLが返すタイムスタンプは、連携先のアプリケーションによっては型変換が必要です。
データのエクスポート:結果をCSVまたはParquetファイルとして保存します。ヘッダーが最終SELECT文で定義された列名と一致していることを確認します。
アップロード用の変換:プロセスマイニングツールで特定のCSV形式(日付のマスキングなど)が必要な場合は、後処理スクリプトまたはSQLのTO_VARCHAR関数で変換します。
最終確認:サンプルデータをProcessMindに読み込み、ケースID(請求書番号)で転記から消込までのすべてのアクティビティが正しくまとまることを確認します。
設定
- 会社コードのフィルター:対象の組織単位(CompanyCode = '1000')にクエリを限定し、コンテキストとパフォーマンスを保ちます。
- 日付範囲:PostingDateまたはCreationDate(例:直近12か月)で絞り込み、データ量を調整します。
- 勘定タイプ:I_OperationalAcctgDocItemをFinancialAccountType = 'K'(仕入先)で絞り込み、総勘定元帳と得意先の明細を除外します。
- CDSビューの有効化:I_JournalEntry、I_OperationalAcctgDocItem、I_PaymentProposalItemが有効で、SQLアクセス用にリリースされていることを確認します。
- 変更ログのパフォーマンス:I_ChangeDocumentの照会はリソースを多く消費する場合があります。ObjectClass 'BELEG'とZLSPR、ZTERMなどの特定のフィールド名でサブクエリを絞り込みます。
クエリの例 sql
/* SAP S/4HANA CDS View Extraction for Accounts Payable */
/* Combined Event Log Query */
/* 1. Invoice Parked */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Parked' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
JE.CreatedByUser AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
CASE WHEN JE.CreationDateTime > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) THEN 'True' ELSE 'False' END AS IsLatePayment,
'False' AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K' -- Vendor
AND JE.AccountingDocumentCategory = 'V' -- Parked Document
UNION ALL
/* 2. Invoice Posted */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Posted' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
JE.CreatedByUser AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
'False' AS IsLatePayment,
CASE WHEN JE.CreatedByUser = 'BATCH_USER' THEN 'True' ELSE 'False' END AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JE.AccountingDocumentCategory <> 'V' -- Exclude Parked
UNION ALL
/* 3. Price Variance Detected (Inferred at Posting) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Price Variance Detected' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.PaymentBlockingReason = 'R' -- Standard SAP Price Variance Block Key
UNION ALL
/* 4. Quantity Variance Detected (Inferred at Posting) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Quantity Variance Detected' AS Activity,
JE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
JEItem.PaymentBlockingReason AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.PaymentBlockingReason = 'M' -- Standard SAP Quantity Variance Block Key
UNION ALL
/* 5. Payment Block Applied (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Block Applied' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
CD.NewValue AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZLSPR'
AND CD.OldValue IS NULL AND CD.NewValue IS NOT NULL
UNION ALL
/* 6. Payment Block Removed (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Block Removed' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZLSPR'
AND CD.OldValue IS NOT NULL AND (CD.NewValue IS NULL OR CD.NewValue = '')
UNION ALL
/* 7. Payment Terms Changed (via Change Document) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Terms Changed' AS Activity,
CD.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
CD.NewValue AS PaymentTerms,
NULL AS PaymentBlockReason,
CD.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_ChangeDocument AS CD
JOIN I_JournalEntry AS JE ON CD.ObjectValue = CONCAT(JE.CompanyCode, JE.AccountingDocument)
JOIN I_OperationalAcctgDocItem AS JEItem ON JE.AccountingDocument = JEItem.AccountingDocument AND JE.CompanyCode = JEItem.CompanyCode
WHERE CD.ObjectClass = 'BELEG'
AND CD.TableName = 'BSEG'
AND CD.FieldName = 'ZTERM'
UNION ALL
/* 8. Invoice Due (Calculated) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Due' AS Activity,
TO_TIMESTAMP(ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays))) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) < CURRENT_DATE
UNION ALL
/* 9. Cash Discount Lost (Calculated) */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Cash Discount Lost' AS Activity,
TO_TIMESTAMP(ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.CashDiscount1Days))) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.CashDiscount1Days > 0
AND (JEItem.ClearingDate IS NULL OR JEItem.ClearingDate > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.CashDiscount1Days)))
UNION ALL
/* 10. Payment Proposal Created */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Proposal Created' AS Activity,
PPI.ProposalRunDate AS EventTime, -- Often just a date, cast to timestamp if needed
JE.CompanyCode,
PPI.Supplier AS VendorNumber,
PPI.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PPI.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_PaymentProposalItem AS PPI
JOIN I_JournalEntry AS JE
ON PPI.CompanyCode = JE.CompanyCode
AND PPI.AccountingDocument = JE.AccountingDocument
AND PPI.FiscalYear = JE.FiscalYear
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JEItem.FinancialAccountType = 'K'
UNION ALL
/* 11. Payment Run Executed */
/* Derived from existence in payment tables with a run ID */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Run Executed' AS Activity,
PPI.PaymentRunDate AS EventTime,
JE.CompanyCode,
PPI.Supplier AS VendorNumber,
PPI.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PPI.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_PaymentProposalItem AS PPI
JOIN I_JournalEntry AS JE
ON PPI.CompanyCode = JE.CompanyCode
AND PPI.AccountingDocument = JE.AccountingDocument
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
WHERE PPI.PaymentRunID IS NOT NULL
UNION ALL
/* 12. Payment Document Created */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Document Created' AS Activity,
PayJE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
PayJE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
PayJE.CreatedByUser AS UserName,
PayJE.PostingDate AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
JOIN I_JournalEntry AS PayJE
ON JEItem.ClearingJournalEntry = PayJE.AccountingDocument
AND JEItem.ClearingJournalEntryFiscalYear = PayJE.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.ClearingJournalEntry IS NOT NULL
UNION ALL
/* 13. Payment Cleared */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Payment Cleared' AS Activity,
TO_TIMESTAMP(JEItem.ClearingDate) AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
'System' AS UserName,
JEItem.ClearingDate,
ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) AS NetDueDate,
CASE WHEN JEItem.ClearingDate > ADD_DAYS(JEItem.DocumentItemDate, TO_INTEGER(JEItem.NetPaymentDays)) THEN 'True' ELSE 'False' END AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JEItem.ClearingDate IS NOT NULL
UNION ALL
/* 14. Invoice Reversed */
SELECT
JE.OriginalReferenceDocument AS InvoiceNumber,
'Invoice Reversed' AS Activity,
RevJE.CreationDateTime AS EventTime,
JE.CompanyCode,
JEItem.Supplier AS VendorNumber,
JEItem.AmountInTransactionCurrency AS InvoiceAmount,
JE.AccountingDocumentType AS DocumentType,
JEItem.PaymentTerms,
NULL AS PaymentBlockReason,
RevJE.CreatedByUser AS UserName,
NULL AS ClearingDate,
NULL AS NetDueDate,
NULL AS IsLatePayment,
NULL AS IsTouchless,
'S4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM I_JournalEntry AS JE
JOIN I_OperationalAcctgDocItem AS JEItem
ON JE.CompanyCode = JEItem.CompanyCode
AND JE.AccountingDocument = JEItem.AccountingDocument
AND JE.FiscalYear = JEItem.FiscalYear
JOIN I_JournalEntry AS RevJE
ON JE.ReverseDocument = RevJE.AccountingDocument
AND JE.ReverseDocumentFiscalYear = RevJE.FiscalYear
WHERE JEItem.FinancialAccountType = 'K'
AND JE.ReverseDocument IS NOT NULL ステップ
- ACDOCA、BKPF、BSEG、VBKPF、REGUH、REGUP、および該当する変更伝票テーブルを含むSAP HANAスキーマに、SQLで直接アクセスできることを確認します。[Your SAP HANA schema]と接続情報は、システムで承認された値に置き換えてください。
- 請求書の対象範囲とレポート期間を確認します。[Start date]と[End date]にはYYYYMMDD形式で日付を指定し、[Company code filter]にはBUKRS IN ('1000','2000')など、有効なSQL条件を設定します。
- SAPのリリースと、保留伝票、支払プログラムのステータス項目、支払伝票タイプ、変更伝票の保存方法に関するローカル設定を確認します。クエリでは文書化されたソースオブジェクトと保守的なフィールド対応を使用していますが、本番利用の前に、ローカル拡張やリリースによる違いを確認する必要があります。
- 承認済みのSQLクライアントまたは抽出サービスを使って、SAP HANAにクエリを実行します。明示的に抽出したアクティビティごとにイベント行が1行作成されます。結果に含まれないアクティビティをProcessMindが推測して補うことはありません。
- ソースデータを確認し、保留ステータス、支払伝票タイプ、支払提案と支払実行のステータス、変更伝票のオブジェクトクラスに関する設定条件を調整します。重複した会計伝票や無関係な伝票との照合を行わずに、条件の範囲を広げないでください。
- InvoiceNumber、CompanyCode、会計年度、会計伝票番号、仕入先番号、明細項目を使って結合を検証します。対象システムで、BKPF、BSEG、ACDOCA、REGUH、REGUP間の請求書伝票番号の表記が一貫していることを確認します。
- 計算イベントを照合します。「請求書支払期日」は計算上の正味支払期日に生成されます。「現金割引の未取得」は、その期限までに支払いがなかった場合に、該当する最も早い割引期限に生成されます。これらは導出された行であり、ソースレコードのイベントと明確に区別してください。
- 結果をフラットなUTF-8 CSV、またはProcessMindが対応する他の表形式でエクスポートします。InvoiceNumber、Activity、EventTime、SourceSystem、LastDataUpdateの列名は正確に維持してください。イベントごとに1行とし、請求書単位でアクティビティを集約しないでください。
- イベントログをProcessMindにアップロードし、InvoiceNumberをケース識別子、Activityをアクティビティ名、EventTimeをイベントタイムスタンプとして割り当てます。残りの列は、ProcessMindのインポート設定に従ってイベント属性またはケース属性に割り当ててください。
設定
- 日付範囲:初回の抽出では、直近3~6か月を対象にします。転記日、変更日、支払プログラムの日付条件を一貫して適用し、支払条件が長いケースを検証する場合は期間を広げます。
- スキーマ:[Your SAP HANA schema]を、SAPオブジェクトを所有するスキーマに置き換えます。選択したスキーマからクライアント依存のオブジェクトにアクセスできるか、クライアント条件を明示する必要があるかを確認します。
- 会社コードによる絞り込み:[Company code filter]を設定して、BUKRSを必要な会社コードに限定します。該当するフィールドがある場合は、BKPF、BSEG、ACDOCA、REGUH、REGUP、変更伝票の各ソースにも同じ範囲を適用します。
- 伝票の絞り込み:請求書の伝票タイプ条件と支払伝票タイプ条件を確認します。クエリには一般的な例が含まれますが、伝票タイプは設定によって異なるため、対象システムに合わせる必要があります。
- 保留請求書:VBKPFまたはBKPFでの保留伝票ステータスの表現を確認します。リリースや実装によってステータスコードが異なる場合があるため、クエリでは設定可能な保留ステータス条件を使用します。
- 支払いの変更:BSEG-ZLSPRとBSEG-ZTERMについて、変更伝票のオブジェクトクラス、テーブル名、フィールド名、値の表現を確認します。変更伝票の保存方法とフィールド名は、対象システムで検証してください。
- 支払プログラム:REGUHとREGUPで、提案と実行のステータス、実行日、実行ID、会計伝票との関連付けに使うフィールドを確認します。ローカルの支払プログラム設定によって、利用できるステータス値が異なる場合があります。
- パフォーマンス:日付範囲と会社コードを絞り、必要な列だけを選択して、結合の前にソースごとのフィルターを適用します。大規模なデータセットでは、絞り込んだソースデータを実体化するか、承認済みのHANA計算ビューまたは抽出スキーマを使用します。
- 権限:関連するSAP HANAスキーマオブジェクトと、会計、支払プログラム、変更伝票のデータを公開するビューへの読み取り権限が必要です。SAPセキュリティチームおよびデータガバナンスチームと調整してください。
- 機能上の前提条件:該当する財務会計、買掛金、支払プログラム、変更伝票の機能が有効で、データが登録されている必要があります。実装でソーステーブルを使用していない場合は、システム設計に基づき、承認済みの代替ソースを設定してください。
- タイムスタンプの処理:BKPFとBSEGでは、日付と時刻が別々のフィールドで提供されることが一般的です。クエリではこれらを組み合わせてタイムスタンプを作成します。ソースシステムのタイムゾーンを確認し、ProcessMindへのアップロード前に必要な変換を適用してください。
- データ保護:仕入先データと会計データは承認された範囲に限定し、組織の保存期間、マスキング、アクセスに関するポリシーを適用してください。
クエリの例 sql
WITH
params AS (
SELECT
TO_DATE('[Start date]', 'YYYYMMDD') AS start_date,
TO_DATE('[End date]', 'YYYYMMDD') AS end_date,
'[Source system identifier]' AS source_system
FROM DUMMY
),
base_bkpf AS (
SELECT
b.MANDT,
b.BUKRS,
b.BELNR,
b.GJAHR,
b.BLART,
b.BLDAT,
b.BUDAT,
b.CPUDT,
b.CPUTM,
b.USNAM,
b.STBLG,
b.STJAH,
b.XBLNR,
b.WAERS,
b.BKTXT,
p.source_system,
p.start_date,
p.end_date
FROM [Your SAP HANA schema].BKPF b
CROSS JOIN params p
WHERE b.BUDAT BETWEEN TO_VARCHAR(p.start_date, 'YYYYMMDD') AND TO_VARCHAR(p.end_date, 'YYYYMMDD')
AND [Company code filter]
),
invoice_bseg AS (
SELECT
k.MANDT,
k.BUKRS,
k.BELNR,
k.GJAHR,
k.BLART,
k.BLDAT,
k.BUDAT,
k.CPUDT,
k.CPUTM,
k.USNAM,
k.STBLG,
k.STJAH,
k.XBLNR,
k.WAERS,
k.BKTXT,
k.source_system,
s.BUZEI,
s.LIFNR,
s.WRBTR,
s.DMBTR,
s.ZTERM,
s.ZLSPR,
s.ZFBDT,
s.ZBD1T,
s.ZBD2T,
s.ZBD3T,
s.AUGDT,
s.AUGBL,
s.SHKZG,
s.SGTXT,
s.XREF1,
s.XREF2,
s.XREF3
FROM base_bkpf k
INNER JOIN [Your SAP HANA schema].BSEG s
ON s.MANDT = k.MANDT
AND s.BUKRS = k.BUKRS
AND s.BELNR = k.BELNR
AND s.GJAHR = k.GJAHR
WHERE s.LIFNR IS NOT NULL
AND s.LIFNR <> ''
),
acdoca_invoice AS (
SELECT
a.RCLNT AS MANDT,
a.RBUKRS AS BUKRS,
a.BELNR,
a.GJAHR,
a.BUZEI,
a.RACCT,
a.HSL,
a.WSL,
a.RWCUR,
a.BUDAT,
a.BLDAT,
a.AUGDT,
a.AUGBL
FROM [Your SAP HANA schema].ACDOCA a
WHERE a.BUDAT BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
AND [ACDOCA company code filter]
),
invoice_cases AS (
SELECT DISTINCT
i.MANDT,
i.BUKRS,
i.BELNR,
i.GJAHR,
i.BUZEI,
i.LIFNR,
i.WRBTR,
i.ZTERM,
i.ZLSPR,
i.ZFBDT,
i.ZBD1T,
i.ZBD2T,
i.ZBD3T,
i.AUGDT,
i.AUGBL,
i.BLART,
i.BLDAT,
i.BUDAT,
i.CPUDT,
i.CPUTM,
i.USNAM,
i.STBLG,
i.STJAH,
i.XBLNR,
i.WAERS,
i.source_system,
COALESCE(NULLIF(i.XBLNR, ''), i.BELNR) AS InvoiceNumber,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD3T, '')), 0)) AS NetDueDate,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD1T, '')), 0)) AS DiscountDueDate1,
ADD_DAYS(TO_DATE(COALESCE(NULLIF(i.ZFBDT, ''), i.BLDAT), 'YYYYMMDD'), COALESCE(TO_INTEGER(NULLIF(i.ZBD2T, '')), 0)) AS DiscountDueDate2
FROM invoice_bseg i
LEFT JOIN acdoca_invoice a
ON a.MANDT = i.MANDT
AND a.BUKRS = i.BUKRS
AND a.BELNR = i.BELNR
AND a.GJAHR = i.GJAHR
AND a.BUZEI = i.BUZEI
),
change_events AS (
SELECT
c.MANDT,
c.OBJECTID,
c.TABKEY,
c.FNAME,
c.VALUE_OLD,
c.VALUE_NEW,
c.UDATE,
c.UTIME,
c.USERNAME
FROM [Your SAP HANA schema].[Your change document item table name] c
WHERE c.TABNAME = 'BSEG'
AND c.FNAME IN ('ZLSPR', 'ZTERM')
AND c.UDATE BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
AND [Change document object class filter]
),
reguh_events AS (
SELECT
r.MANDT,
r.LAUFD,
r.LAUFI,
r.XVORL,
r.ZBUKR,
r.LIFNR,
r.VBLNR,
r.AUSFD,
r.AUSDT,
r.LAUFD AS RunDate,
r.ZALDT,
r.RZAWE,
r.XEINZ,
r.XPGRO,
r.XAVIS,
r.XVORL AS ProposalIndicator
FROM [Your SAP HANA schema].REGUH r
WHERE r.LAUFD BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
),
regup_events AS (
SELECT
u.MANDT,
u.LAUFD,
u.LAUFI,
u.ZBUKR,
u.LIFNR,
u.VBLNR,
u.BUKRS,
u.BELNR,
u.GJAHR,
u.BUZEI,
u.XVORL,
u.AUGBL,
u.AUGDT
FROM [Your SAP HANA schema].REGUP u
WHERE u.LAUFD BETWEEN TO_VARCHAR((SELECT start_date FROM params), 'YYYYMMDD')
AND TO_VARCHAR((SELECT end_date FROM params), 'YYYYMMDD')
),
events AS (
SELECT
i.InvoiceNumber,
'Invoice Parked' AS Activity,
TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
i.source_system AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
i.LIFNR AS VendorNumber,
i.BUKRS AS CompanyCode,
i.WRBTR AS InvoiceAmount,
i.BLART AS DocumentType,
i.ZTERM AS PaymentTerms,
i.ZLSPR AS PaymentBlockReason,
i.USNAM AS UserName,
i.AUGDT AS ClearingDate,
i.NetDueDate,
CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END AS IsLatePayment,
FALSE AS IsTouchless
FROM invoice_cases i
INNER JOIN [Your SAP HANA schema].VBKPF v
ON v.MANDT = i.MANDT
AND v.BUKRS = i.BUKRS
AND v.BELNR = i.BELNR
AND v.GJAHR = i.GJAHR
WHERE [VBKPF parked status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Posted', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i
UNION ALL
SELECT i.InvoiceNumber, 'Payment Block Applied', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, c.VALUE_NEW, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZLSPR' AND COALESCE(c.VALUE_OLD, '') = '' AND COALESCE(c.VALUE_NEW, '') <> ''
UNION ALL
SELECT i.InvoiceNumber, 'Price Variance Detected', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.ZLSPR = 'R'
UNION ALL
SELECT i.InvoiceNumber, 'Quantity Variance Detected', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.ZLSPR = 'M'
UNION ALL
SELECT i.InvoiceNumber, 'Payment Terms Changed', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, c.VALUE_NEW, i.ZLSPR, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZTERM'
UNION ALL
SELECT i.InvoiceNumber, 'Payment Block Removed', TO_TIMESTAMP(c.UDATE || LPAD(COALESCE(c.UTIME, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, c.VALUE_OLD, c.USERNAME, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN change_events c ON c.OBJECTID = i.BELNR AND c.FNAME = 'ZLSPR' AND COALESCE(c.VALUE_OLD, '') <> '' AND COALESCE(c.VALUE_NEW, '') = ''
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Due', TO_TIMESTAMP(TO_VARCHAR(i.NetDueDate, 'YYYYMMDD') || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.NetDueDate IS NOT NULL
UNION ALL
SELECT i.InvoiceNumber, 'Cash Discount Lost', TO_TIMESTAMP(TO_VARCHAR(CASE WHEN i.DiscountDueDate1 <= i.DiscountDueDate2 THEN i.DiscountDueDate1 ELSE i.DiscountDueDate2 END, 'YYYYMMDD') || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.AUGDT IS NULL OR i.AUGDT > CASE WHEN i.DiscountDueDate1 <= i.DiscountDueDate2 THEN i.DiscountDueDate1 ELSE i.DiscountDueDate2 END
UNION ALL
SELECT i.InvoiceNumber, 'Payment Proposal Created', TO_TIMESTAMP(r.RunDate || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN regup_events u ON u.BUKRS = i.BUKRS AND u.BELNR = i.BELNR AND u.GJAHR = i.GJAHR AND u.BUZEI = i.BUZEI INNER JOIN reguh_events r ON r.MANDT = u.MANDT AND r.LAUFD = u.LAUFD AND r.LAUFI = u.LAUFI AND r.LIFNR = u.LIFNR WHERE [Payment proposal status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Payment Run Executed', TO_TIMESTAMP(r.RunDate || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN regup_events u ON u.BUKRS = i.BUKRS AND u.BELNR = i.BELNR AND u.GJAHR = i.GJAHR AND u.BUZEI = i.BUZEI INNER JOIN reguh_events r ON r.MANDT = u.MANDT AND r.LAUFD = u.LAUFD AND r.LAUFI = u.LAUFI AND r.LIFNR = u.LIFNR WHERE [Payment run executed status predicate]
UNION ALL
SELECT i.InvoiceNumber, 'Payment Document Created', TO_TIMESTAMP(p.CPUDT || LPAD(COALESCE(p.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, p.BLART, i.ZTERM, i.ZLSPR, p.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i INNER JOIN [Your SAP HANA schema].BKPF p ON p.MANDT = i.MANDT AND p.BUKRS = i.BUKRS AND p.BELNR = i.AUGBL AND p.GJAHR = i.GJAHR WHERE p.BLART IN ('ZP', 'KZ')
UNION ALL
SELECT i.InvoiceNumber, 'Payment Cleared', TO_TIMESTAMP(i.AUGDT || '000000', 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.AUGDT IS NOT NULL
UNION ALL
SELECT i.InvoiceNumber, 'Invoice Reversed', TO_TIMESTAMP(i.CPUDT || LPAD(COALESCE(i.CPUTM, '000000'), 6, '0'), 'YYYYMMDDHH24MISS'), i.source_system, CURRENT_TIMESTAMP, i.LIFNR, i.BUKRS, i.WRBTR, i.BLART, i.ZTERM, i.ZLSPR, i.USNAM, i.AUGDT, i.NetDueDate, CASE WHEN i.AUGDT IS NOT NULL AND i.AUGDT > i.NetDueDate THEN TRUE ELSE FALSE END, FALSE
FROM invoice_cases i WHERE i.STBLG IS NOT NULL AND i.STBLG <> ''
)
SELECT
InvoiceNumber,
Activity,
EventTime,
SourceSystem,
LastDataUpdate,
VendorNumber,
CompanyCode,
InvoiceAmount,
DocumentType,
PaymentTerms,
PaymentBlockReason,
UserName,
ClearingDate,
NetDueDate,
IsLatePayment,
IsTouchless
FROM events
WHERE EventTime IS NOT NULL
ORDER BY InvoiceNumber, EventTime, Activity; 始める準備はできていますか?
財務データを改善につながるインサイトに変え、支払サイクルの最適化を始めましょう。プロセスマイニングの導入を、各段階でサポートします。
SAP S/4HANAの買掛金支払い処理を改善
ボトルネックを解消し、サイクルタイムを30%短縮します。
クレジットカード不要。5分で設定できます。