決算・レポーティング:仕訳伝票のデータテンプレート
決算・レポーティング:仕訳伝票のデータテンプレート
- 詳細な分析に推奨される属性
- 追跡すべき主要な仕訳伝票アクティビティ
- SAP ECCからデータを抽出するための具体的なガイダンス
決算・レポーティング:仕訳処理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ名 ActivityName | 仕訳プロセスの特定の時点で発生した業務アクティビティまたはイベントの名称です。 | ||
| 説明 アクティビティ名は、「仕訳を作成」「仕訳を承認」「仕訳を計上」など、仕訳のライフサイクルにおける特定のステップを示します。通常は、トランザクションコード(TCODE)、変更伝票ログ(CDHDRおよびCDPOS)、伝票ステータス項目など、SAP内の複数の情報源から導出します。 アクティビティの分析は、プロセスマイニングの中心です。プロセスマップの可視化、ステップ間の遷移時間の計算、手戻りループ(例:「仕訳を却下」から「仕訳を修正」)の特定が可能になります。サイクル時間、手戻り率、プロセスバリアントに関するダッシュボードの基礎となるデータです。 重要な理由 プロセスマップ上のステップを定義し、仕訳ワークフローの可視化、分析、最適化を可能にします。 入手先 BKPFのトランザクションコード(TCODE)、伝票ステータス、SWW_WI2OBJなどのテーブルにあるワークフローログ、CDHDRおよびCDPOSの変更伝票など、さまざまな情報源から導出します。 例 仕訳を作成仕訳を承認仕訳を却下仕訳を計上 | |||
| イベント時刻 EventTime | 仕訳について、特定のアクティビティまたはイベントが発生した時点を示すタイムスタンプです。 | ||
| 説明 イベント時刻は、仕訳プロセスの各アクティビティについて正確な日付と時刻を提供します。サイクル時間、処理時間、ステップ間の遅延など、時間に基づくすべての指標を計算するうえで欠かせないデータです。タイムスタンプの情報源はアクティビティによって異なり、伝票の作成日と作成時刻(CPUDT/CPUTM)や、ログの変更時刻(CDHDR-UDATE/UTIME)を使用します。 分析では、イベント時刻を使ってイベントを時系列に並べ、プロセスマップの基礎を作ります。仕訳の平均サイクル時間、平均承認時間、承認から計上までの時間など、時間に関するすべてのKPIを計算するために必要です。 重要な理由 このタイムスタンプは時間に関する分析の基盤となり、サイクル時間、所要時間、ボトルネックを算出できます。 入手先 アクティビティに応じてさまざまな項目から取得します。主にBKPFの作成時刻(CPUDT、CPUTM)、またはCDHDRの変更伝票時刻(UDATE、UTIME)を使用します。 例 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| 仕訳ID JournalEntryId | 会社コード、伝票番号、会計年度を組み合わせた、財務会計伝票の一意の識別子です。 | ||
| 説明 仕訳IDは、仕訳のライフサイクルを追跡するための主要なケース識別子です。通常は、会社コード(BUKRS)、伝票番号(BELNR)、会計年度(GJAHR)を連結して作成する複合キーで、SAPシステム全体で一意性を確保します。 プロセス分析では、このIDによって作成、一時保存、提出、承認、却下、計上など、関連するすべてのアクティビティを紐づけます。この識別子を追跡することで、各仕訳のエンドツーエンドの経路を構築し、サイクル時間を測定するとともに、特定の仕訳におけるプロセス逸脱やボトルネックを特定できます。 重要な理由 仕訳の作成から最終計上までを追跡するための基本キーです。エンドツーエンドのプロセス分析やバリアント比較が可能になります。 入手先 通常は、BKPFテーブルの会社コード(BUKRS)、伝票番号(BELNR)、会計年度(GJAHR)を連結して作成する導出属性です。 例 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| ソースシステム SourceSystem | プロセスデータを抽出したシステムです。 | ||
| 説明 データの取得元を示す属性で、この場合は特定のSAP ECCインスタンスを指します。通常はデータ抽出時に追加する固定値です。 単純な属性ですが、複数のERPやデータソースが存在する環境では重要です。データの系譜を明確にし、取得元のシステム別に分析をフィルタリングまたは分類できます。 重要な理由 データの系譜を明確にし、複数のソースシステムがある環境でデータ品質を追跡するために欠かせません。 入手先 通常はデータ変換時に追加する固定値で、特定のSAP ECCインスタンス(例:「ECC_PROD_100」)を示します。 例 SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| 最終データ更新 LastDataUpdate | ソースシステムからデータを最後に抽出または更新した時点を示すタイムスタンプです。 | ||
| 説明 SAP ECCから直近にデータを取得した日付と時刻を記録する属性です。分析対象データの鮮度や最新性を把握するために欠かせないメタデータ項目です。 プロセスマイニングのダッシュボードや分析では、最終更新時刻を把握することが、データへの信頼と適切な意思決定につながります。「この情報はどの程度最新か」という疑問に答えられます。 重要な理由 データの鮮度を伝え、分析対象の期間を理解して結果を信頼できるようにします。 入手先 データ更新時に、データ抽出ツールまたはETLプロセスが生成して保存するメタデータ項目です。 例 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| トランザクションコード TransactionCode | 仕訳の作成または処理に使用したSAPのトランザクションコードです。 | ||
| 説明 トランザクションコード(Tコード)は、SAP内の特定の機能またはプログラムを識別する一意のコードです。仕訳では、手動(FB01、F-02)、一時保存(FV50)、自動インターフェースなど、仕訳の作成方法を示します。 「手動アクティビティ最適化」ダッシュボードに欠かせない属性です。Tコードを分析することで、手動と自動のアクティビティを区別し、時間のかかる手動プロセスを特定できます。自動化の機会を見つけ、手作業を減らして効率を高められます。 重要な理由 手動プロセスと自動プロセスを区別し、自動化やプロセス標準化の機会を特定できます。 入手先 伝票ヘッダテーブルBKPFのTCODE項目にあります。 例 FB01F-02FV50FBD1 | |||
| ユーザー User | 仕訳を作成または変更したSAPユーザーIDです。 | ||
| 説明 仕訳の作成、一時保存、計上など、特定のアクティビティを担当したSAPユーザー名を記録する属性です。伝票ヘッダまたは変更ログのテーブルから直接取得します。 ユーザー属性を分析することで、チームや個人のパフォーマンスを把握できます。ユーザー別のアクティビティ量や処理時間を追跡するユーザー生産性ダッシュボードを支えます。また、手戻りループ、取消、コンプライアンス逸脱に関与したユーザーを特定し、対象を絞ったトレーニングやプロセス改善につなげられます。 重要な理由 各アクティビティの担当ユーザーを特定し、ユーザーのパフォーマンス、業務量の分布、手戻りパターンを分析できます。 入手先 通常は、作成者についてはBKPFテーブルのUSNAM項目、変更者についてはCDHDRテーブルのUSERNAME項目から取得します。 例 ABROWNCJONESDSMITH | |||
| 会社コード CompanyCode | 財務諸表を作成する独立した法人を表す組織単位です。 | ||
| 説明 会社コードはSAP Financialsにおける基本的な組織単位です。法的に独立した会社を表し、仕訳伝票ヘッダの主要項目です。 この属性は、法人別にプロセス分析を分類するために欠かせません。事業の各領域におけるプロセスパフォーマンス、コンプライアンス率、KPI結果を比較できます。例えば、承認遅延や高い取消率が特定の会社コードに固有の問題かどうかを確認できます。 重要な理由 組織内の異なる法人または事業部門間で、プロセスパフォーマンスをフィルタリングして比較できます。 入手先 伝票ヘッダテーブルBKPFのBUKRS項目にあります。 例 10002000US01DE01 | |||
| 伝票タイプ DocumentType | 会計伝票の処理方法と保存方法を制御する分類です。 | ||
| 説明 伝票タイプは、総勘定元帳仕訳(SA)、仕入先請求書(KR)、資産計上(AA)など、さまざまな業務取引を区別します。システム設定で定義し、すべての仕訳に割り当てます。 取引の性質別にプロセスを分類できるため、分析に欠かせない属性です。「タイプ別仕訳処理量」ダッシュボードと「仕訳タイプ別平均サイクル時間」KPIは、この項目を直接利用します。特定の仕訳タイプで遅延、手戻り、取消が発生しやすいかどうかを明らかにできます。 重要な理由 取引タイプ別に分析を分類し、プロセス上の問題が特定の仕訳タイプに固有のものかどうかを特定できます。 入手先 伝票ヘッダテーブルBKPFのBLART項目にあります。 例 SAKRREAA | |||
| 取消済みかどうか IsReversed | 仕訳が取り消されているかどうかを示すブール型フラグです。 | ||
| 説明 別の会計伝票によって後から取り消された仕訳を特定するフラグです。SAPでは、取り消された伝票が取消伝票に紐づくため、明確な監査証跡を確保できます。 「仕訳取消分析」ダッシュボードと「仕訳取消率」KPIの基礎となる属性です。取消された仕訳を分離して、入力ミスや誤った会計処理などの根本原因を調査し、取消の発生頻度を減らせます。 重要な理由 後から取り消された仕訳にフラグを付けることで、取消分析を直接支援します。エラーの根本原因を特定し、データの整合性を高められます。 入手先 BKPFテーブルの取消伝票番号項目(STBLG)から導出します。STBLGが空でなければ、フラグはtrueです。 例 truefalse | |||
| 計上日 PostingDate | 取引が総勘定元帳に記録され、財務期間に影響する日付です。 | ||
| 説明 計上日は、仕訳を記録する会計期間を決定します。会計期間の締めスケジュールや規制に合わせる必要があるため、財務とコンプライアンスの観点で重要な日付項目です。 プロセスマイニングでは、この日付を使ってコンプライアンスを監視します。「コンプライアンス遵守状況モニタリング」ダッシュボードと「コンプライアンス適合率」KPIでは、正しい期間内に仕訳が計上されたかを確認するためにこの属性を使用します。仕訳量の経時的な傾向分析にも利用できます。 重要な理由 正しい会計期間に仕訳が計上されていることを確認するため、財務報告とコンプライアンス分析に欠かせません。 入手先 伝票ヘッダテーブルBKPFのBUDAT項目にあります。 例 2023-10-312023-11-302024-01-15 | |||
| 仮登録済み IsParked | 仕訳伝票が転記前に仮登録伝票として保存されたかどうかを示すブール値フラグです。 | ||
| 説明 伝票を仮登録すると、ユーザーは未完成の仕訳伝票を財務残高に影響を与えずに保存できます。その後、別のユーザーが転記前に内容を完成させたり、確認したりできます。このフラグは、仮登録の工程を経た伝票を特定します。 この属性を分析すると、仮登録機能がどのように使われているかを把握できます。仮登録が非公式な確認工程として使われ、遅延を招いている可能性も明らかになります。また、エンドツーエンドの処理時間を分析し、直接転記された伝票と、先に仮登録された伝票を区別できます。 重要な理由 仮登録機能を使用した伝票を特定します。遅延の原因や、非公式な確認プロセスの兆候を把握するのに役立ちます。 入手先 テーブルBKPFの伝票ステータスフィールド(BSTAT)から導出します。「V」は仮登録伝票を示します。 例 truefalse | |||
| 伝票合計金額 TotalDocumentAmount | 伝票通貨で表した仕訳の合計金額です。 | ||
| 説明 仕訳の合計金額を示す属性です。通常は、伝票に紐づくすべての借方または貸方明細の絶対値を合計して算出します。 金額別にプロセスを分析すると、重要なパターンを明らかにできます。例えば、高額な仕訳では、より厳格な承認経路をたどる場合があります。この属性で分析をフィルタリングまたは分類し、サイクル時間、却下率、承認遅延が仕訳金額と相関しているかを確認できます。 重要な理由 仕訳金額と処理時間や却下率の相関など、財務的な影響を分析できます。 入手先 仕訳ごとに、BSEGテーブルのすべての明細にある金額項目(WRBTRまたはDMBTR)を集計して算出する項目です。 例 1500.0025000.75125.50 | |||
| 原価センタ CostCenter | 管理領域内の組織単位で、原価が発生する場所を表します。 | ||
| 説明 原価センタは、管理会計(CO)モジュールの主要なマスターデータ要素であり、仕訳伝票の明細レベルに割り当てられることが一般的です。特定の部門、機能、または場所の原価を追跡するために使用します。 原価センタを含めることで、仕訳伝票プロセスをより細かく分析できます。特定の部門で手戻りが多いか、処理時間が長いか、手入力の件数が多いかを確認でき、部門別にプロセス効率を把握できます。 重要な理由 部門や機能領域ごとにプロセスのパフォーマンスを分析し、局所的な非効率を特定できます。 入手先 伝票明細テーブルBSEGのフィールドKOSTLにあります。 例 4100CC_FINANCE_US10010101 | |||
| 取消理由 ReversalReason | 仕訳が取り消された理由を示すコードです。 | ||
| 説明 伝票を取り消す際、SAPではユーザーが理由コードを指定できます。このコードには、転記日付の誤りやデータ入力ミスなど、取り消しが必要になった理由を構造化して記録します。 この属性は、「仕訳伝票取消分析」ダッシュボードの重要な入力項目です。取り消し理由の傾向を分析することで、組織はプロセスやトレーニングにおける構造的な問題を特定し、将来のエラーを防止して取消率を下げるための対策を講じられます。 重要な理由 取消が発生した理由を直接把握できるため、原因を絞り込んだ分析を行い、将来のエラー削減につなげられます。 入手先 伝票ヘッダーテーブルBKPFのフィールドSTGRDにあります。 例 010205 | |||
| 手戻りあり IsRework | 仕訳伝票が、却下後に修正されるなどの手戻りループを経たかどうかを示すブール値フラグです。 | ||
| 説明 このフラグは、通常の処理経路から外れ、是正対応が必要になったケースを特定します。通常、対象の仕訳伝票について「仕訳伝票却下」に続いて「仕訳伝票修正」などのアクティビティの並びが確認された場合に、trueに設定します。 この属性は、「仕訳伝票手戻り率」KPIの計算や、「手戻り・却下率」ダッシュボードの分析に欠かせません。プロセスの非効率がどの程度発生しているかを定量化し、要件の不明確さや文書不足など、手戻りの根本原因を調査する基盤になります。 重要な理由 修正が必要になった伝票を特定し、手戻りの量と原因を分析できます。初回で正しく処理できる割合の改善にも役立ちます。 入手先 ケースのアクティビティの順序を分析して導出する計算属性です。却下または修正のアクティビティが発生すると、手戻りループとして識別します。 例 truefalse | |||
| 承認時間 ApprovalTime | 仕訳伝票が承認に提出されてから、承認または却下されるまでの経過時間です。 | ||
| 説明 この指標は、承認サブプロセスにかかる時間を測定します。承認サブプロセスは、全体の処理時間に大きく影響することが少なくありません。「仕訳伝票提出」アクティビティと、対応する「仕訳伝票承認」または「仕訳伝票却下」アクティビティの時間差として計算します。 承認時間は、「仕訳伝票承認パフォーマンス」ダッシュボードと「仕訳伝票平均承認時間」KPIの中核指標です。この時間を分析することで、承認ワークフローのボトルネックを特定し、承認者のパフォーマンスを測定できます。また、承認基準の調整など、プロセス変更の必要性を説明する根拠にもなります。 重要な理由 承認段階にかかる時間を定量化し、確認・承認ワークフローの遅延を特定して対処できます。 入手先 「仕訳伝票提出」イベントのタイムスタンプを、「仕訳伝票承認」または「仕訳伝票却下」イベントのタイムスタンプから差し引いて計算します。 例 P1DT2HPT4H15MP3D | |||
| 通貨キー CurrencyKey | 仕訳に記録された金額の通貨コードです。 | ||
| 説明 仕訳の通貨を示す属性で、USD、EUR、JPYなどが該当します。伝票に紐づく金額を解釈するための情報を提供します。 常に主要な分析軸になるとは限りませんが、金額を正しく解釈するために欠かせません。グローバルな組織では、外貨仕訳と現地通貨仕訳でプロセスが異なるかを確認するため、分析の分類にも利用できます。 重要な理由 すべての金額に必要な情報を提供し、正確な財務分析と解釈を可能にします。 入手先 伝票ヘッダテーブルBKPFのWAERS項目にあります。 例 USDEURGBPJPY | |||
決算・レポーティング:仕訳処理のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 仕訳の取消を処理 | 過去に計上された仕訳の取消を示すアクティビティです。取消は、元の仕訳を相殺する新しい会計伝票として作成されます。 | ||
| 重要な理由 データ品質とプロセスの正確性を測る重要なイベントです。取消率が高い場合、初回入力や承認段階に構造的な問題がある可能性があります。また、取消のたびに手戻りが発生します。 入手先 元の伝票のヘッダ(BKPFテーブル)から特定します。伝票が取り消されると、SAPによって取消伝票番号(BKPF-STBLG)と取消理由(BKPF-STGRD)が入力されます。イベント時刻には、新しい取消伝票の計上日を使用します。 取得 元の伝票にBKPF-STBLGが入力された時点を特定します。タイムスタンプには取消伝票の計上日を使用します。 イベントタイプ explicit | |||
| 仕訳を一時保存 | このアクティビティは、仕訳を総勘定元帳へ正式に計上する前に、暫定状態で初めて作成したことを示します。SAPでは、ユーザーが一時保存用のトランザクションで伝票を保存し、伝票ステータスが「一時保存」に設定された時点で明示的に記録されます。 | ||
| 重要な理由 レビューと承認を伴うプロセスの重要な開始イベントです。一時保存から計上までの時間を分析することで、計上前の処理や承認段階における遅延を特定できます。 入手先 このイベントは伝票ヘッダテーブルBKPFから特定します。BKPF-BSTAT=「V」のステータスで作成された伝票を一時保存とみなします。イベント時刻には、作成日と作成時刻であるBKPF-CPUDTおよびBKPF-CPUTMを使用します。 取得 BKPF-BSTATが「V」であるBKPF内の伝票作成を特定します。 イベントタイプ explicit | |||
| 仕訳を承認 | このアクティビティは、ワークフロー内で仕訳が最終承認され、計上可能になったことを示します。ワークフローログで最終的な「リリース」または「承認」ステップが完了した時点で取得します。 | ||
| 重要な理由 承認プロセスを完了する重要なマイルストーンです。このアクティビティまでの所要時間は承認効率を測る重要なKPIであり、このイベントから計上までの時間は承認後の遅延を測定します。 入手先 SAP Business Workflowログに記録された最終承認ステップの完了時刻から推定します。伝票が計上される、または計上可能になる前の最後の承認操作です。 取得 ワークフローログで最終的な「リリース」または「承認」ステップの完了を特定します。 イベントタイプ inferred | |||
| 仕訳を提出 | このアクティビティは、一時保存された仕訳を作成者が確定し、レビューと承認を受けられる状態にしたことを示します。通常は、一時保存された伝票に紐づくSAP Business Workflowタスクの開始によって記録されます。 | ||
| 重要な理由 作成者から承認者への引き継ぎを示し、承認サイクル時間KPIの計測を開始する時点です。承認ワークフローの効率を測る重要なマイルストーンです。 入手先 財務伝票オブジェクトに紐づく承認ワークフローインスタンスの開始時刻から推定します。特定の会社コード、伝票番号、会計年度に対して開始されたワークフローを見つけるため、SWW_WI2OBJなどのワークフローログテーブルを分析する必要があります。 取得 一時保存された伝票オブジェクトのワークフロー開始イベントを特定します。 イベントタイプ inferred | |||
| 仕訳を計上 | 仕訳が総勘定元帳に正式に記録され、財務諸表に影響する中心的なアクティビティです。伝票ステータスが「計上済み」に設定され、計上日が付与された時点で明示的に取得します。 | ||
| 重要な理由 仕訳処理が正常に完了したことを示す最も重要なマイルストーンです。エンドツーエンドのサイクル時間は通常この時点までを対象に測定し、決算分析における重要なイベントとなります。 入手先 BKPFテーブルの伝票に計上日(BKPF-BUDAT)が設定されている場合に特定します。一時保存された伝票では、ステータスBKPF-BSTATが「V」から空白に変わった時点に該当します。計上時刻には入力日であるBKPF-CPUDTを使用します。 取得 BKPF-BSTATが「V」から空白に変わった時点、または直接計上の場合は作成イベントを特定します。 イベントタイプ explicit | |||
| 一時保存仕訳を削除 | 計上されなかった一時保存仕訳の削除を示します。却下後、または誤って作成された場合に発生することがあります。 | ||
| 重要な理由 プロセスが正常に完了しなかったことを示すアクティビティです。一時保存伝票が削除された理由を分析することで、重複入力やプロセスの誤解などの問題を明らかにできます。 入手先 BKPFテーブルにある一時保存伝票のステータスが変更された時点で取得します。ステータス項目BKPF-BSTATが「Z」(一時保存伝票削除済み)に更新されます。変更時刻は伝票変更ログ(CDHDR)から取得できます。 取得 BKPF-BSTATが「Z」に更新された時点を特定します。 イベントタイプ explicit | |||
| 仕訳の修正を依頼 | 承認者が仕訳をレビューし、修正のために作成者へ差し戻したワークフロー上の時点を示します。ワークフローログに記録された「却下」または「差し戻し」のユーザー判断から取得します。 | ||
| 重要な理由 手戻りループを特定するうえで欠かせないアクティビティです。手戻りループは、非効率やプロセス逸脱の主な原因です。このイベントの発生頻度が高い場合、仕訳の品質や要件の明確さに問題がある可能性があります。 入手先 SAP Business Workflowログ内で、「却下」または「修正依頼」に該当する特定のユーザー判断ステップのタイムスタンプから推定します。 取得 ワークフローログから「却下」または「手戻り」の判断時刻を特定します。 イベントタイプ inferred | |||
| 仕訳を作成 | 一時保存のステップを経ずに直接計上された仕訳の作成を示します。SAPで直接計上用のトランザクションを使って伝票が作成された時点で記録されます。 | ||
| 重要な理由 承認ワークフローを必要としない、より単純な仕訳プロセスの開始点となるアクティビティです。単純な直接計上と、より複雑な一時保存仕訳を区別できます。 入手先 BKPFテーブルで、伝票ステータスBKPF-BSTATが空白(計上済み)である伝票の作成に対応するイベントです。イベント時刻には作成日であるBKPF-CPUDTを使用します。これらの伝票では、「作成」と「計上」のイベントが同時に発生します。 取得 BKPF-BSTATが空白であるBKPF内の伝票作成を特定します。 イベントタイプ explicit | |||
| 仕訳を修正 | このアクティビティは、作成者が修正のために差し戻された一時保存仕訳を変更したことを示します。「修正依頼」イベント後の伝票変更を検出して推定します。 | ||
| 重要な理由 修正を追跡することで、手戻りにかかった工数を定量化できます。修正依頼から修正完了までの時間から、提出済み仕訳の問題解決における遅延を把握できます。 入手先 一時保存された伝票について、変更伝票ログ(CDHDRおよびCDPOS)を分析して推定します。ワークフローでの却下イベント後に変更が記録されていれば、修正が行われたことを示します。タイムスタンプにはCDHDRテーブルの値を使用します。 取得 却下イベント後のCDHDR/CDPOSの変更ログエントリを特定します。 イベントタイプ inferred | |||
| 仕訳を却下 | このアクティビティは仕訳が最終的に却下され、その後計上されないことを示します。通常、承認ワークフローの終端ステータスとなり、一時保存された伝票の最終的な削除につながります。 | ||
| 重要な理由 却下を追跡することは品質管理に欠かせません。却下理由と発生頻度を分析することで、仕訳の初回正解率を高められます。 入手先 SAP Business Workflowログから取得する結果で、プロセスを終了させる最終的な「却下」のユーザー判断を示します。その後、一時保存された伝票が削除される場合があります。 取得 伝票のワークフローログで終端の「却下」ステータスを特定します。 イベントタイプ inferred | |||
| 仕訳明細を消込 | 銀行仮勘定など、未消込明細管理の総勘定元帳勘定にある明細を照合するアクティビティです。ある明細を別の明細と照合し、未消込状態を解消した時点で発生します。 | ||
| 重要な理由 銀行照合などのプロセスでは、明細の消込までの時間が重要なKPIです。このアクティビティにより、照合や月末締め処理の効率を分析できます。 入手先 明細テーブルBSEGから取得します。明細が消し込まれると、消込日(BSEG-AUGDT)と消込伝票(BSEG-AUGBL)の項目が入力されます。イベント時刻には消込日を使用します。 取得 明細に消込日(BSEG-AUGDT)が入力された時点を特定します。 イベントタイプ explicit | |||
| 会社間計上を特定 | 複数の会社コードに影響する仕訳にフラグを付ける計算アクティビティです。1つの財務伝票の明細を分析して判定します。 | ||
| 重要な理由 会社間取引では、より複雑な処理や承認要件が適用される場合があります。会社間取引を特定することで、サイクル時間やプロセス経路を分けて分析し、固有のボトルネックを見つけられます。 入手先 指定した伝票番号(BELNR)について、明細テーブルBSEGを調べて算出します。明細に複数の異なる会社コード(BSEG-BUKRS)が含まれていれば、会社間計上と判定します。 取得 1つのBKPF-BELNRに対して、BSEG-BUKRSに複数の異なる値が存在するか確認します。 イベントタイプ calculated | |||
| 手動入力を特定 | 仕訳が手動のオンライン取引で作成されたのか、自動インターフェースまたはバッチ処理で作成されたのかを特定するアクティビティです。ユーザー操作ではなく、システムデータから導出される仕訳の計算属性です。 | ||
| 重要な理由 手動入力と自動入力を区別することは、対象を絞ったプロセス改善に欠かせません。手動プロセスは、標準化や自動化の取り組みの対象になることが多い領域です。 入手先 伝票ヘッダテーブルBKPFの項目を分析して算出します。例えば、トランザクションコード(BKPF-TCODE)の「FB01」「FB50」「FV50」は手動入力を示し、それ以外のTコードや特定のバッチ入力名(BKPF-AWKEY)は自動化を示します。 取得 BKPF-TCODEまたは伝票ヘッダにあるその他のソースシステム指標から導出します。 イベントタイプ calculated | |||
| 証憑を添付 | このアクティビティは、ユーザーが請求書やスプレッドシートなどの関連資料を仕訳に添付したことを示します。このイベントは標準的な会計イベントとして明示的に記録されないため、通常は会計伝票オブジェクトに紐づく添付ファイルの作成を確認して推定します。 | ||
| 重要な理由 このアクティビティを追跡することで、証憑の添付を求める規程への準拠を確認できます。証憑の添付遅延は、承認サイクルが長期化する根本原因になる場合があります。 入手先 タイムスタンプ付きのイベントとして確実に取得することは困難です。SOODなどのGeneric Object Services(GOS)添付テーブルを分析し、添付ファイルの作成時刻を仕訳オブジェクトキーに紐づけることで、推定できる可能性があります。 取得 GOSテーブル(例:SOOD)にある紐づけられたオブジェクトの作成時刻から推定します。 イベントタイプ inferred | |||
抽出ガイド
ステップ
- ABAPプログラムを作成:SAPシステムでトランザクションコードSE38(ABAPエディタ)を開きます。新しいプログラム名を入力します。例:Z_PM_JE_EXTRACTION。「作成」をクリックし、適切なタイトルを入力して、プログラムタイプを「実行可能プログラム」に設定します。
- 選択画面を定義:プログラムのソースコードで選択画面を定義します。これにより、伝票作成日、会社コード、伝票タイプなどのパラメーターを指定し、抽出するデータ量を制限できます。
- データ構造を宣言:最終的なイベントログデータを格納する内部テーブル構造を定義します。この構造には、JournalEntryId、ActivityName、EventTime、SourceSystem、LastDataUpdateのほか、User、CompanyCode、PostingDateなどの推奨属性を含める必要があります。
- データ選択ロジックを実装:14個の必須アクティビティそれぞれのデータを抽出するABAP SQLクエリを記述します。BKPF(ヘッダー)やBSEG(明細)などの主要テーブル、変更ログテーブルCDHDRおよびCDPOS、SWWLOGHISTなどのワークフローテーブル、BSASおよびBSAKなどの消込テーブルからデータを選択します。
- 仮登録伝票と転記済み伝票を抽出:「仕訳伝票仮登録」イベントでは、伝票ステータス(BSTAT)が「V」のBKPFを選択します。「仕訳伝票作成」および「仕訳伝票転記」イベントでは、ステータスが空白のBKPFを選択します。これは通常の転記済み伝票を示します。
- 変更・削除イベントを抽出:変更伝票テーブルCDHDRおよびCDPOSを検索し、オブジェクトクラス「BELEG」で絞り込みます。伝票キーを使って、「仕訳伝票修正」または「仮登録仕訳伝票削除」に該当する変更を特定します。
- ワークフローイベントを抽出:「仕訳伝票提出」、「承認」、「却下」、「変更依頼」などのアクティビティを取得するには、ワークフローテーブルを検索します。SWW_WI2OBJを使って会計伝票とワークフローインスタンスを関連付け、その後SWWLOGHISTからユーザーの判断やステータス変更を読み取ります。
- 計算イベントを特定:「手入力仕訳特定」では、トランザクションコード(BKPF-TCODE)を既知の手入力用Tコードの一覧と照合します。「会社間転記特定」では、対象伝票のBSEG明細を分析し、複数の会社コードが含まれているか確認します。
- データを統合・変換:各アクティビティのデータを選択する際に、最終的なイベントログ構造へ変換します。会社コード、伝票番号、会計年度を連結してJournalEntryIdを作成します。SAPの日付と時刻を1つのEventTimeタイムスタンプに変換します。各クエリの結果を最終的な内部テーブルに追加します。
- ファイル出力を実装:OPEN DATASET、LOOP AT、TRANSFER、CLOSE DATASETなどのABAPファイル処理ステートメントを使い、統合した内部テーブルをSAPアプリケーションサーバーのディレクトリにCSVまたはフラットファイルとして書き込みます。ファイルはトランザクションAL11で確認できます。
- バックグラウンドジョブとしてスケジュール:トランザクションSM36(バックグラウンドジョブ定義)を開きます。新しいジョブを作成し、ABAPプログラムを実行するステップを定義します。夜間や週次など、業務負荷の低い時間帯に実行するスケジュールを設定し、抽出を自動化します。
- ファイルを取得・整形:トランザクションCG3Yを使うか、システム管理者に依頼して、アプリケーションサーバーから生成ファイルをローカルマシンへダウンロードします。ファイルのエンコードと形式が、プロセスマイニングツールへのアップロードに適していることを確認します。
設定
- 日付範囲:パフォーマンスを管理するため、日付範囲を定義することが重要です。主なフィルターには伝票作成日(BKPF-CPUDT)を使用します。初回の分析では、3~6か月の期間を推奨します。テストでは、データが存在することが分かっている数日間の範囲を指定します。
- 会社コードフィルター:必ず会社コード(BKPF-BUKRS)で絞り込みます。すべての会社コードを一度に抽出すると、システムリソースを大量に消費する可能性があります。まずは、対象となる1つまたは少数の会社コードから始めます。
- 伝票タイプフィルター:すべての伝票タイプを分析する必要がない場合は、伝票タイプフィルター(BKPF-BLART)を使って対象を絞り込みます。たとえば、総勘定元帳伝票の「SA」などを指定します。
- ワークフロータスクID:ワークフローイベントを抽出するロジックは、承認、却下、提出に使用するシステム固有のタスクIDに依存します。これらのIDは、自社のワークフロー定義に基づいてプログラムのソースコードに設定する必要があります。
- パフォーマンスに関する考慮事項:このプログラムは、CDPOSやワークフロー履歴テーブルなど、複数の大規模テーブルを結合します。業務のピーク時間帯に実行すると、システムパフォーマンスに影響する可能性があります。必ず業務負荷の低い時間帯にバックグラウンドジョブとして実行してください。パフォーマンスの問題が繰り返し発生する場合は、セカンダリデータベースインデックスの作成を検討します。
- 前提条件:この方法には、ABAP開発権限(SE38)とバックグラウンドジョブの作成・管理権限(SM36)を持つユーザーが必要です。ユーザーまたはジョブには、関連する財務、ワークフロー、システムテーブル(BKPF、BSEG、CDHDR、CDPOS、SWWLOGHISTなど)への読み取りアクセス権も必要です。
a サンプルクエリ abap
REPORT Z_PM_JE_EXTRACTION.
*&---------------------------------------------------------------------*
*& Data Structures for Final Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
username TYPE uname,
companycode TYPE bukrs,
documenttype TYPE blart,
postingdate TYPE budat,
transactioncode TYPE tcode,
isreversed TYPE abap_bool,
END OF ty_event_log.
DATA: lt_final_log TYPE STANDARD TABLE OF ty_event_log.
DATA: ls_event TYPE ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen Parameters
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_blart FOR bkpf-blart,
s_cpudt FOR bkpf-cpudt OBLIGATORY.
PARAMETERS: p_sysid TYPE sy-sysid DEFAULT sy-sysid.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA(lv_last_update) = cl_abap_context_info=>get_system_timestamp( ).
" 1. Journal Entry Parked
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
'Journal Entry Parked' AS activityname,
a~cpudt, a~cputm,
a~usnam AS username,
a~bukrs AS companycode,
a~blart AS documenttype,
a~bldat AS postingdate,
a~tcode AS transactioncode
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~bstat = 'V' " Parked Document
INTO TABLE @DATA(lt_parked).
IF sy-subrc = 0.
LOOP AT lt_parked ASSIGNING FIELD-SYMBOL(<fs_parked>).
ls_event-journalentryid = <fs_parked>-journalentryid.
ls_event-activityname = <fs_parked>-activityname.
CONVERT DATE <fs_parked>-cpudt TIME <fs_parked>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_parked>-username.
ls_event-companycode = <fs_parked>-companycode.
ls_event-documenttype = <fs_parked>-documenttype.
ls_event-postingdate = <fs_parked>-postingdate.
ls_event-transactioncode = <fs_parked>-transactioncode.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 2. Journal Entry Created (directly posted, not parked first)
" 9. Journal Entry Posted
" These two events happen at the same time for a direct posting.
SELECT CONCAT( bukrs, belnr, gjahr ) AS journalentryid,
cpudt, cputm, usnam, bukrs, blart, budat, tcode, stblg
FROM bkpf
WHERE bukrs IN s_bukrs
AND blart IN s_blart
AND cpudt IN s_cpudt
AND bstat = '' " Normal, posted document
INTO TABLE @DATA(lt_posted).
IF sy-subrc = 0.
LOOP AT lt_posted ASSIGNING FIELD-SYMBOL(<fs_posted>).
" Activity: Journal Entry Created
ls_event-journalentryid = <fs_posted>-journalentryid.
ls_event-activityname = 'Journal Entry Created'.
CONVERT DATE <fs_posted>-cpudt TIME <fs_posted>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_posted>-usnam.
ls_event-companycode = <fs_posted>-bukrs.
ls_event-documenttype = <fs_posted>-blart.
ls_event-postingdate = <fs_posted>-budat.
ls_event-transactioncode = <fs_posted>-tcode.
ls_event-isreversed = COND #( WHEN <fs_posted>-stblg IS NOT INITIAL THEN abap_true ELSE abap_false ).
APPEND ls_event TO lt_final_log.
" Activity: Journal Entry Posted
ls_event-activityname = 'Journal Entry Posted'.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 3. Documentation Attached (via GOS)
SELECT a~instid_a, c~cr_timestamp
FROM srgbtbrel AS a
INNER JOIN sood AS b ON a~instid_b = b~objid
INNER JOIN socf AS c ON b~filid = c~filid
WHERE a~typeid_a = 'BKPF'
AND a~bukrs IN s_bukrs
INTO TABLE @DATA(lt_attachments).
IF sy-subrc = 0.
LOOP AT lt_attachments ASSIGNING FIELD-SYMBOL(<fs_attach>).
ls_event-journalentryid = |{ <fs_attach>-instid_a(4) }{ <fs_attach>-instid_a+4(10) }{ <fs_attach>-instid_a+14(4) }|.
ls_event-activityname = 'Documentation Attached'.
ls_event-eventtime = <fs_attach>-cr_timestamp.
" Other attributes may need to be looked up from BKPF if needed.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 4, 5, 6, 7, 8: Workflow events (Submitted, Changes Requested, Corrected, Approved, Rejected)
" This is a simplified example. Real logic depends on specific workflow templates.
SELECT a~instid, b~wi_cd, b~wi_ct, b~wi_aagent, b~wi_text
FROM sww_wi2obj AS a
INNER JOIN swwloghist AS b ON a~wi_id = b~wi_id
WHERE a~typeid = 'BKPF'
AND a~catid = 'BO'
AND a~bukrs IN s_bukrs
AND b~wi_cd BETWEEN s_cpudt-low AND s_cpudt-high
INTO TABLE @DATA(lt_workflow).
IF sy-subrc = 0.
LOOP AT lt_workflow ASSIGNING FIELD-SYMBOL(<fs_wf>).
ls_event-journalentryid = |{ <fs_wf>-instid(4) }{ <fs_wf>-instid+4(10) }{ <fs_wf>-instid+14(4) }|.
ls_event-activityname = CASE <fs_wf>-wi_text. " Simplified logic based on work item text
WHEN '[Placeholder for Submit Text]' THEN 'Journal Entry Submitted'
WHEN '[Placeholder for Approve Text]' THEN 'Journal Entry Approved'
WHEN '[Placeholder for Reject Text]' THEN 'Journal Entry Rejected'
WHEN '[Placeholder for Rework Text]' THEN 'Journal Entry Changes Requested'
ELSE ''
ENDCASE.
IF ls_event-activityname IS NOT INITIAL.
CONVERT DATE <fs_wf>-wi_cd TIME <fs_wf>-wi_ct INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_wf>-wi_aagent.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
ENDIF.
" 10. Manual Entry Identified & 11. Cross-Company Posting Identified
SELECT bukrs, belnr, gjahr, tcode FROM bkpf
WHERE bukrs IN s_bukrs AND blart IN s_blart AND cpudt IN s_cpudt
INTO TABLE @DATA(lt_calc_base).
LOOP AT lt_calc_base ASSIGNING FIELD-SYMBOL(<fs_calc>).
ls_event-journalentryid = |{ <fs_calc>-bukrs }{ <fs_calc>-belnr }{ <fs_calc>-gjahr }|.
" Check for manual entry T-Codes
IF <fs_calc>-tcode = 'FB01' OR <fs_calc>-tcode = 'F-02' OR <fs_calc>-tcode = 'FB50'.
ls_event-activityname = 'Manual Entry Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
" Check for cross-company posting
SELECT SINGLE bukrs FROM bseg WHERE belnr = <fs_calc>-belnr AND gjahr = <fs_calc>-gjahr AND bukrs <> <fs_calc>-bukrs INTO @DATA(lv_cross_bukrs).
IF sy-subrc = 0.
ls_event-activityname = 'Cross-Company Posting Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 12. Journal Entry Line Item Cleared
SELECT a~bukrs, a~belnr, a~gjahr, a~augdt, a~augbl
FROM bsas AS a " G/L Cleared Items
WHERE a~bukrs IN s_bukrs
AND a~budat IN s_cpudt
INTO TABLE @DATA(lt_cleared_gl).
IF sy-subrc = 0.
LOOP AT lt_cleared_gl ASSIGNING FIELD-SYMBOL(<fs_clr>).
ls_event-journalentryid = |{ <fs_clr>-bukrs }{ <fs_clr>-belnr }{ <fs_clr>-gjahr }|.
ls_event-activityname = 'Journal Entry Line Item Cleared'.
CONVERT DATE <fs_clr>-augdt INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
" User is often not directly available for clearing events
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 13. Parked Journal Entry Deleted & 6. Journal Entry Corrected
SELECT objectid, changenr, username, udate, utime FROM cdhdr
WHERE objectclas = 'BELEG'
AND udate IN s_cpudt
INTO TABLE @DATA(lt_cdhdr).
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
SELECT SINGLE tcode FROM cdpos WHERE changenr = <fs_cdhdr>-changenr AND fname = 'BSTAT' AND value_new = 'Z' INTO @DATA(lv_deleted_tcode).
ls_event-journalentryid = |{ <fs_cdhdr>-objectid(4) }{ <fs_cdhdr>-objectid+4(10) }{ <fs_cdhdr>-objectid+14(4) }|.
CONVERT DATE <fs_cdhdr>-udate TIME <fs_cdhdr>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_cdhdr>-username.
IF sy-subrc = 0.
ls_event-activityname = 'Parked Journal Entry Deleted'.
APPEND ls_event TO lt_final_log.
ELSE.
ls_event-activityname = 'Journal Entry Corrected'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 14. Journal Entry Reversal Processed
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
a~cpudt, a~cputm, a~usnam
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~stblg IS NOT NULL " Document is a reversal
INTO TABLE @DATA(lt_reversals).
IF sy-subrc = 0.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
ls_event-journalentryid = <fs_rev>-journalentryid.
ls_event-activityname = 'Journal Entry Reversal Processed'.
CONVERT DATE <fs_rev>-cpudt TIME <fs_rev>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_rev>-usnam.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" Final step: Output to file
DATA(lv_filename) = |/tmp/je_extraction_{ sy-datum }_{ sy-uzeit }.csv|.
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'JournalEntryId,ActivityName,EventTime,SourceSystem,LastDataUpdate,User,CompanyCode,DocumentType,PostingDate,TransactionCode,IsReversed'.
TRANSFER lv_header TO lv_filename.
LOOP AT lt_final_log INTO ls_event.
DATA(lv_line) = |"{ ls_event-journalentryid }","|
|{ ls_event-activityname }","|
|{ ls_event-eventtime }","|
|{ ls_event-sourcesystem }","|
|{ ls_event-lastdataupdate }","|
|{ ls_event-username }","|
|{ ls_event-companycode }","|
|{ ls_event-documenttype }","|
|{ ls_event-postingdate }","|
|{ ls_event-transactioncode }","|
|{ ls_event-isreversed }"|.
TRANSFER lv_line TO lv_filename.
ENDLOOP.
CLOSE DATASET lv_filename.
ENDIF. ステップ
- データベース接続を確立:SAP ECCデータベースの読み取り専用認証情報を取得します。DBeaver、SAP HANA Studio、SQL Server Management Studioなどの標準SQLクライアントを使ってデータベースに接続します。
- SQLクエリを準備:このドキュメントの「query」セクションに記載された完全なSQLクエリをSQLクライアントにコピーします。
- 抽出パラメーターを設定:実行前に、クエリ内のプレースホルダーを設定します。「[START_DATE]」と「[END_DATE]」を、YYYYMMDD形式の対象日付範囲に置き換えます。「[COMPANY_CODE_1]」、「[COMPANY_CODE_2]」を、分析対象のSAP会社コードに置き換えます。
- ソースシステムを定義:メインの
SELECTステートメントで、「[Your SAP System ID]」を実際のSAPシステムID(SID)に置き換え、データソースを正しく識別できるようにします。 - クエリを実行:設定したSQLクエリをSAPデータベースに対して実行します。実行時間は、日付範囲とデータベーステーブルのサイズによって異なります。
- 初期結果を確認:クエリが完了したら、返された行を簡単に確認し、想定どおりデータが取得されていることを確認します。複数のアクティビティが含まれていること、JournalEntryIdやEventTimeなどの主要フィールドが空でないことを確認します。
- タイムスタンプを処理:クエリは日付フィールドと時刻フィールドを連結し、YYYYMMDDHHMMSS形式の文字列を作成します。後処理または対象システムでこの形式を解析できることを確認してください。データベースが対応している場合は、SQLの
CONCAT関数をYYYY-MM-DDTHH:MI:SSなどのISO 8601形式に変更することもできます。 - データをエクスポート:SQLクライアントから結果セット全体をCSVファイルにエクスポートします。特殊文字の問題を防ぐため、UTF-8エンコードを使用してください。
- アップロードを準備:プロセスマイニングツールにアップロードする前に、列見出しが必要なデータスキーマと一致していることを確認します。JournalEntryId、ActivityName、EventTimeは必須項目です。抽出を実行した時点のタイムスタンプをLastDataUpdate列に設定します。
- 最終検証:「validationSteps」セクションに記載された手順を実行し、分析を始める前に、抽出データが完全かつ正確であることを確認します。
設定
- データベース権限:データベースユーザーには、次のSAPテーブルへの読み取りアクセス権が必要です:BKPF、BSEG、CDHDR、CDPOS、T001、V_USERNAME。ワークフロー関連のアクティビティには、SWW_WI2OBJとSWWLOGHISTへのアクセス権も必要です。通常、このレベルのアクセス権は専門の技術チームにのみ付与されます。
- 日付範囲による絞り込み:クエリのパフォーマンスを確保するには、特定の日付範囲でデータを絞り込むことが重要です。提供されているクエリでは、開始日と終了日のプレースホルダーを使用し、伝票作成日(
BKPF.CPUDT)に適用します。初回の分析では、3~6か月の範囲を推奨します。 - エンティティによる絞り込み:データ量を管理し、分析対象を明確にするため、必ず会社コード(
BKPF.BUKRS)で絞り込みます。伝票タイプ(BKPF.BLART)で絞り込み、総勘定元帳伝票の「SA」など、関連する仕訳伝票だけを含めることもできます。対象外であれば、請求書や支払いなどの業務伝票を除外します。 - パフォーマンスに関する考慮事項:BSEGやCDPOSなどの中核テーブルに対する直接クエリは、大量のシステムリソースを消費する可能性があります。エンドユーザーへの影響を避けるため、業務負荷の低い時間帯に抽出を実行することを強く推奨します。1回の実行で1年を超えるデータを抽出しないでください。
- ワークフロータスクID:クエリには「[WF_TASK_ID_SUBMIT]」や「[WF_TASK_ID_APPROVE]」などのプレースホルダーが含まれています。これらを、システム固有の仕訳伝票ワークフロー設定における実際のタスクIDに置き換える必要があります。SAP Workflowの専門家に確認するか、トランザクションPFTCで技術的なワークフロー定義を分析して特定できます。
a サンプルクエリ sql
WITH DOC_HEADERS AS (
SELECT
BUKRS,
BELNR,
GJAHR,
BLART,
BLDAT,
BUDAT,
CPUDT,
CPUTM,
USNAM,
TCODE,
BSTAT,
STBLG,
XRECH
FROM BKPF
WHERE CPUDT BETWEEN '[START_DATE]' AND '[END_DATE]'
AND BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]')
)
-- Event 1: Journal Entry Created (Directly Posted)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = '' OR H.BSTAT = 'U'
UNION ALL
-- Event 2: Journal Entry Parked
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = 'V'
UNION ALL
-- Event 3: Journal Entry Posted (from Parked state)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT <> 'V'
AND P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW <> 'V'
UNION ALL
-- Event 4: Parked Journal Entry Deleted
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Parked Journal Entry Deleted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND C.TCODE = 'FBV0'
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW = 'Z'
UNION ALL
-- Event 5: Journal Entry Reversal Processed
SELECT
CONCAT(H.BUKRS, H.STBLG, H.GJAHR) AS "JournalEntryId", -- Linking to the original document
'Journal Entry Reversal Processed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
TRUE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.STBLG IS NOT NULL AND H.STBLG <> ''
UNION ALL
-- Event 6: Journal Entry Line Item Cleared
SELECT
CONCAT(B.BUKRS, B.BELNR, B.GJAHR) AS "JournalEntryId",
'Journal Entry Line Item Cleared' AS "ActivityName",
TO_TIMESTAMP(B.AUGDT, 'YYYYMMDD') AS "EventTime", -- Clearing date used as event time
U.NAME_TEXT AS "User",
B.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode", -- Clearing transaction is in the clearing document header, complex to retrieve here
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM BSEG B
JOIN DOC_HEADERS H ON B.BUKRS = H.BUKRS AND B.BELNR = H.BELNR AND B.GJAHR = H.GJAHR
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE B.AUGBL IS NOT NULL AND B.AUGBL <> '' AND B.AUGDT <> '00000000'
UNION ALL
-- Event 7: Journal Entry Corrected (changes to a parked document)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT = 'V' AND C.TCODE IN ('FBV2', 'FBV4') -- FBV2 is change parked doc, FBV4 is change parked doc header
UNION ALL
-- Event 8: Documentation Attached (inferred from GOS attachment creation, requires configuration)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(CONCAT(REL.RECDATE, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SRGBTBREL REL ON REL.INSTID_A = CONCAT('BUS2081', H.BUKRS, H.BELNR, H.GJAHR) -- BUS2081 is object type for BKPF
LEFT JOIN V_USERNAME U ON REL.RECUNAM = U.BNAME
WHERE REL.TYPEID_A = 'BUS2081' AND REL.RELTYPE = 'ATTA'
UNION ALL
-- Events 9-13 from Workflow (Submitted, Changes Requested, Approved, Rejected) requires specific workflow config
-- This is a generic template. The WI_RH_TASK must be adapted to your system.
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
CASE
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_SUBMIT]' THEN 'Journal Entry Submitted'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_APPROVE]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Approved'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_REJECT]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Rejected'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_CHANGES_REQ]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Changes Requested'
ELSE NULL
END AS "ActivityName",
TO_TIMESTAMP(CONCAT(LOG.EVT_DATE, LOG.EVT_TIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SWW_WI2OBJ WIOBJ ON WIOBJ.INSTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND WIOBJ.TYPEID = 'BKPF'
JOIN SWWLOGHIST LOG ON WIOBJ.WI_ID = LOG.WI_ID
LEFT JOIN V_USERNAME U ON LOG.EXEC_USER = U.BNAME
WHERE LOG.WI_RH_TASK IN ('[WF_TASK_ID_SUBMIT]', '[WF_TASK_ID_APPROVE]', '[WF_TASK_ID_REJECT]', '[WF_TASK_ID_CHANGES_REQ]')
UNION ALL
-- Event 14: Manual Entry Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Manual Entry Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.TCODE IN ('FB01', 'F-02', 'FB50', 'F-04', 'F-22', 'F-43', 'FB60', 'FB70', 'FV50', 'FV60', 'FV70')
UNION ALL
-- Event 15: Cross-Company Posting Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Cross-Company Posting Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.XRECH = 'X' ステップ
- SAP接続の確立:サードパーティ製ETLツールで、SAP ECCシステムへの新しいソース接続を設定します。通常は、アプリケーションサーバーの詳細、クライアント、システム番号、RFCに必要な権限を持つ専用SAPユーザーが必要です。
- データソースの定義:抽出プロジェクトに必要なSAPテーブルをデータソースとして追加します。主なテーブルは、BKPF(会計伝票ヘッダー)、BSEG(会計伝票明細)、VBSEGK(保留伝票ヘッダー)、CDHDR(変更文書ヘッダー)、CDPOS(変更文書明細)、SWW_WI2OBJ(ワークフローとオブジェクトのリンク)、SWWLOGHIST(ワークフローログ)、SRGBTBREL(GOS添付ファイルの関係)です。
- 基本イベント(作成・保留)の抽出:初期イベントを抽出する最初のデータフローを作成します。
Journal Entry ParkedにはVBSEGKをソースとして使用します。Journal Entry CreatedにはBKPFを使用し、反対仕訳ではなく、最初から保留されていない伝票に絞り込みます。VBSEGKとのアンチ結合で実現できます。 - ワークフローイベントの抽出:オブジェクトキー(会社コード+伝票番号+会計年度)を使ってBKPFとSWW_WI2OBJを結合し、ワークフローインスタンスIDを特定するデータフローを作成します。この結果をSWWLOGHISTと結合し、ログに記録されたワークフロータスクの結果とユーザーの判断に基づいて、
Submitted、Approved、Rejected、Changes Requestedなどのイベントを抽出します。 - 変更・削除イベントの抽出:CDHDRとCDPOSを使い、変更を特定します。
Journal Entry Correctedでは、保留伝票(オブジェクトクラスFIPP)に対する変更に絞り込みます。Parked Journal Entry Deletedでは、保留伝票の変更ログにある削除マーカーを検索します。 - 添付ファイルイベントの抽出:
Documentation Attachedを取得するには、オブジェクトタイプがBKPFで、関係が[Your attachment relationship type]であるSRGBTBRELのレコードをBKPFと結合します。リンクの作成日をイベント時刻として使用します。 - 消込・反対仕訳イベントの抽出:
Journal Entry Line Item Clearedでは、消込伝票フィールド(AUGBL)に値が入っているBSEGレコードを検索します。イベント時刻には、消込伝票の転記日(AUGDT)を使用します。Journal Entry Reversal Processedでは、反対仕訳伝票フィールド(STBLG)に値がある伝票をBKPFから検索します。 - 計算イベントの導出:計算イベントごとに個別のロジックブロックを作成します。
Manual Entry Identifiedでは、手動トランザクションコード(例:FB01、FB50、F-02)の一覧に基づいてBKPFを絞り込みます。Cross-Company Posting Identifiedでは、BSEGを伝票IDでグループ化し、異なる会社コードが2つ以上ある伝票を特定します。 - すべてのイベントフローの結合:ETLツールのUNION変換を使い、個別のイベントフロー(Created、Parked、Approvedなど)の出力を1つのイベントログテーブルに結合します。すべてのフローで列名とデータ型が一致していることを確認します。
- 最終スキーマへのマッピング:結合したデータを必須のイベントログ構造にマッピングし、
JournalEntryId、ActivityName、EventTime、ユーザーなどの必須・推奨属性を作成します。SourceSystemなどの固定列を追加し、LastDataUpdateにはETLジョブの実行時刻を使用します。 - 増分ロードの設定:継続的に抽出する場合は、増分ロードの方法を設定します。最終作成日または変更日(例:BKPF.CPUDT、CDHDR.UDATE)をウォーターマークとして使用し、前回の実行以降に追加または更新されたレコードだけを取得します。
- ProcessMind向けのエクスポート:抽出ジョブをスケジュールし、最終出力をCSVまたはParquetファイルとして、ProcessMindからアップロードできる場所に保存するよう設定します。
設定
- 前提条件:専用SAPコネクターを備えた、ライセンス済みのサードパーティ製ETLツール(例:Theobald Xtract Universal、Informatica、Talend)。RFCアクセス権と、財務テーブル(例:テーブルグループF_00、F_WFに対するS_TABU_DIS)、ワークフローデータ、変更ログを読み取る権限を持つSAPユーザーアカウントも必要です。
- 接続パラメーター:SAPアプリケーションサーバーのIPアドレスまたはホスト名、システム番号、クライアントIDが必要です。SAPユーザー名とパスワードには、安全な認証情報管理を使用してください。
- 主なフィルター:データ量を抑えるため、ソース側で会社コード(BKPF.BUKRS)と会計年度(BKPF.GJAHR)のフィルターを必ず適用します。抽出期間を定義するため、伝票作成日(BKPF.CPUDT)でも絞り込むことを強く推奨します。たとえば、直近6か月を指定します。
- 日付範囲の選択:初回ロードでは、3~6か月など、代表性のある期間を選択します。以降の差分ロードでは、
CPUDTなどのタイムスタンプフィールドにウォーターマークを設定し、新規レコードだけを取得します。 - パフォーマンスに関する考慮事項:BSEG、CDPOS、ワークフローテーブルとの結合には時間がかかる場合があります。可能な限り、ETLツールがフィルターをSAPソース側にプッシュダウンするようにしてください。ツールが対応している場合は、特に大量の履歴データをロードするときに、データを小さなチャンクまたはパッケージに分けて抽出します。
- ワークフローのカスタマイズ:「承認済み」や「却下済み」などのワークフローアクティビティを特定するロジックは、使用しているワークフローテンプレートに大きく依存します。フィルターに使用する正しいワークフロータスクIDとユーザー判断キーを、システム上で特定する必要があります。
a サンプルクエリ sql
/*
This is a logical representation of the extraction configuration in a third-party ETL tool.
It is not executable SQL but defines the sources, joins, and transformations for each activity.
Placeholders like [Your SAP Source], [Date Filter], and [Company Code Filter] must be configured in the tool.
*/
-- Extraction block for 'Journal Entry Parked'
SELECT
CONCAT(v.BUKRS, v.VBELN, v.GJAHR) AS JournalEntryId,
'Journal Entry Parked' AS ActivityName,
CAST(CONCAT(v.CPUDT, v.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
v.USNAM AS User,
v.BUKRS AS CompanyCode,
v.BLART AS DocumentType,
v.BUDAT AS PostingDate,
v.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].VBSEGK v
WHERE [Date Filter on v.CPUDT] AND [Company Code Filter on v.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Created'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Created' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
LEFT JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE h.BSTAT = '' AND v.VBELN IS NULL AND h.STBLG IS NULL
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Posted' (from parked)
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Posted' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Or a more precise posting time from change logs if available
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Submitted', 'Approved', 'Rejected', 'Changes Requested'
SELECT
CONCAT(SUBSTRING(o.INSTID, 3, 4), SUBSTRING(o.INSTID, 7, 10), SUBSTRING(o.INSTID, 17, 4)) AS JournalEntryId,
CASE
WHEN wl.WI_TEXT LIKE '%Submit%' THEN 'Journal Entry Submitted'
WHEN wl.WI_TEXT LIKE '%Approve%' THEN 'Journal Entry Approved'
WHEN wl.WI_TEXT LIKE '%Reject%' THEN 'Journal Entry Rejected'
WHEN wl.WI_TEXT LIKE '%Request Changes%' THEN 'Journal Entry Changes Requested'
END AS ActivityName,
CAST(CONCAT(wl.WI_CD, wl.WI_CT) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
wl.EXEC_USER AS User,
SUBSTRING(o.INSTID, 3, 4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SWW_WI2OBJ o
JOIN [Your SAP Source].SWWLOGHIST wl ON o.WI_ID = wl.WI_ID
WHERE o.TYPEID = 'BKPF' AND o.CATID = 'BO'
AND wl.WI_TEXT IN ('[Your Submit Task Name]', '[Your Approve Task Name]', '[Your Reject Task Name]', '[Your Changes Request Task Name]')
AND [Date Filter on wl.WI_CD]
UNION ALL
-- Extraction block for 'Journal Entry Corrected'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Journal Entry Corrected' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'U'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Parked Journal Entry Deleted'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Parked Journal Entry Deleted' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'D'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Documentation Attached'
SELECT
CONCAT(SUBSTRING(r.INSTID_A, 3, 4), SUBSTRING(r.INSTID_A, 7, 10), SUBSTRING(r.INSTID_A, 17, 4)) AS JournalEntryId,
'Documentation Attached' AS ActivityName,
-- Note: A precise timestamp is often unavailable. Using document creation time as a proxy.
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SRGBTBREL r
JOIN [Your SAP Source].BKPF h ON h.BUKRS = SUBSTRING(r.INSTID_A, 3, 4) AND h.BELNR = SUBSTRING(r.INSTID_A, 7, 10) AND h.GJAHR = SUBSTRING(r.INSTID_A, 17, 4)
WHERE r.TYPEID_A = 'BKPF' AND r.RELTYPE = '[Configure based on your system]'
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Reversal Processed'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Reversal Processed' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.STBLG IS NOT NULL AND h.STBLG <> ''
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Is Reversed' flag on original document
SELECT
CONCAT(h_orig.BUKRS, h_orig.BELNR, h_orig.GJAHR) AS JournalEntryId,
'Is Reversed' AS ActivityName, -- This is an attribute update, modeled as an event
CAST(CONCAT(h_rev.CPUDT, h_rev.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h_rev.USNAM AS User,
h_orig.BUKRS AS CompanyCode,
h_orig.BLART AS DocumentType,
h_orig.BUDAT AS PostingDate,
h_orig.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h_rev
JOIN [Your SAP Source].BKPF h_orig ON h_rev.STBLG = h_orig.BELNR AND h_rev.BUKRS = h_orig.BUKRS AND h_rev.GJAHR_S = h_orig.GJAHR
WHERE h_rev.STBLG IS NOT NULL AND h_rev.STBLG <> ''
AND [Date Filter on h_rev.CPUDT] AND [Company Code Filter on h_rev.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Line Item Cleared'
SELECT
CONCAT(i.BUKRS, i.BELNR, i.GJAHR) AS JournalEntryId,
'Journal Entry Line Item Cleared' AS ActivityName,
CAST(i.AUGDT AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
NULL AS User, -- User who performed clearing is on the clearing document header
i.BUKRS AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BSEG i
WHERE i.AUGBL IS NOT NULL AND i.AUGBL <> ''
AND [Date Filter on i.AUGDT] AND [Company Code Filter on i.BUKRS]
UNION ALL
-- Extraction block for 'Manual Entry Identified'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Manual Entry Identified' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.TCODE IN ('FB01', 'F-02', 'FB50', 'FV50', '[Add other manual T-Codes]')
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Cross-Company Posting Identified'
SELECT
JournalEntryId,
'Cross-Company Posting Identified' AS ActivityName,
EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
User,
CompanyCode,
DocumentType,
PostingDate,
TransactionCode,
IsReversed
FROM (
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed,
(SELECT COUNT(DISTINCT i.BUKRS) FROM [Your SAP Source].BSEG i WHERE i.BELNR = h.BELNR AND i.BUKRS = h.BUKRS AND i.GJAHR = h.GJAHR) as CompanyCodeCount
FROM [Your SAP Source].BKPF h
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
) AS CrossCompanyCheck
WHERE CompanyCodeCount > 1 始める準備はできていますか?
このデータテンプレートを使って、決算・レポーティング:仕訳伝票のプロセスマイニングを始めましょう。財務業務をより深く把握し、効率化を進められます。
今すぐ決算・レポーティング:仕訳伝票を最適化
仕訳伝票の処理時間を30%短縮し、正確な財務報告を実現します。
クレジットカードは不要です。今日から改善を始められます。