決算報告 - 仕訳入力データテンプレート
決算報告 - 仕訳入力データテンプレート
- 包括的な分析のための推奨属性
- 追跡すべき主要な仕訳伝票活動
- SAP ECC向け実践的データ抽出ガイド
Record to Report - 仕訳伝票属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ名 ActivityName | 仕訳伝票プロセスのある特定の時点で発生したビジネス活動またはイベントの名称。 | ||
| 説明 活動名とは、「仕訳伝票作成済み」、「仕訳伝票承認済み」、「仕訳伝票転記済み」など、仕訳伝票のライフサイクルにおける特定のステップを指します。この属性は通常、SAPの複数のソース、すなわちトランザクションコード(TCODE)、変更伝票ログ(CDHDRおよびCDPOSテーブル)、伝票ステータス項目から取得されます。 活動の分析はプロセスマイニングの核となります。これにより、プロセスマップの可視化、ステップ間の移行時間の計算、および手戻りループ(例:「仕訳伝票却下済み」に続く「仕訳伝票修正済み」)の特定が可能になります。このデータは、サイクルタイム、手戻り率、プロセスバリアントに関連するダッシュボードにとって不可欠です。 その重要性 プロセスマップの各ステップを定義し、仕訳伝票ワークフローの可視化、分析、最適化を可能にします。 取得元 BKPFの 例 仕訳を作成仕訳伝票承認済み仕訳伝票却下済み仕訳伝票転記済み | |||
| イベント日時 EventTime | 仕訳伝票に対して特定の活動またはイベントが発生した時点を示すタイムスタンプ。 | ||
| 説明
その重要性 このタイムスタンプは、サイクルタイム、期間、そしてボトルネックの計算を可能にする、時間関連分析のすべての基盤となります。 取得元 活動に応じて様々な項目から取得され、主に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 | |||
| ドキュメントタイプ DocumentType | `会計伝票`の処理`および``保存方法`を`制御`するための`分類`です。 | ||
| 説明 伝票タイプは、総勘定元帳入力(SA)、仕入先請求書(KR)、固定資産転記(AA)など、さまざまな種類の取引を区別します。これはシステム設定時に定義され、すべての仕訳伝票に割り当てられます。 これは、取引の性質に基づいてプロセスをセグメント化できるため、分析にとって重要な属性です。「Journal Entry Throughput by Type」ダッシュボードおよび「Average Cycle Time by Journal Entry Type」KPIは、この項目に直接依存しています。特定の種類の伝票が遅延、手戻り、または取消に陥りやすいかどうかを明らかにするのに役立ちます。 その重要性
取得元 伝票ヘッダテーブルBKPFの項目BLARTにあります。 例 SAKRREAA | |||
| トランザクションコード TransactionCode | 仕訳伝票の作成または処理に使用されるSAPトランザクションコード。 | ||
| 説明 トランザクションコード(T-Code)は、SAPにおける特定の機能またはプログラムの一意の識別子です。仕訳伝票の場合、伝票がどのように作成されたかを示します。例えば、手動(FB01、F-02)、仮保存(FV50)、または自動インターフェース経由などです。 この属性は「手動活動最適化」ダッシュボードにとって非常に貴重です。T-Codeを分析することで、手動活動と自動化活動を区別し、どの手動プロセスが最も時間を消費しているかを特定し、手動作業を減らして効率を向上させる自動化の機会を明確にすることができます。 その重要性 手動プロセスと自動化プロセスの区別を支援し、自動化とプロセスの標準化の機会を特定します。 取得元 伝票ヘッダテーブルBKPFの項目TCODEにあります。 例 FB01F-02FV50FBD1 | |||
| ユーザー User | 仕訳伝票を作成または変更した担当者のSAPユーザーID。 | ||
| 説明 この属性は、伝票の作成、仮保存、転記などの特定の活動を担当するSAPユーザー名を捕捉します。伝票ヘッダまたは変更ログテーブルから直接取得されます。 ユーザー属性の分析は、チームおよび個人のパフォーマンスを理解する上で重要です。ユーザーごとの活動量と処理時間を追跡することで、ユーザー生産性ダッシュボードをサポートします。また、誰が手戻りループ、取消、またはコンプライアンス逸脱に関与しているかを特定し、的を絞ったトレーニングやプロセス改善を可能にします。 その重要性 各活動の担当者を特定し、ユーザーのパフォーマンス、ワークロードの配分、手戻りのパターンを分析できるようにします。 取得元 通常、BKPFテーブル(作成者用のUSNAMフィールド)またはCDHDRテーブル(変更者用のUSERNAMEフィールド)から取得されます。 例 ABROWNCJONESDSMITH | |||
| 会社コード CompanyCode | 財務諸表が作成される独立した法人を表す組織単位。 | ||
| 説明 会社コードは、SAP Financialsにおける基本的な組織単位です。法的に独立した会社を表し、仕訳伝票ヘッダの主要項目です。 この属性は、法的エンティティごとにプロセス分析をセグメント化するために不可欠です。これにより、事業の異なる部分間でプロセスパフォーマンス、コンプライアンス率、KPI結果を比較できます。例えば、承認の遅延や高い取消率が特定の会社コードに固有のものかどうかを特定するのに役立ちます。 その重要性
取得元 伝票ヘッダテーブルBKPFの項目BUKRSにあります。 例 10002000US01DE01 | |||
| 反転済み IsReversed | 仕訳が`取り消さ`れたかどうかを`示す``ブール値`の`フラグ`です。 | ||
| 説明 このフラグは、その後別の会計伝票によって取り消された仕訳伝票を識別します。SAPでは、取り消された伝票が取消伝票にリンクされ、明確な監査証跡が提供されます。 この属性は、「Journal Entry Reversal Analysis」ダッシュボードおよび「Journal Entry Reversal Rate」KPIの基本となります。これにより、取り消された伝票を分離して、データ入力エラーや不正確な会計処理など、根本原因を調査することが可能になり、取消の頻度を減らすことを目標とします。 その重要性 後で 取得元 BKPFテーブルの 例 truefalse | |||
| 計上日 PostingDate | 取引が総勘定元帳に記録された日付で、会計期間に影響します。 | ||
| 説明 転記日付は、仕訳伝票が計上される会計期間を決定します。これは、会計期間の締め日スケジュールや規制と整合する必要があるため、財務およびコンプライアンスの観点から重要な日付項目です。 プロセスマイニングでは、この日付はコンプライアンスを監視するために使用されます。「Compliance Adherence Monitoring」ダッシュボードおよび「Compliance Conformance Rate」KPIは、この属性を使用して、伝票が正しい期間内に転記されているかを確認します。また、仕訳伝票のボリュームの経時的なトレンドを分析するためにも使用できます。 その重要性 財務報告 取得元 伝票ヘッダテーブルBKPFの項目BUDATにあります。 例 2023-10-312023-11-302024-01-15 | |||
| コストセンター CostCenter | `管理領域`内の`組織単位`で、`コスト`が発生する`場所`を表します。 | ||
| 説明 原価センタは、管理会計(CO)モジュールの主要なマスタデータ要素であり、仕訳伝票の明細レベルで割り当てられることがよくあります。特定の部門、機能、または場所のコストを追跡するために使用されます。 原価センタを含めることで、仕訳伝票プロセスのより詳細な分析が可能になります。特定の部門がより多くの手戻りを発生させているか、サイクルタイムが長いか、またはより多くの手動入力に関与しているかを判断するのに役立ちます。これにより、部門別のプロセス効率ビューが可能になります。 その重要性 部門または 取得元 伝票明細テーブルBSEGの項目KOSTLにあります。 例 4100CC_FINANCE_US10010101 | |||
| サイクルタイム CycleTime | 最初の仕訳伝票活動の作成から最終転記活動までの総経過時間。 | ||
| 説明
この その重要性 プロセス全体の最初から最後までの効率を測定し、ボトルネックの特定と改善の追跡のための主要な指標を提供します。 取得元 各 例 P2DT3H15MPT8H30MP5D | |||
| 仮保存済み IsParked | 仕訳が`転記`される前に`仮保存`伝票として`保存`されたかどうかを`示す``ブール値`の`フラグ`です。 | ||
| 説明 伝票を仮保存することで、ユーザーは財務残高に影響を与えることなく未完成の仕訳伝票を保存できます。その後、転記前に他のユーザーによって完了またはレビューされることができます。このフラグは、仮保存ステップを経た伝票を識別します。 この属性を分析することで、仮保存機能の利用状況を理解できます。仮保存が非公式なレビューステップとして使用され、遅延を引き起こしている可能性があるかどうかを明らかにできます。直接転記される伝票と、まず仮保存される伝票とを区別し、エンドツーエンドのサイクルタイム分析をサポートします。 その重要性 仮保存機能を使用する伝票を特定します。これは遅延の原因となったり、非公式なレビュープロセスの指標となったりする可能性があります。 取得元 テーブルBKPFの 例 truefalse | |||
| 伝票合計金額 TotalDocumentAmount | 伝票通貨における仕訳伝票の合計金額。 | ||
| 説明 この属性は、仕訳伝票の総財務価値を表します。通常、伝票に関連するすべての借方または貸方の明細の絶対値を合計することで算出されます。 財務価値によるプロセス分析は、重要なパターンを明らかにすることができます。例えば、高額な伝票は、より厳格な承認経路をたどる場合があります。この属性は、サイクルタイム、却下率、または承認遅延が伝票金額と相関しているかどうかを確認するために、分析をフィルタリングまたはセグメント化するために使用できます。 その重要性 処理 取得元 これは、特定の仕訳伝票について、BSEGテーブル内のすべての明細から金額フィールド(WRBTRまたはDMBTR)を集計して導出される計算フィールドです。 例 1500.0025000.75125.50 | |||
| 取消理由 ReversalReason | 仕訳が`取り消さ`れた`理由`を`示す``コード`です。 | ||
| 説明 伝票が取り消される際、SAPではユーザーが理由コードを指定できます。このコードは、転記日付の誤りやデータ入力エラーなど、取り消しが必要だった理由に関する構造化された情報を提供します。 この属性は、「仕訳伝票取消分析」ダッシュボードの主要な入力となります。最も一般的な取消理由を分析することで、組織はプロセス内のシステム上の問題やトレーニングのギャップを特定し、将来のエラーを防止して取消率を低減するための的を絞ったアクションを取ることができます。 その重要性 なぜ取消が発生するのかについて直接的な洞察を提供し、将来のエラーを減らすためのターゲットを絞った根本原因分析を可能にします。 取得元 伝票ヘッダテーブルBKPFの項目STGRDにあります。 例 010205 | |||
| 手戻り IsRework | 仕訳が却下されて修正されるなど、手戻りの`ループ`を経たかどうかを`示す``ブール値`の`フラグ`です。 | ||
| 説明 このフラグは、「ハッピーパス」から逸脱し、修正措置が必要となったケースを識別します。通常、特定の仕訳伝票に対して「Journal Entry Rejected」の後に「Journal Entry Corrected」といった活動シーケンスが観察された場合に真となります。 この属性は、「Journal Entry Rework Rate」KPIの計算や、「Rework and Rejection Rate」ダッシュボードでの分析に不可欠です。プロセスの非効率性の程度を定量化するのに役立ち、不明確な要件や不十分な文書化など、手戻りの根本原因を調査するための基盤を提供します。 その重要性 修正が必要な 取得元 これは、ケースの活動シーケンスを分析して導き出される計算属性です。却下または修正活動が発生した場合に手戻りループが識別されます。 例 truefalse | |||
| 承認時間 ApprovalTime | 仕訳伝票が承認のために提出されてから、承認または却下されるまでの経過時間。 | ||
| 説明 この指標は、全体のサイクルタイムに大きく影響する承認サブプロセス(期間)を測定します。これは、「仕訳入力提出」アクティビティと、対応する「仕訳伝票承認」または「仕訳伝票却下」アクティビティ間の時間差として計算されます。 承認時間は、「仕訳伝票承認パフォーマンス」ダッシュボードおよび「平均仕訳伝票承認時間」KPIの主要な指標です。この期間を分析することで、承認ワークフローにおけるボトルネックを特定し、承認者のパフォーマンスを測定し、承認しきい値の調整などのプロセス変更を正当化するのに役立ちます。 その重要性 承認段階の期間を定量化し、レビューおよび承認ワークフローにおける遅延を特定し、対処するのに役立ちます。 取得元 「Journal Entry Submitted(仕訳 例 1日2時間4時間15分P3D | |||
| 通貨キー CurrencyKey | 仕訳伝票に記録された金額の通貨コード。 | ||
| 説明 この属性は、USD、EUR、JPYなど、仕訳伝票の通貨を指定します。伝票に関連するあらゆる財務金額のコンテキストを提供します。 常に主要な分析ディメンションであるとは限りませんが、金額を正しく解釈するためには不可欠です。また、グローバル組織では、外貨と現地通貨での伝票でプロセスが異なるかどうかを分析するために、セグメント化にも使用できます。 その重要性 すべての金銭的価値に必要なコンテキストを提供し、正確な財務分析と解釈を保証します。 取得元 伝票ヘッダテーブルBKPFの項目WAERSにあります。 例 USDEURGBPJPY | |||
Record to Report - 仕訳伝票活動
| アクティビティ | 説明 | ||
|---|---|---|---|
| 仕訳伝票仮保存済み | この活動は、仕訳伝票が総勘定元帳に正式に転記される前の仮の状態での初回作成を示します。これは、SAPでユーザーが仮保存トランザクションを使用して伝票を保存し、伝票ステータスを「仮保存済み」に設定したときに明示的に捕捉されます。 | ||
| その重要性 これは、レビューと承認を伴うプロセスにとって重要な開始イベントです。仮保存から転記までの時間を分析することで、転記前および承認段階での遅延を特定するのに役立ちます。 取得元 このイベントは、伝票ヘッダテーブルBKPFから識別されます。伝票は、ステータスBKPF-BSTAT = 'V'で作成された場合に仮保存済みとみなされます。イベントタイムスタンプは作成日時、BKPF-CPUDTとBKPF-CPUTMです。 取得 BKPFテーブル内でBKPF-BSTATが「V」である伝票の作成を特定します。 イベントタイプ explicit | |||
| 仕訳伝票取消処理済み | この活動は、以前に転記された仕訳伝票の取消を示します。取消は、元の伝票を相殺する新しい会計伝票です。 | ||
| その重要性 これは、データ品質とプロセス精度を測定するための重要なイベントです。取消率が高いことは、初期のデータ入力または承認段階でのシステム的な問題を示しており、各取消は手戻り作業を意味します。 取得元 このイベントは元伝票のヘッダ(BKPFテーブル)で識別されます。伝票が取り消されると、SAPは取消伝票番号(BKPF-STBLG)と取消理由(BKPF-STGRD)を入力します。イベントタイムスタンプは新しい取消伝票の転記日付です。 取得 元伝票のBKPF-STBLGが入力される時点を特定します。タイムスタンプは取消伝票の転記日付です。 イベントタイプ 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 | |||
| 仕訳を作成 | 先行する仮保存ステップなしに直接転記される仕訳伝票の作成を表します。これは、SAPで直接転記トランザクションを使用して伝票が作成されたときに捕捉されます。 | ||
| その重要性 この活動は、承認ワークフローを必要としないより単純な仕訳伝票プロセスにとっての代替の開始点として機能します。これにより、単純な直接転記と、より複雑な仮保存伝票との違いを区別するのに役立ちます。 取得元 このイベントは、BKPFテーブルで伝票ステータスBKPF-BSTATが空白(転記済み)である伝票作成に対応します。イベントタイムスタンプは作成日BKPF-CPUDTです。これらの伝票の場合、「作成済み」と「転記済み」イベントは同時に発生します。 取得 BKPFテーブル内でBKPF-BSTATが空白である伝票の作成を特定します。 イベントタイプ explicit | |||
| 仕訳伝票修正済み | この活動は、元の作成者が、変更のために差し戻された仮保存仕訳伝票を修正したことを示します。「Changes Requested」イベント後の伝票への変更を検出することで推測されます。 | ||
| その重要性 修正を追跡することは、手直しに費やされた労力を数値化するのに役立ちます。変更要求から修正までの時間は、提出された入力に関する問題解決における遅延を浮き彫りにします。 取得元 仮保存伝票の変更伝票ログ(CDHDRおよびCDPOSテーブル)を分析することで推測されます。ワークフローにおける却下イベント後に記録された変更は、修正が行われたことを意味します。タイムスタンプはCDHDRテーブルからのものです。 取得 却下イベント後のCDHDR/CDPOSにおける変更ログエントリを特定します。 イベントタイプ inferred | |||
| 仕訳伝票却下済み | この活動は、仕訳伝票の最終的な却下を示し、その後は転記されません。これは通常、承認ワークフローにおける最終ステータスであり、結果として仮保存伝票の削除につながります。 | ||
| その重要性 却下を追跡することは、品質管理にとって非常に重要です。却下の理由と頻度を分析することで、仕訳入力の初回成功率を向上させるのに役立ちます。 取得元 これはSAP Business Workflowログから捕捉された結果であり、プロセスを終了させる最終的な「却下」のユーザー決定を表します。仮保存伝票はその後削除される可能性があります。 取得 伝票のワークフローログにおける最終的な「却下」ステータスを特定します。 イベントタイプ inferred | |||
| 仕訳伝票変更要求済み | ワークフローにおいて、承認者が仕訳伝票をレビューし、作成者に修正のために差し戻した時点を表します。このイベントは、「却下」または「差し戻し」のユーザー決定を示すワークフローログから取得されます。 | ||
| その重要性 この活動は、非効率性やプロセス逸脱の主な原因である手戻りループを特定するために不可欠です。このイベントの発生頻度が高いことは、入力品質の問題や要件の不明確さを示しています。 取得元 このイベントは、SAP Business Workflowログ内の特定のユーザー決定ステップのタイムスタンプから推測されます。これは「却下」または「修正のために差し戻し」アクションに対応します。 取得 ワークフローログ内の「却下」または「手戻り」の決定タイムスタンプを特定します。 イベントタイプ inferred | |||
| 仕訳伝票明細消込済み | この活動は、銀行勘定などの未消込管理される総勘定元帳の明細の消込を表します。これは、ある明細が別の明細と照合され、消込が行われたときに発生します。 | ||
| その重要性
取得元 このイベントは、明細テーブルBSEGから取得されます。明細が消込されると、消込日付(BSEG-AUGDT)と消込伝票(BSEG-AUGBL)の項目が入力されます。イベントのタイムスタンプは消込日付です。 取得 明細の消込日付(BSEG-AUGDT)が入力される時点を特定します。 イベントタイプ explicit | |||
| 仮保存仕訳伝票削除済み | 一度も転記されなかった仮保存仕訳伝票の削除を表します。これは、却下後や誤って作成された場合に発生する可能性があります。 | ||
| その重要性 この活動は、プロセスが不成功に終わったことを示します。仮保存伝票が削除される理由を分析することで、重複した入力やプロセスの誤解などの問題を明らかにできます。 取得元 このイベントは、BKPFテーブル内の仮保存伝票のステータスが変更されたときに捕捉されます。ステータス項目BKPF-BSTATが「Z」(仮保存伝票削除済み)に更新されます。変更タイムスタンプは伝票変更ログ(CDHDR)で確認できます。 取得 BKPF-BSTATが「Z」に更新される時点を特定します。 イベントタイプ explicit | |||
| 会社間`転記`が`識別`されました | 複数の会社コードに影響を与える仕訳を`フラグ`付けする`計算済み`の`アクティビティ`です。これは単一の財務`伝票`の`明細`を`分析`することで決定されます。 | ||
| その重要性 会社間 取得元 特定の 取得 単一のBKPF-BELNRに対して複数の イベントタイプ calculated | |||
| 手動入力特定済み | この活動は、仕訳伝票が手動のオンライン取引を通じて作成されたのか、それとも自動化されたインターフェースやバッチプロセスを通じて作成されたのかを識別します。これはユーザーアクションではなく、システムデータから派生した仕訳伝票の計算属性です。 | ||
| その重要性 手動 取得元 これは、伝票ヘッダテーブルBKPFの項目を分析することで計算されます。「FB01」、「FB50」、「FV50」のようなトランザクションコード(BKPF-TCODE)は手動入力を示し、その他のT-コードや特定のバッチ入力名(BKPF-AWKEY)は自動化を示唆します。 取得 BKPF-TCODEまたは イベントタイプ calculated | |||
| 資料が`添付`されました | この活動は、ユーザーが請求書やスプレッドシートなどの補足文書を仕訳伝票に添付したことを表します。このイベントは標準的な会計イベントとして明示的にログに記録されず、通常、会計伝票オブジェクトにリンクされた添付ファイルの作成を確認することで推測されます。 | ||
| その重要性 このアクティビティを追跡することで、文書化を義務付けるポリシーへのコンプライアンスの検証に役立ちます。文書添付の遅延は、承認サイクルが長期化する根本原因となる可能性があります。 取得元 これはタイムスタンプ付きイベントとして確実に捕捉するのが困難です。Generic Object Services(GOS)の添付ファイルテーブル(SOODなど)を分析し、添付ファイルの作成タイムスタンプを仕訳伝票オブジェクトキーにリンクすることで、推測できる可能性があります。 取得 GOSテーブル(例: SOOD)内のリンクされたオブジェクトの作成タイムスタンプから推測します。 イベントタイプ inferred | |||
抽出ガイド
ステップ
- ABAP
プログラムの作成: SAPシステムでトランザクションコードSE38(ABAPエディタ)に移動します。新しいプログラム名(例:Z_PM_JE_EXTRACTION)を入力し、「作成」をクリックします。適切なタイトルを指定し、プログラムタイプを「実行可能プログラム」に設定します。 選択画面の定義:プログラムのソースコード内で選択画面を定義します。これにより、ユーザーは伝票作成の日付範囲、会社コード、伝票タイプなどのパラメータを指定し、抽出のデータボリュームを制限できます。データ構造の宣言: 最終的なイベントログ``データを保持する内部テーブル``構造を定義します。この構造には、JournalEntryId、ActivityName、EventTime、SourceSystem、LastDataUpdate、およびユーザー、会社コード、転記日などの推奨される属性を含む、すべての必須フィールドを含める必要があります。データ選択ロジックの実装: 必須の14のアクティビティそれぞれに対してデータを抽出するコアABAP SQLクエリを記述します。これには、BKPF(ヘッダ)やBSEG(明細)などの主要テーブル、CDHDRおよびCDPOSなどの変更ログテーブル、SWWLOGHISTなどのワークフローテーブル、BSASおよびBSAKなどの消込テーブルからデータを選択することが含まれます。仮保存および転記済み伝票の抽出: 「Journal Entry Parked(仕訳仮保存)」イベントの場合、伝票ステータス(BSTAT)が「V」であるBKPFから選択します。「Journal Entry Created(仕訳作成)」および「Journal Entry Posted(仕訳転記済み)」イベントの場合、ステータスが空白であるBKPFから選択します。これは通常の転記済み伝票を示します。- 変更
および削除イベントの抽出:変更伝票テーブルCDHDRおよびCDPOSをオブジェクトクラス「BELEG」で照会します。伝票キーでフィルタし、「Journal Entry Corrected(仕訳修正済み)」または「Parked Journal Entry Deleted(仮保存仕訳削除済み)」アクティビティに対応する変更を見つけます。 ワークフローイベントの抽出: 「Journal Entry Submitted(仕訳提出済み)」、「Approved(承認済み)」、「Rejected(却下済み)」、「Changes Requested(変更要求済み)」などのアクティビティをキャプチャするには、ワークフローテーブルを照会します。SWW_WI2OBJテーブルを使用して会計伝票をワークフローインスタンスにリンクし、SWWLOGHISTを読み取って特定のユーザー決定またはステータス変更を確認します。計算済みイベントの識別: 「Manual Entry Identified(手動入力識別済み)」の場合、トランザクションコード(BKPF-TCODE)を既知の手動入力t-コードのリストと照合します。「Cross-Company Posting Identified(会社間転記識別済み)」の場合、与えられた伝票のBSEG明細を分析して、複数の会社コードが関与しているかどうかを確認します。データの統合と変換: 各アクティビティのデータが選択されるにつれて、それを最終的なイベントログ``構造に変換します。会社コード、伝票番号、会計年度を連結してJournalEntryIdを作成します。SAPの日付と時間を単一のEventTimeタイムスタンプに変換します。各クエリの結果を最終的な内部テーブルに追加します。- ファイル
エクスポートの実装: OPEN DATASET、LOOP AT、TRANSFER、CLOSE DATASETなどのABAPファイル処理ステートメントを使用して、統合された内部テーブルをSAPアプリケーションサーバー``ディレクトリ(トランザクションAL11で表示可能)上のCSVまたはフラットファイルに書き込みます。 バックグラウンドジョブとしてのスケジュール:トランザクションSM36(バックグラウンドジョブの定義)に移動します。新しいジョブを作成し、ABAPプログラムを実行するステップを定義し、抽出プロセスを自動化するために、例えば夜間や週次の負荷の低い時間帯にスケジュールを設定します。- ファイルの
取得とフォーマット:トランザクションCG3Yを使用するか、システム管理者と協力して、生成されたファイルをアプリケーションサーバーからローカルマシンにダウンロードします。ファイルエンコーディングとフォーマットがプロセスマイニングツールへのアップロードに適していることを確認します。
設定
- Date Range:
パフォーマンス管理のため、期間を定義することが重要です。伝票作成日付(BKPF-CPUDT)を主要なフィルタとして使用してください。初回分析では3〜6ヶ月の期間を推奨します。テストには、データが含まれていることが分かっている数日間の範囲を使用してください。 - Company Code Filter: 常に会社コード(BKPF-BUKRS)で
フィルタリングしてください。すべての会社コードのデータを一度に抽出すると、非常にリソースを消費する可能性があります。まず、関連する1つまたは少数の会社コードから開始してください。 - Document Type Filter: すべての伝票
タイプを分析する必要がない場合、伝票タイプフィルタ(BKPF-BLART)を使用して、G/L伝票の「SA」など、特定の仕訳タイプにスコープを絞り込んでください。 - Workflow Task IDs:
ワークフローイベントを抽出するロジックは、システムで使用される承認、却下、および提出のための特定のタスクIDに依存します。これらのIDは、会社のワークフロー定義に基づいてプログラムのソースコードに設定する必要があります。 - Performance Considerations: この
プログラムは、特にCDPOSおよびワークフロー履歴テーブルなど、いくつかの大きなテーブルを結合します。ピークビジネス時間中に実行すると、システムパフォーマンスに影響を与える可能性があります。常にバックグラウンドジョブとして、システム負荷の低い時間帯に実行するようスケジュールしてください。パフォーマンスが繰り返し問題となる場合は、セカンダリデータベースインデックスの作成を検討してください。 - Prerequisites: この
方法では、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 ServerManagement 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``文字列に連結します。ポストプロセスまたはターゲットシステムがこの形式を解析できることを確認するか、データベースがサポートしている場合は、SQLCONCAT``関数をYYYY-MM-DDTHH:MI:SSのようなISO 8601形式に調整します。データのエクスポート: SQLクライアントから完全な結果セットをCSVファイルにエクスポートします。特殊文字に関する問題を防止するために、UTF-8エンコーディングを使用していることを確認します。アップロードの準備:プロセスマイニングツールにアップロードする前に、列ヘッダが必須のデータスキーマと一致することを確認します。JournalEntryId、ActivityName、EventTimeはクリティカルです。LastDataUpdate``列を追加し、抽出が実行されたタイムスタンプで入力します。- 最終
検証:分析を開始する前に、抽出されたデータが完全で正確であることを確認するために、「validationSteps」セクションで概説されているステップを実行します。
設定
- Database Authorizations: データベースユーザーには、以下のSAPテーブル(BKPF、BSEG、CDHDR、CDPOS、T001、V_USERNAME)への読み取りアクセスが必要です。ワークフロー関連の
アクティビティには、SWW_WI2OBJおよびSWWLOGHISTへのアクセスも必須です。通常、このレベルのアクセスは専門の技術チームのみに付与されます。 - Date Range Filtering:
クエリのパフォーマンスを確保するため、データを特定の期間でフィルタリングすることが非常に重要です。提供されているクエリは、開始日付と終了日付のプレースホルダーを使用しており、これらは伝票作成日付(BKPF.CPUDT)に適用されます。初回分析には3〜6ヶ月の範囲を推奨します。 - Entity Filtering:
データボリュームを管理し、分析を絞り込むために、常に会社コード(BKPF.BUKRS)でフィルタリングしてください。関連する仕訳タイプのみを含めるために、伝票タイプ(BKPF.BLART)でフィルタリングすることも検討できます。例えば、G/L伝票には「SA」を使用し、対象外の請求書や支払いなどの運用伝票を除外することができます。 - Performance Considerations: BSEGやCDPOSのような
コアテーブルへの直接クエリは、リソースを大量に消費する可能性があります。エンドユーザーのシステムパフォーマンスへの影響を避けるため、この抽出はシステム負荷の低い時間帯に実行することを強くお勧めします。1回の実行で1年以上のデータを抽出することは避けてください。 - Workflow Task IDs:
クエリには'[WF_TASK_ID_SUBMIT]'や'[WF_TASK_ID_APPROVE]'のようなプレースホルダーが含まれています。これらは、お客様のシステムの特定の仕訳ワークフロー設定からの実際のタスクIDに置き換える必要があります。これらはSAPワークフロー専門家と連携するか、トランザクション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]'であるBKPFをSRGBTBRELに結合します。リンクの作成日付がイベントタイムとなります。- **
消込``および``反転イベントの抽出**: 「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(会社間転記識別済み)」の場合、伝票IDでBSEGテーブルをグループ化し、複数の異なる会社コードを持つ伝票を識別します。- すべての
イベントフローの結合: ETLツールのUNION変換を使用して、個々のイベントフロー(作成済み、仮保存、承認済みなど)の出力を単一のイベントログ``テーブルにマージします。すべてのフローで列名とデータタイプが一貫していることを確認します。 - 最終
スキーマへのマッピング: 結合されたデータを必須のイベントログ``構造にマッピングし、JournalEntryId、ActivityName、EventTime、User、およびその他の必須および推奨属性を作成します。SourceSystemのような静的な列を追加し、ETLジョブの実行時間をLastDataUpdateに使用します。 増分ロードの構成:継続的な抽出の場合、増分ロードストラテジーを構成します。最後の実行以降の新規または更新されたレコードのみをプルするために、最後の作成または変更日付(例:BKPF.CPUDT、CDHDR.UDATE)をウォーターマークとして使用します。- ProcessMindへの
エクスポート:抽出ジョブをスケジュールし、最終的な出力ステップを構成して、イベントログをProcessMindによるアップロードでアクセス可能な場所にCSVまたはParquetファイルとして保存します。
設定
- Prerequisites: ライセンスを持つ
サードパーティ製ETLツール(例:Theobald Xtract Universal、Informatica、Talend)と専用のSAPコネクタが必要です。また、RFCアクセスと財務テーブル(例:テーブルグループF_00、F_WFに対するS_TABU_DIS)、ワークフローデータ、変更ログを読み取る権限を持つSAPユーザーアカウントも必要です。 - Connection Parameters: SAP
アプリケーション``サーバーのIPアドレスまたはホスト名、システム番号、クライアントIDが必要です。SAPのユーザー名とパスワードには、安全な認証情報``管理を使用してください。 - Key Filters:
データボリュームを制限するため、常にソース側で会社コード(BKPF.BUKRS)と会計年度(BKPF.GJAHR)にフィルタを適用してください。特定の抽出期間を定義するため、伝票作成日付(BKPF.CPUDT)でフィルタリングすることを強くお勧めします(例:過去6ヶ月間)。 - Date Range Selection: 初回
ロードでは、3〜6ヶ月のような代表的な期間を選択してください。その後のデルタロードでは、CPUDTのようなタイムスタンプフィールドにウォーターマークを使用して、新しいレコードのみをフェッチします。 - Performance Considerations: BSEG、CDPOS、および
ワークフローテーブルでの結合は非常に遅くなる可能性があります。ETLツールが可能な限りフィルタをSAPソースにプッシュダウンするようにしてください。特に大量の履歴ロードの場合、ツールが許可する場合は、データをより小さなチャンクまたはパッケージで抽出してください。 - Workflow Customization: 「承認済み」や「却下済み」などの
ワークフローアクティビティを識別するロジックは、お客様の特定のワークフロー``テンプレートに大きく依存します。フィルタで使用するために、お客様のシステムから正しいワークフロータスクIDとユーザー決定キーを特定する必要があります。
a クエリ例 config
/*
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