Record to Report - 会計伝票データテンプレート
SAP S/4HANARecord to Report - 会計伝票データテンプレート
- 収集を推奨する項目
- 追跡すべき主要アクティビティ
- 実践的なデータ抽出ガイド
Record to Report - 会計伝票属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ ActivityName | 会計伝票プロセスの特定の時点で発生したビジネスアクティビティの名称。 | ||
| 説明 アクティビティは、「会計伝票作成」、「伝票レビュー提出済」、「会計伝票転記済」など、会計伝票のライフサイクルにおける特定のステップまたはイベントを表します。これらのアクティビティは通常、システムに記録された変更ログ、ステータス更新、またはトランザクションコードから派生します。 アクティビティを分析することで、プロセスフローの可視化、一般的な経路の特定、および標準手順からの逸脱の発見が可能になります。アクティビティ頻度、ステップ間の待機時間、適合率などのメトリクスを計算するための基本となります。 その重要性 プロセスのステップを定義し、プロセスマップの可視化とワークフローパターンの分析を可能にします。 取得元 ヘッダー/明細テーブルのステータスフィールド(例:BKPF-BSTAT)、変更伝票ログ(CDHDR/CDPOS)、ワークフローログなど、さまざまなソースから派生します。 例 仕訳を作成会計伝票仮保存済伝票レビュー提出済仕訳入力承認済み会計伝票転記済 | |||
| イベント日時 EventTime | 会計伝票に対して特定のアクティビティが発生した時点を示すタイムスタンプ。 | ||
| 説明 イベントタイムとは、業務活動がシステムで実行および記録された正確な日時です。ケース内の各活動には独自のタイムスタンプがあり、イベントの時系列シーケンスを作成します。 この属性は、すべての時間ベースのプロセス分析に不可欠です。サイクルタイム、活動間の期間、待機時間の計算、および作業の時間的分布の理解に使用されます。正確なタイムスタンプは、信頼性の高いプロセスモデルを構築し、承認サイクルタイムのような主要なパフォーマンス指標を計算するために不可欠です。 その重要性 イベントの時系列順序を提供し、すべての期間ベースのメトリクスを計算し、プロセスのタイムラインを理解するために不可欠です。 取得元 変更伝票ログ(CDHDR-UDATE, CDHDR-UTIME)、ワークフローログ、またはBKPF(CPUDT, CPUTM)のようなテーブルの作成/入力タイムスタンプから取得。 例 2023-10-26T10:05:00Z2023-11-15T14:30:15Z2024-01-20T09:00:45Z | |||
| 会計伝票ID JournalEntryId | 財務会計伝票の一意な識別子であり、プロセスの主要なケース識別子として機能します。 | ||
| 説明 会計伝票IDは、SAP S/4HANAで各会計伝票が作成された際に割り当てられる一意の番号です。この識別子は、初期の作成または仮保存から、承認ワークフローを経て、最終的な転記、そして潜在的な取消しまたは消込に至るまで、会計伝票の完全なライフサイクルを追跡するために不可欠です。 プロセスマイニング分析では、このIDを使用して、関連するすべてのアクティビティを単一のケースにリンクします。共通の会計伝票IDの下でイベントをグループ化することで、アナリストはエンドツーエンドのプロセスフローを再構築し、サイクルタイムを測定し、特定の各財務取引のバリエーションやボトルネックを特定することができます。これは、プロセスビュー全体を構築するための基盤となる属性です。 その重要性 この識別子により、関連するすべてのプロセスステップが接続され、各会計伝票のエンドツーエンドのジャーニーを分析することが可能になります。 取得元 これは複合キーであり、通常、会社コード(BKPF-BUKRS)、伝票番号(BKPF-BELNR)、および会計年度(BKPF-GJAHR)を連結して形成されます。 例 1000-1000000001-20231710-1900000055-20242000-2100003412-2023 | |||
| Amount In Local Currency AmountInLocalCurrency | 会社コードの現地通貨で表された会計伝票の総額。 | ||
| 説明 この属性は、会計伝票の財務的規模を表します。通常、伝票内のすべての借方または貸方明細の絶対値の合計であり、会社コードの現地通貨に換算されます。 金額別に分析することで、財務的影響に基づいてプロセスをセグメント化することができます。例えば、高額な伝票は低額な伝票よりも厳格な承認プロセスに従う場合があります。これは、最も高い財務リスクをもたらす取引に対するプロセス改善努力を優先するのに役立ちます。 その重要性 伝票の財務的価値を提供し、関連する金銭的価値によってプロセス動作がどのように変化するかを分析できるようにします。 取得元 特定の仕訳伝票(BELNR)について明細テーブルBSEG(フィールドDMBTR)から金額を合計し、正の値に変換することで算出されます。 例 1500.75125000.0050.20 | |||
| 会社コード CompanyCode | 会計伝票が転記される会社または法人の一意な識別子。 | ||
| 説明 会社コードは、SAP Financialsにおける基本的な組織単位であり、財務諸表が作成される独立した法人を表します。すべての会計伝票は特定の会社コードに割り当てられます。 この属性は、組織の異なる部分間でプロセスパフォーマンスをセグメント化し、比較するために重要です。アナリストはこれを使用して、特定の法人についてプロセスビューをフィルタリングしたり、会社コード間の却下率を比較したり、地域固有のプロセスバリエーションを特定したりすることができます。 その重要性 組織内の異なる法的エンティティまたは事業部門間で仕訳入力プロセスをフィルターし、比較することができます。 取得元 SAP S/4HANAテーブルBKPF、フィールドBUKRS(会社コード)。 例 10001710US01 | |||
| 会計伝票タイプ JournalEntryType | 仕訳入力を、資産転記、仕入先請求書、総勘定元帳入力など、そのビジネス目的で分類します。 | ||
| 説明 会計伝票タイプ、またはSAP用語での伝票タイプは、会計伝票を分類するためのキーです。これは、伝票に割り当てられる番号範囲や、転記が許可される勘定タイプなどの側面を制御します。 会計伝票タイプ別にプロセスを分析することは、コンテキスト固有の挙動を理解するために不可欠です。例えば、単純な経過勘定(タイプSA)の承認プロセスは、複雑な資産取得(タイプAA)よりもはるかに単純である可能性があります。この側面は、「伝票タイプ別コンプライアンス」ダッシュボードの鍵となります。 その重要性 ビジネスコンテキスト別に仕訳を分類し、異なる種類の財務取引におけるプロセスバリエーションとパフォーマンスの分析を可能にします。 取得元 SAP S/4HANAテーブルBKPF、フィールドBLART(伝票タイプ)。 例 SAKRAA | |||
| 作成ユーザー CreatedByUser | 会計伝票を作成した担当者のユーザーID。 | ||
| 説明 この属性は、初期伝票を作成して会計伝票プロセスを開始したユーザーの一意の識別子を格納します。これは会計士、ビジネスユーザー、または自動化された伝票のためのシステムIDである可能性があります。 作成者別にプロセスを分析することで、特定のユーザーやチームに関連するパターンを特定するのに役立ちます。特定のユーザーがより高い却下率を持つ場合はトレーニングの必要性を明らかにしたり、高いパフォーマンスを持つ個人を強調したりすることができます。「ユーザーアクティビティとスループット」ダッシュボードに不可欠です。 その重要性 プロセス活動を特定のユーザーに割り当て、パフォーマンス分析、ワークロードバランス調整、トレーニング機会の特定を可能にします。 取得元 SAP S/4HANAテーブルBKPF、フィールドUSNAM(ユーザー名)。 例 ABROWNCJONESBATCH_USER | |||
| 計上日 PostingDate | 会計伝票が総勘定元帳に記録され、会計期間に影響を与える日付です。 | ||
| 説明 転記日付は、取引が財務諸表に表示される会計期間を決定します。これは会計にとって重要な日付であり、伝票が作成またはシステムに入力された日付とは異なる場合があります。 プロセスマイニングでは、転記日付は、月次決算プロセスを比較したり、異なる会計期間にわたるパフォーマンス傾向を分析したりするなど、時間ベースのコホート分析に使用されます。また、伝票作成から実際の財務転記までの遅延を測定するためにも使用されます。 その重要性 財務コンテキストにとって重要であり、月末や年末など特定の会計期間内のプロセスパフォーマンス分析を可能にします。 取得元 SAP S/4HANAテーブルBKPF、フィールドBUDAT(伝票転記日付)。 例 2023-10-312023-11-012024-02-29 | |||
| ソースシステム SourceSystem | 仕訳入力データが抽出されたソースシステムを識別します。 | ||
| 説明 この属性は、会計伝票データの発生元である記録システムを指定します。複数のERPインスタンスやレガシーシステムと最新システムの混在する企業にとって、これはデータソースを区別するのに役立ちます。 分析では、異なるシステム間でプロセスパフォーマンスを比較したり、特定のソースのデータをフィルタリングしたりするために使用できます。これはデータガバナンスにとって重要であり、データのコンテキストが理解されていることを確認するために必要です。 その重要性 データの出所に関するコンテキストを提供します。これは、マルチシステム環境において正確なプロセス分析と比較を行う上で不可欠です。 取得元 これは通常、データ抽出中に追加される静的な値であり、特定のSAP S/4HANAインスタンス(例:SIDまたは論理システム名)を識別します。 例 S4H_PROD_100ECC_FIN_200S4C_US_EAST | |||
| トランザクションコード TransactionCode | 会計伝票の作成または変更に使用されるSAPトランザクションコード。 | ||
| 説明 トランザクションコード(T-Code)は、SAPにおける特定の機能またはプログラムを識別するショートカットです。会計伝票の場合、異なるT-Codeは、伝票がどのように作成されたかを示すことができます。例えば、FB01は手動GL転記、FV50は仮保存、またはシステム生成伝票のための自動コードなどです。 この属性は、アクティビティがユーザーによって手動で実行されたのか、システムによって自動的に実行されたのかを示す強力な指標となります。これは、手動転記率KPIの計算や、自動化の機会を特定するための鍵となります。 その重要性 仕訳がどのように処理されたか(例:手動か自動か)を示し、自動化分析とプロセス変動の理解に重要です。 取得元 SAP S/4HANAテーブルBKPF、フィールドTCODE(トランザクションコード)。 例 FB01FV50F-02 | |||
| 会計年度 FiscalYear | 会計伝票が属する会計年度。 | ||
| 説明 会計年度は、会社コードと伝票番号とともに、会計伝票の一意のキーの一部です。これは、その伝票が関連する会計年度を表します。 分析において、会計年度は長期的な傾向分析や、ケース識別子の一意性を確保するために使用されます。異なる会計年度間でプロセスメトリクスを比較することで、時間の経過に伴うパフォーマンスの改善または劣化を明らかにすることができます。 その重要性 ドキュメントを一意に識別するための重要な要素を提供し、経年的なプロセスパフォーマンス分析を可能にします。 取得元 SAP S/4HANAテーブルBKPF、フィールドGJAHR(会計年度)。 例 202320242022 | |||
| 伝票ステータス DocumentStatus | 会計伝票の現在の処理ステータス。例えば、仮保存(Parked)、転記済(Posted)、または消込済(Cleared)です。 | ||
| 説明 伝票ステータスは、会計伝票がライフサイクルのどの段階にあるかを示します。例えば、「仮保存(parked)」伝票は保存されていますが、まだ総勘定元帳に転記されておらず、「転記済(posted)」伝票は最終化されています。 ステータスを分析することで、作業の流れを理解し、ボトルネックを特定するのに役立ちます。長期間にわたって「仮保存」または「承認待ち」の状態にある伝票が大量にある場合、プロセスにおける非効率性を示唆する可能性があります。これはプロセスアクティビティを導き出すための主要な情報源でもあります。 その重要性 会計伝票がライフサイクルのどこにあるかのスナップショットを提供し、キューやボトルネックの特定に役立ちます。 取得元 SAP S/4HANAテーブルBKPF、フィールドBSTAT(伝票ステータス)。 例 VAB | |||
| 最終データ更新 LastDataUpdate | このレコードのデータがソースシステムから最後に更新された日時を示すタイムスタンプです。 | ||
| 説明 この属性は、ソースシステムからの最新のデータ抽出または更新の日付と時刻を記録します。分析されているデータの鮮度に関する透明性を提供します。 最終更新時刻を知ることは、プロセス分析の現状を理解するために重要です。これにより、ユーザーは、ほぼリアルタイムのデータを見ているのか、それとも以前の期間のスナップショットを見ているのかを理解し、ダッシュボードやKPIを正しく解釈するのに役立ちます。 その重要性 データの鮮度を示し、ユーザーがプロセス分析の最新性を認識していることを保証します。 取得元 これはメタデータ属性であり、通常、データ取り込みパイプライン中に各レコードに生成され、スタンプされます。 例 2024-03-10T02:00:00Z2024-03-11T02:00:00Z2024-03-12T02:00:00Z | |||
| 取消理由 ReversalReason | 転記された仕訳伝票が取り消された理由を示すコードです。 | ||
| 説明 転記された会計伝票に誤りがある場合、削除することはできず、新しい伝票で取消す必要があります。取消理由コードは、例えば誤った転記日付や金額が原因であるなど、このアクションが取られた理由を説明します。 取消理由を分析することは、Record to Reportプロセスにおけるエラーの根本原因を特定するのに役立ちます。特定の理由の発生頻度が高い場合、不十分なトレーニングや統制の不備など、初回品質を向上させるために対処すべきシステム的な問題を示唆している可能性があります。 その重要性 取消につながるエラーの根本原因を診断するのに役立ち、手戻りを減らし、プロセス品質を向上させるために必要なインサイトを提供します。 取得元 SAP S/4HANAテーブルBKPF、フィールドSTGRD(取消理由)。 例 010205 | |||
| 合計サイクルタイム TotalCycleTime | 会計伝票の最初のアクティビティの作成から最後のアクティビティの完了までの合計期間。 | ||
| 説明 この計算メトリクスは、各ケースにおける会計伝票プロセスのエンドツーエンドの期間を測定します。これは、最後に観測されたアクティビティのタイムスタンプと最初に観測されたアクティビティのタイムスタンプの差です。 総サイクルタイムは、全体的なプロセス効率を測定するための主要なKPIです。プロセスパフォーマンスの高レベルなビューを提供し、ダッシュボードで時間の経過に伴うトレンドを追跡するために使用されます。長いサイクルタイムの原因を分析することは、プロセス改善の一般的な出発点です。 その重要性 エンドツーエンドのプロセス期間を測定し、全体的なプロセス効率とスピードの主要業績評価指標(KPI)を提供します。 取得元 一意のJournalEntryIdごとに、最大EventTimeから最小EventTimeを差し引くことで算出されます。 例 2日4時間30分8時間15分15 days 2 hours | |||
| 手動転記である IsManualPosting | 仕訳伝票がユーザーによって手動で転記されたかどうかを示すブール値フラグです。 | ||
| 説明 この属性は、システムジョブやインターフェースによって自動的に転記されるのではなく、手動のユーザー介入によって転記された会計伝票を識別します。これは通常、伝票を転記するために使用されたトランザクションコードから派生します。 このフラグは、手動転記率KPIの計算に使用され、組織がRecord to Reportプロセスの自動化における進捗を追跡するのに役立ちます。手動で転記された伝票をフィルタリングすることで、アナリストは依然として人間の介入を必要とする特定のシナリオを特定し、それらを自動化の可能性について評価することができます。 その重要性 人間による転記とシステムによる転記を区別し、自動化レベルの測定と自動化機会の特定に不可欠です。 取得元 これはTransactionCodeから派生した計算属性です。手動トランザクションコードの事前定義リスト(例:「FB01」、「F-02」)を使用して、フラグが「true」に設定されます。 例 truefalse | |||
| 手戻り IsRework | 仕訳伝票が却下後に修正されるなど、手戻りが発生したかどうかを示すブール値フラグです。 | ||
| 説明 この計算属性は、理想的な「ハッピーパス」プロセスから逸脱した会計伝票にフラグを立てます。通常、「会計伝票却下済」や「会計伝票修正済」のようなアクティビティがケース内で発生した場合にtrueに設定されます。 このフラグは、プロセス効率の分析を簡素化します。手戻り率KPIの迅速な計算を可能にし、手戻りが発生したケースとそうでないケースの間でサイクルタイムとコストを直接比較できるようにします。手戻りの原因を特定することは、多くのプロセス改善イニシアチブの主要な目標です。 その重要性 修正または追加のループが必要だったケースにフラグを立て、プロセス非効率性の容易な定量化と根本原因分析を可能にします。 取得元 これは、ケース内のアクティビティのシーケンスから派生した計算属性です。「会計伝票却下済」のようなアクティビティが存在する場合、「true」としてフラグが付けられます。 例 truefalse | |||
| 承認サイクルタイム ApprovalCycleTime | 会計伝票が承認のために提出されてから、承認または却下されるまでの経過時間。 | ||
| 説明 この計算メトリクスは、承認ステージの期間に特に焦点を当てています。「伝票レビュー提出済」アクティビティと、それに続く「会計伝票承認済」または「会計伝票却下済」アクティビティの間の時間を測定します。 このKPIは、承認ワークフロー内のボトルネックを特定するために重要です。承認サイクルタイムが長いと、プロセス全体が大幅に遅延する可能性があります。承認者、会社コード、または会計伝票タイプ別にこのメトリクスを分析することで、改善のための特定の領域を明らかにすることができます。 その重要性 承認ステップの期間を分離し、レビューおよび承認ワークフローにおけるボトルネックを特定し、対処するのに役立ちます。 取得元 「レビューのために仕訳が提出された」イベントと、「仕訳が承認された」または「仕訳が却下された」イベントとの時間差を求めることで算出されます。 例 1日2時間4時間25分5日0時間 | |||
| 承認者ユーザー ApproverUser | 会計伝票を承認または却下した担当者のユーザーID。 | ||
| 説明 この属性は、提出された会計伝票のレビューと決定に責任を持つユーザーを識別します。多段階承認ワークフローでは、単一の会計伝票に対して複数の承認者がいる場合があります。 この情報は、承認プロセスを詳細に分析するために不可欠です。これは、異なる承認者のワークロードを測定し、個々の承認時間を計算し、承認チェーンのボトルネックを特定するのに役立ちます。「ユーザーアクティビティとスループット」ダッシュボードを直接サポートします。 その重要性 承認を担当する個人を特定し、承認ワークロード、パフォーマンス、ボトルネックの分析を可能にします。 取得元 ワークフローログ(例:SWW_WI2OBJ, SWWLOG)または変更伝票テーブル(CDHDR/CDPOS)から、承認ステップを実行したユーザーを追跡して取得。 例 DMILLERFWHITEKCHEN | |||
| 終了日時 EndTime | `アクティビティ`が完了したことを示す`タイムスタンプ`です。 | ||
| 説明 終了時刻はアクティビティの完了を示します。多くのイベントログでは、アクティビティの開始時刻と終了時刻は同じであり、瞬時イベントを表します。しかし、ユーザーが積極的に文書をレビューするような、測定可能な期間を持つアクティビティの場合、この属性はその期間を捕捉できます。 明確な終了時刻を持つことで、アクティビティ処理時間と待機時間のより正確な計算が可能になります。これは、タスクが実際に作業されていた時間と、キューでアイドル状態だった時間を区別するのに役立ちます。 その重要性 正確な活動処理時間を計算し、実作業時間とアイドル待機時間を区別することを可能にします。 取得元 原子イベントの場合、通常StartTimeと同じです。期間を伴うアクティビティの場合、ワークフローログから取得されるか、後続イベントに基づいて計算される場合があります。 例 2023-10-26T10:05:00Z2023-11-15T14:45:20Z2024-01-20T09:10:30Z | |||
Record to Report - 会計伝票アクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 仕訳を作成 | このアクティビティは、システムにおける会計伝票ドキュメントの初期作成を示します。レコードはヘッダーテーブル(BKPF)に作成されますが、まだ総勘定元帳に転記されていません。これが会計伝票ライフサイクルの開始点です。 | ||
| その重要性 これはプロセスの主要な開始イベントです。このイベントから転記までの時間を分析することは、全体的なサイクルタイムを測定し、初期データ入力の遅延を特定するために不可欠です。 取得元 このイベントは、指定された伝票番号(BELNR)について、作成日付(CPUDT)と作成時刻(CPUTM)フィールドを使用してSAPテーブルBKPFから明示的に取得できます。 取得 イベントタイムスタンプにはBKPF-CPUDTとBKPF-CPUTMを使用します。 イベントタイプ explicit | |||
| 仕訳入力承認済み | 会計伝票は、権限のある管理者から最終承認を受け、その有効性と正確性が確認されます。このアクティビティは、伝票が総勘定元帳に転記される前の最後のゲートです。 | ||
| その重要性 これは承認サイクルを締めくくる重要なマイルストーンです。このステップに到達するのにかかった時間は、プロセス全体の期間の主要な構成要素であり、承認者の効率性を示す重要な指標です。 取得元 このイベントは、最終承認ステップを示すワークフローログ、またはドキュメントのステータス変更から推測されます。承認者のユーザーIDとタイムスタンプは、ワークフローデータまたは変更ログから取得できます。 取得 ワークフローログの最終承認ステップのタイムスタンプ、または変更伝票のステータスが「承認済み」に変更されたことを特定します。 イベントタイプ inferred | |||
| 会計伝票取消処理済 | 以前に転記された仕訳伝票は、逆仕訳を含む新しい伝票を作成することで取り消されます。このアクションは、転記済み伝票のエラーを修正するために行われ、明示的で監査可能な取引です。 | ||
| その重要性 取消しは、転記された伝票にエラーがあったことを示します。高い取消し率は、承認プロセスやデータ入力の品質における根本的な問題を示唆しており、これを追跡することで、初回精度の向上に役立ちます。 取得元 取消しは明示的なイベントです。新しい取消伝票のヘッダー(BKPF)には、取消伝票番号(STBLG)フィールドに元の伝票への参照が含まれています。新しい伝票の転記日付がイベント時刻となります。 取得 BKPF-STBLGが入力されている伝票を特定します。イベントタイムスタンプは、取消伝票の転記日付です。 イベントタイプ explicit | |||
| 会計伝票消込済 | 仕訳入力内の未消込明細が、請求書の支払いによる消込など、別の転記によって相殺されます。このアクティビティは、特定の明細の照合を示し、それらを効果的にクローズアウトします。 | ||
| その重要性 このアクティビティは、多くの会計伝票、特に未決勘定や未消込項目管理勘定を含む伝票の最終的な消込ステップを表します。転記から消込までの時間を分析することで、消込の効率性を測定するのに役立ちます。 取得元 このイベントは、明細テーブル(BSEGまたはACDOCAビュー)から推測されます。項目が消込されると、その明細に対して消込日付(AUGDT)と消込伝票(AUGBL)フィールドが入力されます。 取得 イベントのタイムスタンプとして、明細の消込日付(BSEG-AUGDT)を使用します。 イベントタイプ inferred | |||
| 会計伝票転記済 | 会計伝票は正式に総勘定元帳に記録され、会社の財務諸表に影響を与えます。これは、その伝票が永続的な財務記録となる時点です。 | ||
| その重要性 これは主要な成功マイルストーンであり、コア処理サイクルの終了を示します。転記済み伝票のスループットとこの段階に到達するまでの時間を分析することは、基本的なプロセスマイニングメトリクスです。 取得元 これは、BKPFテーブルの転記日付(BUDAT)によってマークされる明示的なイベントです。転記済み伝票は、仮保存('V')または保留('D')の伝票と区別するために、空白の伝票ステータス(BSTAT)を持ちます。 取得 イベントのタイムスタンプとして、転記日付(BKPF-BUDAT)と入力日付(BKPF-CPUDT)を使用します。BKPF-BSTATが空白であることは、転記済み伝票を示します。 イベントタイプ explicit | |||
| 伝票レビュー提出済 | 会計伝票の作成者は、レビューおよび承認ワークフローのために正式に伝票を提出します。このアクティビティは、データ入力から正式な管理プロセスへの引き渡しを表し、承認サイクルを開始します。 | ||
| その重要性 これは承認サイクルタイムの始まりを示します。この時点から最終承認または却下までの期間を測定することで、レビューおよび承認ステージ内のボトルネックを具体的に特定するのに役立ちます。 取得元 これは、ビジネスオブジェクトにリンクされたワークフローログ(テーブルSWW_WIHEAD, SWWLOG)から取得されることがよくあります。また、伝票ヘッダー(BKPF)上のカスタムフィールドのステータス変更から推測することもできます。 取得 ワークフロー項目作成のタイムスタンプ、またはステータスフィールドが「提出済」または「レビュー中」に変更されたタイムスタンプ。 イベントタイプ inferred | |||
| 仕訳入力転記後変更済み | ユーザーが総勘定元帳にすでに転記された仕訳入力の限られたフィールドセットを変更します。ほとんどの財務データは転記後に不変ですが、テキストや割り当てなどの一部のフィールドは変更可能です。 | ||
| その重要性 このアクティビティは、コンプライアンス上の重要なフラグです。転記後の変更は記録の改ざんの試みを示唆する可能性があり、不正行為を防ぎデータ整合性を確保するために厳密に監視されるべきです。 取得元 これは変更伝票テーブル(CDHDRおよびCDPOS)から確実に推測できます。転記日後の変更日で伝票番号のCDHDRにエントリがある場合、それは転記後変更を示します。 取得 CDHDR内で変更タイムスタンプ(UDATE/UTIME)が伝票の転記日付(BKPF-BUDAT)より後であるレコードを検索します。 イベントタイプ inferred | |||
| 会計伝票仮保存済 | ユーザーが不完全な仕訳入力を転記せずに保存し、後で完了またはレビューできるようにします。これは、「仮保存済み」ステータスを持つ伝票ヘッダーレコードを作成し、転記されていない状態で保持する明示的なアクションです。 | ||
| その重要性 仮保存(Parking)は、提出前の一般的なステップです。仮保存状態の期間を追跡することで、正式なレビューおよび承認プロセスが始まる前のデータ完了および準備の遅延を特定するのに役立ちます。 取得元 BKPFテーブルでは、仮保存済み伝票は伝票ステータスフィールド(BSTAT)の値が「V」であることで識別されます。イベントタイムスタンプは作成日付(CPUDT)です。 取得 作成時にBKPF-BSTAT = 'V'である伝票をフィルターします。 イベントタイプ explicit | |||
| 会計伝票修正済 | ユーザーが、却下された、または変更のために差し戻された会計伝票を修正します。これは、再提出前にレビュープロセスで特定された問題に対処するために必要な手戻り作業を表します。 | ||
| その重要性 このアクティビティは手戻りループを定量化します。修正の頻度と期間を分析することで、非効率性の原因を特定し、トレーニングやプロセス明確化の機会を浮き彫りにするのに役立ちます。 取得元 これは、以前「却下済」状態にあった伝票のBKPFテーブルの「最終変更日」(AEDAT)を追跡することで推測できます。変更伝票は、何が変更されたかについてより具体的な詳細を提供します。 取得 却下イベント後に加えられた変更には、変更伝票ヘッダー(CDHDR-UDATE)からのタイムスタンプを使用します。 イベントタイプ inferred | |||
| 会計伝票却下済 | レビュー担当者または承認者が仕訳入力を却下し、転記を阻止します。伝票は通常、修正のために作成者に戻され、手戻りループが開始されます。 | ||
| その重要性 却下を追跡することは、プロセス品質を理解し、一般的なエラーを特定するための鍵です。高い却下率は、データ精度、ポリシー理解、または不十分な裏付け書類に問題があることを示しています。 取得元 このイベントは、ワークフローログのステータス変更、または会計伝票ドキュメント上のカスタムステータスフィールドから推測されます。関連するステータスフィールドの変更伝票ログ(CDHDR/CDPOS)はタイムスタンプを提供できます。 取得 変更伝票(CDHDR/CDPOS)またはワークフローログを介して、ステータスフィールドが「却下済み」に変更されたことを特定します。 イベントタイプ inferred | |||
| 手動転記を特定 | この会計伝票は、自動化されたインターフェースやバッチジョブではなく、手動のトランザクションコードを使用して転記されました。これは時間的なイベントではなく、転記アクティビティの分類です。 | ||
| その重要性 手動転記の特定は自動化イニシアチブにとって極めて重要です。手動転記の割合が高い場合、サブシステムの統合や自動転記プログラムの使用によってプロセスを合理化する機会があることを示唆しています。 取得元 これは、伝票ヘッダーテーブル(BKPF)のトランザクションコード(TCODE)フィールドを分析して計算されます。既知の手動T-Codeのリスト(例:FB01、F-02、FB50)を使用して、伝票を分類します。 取得 転記時に、BKPF-TCODEと事前定義された手動取引コードのリストに基づいてイベントを分類します。 イベントタイプ calculated | |||
| 裏付け書類添付済 | ユーザーが1つ以上のサポート文書(請求書やスプレッドシートなど)を仕訳入力に添付します。これは通常、レビューおよび監査プロセス中に財務取引の証拠とコンテキストを提供するために行われます。 | ||
| その重要性 レビュー前に文書が添付されていることを確認することは、コンプライアンスと承認効率にとって重要です。この活動は、文書化ポリシーの遵守と、それが承認サイクルタイムに与える影響を測定するのに役立ちます。 取得元 これは通常、汎用オブジェクトサービス(GOS)を介してリンクされた添付ファイルの作成タイムスタンプを確認することで推測されます。SRGBTBRELテーブルは、ビジネスオブジェクト(例:BKPF伝票)を添付ファイルにリンクします。 取得 GOS添付テーブル(例:SRGBTBREL)を照会してBKPFオブジェクトへのリンクを取得し、添付作成タイムスタンプを使用します。 イベントタイプ inferred | |||
抽出ガイド
ステップ
- 前提条件とアクセス権: SAP S/4HANAの基盤となるデータベースを照会したり、ABAPレポートを実行したりするために必要な権限を持つユーザーが確保されていることを確認してください。CDSビュー
I_JournalEntry、I_JournalEntryItem、およびテーブルCDHDR、CDPOS、SRGBREL、SOOD、SWW_WI2OBJ、SWWLOGHISTへの読み取りアクセス権が必要です。アクセスは通常、SAP HANA Studio、DBeaverなどのデータベースクライアント、またはEclipse用SAP ABAP開発ツール(ADT)を介して付与されます。 - システム固有の設定の特定: クエリを実行する前に、仕訳入力承認ワークフローで使用される特定のタスクコードを特定する必要があります。SAPワークフロー管理者と相談し、申請、却下、承認イベントに対応するタスクID(例:TS12345678)を見つけてください。これらは最終的なクエリのプレースホルダーに必要です。
- SQLクエリの準備:
queryセクションに記載されている完全なSQLクエリを、選択したSQLクライアントまたは開発ツールにコピーします。 - クエリパラメーターの設定: クエリ内のプレースホルダーを見つけ、それらを特定の値に置き換えます。これには、
[YourCompanyCode]、[StartDate]、[EndDate]パラメーターの設定が含まれます。また、プレースホルダーのワークフロータスクID([Workflow Submitted Task ID]、[Workflow Rejected Task ID]、[Workflow Approved Task ID])を、前のステップで特定した値に置き換える必要があります。 - 抽出クエリの実行: 修正したSQLクエリをSAP S/4HANAデータベースに対して実行します。日付範囲とデータ量によっては、クエリの完了にかなりの時間がかかる場合があります。ピーク時間外に実行することをお勧めします。
- 初期結果の確認: クエリが完了したら、出力の最初の数行を調べて、
JournalEntryId、ActivityName、EventTimeなどのすべての列が期待どおりにデータが入力されていることを確認します。結果セットには、仕訳入力ライフサイクルにおける各個別のビジネスイベントにつき1行が含まれるはずです。 - CSVへのデータエクスポート: SQLツールから結果セット全体を単一のCSVファイルにエクスポートします。特殊文字に関する問題を回避するために、ファイルがUTF-8エンコーディングを使用していることを確認してください。
- アップロードの準備: プロセスマイニングツールにアップロードする前に、CSVファイルに必須のヘッダーがあることを確認します。データは既にイベントログとして構造化されているため、それ以上の変換やピボットは不要です。
設定
- Core Data Services (CDS) ビュー: 抽出では主に、ヘッダーデータには
I_JournalEntryを、明細と金額の詳細にはI_JournalEntryItemを使用します。これらのビューは、ユニバーサルジャーナル (ACDOCA) に対するシンプルかつ意味豊かなインターフェースを提供します。 - 補助テーブル: 完全なプロセスビューを把握するために、クエリはいくつかの標準SAPテーブルも結合します。
- 伝票の変更履歴を追跡するための
CDHDRとCDPOS。 - Generic Object Services (GOS) を介して添付ファイルがリンクされた時期を特定するための
SRGBRELとSOOD。 - 承認ワークフローから主要なイベントを抽出するための
SWW_WI2OBJとSWWLOGHIST。
- 伝票の変更履歴を追跡するための
- 日付範囲フィルター: パフォーマンス管理のために、特定の期間でデータをフィルターすることが非常に重要です。
WHERE句でI_JournalEntry.CreationDateTimeフィールドを使用してください。初回分析では、3〜6ヶ月の範囲が推奨されます。 - 組織フィルター: 抽出を関連する法的エンティティに限定するために、常に
CompanyCodeでフィルターしてください。大規模なシステムで全ての会社コードを一度にクエリすると、非常に長い実行時間につながる可能性があります。 - ワークフロータスクID: クエリには、ワークフロータスクIDのプレースホルダー(例:
[Workflow Approved Task ID])が含まれています。これらは各SAPインストールに固有であり、ワークフロー活動を抽出するためには正しく設定する必要があります。これらがないと、申請、承認、または却下イベントは捕捉されません。 - 前提条件: 実行ユーザーは、財務、システム、およびワークフローテーブルに対する広範な読み取り権限を必要とします。これらの権限は標準ではないため、個別に割り当てる必要があります。
a クエリ例 sql
WITH JournalEntryAmountCTE AS (
SELECT
CompanyCode,
AccountingDocument,
FiscalYear,
SUM(AmountInCompanyCodeCurrency) AS AmountInLocalCurrency
FROM I_JournalEntryItem
GROUP BY CompanyCode, AccountingDocument, FiscalYear
),
JournalEntryBaseCTE AS (
SELECT
JE.CompanyCode,
JE.AccountingDocument,
JE.FiscalYear,
JE.CreatedByUser,
JE.CreationDateTime,
JE.PostingDateTime,
JE.PostingDate,
JE.AccountingDocumentType,
JE.DocumentIsParked,
JE.ReversedJournalEntry,
JE.TransactionCode,
JEA.AmountInLocalCurrency
FROM I_JournalEntry AS JE
LEFT JOIN JournalEntryAmountCTE AS JEA
ON JE.CompanyCode = JEA.CompanyCode
AND JE.AccountingDocument = JEA.AccountingDocument
AND JE.FiscalYear = JEA.FiscalYear
WHERE JE.CompanyCode IN ('[YourCompanyCode]')
AND JE.CreationDateTime BETWEEN '[StartDate]' AND '[EndDate]'
)
-- 1. Journal Entry Created
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
UNION ALL
-- 2. Journal Entry Parked
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 3. Supporting Documentation Attached
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Supporting Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(SOOD.CREDAT || ' ' || SOOD.CRETIM, 'YYYYMMDD HH24MISS') AS "EventTime",
SOOD.OWNER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SRGBREL ON SRGBREL.INSTID_A = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND SRGBREL.TYPEID_A = 'BKPF'
AND SRGBREL.CATID_A = 'BO'
JOIN SOOD ON SOOD.OBJTP = SRGBREL.TYPEID_B
AND SOOD.OBJYR = SRGBREL.INSTID_B(3)
AND SOOD.OBJNO = SRGBREL.INSTID_B(5)
UNION ALL
-- 4. Journal Submitted For Review
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Submitted For Review' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Submitted Task ID]'
UNION ALL
-- 5. Journal Entry Rejected
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Rejected' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Rejected Task ID]'
UNION ALL
-- 6. Journal Entry Corrected (changed while parked)
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 7. Journal Entry Approved
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Approved' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Approved Task ID]'
UNION ALL
-- 8. Manual Posting Identified
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Manual Posting Identified' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL AND BJE.TransactionCode IN ('FB01', 'F-02', 'FB50', 'FV50', 'FBB1', 'FBV1')
UNION ALL
-- 9. Journal Entry Posted
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL
UNION ALL
-- 10. Journal Entry Changed After Posting
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Changed After Posting' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.PostingDateTime IS NOT NULL AND TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') > BJE.PostingDateTime
UNION ALL
-- 11. Journal Entry Cleared
SELECT
JEI.AccountingDocument AS "JournalEntryId",
'Journal Entry Cleared' AS "ActivityName",
MIN(JEI.ClearingDateTime) AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser", -- Note: Clearing user is not directly available here
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM I_JournalEntryItem AS JEI
JOIN JournalEntryBaseCTE AS BJE ON JEI.AccountingDocument = BJE.AccountingDocument
AND JEI.CompanyCode = BJE.CompanyCode
AND JEI.FiscalYear = BJE.FiscalYear
WHERE JEI.ClearingDateTime IS NOT NULL
GROUP BY JEI.AccountingDocument, BJE.CreatedByUser, BJE.CompanyCode, BJE.AccountingDocumentType, BJE.PostingDate, BJE.AmountInLocalCurrency
UNION ALL
-- 12. Journal Entry Reversal Processed
SELECT
OriginalDoc.AccountingDocument AS "JournalEntryId",
'Journal Entry Reversal Processed' AS "ActivityName",
ReversalDoc.PostingDateTime AS "EventTime",
ReversalDoc.CreatedByUser AS "CreatedByUser",
OriginalDoc.CompanyCode AS "CompanyCode",
OriginalDoc.AccountingDocumentType AS "JournalEntryType",
OriginalDoc.PostingDate AS "PostingDate",
OriginalDoc.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS ReversalDoc
JOIN JournalEntryBaseCTE AS OriginalDoc
ON ReversalDoc.ReversedJournalEntry = OriginalDoc.AccountingDocument
AND ReversalDoc.CompanyCode = OriginalDoc.CompanyCode
AND ReversalDoc.ReversalFiscalYear = OriginalDoc.FiscalYear
WHERE ReversalDoc.ReversedJournalEntry IS NOT NULL; ステップ
- 前提条件とアクセス権: SAP S/4HANAの基盤となるデータベースを照会したり、ABAPレポートを実行したりするために必要な権限を持つユーザーが確保されていることを確認してください。CDSビュー
I_JournalEntry、I_JournalEntryItem、およびテーブルCDHDR、CDPOS、SRGBREL、SOOD、SWW_WI2OBJ、SWWLOGHISTへの読み取りアクセス権が必要です。アクセスは通常、SAP HANA Studio、DBeaverなどのデータベースクライアント、またはEclipse用SAP ABAP開発ツール(ADT)を介して付与されます。 - システム固有の設定の特定: クエリを実行する前に、仕訳入力承認ワークフローで使用される特定のタスクコードを特定する必要があります。SAPワークフロー管理者と相談し、申請、却下、承認イベントに対応するタスクID(例:TS12345678)を見つけてください。これらは最終的なクエリのプレースホルダーに必要です。
- SQLクエリの準備:
queryセクションに記載されている完全なSQLクエリを、選択したSQLクライアントまたは開発ツールにコピーします。 - クエリパラメーターの設定: クエリ内のプレースホルダーを見つけ、それらを特定の値に置き換えます。これには、
[YourCompanyCode]、[StartDate]、[EndDate]パラメーターの設定が含まれます。また、プレースホルダーのワークフロータスクID([Workflow Submitted Task ID]、[Workflow Rejected Task ID]、[Workflow Approved Task ID])を、前のステップで特定した値に置き換える必要があります。 - 抽出クエリの実行: 修正したSQLクエリをSAP S/4HANAデータベースに対して実行します。日付範囲とデータ量によっては、クエリの完了にかなりの時間がかかる場合があります。ピーク時間外に実行することをお勧めします。
- 初期結果の確認: クエリが完了したら、出力の最初の数行を調べて、
JournalEntryId、ActivityName、EventTimeなどのすべての列が期待どおりにデータが入力されていることを確認します。結果セットには、仕訳入力ライフサイクルにおける各個別のビジネスイベントにつき1行が含まれるはずです。 - CSVへのデータエクスポート: SQLツールから結果セット全体を単一のCSVファイルにエクスポートします。特殊文字に関する問題を回避するために、ファイルがUTF-8エンコーディングを使用していることを確認してください。
- アップロードの準備: プロセスマイニングツールにアップロードする前に、CSVファイルに必須のヘッダーがあることを確認します。データは既にイベントログとして構造化されているため、それ以上の変換やピボットは不要です。
設定
- Core Data Services (CDS) ビュー: 抽出では主に、ヘッダーデータには
I_JournalEntryを、明細と金額の詳細にはI_JournalEntryItemを使用します。これらのビューは、ユニバーサルジャーナル (ACDOCA) に対するシンプルかつ意味豊かなインターフェースを提供します。 - 補助テーブル: 完全なプロセスビューを把握するために、クエリはいくつかの標準SAPテーブルも結合します。
- 伝票の変更履歴を追跡するための
CDHDRとCDPOS。 - Generic Object Services (GOS) を介して添付ファイルがリンクされた時期を特定するための
SRGBRELとSOOD。 - 承認ワークフローから主要なイベントを抽出するための
SWW_WI2OBJとSWWLOGHIST。
- 伝票の変更履歴を追跡するための
- 日付範囲フィルター: パフォーマンス管理のために、特定の期間でデータをフィルターすることが非常に重要です。
WHERE句でI_JournalEntry.CreationDateTimeフィールドを使用してください。初回分析では、3〜6ヶ月の範囲が推奨されます。 - 組織フィルター: 抽出を関連する法的エンティティに限定するために、常に
CompanyCodeでフィルターしてください。大規模なシステムで全ての会社コードを一度にクエリすると、非常に長い実行時間につながる可能性があります。 - ワークフロータスクID: クエリには、ワークフロータスクIDのプレースホルダー(例:
[Workflow Approved Task ID])が含まれています。これらは各SAPインストールに固有であり、ワークフロー活動を抽出するためには正しく設定する必要があります。これらがないと、申請、承認、または却下イベントは捕捉されません。 - 前提条件: 実行ユーザーは、財務、システム、およびワークフローテーブルに対する広範な読み取り権限を必要とします。これらの権限は標準ではないため、個別に割り当てる必要があります。
a クエリ例 sql
WITH JournalEntryAmountCTE AS (
SELECT
CompanyCode,
AccountingDocument,
FiscalYear,
SUM(AmountInCompanyCodeCurrency) AS AmountInLocalCurrency
FROM I_JournalEntryItem
GROUP BY CompanyCode, AccountingDocument, FiscalYear
),
JournalEntryBaseCTE AS (
SELECT
JE.CompanyCode,
JE.AccountingDocument,
JE.FiscalYear,
JE.CreatedByUser,
JE.CreationDateTime,
JE.PostingDateTime,
JE.PostingDate,
JE.AccountingDocumentType,
JE.DocumentIsParked,
JE.ReversedJournalEntry,
JE.TransactionCode,
JEA.AmountInLocalCurrency
FROM I_JournalEntry AS JE
LEFT JOIN JournalEntryAmountCTE AS JEA
ON JE.CompanyCode = JEA.CompanyCode
AND JE.AccountingDocument = JEA.AccountingDocument
AND JE.FiscalYear = JEA.FiscalYear
WHERE JE.CompanyCode IN ('[YourCompanyCode]')
AND JE.CreationDateTime BETWEEN '[StartDate]' AND '[EndDate]'
)
-- 1. Journal Entry Created
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
UNION ALL
-- 2. Journal Entry Parked
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
BJE.CreationDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 3. Supporting Documentation Attached
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Supporting Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(SOOD.CREDAT || ' ' || SOOD.CRETIM, 'YYYYMMDD HH24MISS') AS "EventTime",
SOOD.OWNER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SRGBREL ON SRGBREL.INSTID_A = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND SRGBREL.TYPEID_A = 'BKPF'
AND SRGBREL.CATID_A = 'BO'
JOIN SOOD ON SOOD.OBJTP = SRGBREL.TYPEID_B
AND SOOD.OBJYR = SRGBREL.INSTID_B(3)
AND SOOD.OBJNO = SRGBREL.INSTID_B(5)
UNION ALL
-- 4. Journal Submitted For Review
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Submitted For Review' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Submitted Task ID]'
UNION ALL
-- 5. Journal Entry Rejected
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Rejected' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Rejected Task ID]'
UNION ALL
-- 6. Journal Entry Corrected (changed while parked)
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.DocumentIsParked = 'X'
UNION ALL
-- 7. Journal Entry Approved
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Approved' AS "ActivityName",
LOG.END_TS AS "EventTime",
LOG.EXEC_USER AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN SWW_WI2OBJ AS WF_LINK ON WF_LINK.INSTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND WF_LINK.TYPEID = 'BKPF'
JOIN SWWLOGHIST AS LOG ON LOG.WI_ID = WF_LINK.WI_ID
WHERE LOG.METHOD = '[Workflow Approved Task ID]'
UNION ALL
-- 8. Manual Posting Identified
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Manual Posting Identified' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL AND BJE.TransactionCode IN ('FB01', 'F-02', 'FB50', 'FV50', 'FBB1', 'FBV1')
UNION ALL
-- 9. Journal Entry Posted
SELECT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
BJE.PostingDateTime AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
WHERE BJE.PostingDateTime IS NOT NULL
UNION ALL
-- 10. Journal Entry Changed After Posting
SELECT DISTINCT
BJE.AccountingDocument AS "JournalEntryId",
'Journal Entry Changed After Posting' AS "ActivityName",
TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') AS "EventTime",
CH.USERNAME AS "CreatedByUser",
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS BJE
JOIN CDHDR AS CH ON CH.OBJECTID = CONCAT(BJE.CompanyCode, BJE.AccountingDocument, BJE.FiscalYear)
AND CH.OBJECTCLASS = 'BELEG'
WHERE BJE.PostingDateTime IS NOT NULL AND TO_TIMESTAMP(CH.UDATE || ' ' || CH.UTIME, 'YYYYMMDD HH24MISS') > BJE.PostingDateTime
UNION ALL
-- 11. Journal Entry Cleared
SELECT
JEI.AccountingDocument AS "JournalEntryId",
'Journal Entry Cleared' AS "ActivityName",
MIN(JEI.ClearingDateTime) AS "EventTime",
BJE.CreatedByUser AS "CreatedByUser", -- Note: Clearing user is not directly available here
BJE.CompanyCode AS "CompanyCode",
BJE.AccountingDocumentType AS "JournalEntryType",
BJE.PostingDate AS "PostingDate",
BJE.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM I_JournalEntryItem AS JEI
JOIN JournalEntryBaseCTE AS BJE ON JEI.AccountingDocument = BJE.AccountingDocument
AND JEI.CompanyCode = BJE.CompanyCode
AND JEI.FiscalYear = BJE.FiscalYear
WHERE JEI.ClearingDateTime IS NOT NULL
GROUP BY JEI.AccountingDocument, BJE.CreatedByUser, BJE.CompanyCode, BJE.AccountingDocumentType, BJE.PostingDate, BJE.AmountInLocalCurrency
UNION ALL
-- 12. Journal Entry Reversal Processed
SELECT
OriginalDoc.AccountingDocument AS "JournalEntryId",
'Journal Entry Reversal Processed' AS "ActivityName",
ReversalDoc.PostingDateTime AS "EventTime",
ReversalDoc.CreatedByUser AS "CreatedByUser",
OriginalDoc.CompanyCode AS "CompanyCode",
OriginalDoc.AccountingDocumentType AS "JournalEntryType",
OriginalDoc.PostingDate AS "PostingDate",
OriginalDoc.AmountInLocalCurrency AS "AmountInLocalCurrency"
FROM JournalEntryBaseCTE AS ReversalDoc
JOIN JournalEntryBaseCTE AS OriginalDoc
ON ReversalDoc.ReversedJournalEntry = OriginalDoc.AccountingDocument
AND ReversalDoc.CompanyCode = OriginalDoc.CompanyCode
AND ReversalDoc.ReversalFiscalYear = OriginalDoc.FiscalYear
WHERE ReversalDoc.ReversedJournalEntry IS NOT NULL; ステップ
- ABAPプログラムの作成: トランザクションコード
SE38を使用してABAPエディターにアクセスします。新しいプログラム名(例:Z_PM_JE_EXTRACT)を入力し、「作成」をクリックします。適切なタイトルを指定し、「タイプ」を「実行可能プログラム」に設定し、ローカルオブジェクトまたはパッケージ内に保存します。 - 選択画面の定義: プログラム内で、ユーザーがデータをフィルターするためのパラメーターと選択オプションを定義します。これには、仕訳伝票登録日の日付範囲(
P_CPUDT_FR、P_CPUDT_TO)、会社コード(SO_BUKRS)の選択オプション、およびアプリケーションサーバー上の出力ファイルのパス(P_FPATH)を含める必要があります。 - データ構造の宣言: 必要なイベントログ形式に一致する内部テーブル構造を定義します。この構造が最終出力を保持します。また、BKPF、ACDOCA、CDHDR、CDPOS、および様々なワークフローテーブルなど、選択するSAPテーブルの内部テーブルと作業領域も宣言します。
- データ選択ロジックの実装: 必要な12のアクティビティそれぞれからデータを取得するためのコアABAPロジックを作成します。コードを整理するために、各アクティビティごとに個別のサブルーチン(FORM)を作成します。たとえば、
get_created_events、get_parked_events、get_workflow_eventsなどのFORMを作成します。 - 「登録済み」および「転記済み」イベントの選択: ユーザーの選択画面基準に基づいてテーブルBKPFから読み取ります。BKPFのエントリは登録を意味します。ステータス
BSTAT = ' 'の伝票は転記済みと見なされます。登録タイムスタンプ(CPUDT、CPUTM)をイベント時刻として使用します。 - 「仮保存済み」イベントの選択: 仮保存済み伝票ヘッダーを格納するテーブルVBKPFから読み取ります。このテーブルの登録タイムスタンプは仮保存イベントを表します。
- 「ワークフロー」イベント(申請済み、承認済み、却下済み)の選択: SWW_WI2OBJ(仕訳伝票オブジェクトをワークフローインスタンスにリンクするため)およびSWWLOGHISTまたはSWWIHEAD(特定のステップの詳細とタイミングを取得するため)などのワークフローテーブルを照会します。システム内で、申請、承認、却下に対応する特定のワークフロータスクIDを特定する必要があります。
- 「変更」および「修正」イベントの選択: 変更伝票テーブルCDHDR(ヘッダー)とCDPOS(明細)を
OBJECTCLAS = 'BELEG'で照会します。「転記後変更」については、変更タイムスタンプが伝票の転記日より後の変更をフィルターします。「修正済み」については、仮保存または却下された伝票への変更をフィルターします。 - 「取消」および「消込済み」イベントの選択: BKPFの
STBLGフィールド(取消伝票番号)が入力されている伝票を見つけて、取消を特定します。取消イベント時刻は、取消伝票の登録時刻です。特定の仕訳伝票の明細について、テーブルACDOCAから最新の消込日付(AUGDT)を選択することで、消込イベントを特定します。 - データの結合とソート: 各アクティビティのデータが選択されると、結果を最終マスター内部テーブルに追加します。すべての選択が完了した後、各ケースの時系列順を確保するために、マスターテーブルを
JournalEntryIdとEventTimeでソートします。 - 出力ファイルの生成:
OPEN DATASET、LOOP AT... TRANSFER、およびCLOSE DATASETステートメントを使用して、ソートされた最終内部テーブルの内容を、SAPアプリケーションサーバー上の指定されたファイルパスに書き込みます。ファイルはヘッダー行を含むCSV形式である必要があります。 - 実行のスケジュール設定: 定期的な抽出には、トランザクションコード
SM36を使用して、Z_PM_JE_EXTRACTプログラムを定義されたスケジュール(例:毎週または毎月)で実行するバックグラウンドジョブを作成します。これにより、データエクスポートプロセスが自動化されます。
設定
- 日付範囲: 選択画面には、仕訳伝票登録日 (
CPUDT) の必須日付範囲が必要です。パフォーマンスを確保するため、3〜6ヶ月単位など、管理しやすい期間でデータを抽出することをお勧めします。 - 会社コード (
BUKRS): これは、プロセスマイニング分析に関連する特定の法的エンティティに抽出を限定するための重要なフィルターです。すべての会社コードを一度に抽出することは推奨されません。 - 伝票タイプ (
BLART): G/L勘定転記の「SA」や仕入先請求書の「KR」など、特定の仕訳伝票タイプに焦点を当てるためのオプションフィルターを追加できます。これにより、データ量を削減し、データセットの関連性を高めることができます。 - ファイルパス: プログラムは、出力ファイルが書き込まれるSAPアプリケーションサーバー上の論理ファイルパスを必要とします。パスが有効であり、SAPシステムユーザーがそのディレクトリに必要な書き込み権限を持っていることを確認してください。トランザクション
AL11を使用して、サーバーディレクトリを管理および表示できます。 - ワークフロータスクID: ワークフローイベント(申請済み、承認済み、却下済み)を抽出するためのロジックは、組織の仕訳伝票承認ワークフローで使用される特定のタスクIDで設定する必要があります。これらは多くの場合カスタムであり、ワークフローコンサルタントまたは開発者によって特定される必要があります。
- 前提条件: プログラムを実行するユーザーまたはシステムアカウントは、ABAPプログラム (
S_DEVELOP) の作成および実行のための開発者権限と、財務テーブル (BKPF, ACDOCA)、変更ログテーブル (CDHDR, CDPOS)、およびワークフローテーブル (SWW*) への広範な読み取りアクセス権限を必要とします。
a クエリ例 abap
REPORT Z_PM_JE_EXTRACT.
*&---------------------------------------------------------------------*
*&-- Data Structures for Event Log --*
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE string,
createdbyuser TYPE uname,
companycode TYPE bukrs,
journalentrytype TYPE blart,
postingdate TYPE budat,
amountinlocalcurrency TYPE wrbtr,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*&-- Selection Screen Definition --*
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_erdat_fr TYPE dats OBLIGATORY DEFAULT sy-datum-30,
p_erdat_to TYPE dats OBLIGATORY DEFAULT sy-datum.
SELECT-OPTIONS: so_bukrs FOR bkpf-bukrs OBLIGATORY.
PARAMETERS: p_fpath TYPE string OBLIGATORY DEFAULT '/usr/sap/trans/tmp/je_event_log.csv'.
SELECTION-SCREEN END OF BLOCK b1.
*&---------------------------------------------------------------------*
*&-- Internal Tables --*
*&---------------------------------------------------------------------*
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*&-- Main Processing Block --*
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_created_posted_events.
PERFORM get_parked_events.
PERFORM get_attachment_events.
PERFORM get_workflow_events.
PERFORM get_change_events.
PERFORM get_cleared_events.
PERFORM get_reversal_events.
SORT gt_event_log BY journalentryid eventtime.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*&-- Subroutines for Extracting Individual Activities --*
*&---------------------------------------------------------------------*
FORM get_created_posted_events.
DATA: lt_bkpf TYPE TABLE OF bkpf,
ls_event_log TYPE ty_event_log,
lv_timestamp TYPE string.
SELECT * FROM bkpf INTO TABLE lt_bkpf
WHERE bukrs IN so_bukrs
AND cpudt BETWEEN p_erdat_fr AND p_erdat_to.
LOOP AT lt_bkpf ASSIGNING FIELD-SYMBOL(<fs_bkpf>).
CLEAR ls_event_log.
CONCATENATE <fs_bkpf>-bukrs <fs_bkpf>-belnr <fs_bkpf>-gjahr INTO ls_event_log-journalentryid.
ls_event_log-companycode = <fs_bkpf>-bukrs.
ls_event_log-journalentrytype = <fs_bkpf>-blart.
ls_event_log-postingdate = <fs_bkpf>-budat.
ls_event_log-createdbyuser = <fs_bkpf>-usnam.
" Timestamp format YYYY-MM-DDTHH:MI:SS
CONCATENATE <fs_bkpf>-cpudt(4) '-' <fs_bkpf>-cpudt+4(2) '-' <fs_bkpf>-cpudt+6(2) 'T' <fs_bkpf>-cputm(2) ':' <fs_bkpf>-cputm+2(2) ':' <fs_bkpf>-cputm+4(2) INTO lv_timestamp.
ls_event_log-eventtime = lv_timestamp.
" Activity: Journal Entry Created
ls_event_log-activityname = 'Journal Entry Created'.
SELECT SUM( hsl ) INTO ls_event_log-amountinlocalcurrency FROM acdoca WHERE belnr = <fs_bkpf>-belnr AND gjahr = <fs_bkpf>-gjahr AND bukrs = <fs_bkpf>-bukrs.
APPEND ls_event_log TO gt_event_log.
" Activity: Journal Entry Posted (if not parked)
IF <fs_bkpf>-bstat = ' '.
ls_event_log-activityname = 'Journal Entry Posted'.
APPEND ls_event_log TO gt_event_log.
" Activity: Manual Posting Identified (based on T-Code)
CASE <fs_bkpf>-tcode.
WHEN 'FB01' OR 'F-02' OR 'FB50' OR 'F-22' OR 'F-43'.
ls_event_log-activityname = 'Manual Posting Identified'.
APPEND ls_event_log TO gt_event_log.
ENDCASE.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_parked_events.
DATA: ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM vbkpf
WHERE bukrs IN so_bukrs
AND cpudt BETWEEN p_erdat_fr AND p_erdat_to.
CLEAR ls_event_log.
CONCATENATE vbkpf-bukrs vbkpf-belnr vbkpf-gjahr INTO ls_event_log-journalentryid.
CONCATENATE vbkpf-cpudt(4) '-' vbkpf-cpudt+4(2) '-' vbkpf-cpudt+6(2) 'T' vbkpf-cputm(2) ':' vbkpf-cputm+2(2) ':' vbkpf-cputm+4(2) INTO lv_timestamp.
ls_event_log-activityname = 'Journal Entry Parked'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = vbkpf-usnam.
ls_event_log-companycode = vbkpf-bukrs.
ls_event_log-journalentrytype = vbkpf-blart.
ls_event_log-postingdate = vbkpf-budat.
APPEND ls_event_log TO gt_event_log.
ENDSELECT.
ENDFORM.
FORM get_attachment_events.
DATA: lt_bdocs TYPE TABLE OF srgbtbrel, ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM srgbtbrel INTO TABLE lt_bdocs
WHERE typeid_a = 'BUS2081' " Object type for Accounting Document
AND catid_a = 'BO'.
LOOP AT lt_bdocs ASSIGNING FIELD-SYMBOL(<fs_bdocs>).
CHECK <fs_bdocs>-instid_a(4) IN so_bukrs.
DATA(lv_bukrs) = <fs_bdocs>-instid_a(4).
DATA(lv_belnr) = <fs_bdocs>-instid_a+4(10).
DATA(lv_gjahr) = <fs_bdocs>-instid_a+14(4).
SELECT SINGLE cpudt, cputm, usnam, blart, budat FROM bkpf
INTO (DATA(lv_cpudt), DATA(lv_cputm), DATA(lv_usnam), DATA(lv_blart), DATA(lv_budat))
WHERE bukrs = lv_bukrs AND belnr = lv_belnr AND gjahr = lv_gjahr.
IF sy-subrc = 0 AND lv_cpudt BETWEEN p_erdat_fr AND p_erdat_to.
CLEAR ls_event_log.
CONCATENATE lv_bukrs lv_belnr lv_gjahr INTO ls_event_log-journalentryid.
" Note: Using document creation time as a proxy for attachment time.
CONCATENATE lv_cpudt(4) '-' lv_cpudt+4(2) '-' lv_cpudt+6(2) 'T' lv_cputm(2) ':' lv_cputm+2(2) ':' lv_cputm+4(2) INTO lv_timestamp.
ls_event_log-activityname = 'Supporting Documentation Attached'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = lv_usnam.
ls_event_log-companycode = lv_bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_workflow_events.
" This is a simplified example. Real workflow logic can be complex.
" You must identify your specific Task IDs for these events.
DATA: ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
DATA: BEGIN OF ls_wi, wi_id TYPE sww_wiid, cr_date TYPE sww_cd, cr_time TYPE sww_ct, task TYPE sww_task, instid TYPE swo_typeid, END OF ls_wi.
SELECT h~wi_id h~cr_date h~cr_time h~wi_rh_task o~instid
FROM swwwihead AS h
JOIN sww_wi2obj AS o ON h~wi_id = o~wi_id
INTO @ls_wi
WHERE o~typeid = 'BUS2081' AND o~catid = 'BO'
AND h~cr_date BETWEEN @p_erdat_fr AND @p_erdat_to.
DATA(lv_bukrs) = ls_wi-instid(4).
DATA(lv_belnr) = ls_wi-instid+4(10).
DATA(lv_gjahr) = ls_wi-instid+14(4).
IF lv_bukrs IN so_bukrs.
CLEAR ls_event_log.
CONCATENATE lv_bukrs lv_belnr lv_gjahr INTO ls_event_log-journalentryid.
CONCATENATE ls_wi-cr_date(4) '-' ls_wi-cr_date+4(2) '-' ls_wi-cr_date+6(2) 'T' ls_wi-cr_time(2) ':' ls_wi-cr_time+2(2) ':' ls_wi-cr_time+4(2) INTO lv_timestamp.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-companycode = lv_bukrs.
CASE ls_wi-task.
WHEN '[Your Submit Task ID]'. " e.g., TS20000139
ls_event_log-activityname = 'Journal Submitted For Review'.
APPEND ls_event_log TO gt_event_log.
WHEN '[Your Approve Task ID]'. " e.g., TS20000142
ls_event_log-activityname = 'Journal Entry Approved'.
APPEND ls_event_log TO gt_event_log.
WHEN '[Your Reject Task ID]'. " e.g., TS20000141
ls_event_log-activityname = 'Journal Entry Rejected'.
APPEND ls_event_log TO gt_event_log.
ENDCASE.
ENDIF.
ENDSELECT.
ENDFORM.
FORM get_change_events.
DATA: lt_cdhdr TYPE TABLE OF cdhdr, ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM cdhdr INTO TABLE lt_cdhdr
WHERE objectclas = 'BELEG'
AND udate BETWEEN p_erdat_fr AND p_erdat_to.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_bukrs) = <fs_cdhdr>-objectid(4).
DATA(lv_belnr) = <fs_cdhdr>-objectid+4(10).
DATA(lv_gjahr) = <fs_cdhdr>-objectid+14(4).
IF lv_bukrs IN so_bukrs.
SELECT SINGLE bstat, budat, blart FROM bkpf
INTO (DATA(lv_bstat), DATA(lv_budat), DATA(lv_blart))
WHERE bukrs = lv_bukrs AND belnr = lv_belnr AND gjahr = lv_gjahr.
IF sy-subrc = 0.
CLEAR ls_event_log.
CONCATENATE lv_bukrs lv_belnr lv_gjahr INTO ls_event_log-journalentryid.
CONCATENATE <fs_cdhdr>-udate(4) '-' <fs_cdhdr>-udate+4(2) '-' <fs_cdhdr>-udate+6(2) 'T' <fs_cdhdr>-utime(2) ':' <fs_cdhdr>-utime+2(2) ':' <fs_cdhdr>-utime+4(2) INTO lv_timestamp.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = <fs_cdhdr>-username.
ls_event_log-companycode = lv_bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
IF lv_bstat = ' ' AND <fs_cdhdr>-udate > lv_budat.
ls_event_log-activityname = 'Journal Entry Changed After Posting'.
APPEND ls_event_log TO gt_event_log.
ELSEIF lv_bstat <> ' '.
ls_event_log-activityname = 'Journal Entry Corrected'.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_cleared_events.
DATA: ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
DATA: BEGIN OF ls_clear, belnr TYPE belnr_d, gjahr TYPE gjahr, bukrs TYPE bukrs, augdt TYPE augdt, END OF ls_clear, lt_clear LIKE TABLE OF ls_clear.
SELECT belnr, gjahr, bukrs, MAX( augdt ) AS augdt FROM acdoca
INTO TABLE @lt_clear
WHERE bukrs IN @so_bukrs
AND augdt NE '00000000'
AND augdt BETWEEN @p_erdat_fr AND @p_erdat_to
GROUP BY belnr, gjahr, bukrs.
LOOP AT lt_clear INTO ls_clear.
SELECT SINGLE usnam, blart, budat FROM bkpf
INTO (DATA(lv_usnam), DATA(lv_blart), DATA(lv_budat))
WHERE bukrs = ls_clear-bukrs AND belnr = ls_clear-belnr AND gjahr = ls_clear-gjahr.
IF sy-subrc = 0.
CLEAR ls_event_log.
CONCATENATE ls_clear-bukrs ls_clear-belnr ls_clear-gjahr INTO ls_event_log-journalentryid.
CONCATENATE ls_clear-augdt(4) '-' ls_clear-augdt+4(2) '-' ls_clear-augdt+6(2) 'T12:00:00' INTO lv_timestamp. " Clearing date has no time, use midday
ls_event_log-activityname = 'Journal Entry Cleared'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = lv_usnam.
ls_event_log-companycode = ls_clear-bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
FORM get_reversal_events.
DATA: lt_reversals TYPE TABLE OF bkpf, ls_event_log TYPE ty_event_log, lv_timestamp TYPE string.
SELECT * FROM bkpf INTO TABLE lt_reversals
WHERE bukrs IN so_bukrs
AND cpudt BETWEEN p_erdat_fr AND p_erdat_to
AND stblg IS NOT NULL.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
SELECT SINGLE usnam, blart, budat FROM bkpf
INTO (DATA(lv_usnam), DATA(lv_blart), DATA(lv_budat))
WHERE bukrs = <fs_rev>-bukrs AND belnr = <fs_rev>-stblg AND gjahr = <fs_rev>-gjahr.
IF sy-subrc = 0.
CLEAR ls_event_log.
CONCATENATE <fs_rev>-bukrs <fs_rev>-stblg <fs_rev>-gjahr INTO ls_event_log-journalentryid.
CONCATENATE <fs_rev>-cpudt(4) '-' <fs_rev>-cpudt+4(2) '-' <fs_rev>-cpudt+6(2) 'T' <fs_rev>-cputm(2) ':' <fs_rev>-cputm+2(2) ':' <fs_rev>-cputm+4(2) INTO lv_timestamp.
ls_event_log-activityname = 'Journal Entry Reversal Processed'.
ls_event_log-eventtime = lv_timestamp.
ls_event_log-createdbyuser = lv_usnam.
ls_event_log-companycode = <fs_rev>-bukrs.
ls_event_log-journalentrytype = lv_blart.
ls_event_log-postingdate = lv_budat.
APPEND ls_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
FORM write_output_file.
DATA: lv_line TYPE string.
FIELD-SYMBOLS: <fs_event_log> TYPE ty_event_log.
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc NE 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_line = 'JournalEntryId,ActivityName,EventTime,CreatedByUser,CompanyCode,JournalEntryType,PostingDate,AmountInLocalCurrency'.
TRANSFER lv_line TO p_fpath.
LOOP AT gt_event_log ASSIGNING <fs_event_log>.
CONCATENATE <fs_event_log>-journalentryid <fs_event_log>-activityname <fs_event_log>-eventtime <fs_event_log>-createdbyuser <fs_event_log>-companycode <fs_event_log>-journalentrytype <fs_event_log>-postingdate <fs_event_log>-amountinlocalcurrency
INTO lv_line SEPARATED BY ','.
TRANSFER lv_line TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: / 'File successfully written to', p_fpath.
ENDFORM.