買掛金支払処理のデータテンプレート
買掛金支払処理のデータテンプレート
- 仕入先と支払分析に必要な主要属性
- 支払サイクルにおける重要なプロセス上の節目
- 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 | |||
| タッチレス処理 IsTouchless | 請求書が手動介入なしで処理されたかどうかを示すブール値フラグです。 | ||
| 説明 この属性は、ケースのイベントストリームを分析して計算します。ケースに自動処理のアクティビティ(例:「system」ユーザーや特定のバックグラウンドTCODE)だけが含まれ、手動変更やブロックがない場合、タッチレスとして記録されます。 分析では、タッチレス請求書率KPIの中核指標になります。自動化施策の成果を追跡し、仕入先や地域などのケースタイプ別に、人の操作なしでシステムを通過できているかを特定できます。 重要な理由 プロセスの自動化と効率を測る主要な指標です。 入手先 アクティビティの順序とユーザー種別に基づいて計算 例 truefalse | |||
| ユーザー名 UserName | 特定のアクティビティを実行したユーザーのIDです。 | ||
| 説明 ユーザー名は、プロセスステップの実行を担当した人物またはシステムエージェントのログインIDを記録します。データを入力する手動ユーザーの場合もあれば、自動タスクを実行するバックグラウンドジョブID(例:「BATCH_USER」)の場合もあります。 分析では、人のユーザーとシステムアカウントを区別し、アクティビティ自動化率を計算できます。手動作業と自動処理の割合を測定できるほか、手動タッチポイント分布ダッシュボードでチームごとの作業量を評価する際にも使われます。 重要な理由 手動作業と自動処理を区別し、自動化率の計算を可能にします。 入手先 SAPテーブルBKPFのUSNAMフィールド、またはCDHDRのUSERNAMEフィールド 例 BSMITHWF-BATCHRJONES | |||
| 仕入先番号 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 | 基準日から数えて、最初の現金割引が適用される期間の日数です。 | ||
| 説明 この属性は、最も有利な支払条件が適用される期間を定義します(例:「10日以内2%割引、30日後払い」の「10」)。請求書明細に保存された条件から取得されます。 分析では、早期支払割引オプティマイザーの「目標日」を判定するために使います。この期間内に請求書を消し込めば、割引を受けられます。処理サイクルの遅延による機会費用の測定にも役立ちます。 重要な理由 金銭的な削減機会が得られる期間を定義します。 入手先 SAPテーブルBSEGのZBD1Tフィールド 例 10140 | |||
| 現金割引率1 CashDiscountPercentage1 | 最初の割引期間内に支払った場合に適用される割引率です。 | ||
| 説明 この属性は、仕入先が早期支払に対して提示する金銭的なメリットの率を示します(例:「10日以内2%」の「2」)。 分析では、「潜在的現金割引」金額の計算に使います。この率を請求書金額に掛けることで、プロセスの非効率によって取り逃している金額をダッシュボードで可視化し、自動化の必要性を示す根拠にできます。 重要な理由 削減可能な金額の率を定量化し、ROIの計算に役立ちます。 入手先 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 | |||
| 支払を消込 | 仕入先勘定の未決済項目が支払と照合され、消し込まれたことを示す最終照合です。BSEGテーブルのAUGDT(消込日)フィールドから取得します。 | ||
| 重要な理由 プロセスの最終状態であり、ライフサイクルが完了して帳簿の残高が一致したことを示します。手動消込率が高い場合は、照合業務に非効率があることを示します。 入手先 BSEGテーブルのAUGDT(消込日)フィールド。 取得 AUGDTフィールドへの入力時に記録 イベントタイプ explicit | |||
| 支払伝票を作成 | 銀行を貸方、仕入先を借方とする会計伝票の生成を示します。支払伝票タイプ(例:ZP、KZ)が設定されたBKPFから取得します。 | ||
| 重要な理由 支払が財務上実現したことを示し、買掛金回転日数(DPO)の計算に使用します。 入手先 支払に固有の伝票タイプ(BLART)でBKPFテーブルを絞り込みます。 取得 BKPFの支払伝票作成時に記録 イベントタイプ explicit | |||
| 支払処理を実行 | 送金指示が生成される支払処理の実行を示します。REGUHまたはREGUPテーブルのステータス更新で追跡します。 | ||
| 重要な理由 支払いを実行する業務上の確約であり、支払の一括処理の効率を分析するうえで重要です。 入手先 REGUHテーブルで、通常は処理日と識別情報を関連付けて確認します。 取得 支払処理のステータス更新時に記録 イベントタイプ explicit | |||
| 請求書を転記 | 総勘定元帳に債務を正式に記録することを示します。BKPFテーブルの作成タイムスタンプ、またはACDOCAテーブルの入力日から取得します。 | ||
| 重要な理由 財務上のタイムラインの主な起点となり、支払期日と経過日数分析の基準を設定します。 入手先 BKPFテーブルのCPUDT(入力日)とCPUTM(入力時刻)を使用します。 取得 BKPFレコードの作成時に記録 イベントタイプ explicit | |||
| 価格差異を検出 | 請求書価格と発注価格の不一致を示す推定アクティビティです。通常、転記時に請求書照合用のPayment Block Key(通常は「R」)が自動設定されることから判定します。 | ||
| 重要な理由 手動でのやり直しの根本原因を特定し、三者照合率分析を支援します。 入手先 転記時のBSEG-ZLSPRの値「R」(または価格ブロックに関するシステム固有の設定)から推定します。 取得 ZLSPRの値を「R」と比較 イベントタイプ inferred | |||
| 支払提案を作成 | 請求書が支払提案の実行(F110)に含まれたことを示します。これは自動支払プログラムの最初の手順です。決済データを保存するREGUHテーブルから取得します。 | ||
| 重要な理由 請求書が支払対象として選択され、支払プログラム内の検証チェックに合格したことを示します。 入手先 REGUHテーブルの作成タイムスタンプ(LAUFDおよびLAUFIキー)。 取得 REGUHレコードの作成時に記録 イベントタイプ explicit | |||
| 支払条件を変更 | 未決済請求書の支払条件が更新され、支払期日または割引の適用可否が変わったことを記録します。BSEGテーブルのZTERMフィールドに対する変更ログで追跡します。 | ||
| 重要な理由 変更が頻繁に発生する場合、マスターデータの誤りや手動上書きが疑われ、キャッシュフロー予測と仕入先支払条件のコンプライアンスに影響します。 入手先 CDPOSおよびCDHDRテーブルで、BSEG-ZTERMフィールドの更新を確認します。 取得 CDPOSレコードのZTERM変更時に記録 イベントタイプ explicit | |||
| 数量差異を検出 | 請求数量と入庫数量の不一致を示す推定アクティビティです。明細行に数量差異用のPayment Block Key(通常は「M」)が設定されることから判定します。 | ||
| 重要な理由 照合効率とサプライチェーンのデータ品質を分析するうえで欠かせません。 入手先 BSEG-ZLSPRの値「M」(または数量ブロックに関するシステム固有の設定)から推定します。 取得 ZLSPRの値を「M」と比較 イベントタイプ inferred | |||
| 現金割引を失効 | 現金割引の適用資格が失効した日付を示す計算済みイベントです。割引期日と現在の日付または支払日を比較して算出します。 | ||
| 重要な理由 早期支払割引オプティマイザーで失われた金銭的機会を可視化するために必要です。 入手先 計算式:BSEG-ZFBDT + BSEG-ZBD1T(割引日数1)。 取得 日付と割引期日を比較して算出 イベントタイプ calculated | |||
| 請求書の支払期日 | 請求書が正味支払期日に達した時点を示す計算済みのタイムスタンプです。BSEGテーブルの基準日に支払条件の日数を加算して算出します。 | ||
| 重要な理由 期日どおりの支払パフォーマンスと支払遅延損害金トラッカーの基準点になります。 入手先 計算式:BSEG-ZFBDT(基準日)+ BSEG-ZBD1T/ZBD2T/ZBD3T(日数)。 取得 現在の日付と正味支払期日を比較して算出 イベントタイプ calculated | |||
| 請求書を保留 | 請求書がSAPに入力されたものの、総勘定元帳にはまだ転記されていない状態を示します。通常は仮入力に使われます。VBKPFテーブルから明示的に取得するか、転記済みへ移行する前に、BKPFで保留ステータスコードが設定された伝票を特定して記録します。 | ||
| 重要な理由 保留はデータ入力段階の開始を示し、受領から財務上の債務が発生するまでの遅延時間を測定するのに役立ちます。 入手先 保留伝票のヘッダーデータにはVBKPFテーブルを使用します。または、特定の伝票ステータス(BSTAT = V)が設定されたBKPFを使用します。 取得 VBKPFエントリの作成時に記録 イベントタイプ explicit | |||
| 請求書を取消 | 請求書伝票が取消または無効化されたことを示します。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)と会計年度の範囲を決めます。運用会計伝票明細ビューを照会する際の性能確保に欠かせません。
アクティビティロジックを実装:以下に示す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に読み込み、Case ID(請求書番号)によって転記から消込までのすべてのアクティビティが正しくグループ化されることを確認します。
設定
- 会社コードフィルター:特定の組織単位(CompanyCode = '1000')にクエリを限定し、対象範囲と性能を維持します。
- 日付範囲:PostingDateまたはCreationDate(例:過去12か月)にフィルターを適用し、データ量を管理します。
- 勘定タイプ:I_OperationalAcctgDocItemをFinancialAccountType = 'K'(仕入先)でフィルターし、総勘定元帳と得意先の明細を除外します。
- CDSビューの有効化:I_JournalEntry、I_OperationalAcctgDocItem、I_PaymentProposalItemが有効で、SQLアクセス用にリリースされていることを確認します。
- 変更ログの性能:I_ChangeDocumentへの照会はリソースを大量に消費する場合があります。ObjectClassを'BELEG'に限定し、ZLSPRやZTERMなど特定の項目名でサブクエリを絞り込みます。
a サンプルクエリ 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間で一貫して表現されていることを確認します。
- 計算イベントを照合します。Invoice Dueは計算上の正味支払期限に生成され、Cash Discount Lostは、その期限より前に支払が行われなかった場合に、該当する最も早い割引期限に生成されます。これらは派生行であり、ソースレコードのイベントと明確に区別してください。
- 結果をフラットな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の項目を確認します。ローカルの支払プログラム設定によって、利用できるステータス値が変わる場合があります。
- 性能:日付範囲と会社コードを限定し、必要な列だけを選択して、結合前にソース固有のフィルターを適用します。大規模なデータセットでは、フィルター済みのソースサブセットをマテリアライズするか、承認済みのHANA Calculation Viewまたは抽出スキーマを使用します。
- 権限:関連するSAP HANAスキーマオブジェクトと、会計、支払プログラム、変更伝票のデータを公開するビューへの読み取り権限が必要です。SAPセキュリティチームおよびデータガバナンスチームと調整してください。
- 機能上の前提条件:関連する財務会計、買掛金、支払プログラム、変更伝票の機能が有効で、データが登録されている必要があります。実装でソーステーブルを使用していない場合は、システム設計に基づく承認済みの代替ソースを設定します。
- タイムスタンプ処理:BKPFとBSEGでは、日付と時刻が別々の項目で提供されることが一般的です。クエリはこれらを組み合わせてタイムスタンプを作成します。ソースシステムのタイムゾーンを確認し、ProcessMindへのアップロード前に必要な変換を適用します。
- データ保護:仕入先データと会計データを承認された範囲に限定し、組織の保持、マスキング、アクセスに関するポリシーを適用します。
a サンプルクエリ 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分で設定できます。