決算・レポーティング:仕訳のデータテンプレート
決算・レポーティング:仕訳のデータテンプレート
- 詳細な分析に推奨される属性
- 追跡すべき主な仕訳アクティビティ
- SAP ECCからのデータ抽出手順
決算・レポーティング:仕訳の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ名 ActivityName | 仕訳プロセスの特定の時点で発生した業務アクティビティまたはイベントの名前です。 | ||
| 説明 アクティビティ名は、「仕訳の作成」「仕訳の承認」「仕訳の転記」など、仕訳のライフサイクルにおける特定のステップを表します。通常、SAPの複数の情報源から導出します。情報源には、トランザクションコード(TCODE)、変更文書ログ(テーブルCDHDRおよびCDPOS)、文書ステータス項目などがあります。 アクティビティの分析は、プロセスマイニングの中核です。プロセスマップの可視化、ステップ間の所要時間の計算、手戻りのループ(例:「仕訳の却下」の後に「仕訳の修正」が続くケース)の特定に役立ちます。このデータは、サイクルタイム、手戻り率、プロセスバリアントに関するダッシュボードの基礎となります。 重要な理由 プロセスマップの各ステップを定義し、仕訳ワークフローの可視化、分析、最適化を可能にします。 入手先 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を使って作成、一時保存、提出、承認、却下、転記など、関連するすべてのアクティビティを結び付けます。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 | |||
| 取消済みかどうか IsReversed | 仕訳が取り消されているかどうかを示す真偽値です。 | ||
| 説明 このフラグは、別の会計伝票によって後から取り消された仕訳を示します。SAPでは、取り消された伝票が取消伝票と関連付けられるため、監査証跡を明確に確認できます。 この属性は、「仕訳取消分析」ダッシュボードと「仕訳取消率」KPIの基礎となります。取り消された仕訳を抽出して、入力ミスや誤った会計処理などの根本原因を調査し、取消の発生頻度を減らすために利用できます。 重要な理由 後から取り消された仕訳にフラグを付けて取消分析を支援し、エラーの根本原因の特定とデータの整合性向上に役立ちます。 入手先 BKPFテーブルの取消伝票番号フィールド(STBLG)から算出します。STBLGが空でない場合、フラグはtrueになります。 例 truefalse | |||
| 文書タイプ DocumentType | 会計文書の処理方法や保存方法を制御する分類です。 | ||
| 説明 文書タイプは、総勘定元帳の仕訳(SA)、仕入先請求書(KR)、資産転記(AA)など、異なる業務取引を区別します。システム設定で定義し、各仕訳に割り当てます。 取引の性質ごとにプロセスを分類できるため、分析に欠かせない属性です。「タイプ別の仕訳処理件数」ダッシュボードと「仕訳タイプ別の平均サイクルタイム」指標は、この項目を直接参照します。特定のタイプの仕訳で遅延、手戻り、取消が発生しやすいかを明らかにできます。 重要な理由 取引タイプごとに分析を分類し、特定の仕訳タイプに限ったプロセス上の問題を特定できます。 入手先 文書ヘッダーテーブルBKPFのBLART項目にあります。 例 SAKRREAA | |||
| 転記日 PostingDate | 取引が総勘定元帳に記録され、財務期間に反映される日付です。 | ||
| 説明 転記日は、仕訳が計上される会計期間を決定します。会計期間の締めスケジュールや規制に沿っている必要があるため、財務とコンプライアンスの観点から重要な日付項目です。 プロセスマイニングでは、この日付を使ってコンプライアンスを監視します。「コンプライアンス遵守状況のモニタリング」ダッシュボードと「コンプライアンス適合率」指標では、この属性を使って仕訳が正しい期間内に転記されているかを確認します。仕訳件数の経時的な傾向分析にも利用できます。 重要な理由 財務レポーティングとコンプライアンス分析に欠かせない項目です。仕訳が正しい会計期間に転記されているかを確認できます。 入手先 文書ヘッダーテーブルBKPFのBUDAT項目にあります。 例 2023-10-312023-11-302024-01-15 | |||
| 仮登録済み IsParked | 仕訳が転記前に仮登録伝票として保存されたかどうかを示す真偽値フラグです。 | ||
| 説明 伝票を仮登録すると、財務残高に影響を与えずに未完成の仕訳を保存できます。その後、別のユーザーが内容を完成させるか確認してから転記できます。このフラグは、仮登録の段階を経た仕訳を示します。 この属性を分析すると、仮登録機能がどのように使われているかを把握できます。非公式な確認手順として使われ、遅延につながっている可能性も明らかになります。また、プロセス全体のサイクルタイムを分析し、直接転記された仕訳と、先に仮登録された仕訳を区別できます。 重要な理由 仮登録機能を使った仕訳を特定します。遅延の原因や、非公式な確認プロセスの兆候を把握できます。 入手先 BKPFテーブルの伝票ステータスフィールド(BSTAT)から算出します。「V」は仮登録伝票を示します。 例 truefalse | |||
| 原価センタ CostCenter | 管理領域内で、費用が発生する部門や場所を表す組織単位です。 | ||
| 説明 原価センタは、管理会計(CO)モジュールの主要なマスターデータ項目で、仕訳の明細行に割り当てられることがよくあります。特定の部門、機能、場所の費用を追跡するために使われます。 原価センタを含めると、仕訳プロセスをより細かく分析できます。特定の部門で手戻りが多いか、サイクルタイムが長いか、手入力の件数が多いかを確認できます。これにより、部門ごとのプロセス効率を把握できます。 重要な理由 部門や機能領域ごとのプロセス実績を分析し、局所的な非効率を特定できます。 入手先 伝票明細テーブルBSEGのフィールドKOSTLにあります。 例 4100CC_FINANCE_US10010101 | |||
| 取消理由 ReversalReason | 仕訳を取り消した理由を示すコードです。 | ||
| 説明 伝票を取り消す際、SAPではユーザーが理由コードを指定できます。このコードには、転記日の誤りや入力ミスなど、取消が必要になった理由が構造化された形で記録されます。 この属性は、「仕訳取消分析」ダッシュボードの主要な入力データです。よくある取消理由を分析することで、組織はプロセス上の構造的な問題やトレーニングの不足を特定し、今後のエラーを防いで取消率を下げるための対策を講じられます。 重要な理由 取消が発生する理由を直接把握できるため、根本原因を絞り込んで分析し、今後のエラーを減らせます。 入手先 伝票ヘッダーテーブルBKPFのフィールドSTGRDにあります。 例 010205 | |||
| 手戻りあり IsRework | 仕訳が却下後に修正されるなど、手戻りのループが発生したかどうかを示す真偽値フラグです。 | ||
| 説明 このフラグは、理想経路から外れて修正が必要になったケースを示します。通常、特定の仕訳で「仕訳を却下」の後に「仕訳を修正」などの一連のアクティビティが確認された場合にtrueになります。 この属性は、「仕訳手戻り率」KPIの算出と、「手戻り・却下率」ダッシュボードの分析に欠かせません。プロセスの非効率の程度を数値化し、要件の不明確さや文書化の不足など、手戻りの根本原因を調査するための基礎となります。 重要な理由 修正が必要だった仕訳にフラグを付け、手戻りの件数と根本原因を分析できます。初回で正しく処理できる割合の向上に役立ちます。 入手先 ケース内のアクティビティの順序を分析して算出する属性です。却下または修正のアクティビティが発生した場合に、手戻りのループとして識別します。 例 truefalse | |||
| 承認時間 ApprovalTime | 仕訳が承認に提出されてから、承認または却下されるまでの経過時間です。 | ||
| 説明 この指標は、承認サブプロセスにかかる時間を測定します。承認は、全体のサイクルタイムに大きく影響することがよくあります。「仕訳を承認申請」と、それに対応する「仕訳を承認」または「仕訳を却下」のアクティビティ間の時間差として算出します。 承認時間は、「仕訳承認パフォーマンス」ダッシュボードと「仕訳の平均承認時間」KPIの中心となる指標です。この時間を分析すると、承認ワークフローのボトルネックを特定し、承認者の対応状況を測定できます。また、承認基準の調整など、プロセス変更の根拠にもなります。 重要な理由 承認段階にかかる時間を数値化し、確認・承認ワークフローの遅延を特定して対処できます。 入手先 「仕訳を承認申請」イベントのタイムスタンプを、「仕訳を承認」または「仕訳を却下」イベントのタイムスタンプから差し引いて算出します。 例 P1DT2HPT4H15MP3D | |||
| 文書の合計金額 TotalDocumentAmount | 文書通貨で表した仕訳の合計金額です。 | ||
| 説明 この属性は、仕訳の合計金額を表します。通常、文書に関連付けられたすべての借方または貸方の明細項目について、絶対値を合計して算出します。 金額別にプロセスを分析すると、重要な傾向が見つかる場合があります。たとえば、高額の仕訳には、より厳格な承認経路が適用されることがあります。この属性で分析を絞り込んだり分類したりすることで、仕訳金額とサイクルタイム、却下率、承認の遅延との関連を確認できます。 重要な理由 仕訳金額と処理時間や却下率の関係など、金額に応じた影響を分析できます。 入手先 算出項目です。対象の仕訳について、BSEGテーブルにあるすべての明細項目の金額項目(WRBTRまたはDMBTR)を集計して求めます。 例 1500.0025000.75125.50 | |||
| 通貨コード CurrencyKey | 仕訳に記録された金額の通貨コードです。 | ||
| 説明 この属性は、USD、EUR、JPYなど、仕訳の通貨を示します。伝票に関連する金額を解釈する際の情報として利用できます。 常に主要な分析軸となるわけではありませんが、金額を正しく解釈するうえで欠かせません。また、グローバル組織で分析を通貨別に分け、外貨建てと自国通貨建ての仕訳でプロセスに違いがあるかを確認する際にも利用できます。 重要な理由 すべての金額に必要な情報を補い、正確な財務分析と解釈を支援します。 入手先 伝票ヘッダーテーブルBKPFのフィールドWAERSにあります。 例 USDEURGBPJPY | |||
決算・レポーティング:仕訳のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 仕訳の一時保存 | このアクティビティは、仕訳を総勘定元帳に正式に転記する前の仮状態で作成した時点を示します。SAPでは、ユーザーが一時保存用のトランザクションで文書を保存し、ステータスを「一時保存」にすると記録されます。 | ||
| 重要な理由 レビューや承認を伴うプロセスの重要な開始イベントです。一時保存から転記までの時間を分析すると、転記前の処理や承認段階で発生している遅延を特定できます。 入手先 このイベントは、文書ヘッダーテーブルBKPFから特定します。BKPF-BSTAT = 'V'のステータスで作成された文書を一時保存とみなします。イベントのタイムスタンプには、作成日と時刻であるBKPF-CPUDTおよびBKPF-CPUTMを使用します。 記録 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 | |||
| 一時保存仕訳の削除 | 転記されなかった一時保存仕訳の削除を示します。却下後や、誤って仕訳を作成した場合などに発生します。 | ||
| 重要な理由 このアクティビティは、プロセスが正常に完了しなかったことを示します。一時保存された文書が削除された理由を分析すると、重複入力やプロセスへの理解不足などの問題が明らかになる場合があります。 入手先 BKPFテーブルにある一時保存文書のステータスが変更された時点で記録されます。ステータス項目BKPF-BSTATは'Z'(一時保存文書の削除)に更新されます。変更時刻は文書変更ログ(CDHDR)で確認できます。 記録 BKPF-BSTATが'Z'に更新された時点を特定します。 イベントタイプ explicit | |||
| 仕訳の作成 | 一時保存の手順を経ずに、仕訳を直接転記したことを示します。SAPで直接転記用のトランザクションを使って文書を作成した際に記録されます。 | ||
| 重要な理由 承認ワークフローを必要としない、比較的単純な仕訳プロセスの開始点として使われます。単純な直接転記と、より複雑な一時保存を伴う仕訳を区別できます。 入手先 BKPFテーブルで文書を作成した際、文書ステータスBKPF-BSTATが空欄(転記済み)の場合に、このイベントに該当します。イベントのタイムスタンプには作成日BKPF-CPUDTを使用します。この場合、「作成」と「転記」のイベントは同時に発生します。 記録 BKPF-BSTATが空欄の文書作成を特定します。 イベントタイプ explicit | |||
| 仕訳の修正 | このアクティビティは、修正依頼で差し戻された後、元の作成者が一時保存された仕訳を変更したことを示します。「修正依頼」イベントの後に文書が変更されたことを検出して推定します。 | ||
| 重要な理由 修正を追跡すると、手戻りにかかった作業量を把握できます。修正依頼から修正完了までの時間を確認することで、提出された仕訳の問題解決にかかる遅延を明らかにできます。 入手先 一時保存された文書について、変更文書ログ(テーブルCDHDRおよびCDPOS)を分析して推定します。ワークフローで却下された後に変更が記録されていれば、修正が行われたことを示します。タイムスタンプはCDHDRテーブルから取得します。 記録 却下イベント後にCDHDR/CDPOSの変更ログエントリーがあるかを特定します。 イベントタイプ inferred | |||
| 仕訳の修正依頼 | このアクティビティは、承認者が仕訳を確認し、修正のために作成者へ差し戻した時点を示します。「却下」または「差し戻し」のユーザー判断を示すワークフローログから記録します。 | ||
| 重要な理由 手戻りのループを特定するうえで欠かせないアクティビティです。手戻りは、非効率やプロセス逸脱の主な原因です。このイベントが頻繁に発生する場合、仕訳の品質や要件の明確さに問題がある可能性があります。 入手先 SAP Business Workflowログで、「却下」または「修正依頼」に該当する特定のユーザー判断ステップのタイムスタンプから推定します。 記録 ワークフローログから「却下」または「手戻り」の判断時刻を特定します。 イベントタイプ 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の項目を分析して算出します。「FB01」「FB50」「FV50」などのトランザクションコード(BKPF-TCODE)は手動入力を示します。一方、その他のTコードや特定のバッチ入力名(BKPF-AWKEY)は自動処理を示す場合があります。 記録 BKPF-TCODEや文書ヘッダーにあるその他のソースシステムの識別情報から判定します。 イベントタイプ calculated | |||
| 文書の添付 | このアクティビティは、ユーザーが請求書やスプレッドシートなどの関連文書を仕訳に添付したことを示します。標準的な会計イベントとして明示的に記録されるものではなく、通常は会計文書オブジェクトに関連付けられた添付ファイルの作成を確認して推定します。 | ||
| 重要な理由 このアクティビティを追跡すると、文書化を求める規程への準拠を確認できます。文書の添付が遅れると、承認サイクルが長引く原因になる場合があります。 入手先 タイムスタンプ付きのイベントとして正確に記録するのは困難です。SOODなどの汎用オブジェクトサービス(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)を既知の手入力用コード一覧と照合します。「会社間転記を特定」では、対象伝票の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など)への読み取りアクセス権限が必要です。
クエリの例 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ワークフローの担当者に確認するか、トランザクションPFTCで技術的なワークフロー定義を調べて特定してください。
クエリの例 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添付ファイルの関連情報)です。
- 基本イベントの抽出(作成・保留):最初のイベントを抽出するデータフローを作成します。「仕訳入力の保留」にはVBSEGKを使用します。「仕訳入力の作成」にはBKPFを使用し、取消伝票ではなく、当初から保留されていた伝票でもないことを条件にします。VBSEGKとのアンチ結合で判定できます。
- ワークフローイベントの抽出:オブジェクトキー(会社コード+伝票番号+会計年度)を使ってBKPFとSWW_WI2OBJを結合し、ワークフローインスタンスIDを取得するデータフローを作成します。この結果をSWWLOGHISTと結合し、ログに記録されたワークフロータスクの結果とユーザーの判断に基づいて、「申請」「承認」「却下」「変更依頼」などのイベントを抽出します。
- 変更・削除イベントの抽出:CDHDRとCDPOSを使って変更を特定します。「仕訳入力の修正」では、保留伝票(オブジェクトクラス「FIPP」)に対する変更に絞り込みます。「保留中の仕訳入力の削除」では、保留伝票の変更ログから削除マーカーを探します。
- 添付ファイルイベントの抽出:「文書の添付」を取得するには、オブジェクトタイプが「BKPF」、関連タイプが「[Your attachment relationship type]」であるSRGBTBRELのレコードをBKPFと結合します。リンクの作成日をイベント時刻として使用します。
- 消込・取消イベントの抽出:「仕訳入力明細の消込」では、消込伝票フィールド(AUGBL)に値が設定されているBSEGのレコードを照会します。イベント時刻には、消込伝票の転記日(AUGDT)を使用します。「仕訳入力の取消処理」では、取消伝票フィールド(STBLG)に値がある伝票をBKPFから照会します。
- 計算イベントの導出:計算イベントごとに個別のロジックブロックを作成します。「手入力の特定」では、手入力に使用するトランザクションコード(例:FB01、FB50、F-02)の一覧に基づいてBKPFを絞り込みます。「会社間転記の特定」では、BSEGを伝票IDごとにグループ化し、会社コードが複数ある伝票を特定します。
- すべてのイベントフローの統合:ETLツールのUNION変換を使い、個々のイベントフロー(作成、保留、承認など)の出力を1つのイベントログテーブルに統合します。すべてのフローで列名とデータ型が一致していることを確認します。
- 最終スキーマへのマッピング:統合したデータを必要なイベントログ構造にマッピングし、
JournalEntryId、ActivityName、EventTime、ユーザーなどの必須属性と推奨属性を作成します。SourceSystemなどの固定列を追加し、LastDataUpdateにはETLジョブの実行時刻を設定します。 - 増分ロードの設定:継続的にデータを抽出するため、増分ロード方式を設定します。最終実行後に作成または変更されたレコードだけを取得できるよう、最終作成日または変更日(例:BKPF.CPUDT、CDHDR.UDATE)をウォーターマークとして使用します。
- ProcessMind用のエクスポート:抽出ジョブをスケジュールし、最終出力の保存先として、ProcessMindからアクセスしてアップロードできる場所を指定します。イベントログはCSVまたはParquetファイルとして保存します。
設定
- 前提条件:専用の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とユーザー判断キーを、システム上で特定する必要があります。
クエリの例 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%短縮し、正確な財務報告を実現します。
クレジットカードは不要です。今日から改善に取り組みましょう。