決算・レポーティングの仕訳データテンプレート
決算・レポーティングの仕訳データテンプレート
- 収集を推奨する属性
- 追跡する主なアクティビティ
- データ抽出の手順
決算・レポーティングの仕訳の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ 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を使って関連するすべてのアクティビティを1つのケースにまとめます。共通の仕訳IDでイベントをグループ化すると、エンドツーエンドの処理の流れを再構成し、サイクルタイムを測定して、個々の財務取引におけるばらつきやボトルネックを特定できます。プロセス全体を分析するための基本となる属性です。 重要な理由 この識別子で関連するすべてのプロセス手順を結び付け、仕訳ごとのエンドツーエンドの流れを分析できます。 入手先 通常、会社コード(BKPF-BUKRS)、伝票番号(BKPF-BELNR)、会計年度(BKPF-GJAHR)を連結して作成する複合キーです。 例 1000-1000000001-20231710-1900000055-20242000-2100003412-2023 | |||
| 仕訳タイプ JournalEntryType | 資産計上、仕入先請求書、総勘定元帳への記帳など、業務上の目的に基づいて仕訳を分類します。 | ||
| 説明 仕訳タイプは、SAPの用語では伝票タイプとも呼ばれ、会計伝票を分類するキーです。伝票に割り当てる番号範囲や、記帳できる勘定タイプなどを制御します。 仕訳タイプ別のプロセス分析は、業務の背景による違いを理解するうえで重要です。たとえば、単純な未払計上(タイプSA)の承認プロセスは、複雑な資産取得(タイプAA)の承認プロセスよりも簡単な場合があります。この属性は「仕訳タイプ別コンプライアンス」ダッシュボードの分析に欠かせません。 重要な理由 業務上の背景に応じて仕訳を分類し、財務取引の種類ごとにプロセスの違いやパフォーマンスを分析できます。 入手先 SAP S/4HANAのテーブルBKPF、フィールドBLART(伝票タイプ)。 例 SAKRAA | |||
| 会社コード CompanyCode | 仕訳が計上される会社または法人を識別する一意のコードです。 | ||
| 説明 会社コードはSAP Financialsにおける基本的な組織単位で、財務諸表を作成する独立した法人を表します。各仕訳には、特定の会社コードが割り当てられます。 この属性を使うと、組織内の各部門におけるプロセスパフォーマンスを分けて比較できます。特定の法人に絞ってプロセスを表示したり、会社コード間で差し戻し率を比較したり、地域ごとのプロセスの違いを特定したりできます。 重要な理由 組織内の異なる法人や事業部門ごとに、仕訳プロセスを絞り込んで比較できます。 入手先 SAP S/4HANAのテーブルBKPF、フィールドBUKRS(会社コード)。 例 10001710US01 | |||
| 会社コード通貨での金額 AmountInLocalCurrency | 会社コードの現地通貨で表した仕訳の合計金額です。 | ||
| 説明 この属性は、仕訳の金額規模を表します。通常、伝票内の借方または貸方の各明細金額の絶対値を合計し、会社コードの現地通貨に換算した値です。 金額別に分析すると、財務への影響に応じてプロセスを分類できます。たとえば、高額の仕訳には、少額の仕訳より厳格な承認プロセスが適用される場合があります。財務リスクが最も高い取引を優先し、プロセス改善に取り組む際にも役立ちます。 重要な理由 仕訳の金額を示し、金額の規模によってプロセスの動きがどう変わるかを分析できます。 入手先 明細テーブルBSEGのフィールドDMBTRから、対象の仕訳(BELNR)の金額を合計し、正の値に換算して算出します。 例 1500.75125000.0050.20 | |||
| 作成者ユーザー 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は総勘定元帳への手動記帳、FV50は仮登録を示し、自動処理用のコードはシステムによる仕訳作成を示します。 この属性は、アクティビティがユーザーによる手動処理か、システムによる自動処理かを判断する手がかりになります。手動記帳率のKPI算出や、自動化できる業務の特定にも役立ちます。 重要な理由 仕訳の処理方法(手動か自動かなど)を示し、自動化分析やプロセスの違いの把握に役立ちます。 入手先 SAP S/4HANAのテーブルBKPF、フィールドTCODE(トランザクションコード)。 例 FB01FV50F-02 | |||
| 会計年度 FiscalYear | 仕訳が属する会計年度です。 | ||
| 説明 会計年度は、会社コードおよび伝票番号とともに、仕訳を一意に識別するキーの一部です。伝票が関連する会計年度を表します。 分析では、長期的な傾向の把握やケースIDの一意性の確保に会計年度を使います。会計年度ごとにプロセス指標を比較すると、パフォーマンスが時間とともに改善したか、低下したかを確認できます。 重要な理由 伝票を一意に識別するための重要な情報であり、前年比でプロセスパフォーマンスを分析できます。 入手先 SAP S/4HANAのテーブルBKPF、フィールドGJAHR(会計年度)。 例 202320242022 | |||
| 伝票ステータス DocumentStatus | 仮登録、転記済み、消込済みなど、仕訳の現在の処理状況です。 | ||
| 説明 伝票ステータスは、仕訳のライフサイクルにおける現在の状態を示します。たとえば、仮登録された伝票は保存済みですが、総勘定元帳にはまだ転記されていません。一方、転記済みの伝票は処理が完了しています。 ステータスを分析すると、業務の流れを把握し、ボトルネックを特定できます。仮登録や承認待ちの伝票が長期間にわたって多く残っている場合、プロセスに非効率な部分がある可能性があります。また、プロセスのアクティビティを導出する際の重要なデータでもあります。 重要な理由 仕訳のライフサイクル上の状態を把握し、滞留やボトルネックの特定に役立ちます。 入手先 SAP S/4HANAのテーブルBKPF、フィールドBSTAT(伝票ステータス)。 例 VAB | |||
| 最終データ更新日時 LastDataUpdate | このレコードのデータがソースシステムから最後に更新された日時を示すタイムスタンプです。 | ||
| 説明 この属性には、ソースシステムからデータを最後に抽出または更新した日時が記録されます。分析対象のデータがどの程度新しいかを把握できます。 最終更新日時を確認することで、プロセス分析のデータが最新のものかどうかを判断できます。ほぼリアルタイムのデータなのか、前の期間のスナップショットなのかを踏まえて、ダッシュボードやKPIを正しく読み取るために役立ちます。 重要な理由 データの新しさを示し、プロセス分析がどの時点のデータに基づいているかを把握できます。 入手先 メタデータ属性です。通常、データ取り込みの過程で各レコードに生成・記録されます。 例 2024-03-10T02:00:00Z2024-03-11T02:00:00Z2024-03-12T02:00:00Z | |||
| 取消理由 ReversalReason | 転記済みの仕訳を取り消した理由を示すコードです。 | ||
| 説明 転記済みの仕訳に誤りがあった場合、削除するのではなく、新しい伝票を作成して取り消す必要があります。取消理由コードには、転記日や金額の誤りなど、取消処理を行った理由が記録されます。 取消理由を分析すると、決算・レポーティングプロセスで発生したエラーの根本原因を特定できます。特定の理由による取消が頻発している場合、トレーニング不足や統制上の不備など、初回処理の品質向上に向けて対処すべき組織的な問題が考えられます。 重要な理由 取消につながったエラーの根本原因を調べ、手戻りの削減とプロセス品質の向上に役立つインサイトを得られます。 入手先 SAP S/4HANAのテーブルBKPF、フィールドSTGRD(取消理由)。 例 010205 | |||
| 手動記帳の有無 IsManualPosting | 仕訳がユーザーによって手動で転記されたかどうかを示す真偽値です。 | ||
| 説明 この属性は、システムジョブやインターフェースによる自動転記ではなく、ユーザーが手動で処理した仕訳を特定します。通常、伝票の転記に使用したトランザクションコードから判定します。 このフラグは、手動記帳率のKPI算出に使われ、組織が決算・レポーティングプロセスの自動化をどこまで進めているかを把握するのに役立ちます。手動で転記された仕訳に絞り込むことで、人手が必要な具体的な業務を特定し、自動化の可能性を評価できます。 重要な理由 人による記帳とシステムによる記帳を区別でき、自動化の度合いの測定や自動化できる業務の特定に役立ちます。 入手先 トランザクションコードから算出する属性です。「FB01」や「F-02」など、あらかじめ定義した手動処理用コードの一覧に基づき、該当する場合はフラグをtrueに設定します。 例 truefalse | |||
| 手戻りの有無 IsRework | 仕訳に、却下後の修正などの手戻りが発生したかどうかを示す真偽値です。 | ||
| 説明 この計算属性は、理想経路から外れた仕訳にフラグを付けます。ケース内で「仕訳却下」や「仕訳修正」などのアクティビティが発生した場合、通常はtrueに設定されます。 このフラグを使うと、プロセス効率を簡単に分析できます。手戻り率のKPIをすばやく算出できるほか、手戻りの有無によるサイクルタイムやコストの比較も可能です。手戻りの要因を特定することは、多くのプロセス改善施策で主要な目標となっています。 重要な理由 修正や追加の処理が必要だったケースにフラグを付け、プロセスの非効率性を定量化して根本原因を分析できます。 入手先 ケース内のアクティビティの順序から算出する属性です。「仕訳却下」などのアクティビティが含まれる場合、trueに設定されます。 例 truefalse | |||
| 承認サイクルタイム ApprovalCycleTime | 仕訳を承認に提出してから、承認または却下されるまでの経過時間です。 | ||
| 説明 この計算指標は、承認段階にかかった時間を測定します。「仕訳レビュー提出」アクティビティから、その後の「仕訳承認」または「仕訳却下」アクティビティまでの時間を算出します。 このKPIは、承認ワークフローのボトルネックを特定するうえで重要です。承認サイクルタイムが長いと、プロセス全体に大きな遅れが生じる可能性があります。承認者、会社コード、仕訳タイプごとに分析すると、改善が必要な箇所を特定できます。 重要な理由 承認ステップにかかった時間を切り分け、レビューと承認のワークフローにおけるボトルネックの特定と解消に役立ちます。 入手先 「仕訳レビュー提出」イベントから「仕訳承認」または「仕訳却下」イベントまでの時間差を算出します。 例 1日2時間4時間25分5日0時間 | |||
| 承認者ユーザー ApproverUser | 仕訳を承認または却下したユーザーのIDです。 | ||
| 説明 この属性は、提出された仕訳を確認し、判断を下す担当ユーザーを特定します。複数段階の承認ワークフローでは、1つの仕訳に複数の承認者が関わる場合があります。 承認プロセスを詳しく分析するうえで欠かせない情報です。承認者ごとの業務量や承認時間を測定し、承認経路のボトルネックを特定できます。「ユーザーのアクティビティと処理量」ダッシュボードの分析にも直接役立ちます。 重要な理由 承認を担当したユーザーを特定し、承認者ごとの業務量、パフォーマンス、ボトルネックを分析できます。 入手先 ワークフローログ(SWW_WI2OBJ、SWWLOGなど)または変更文書テーブル(CDHDR/CDPOS)から、承認ステップを実行したユーザーを追跡して取得します。 例 DMILLERFWHITEKCHEN | |||
| 終了時刻 EndTime | アクティビティが完了した日時を示すタイムスタンプです。 | ||
| 説明 終了時刻は、アクティビティが完了した時点を示します。多くのイベントログでは、瞬時に発生するイベントを表すため、アクティビティの開始時刻と終了時刻が同じです。一方、担当者による文書の確認など、所要時間を測定できるアクティビティでは、この属性でその時間を記録できます。 終了時刻を個別に記録すると、アクティビティの処理時間と待ち時間をより正確に算出できます。タスクに実際に取り組んでいた時間と、キューで待機していた時間を区別できます。 重要な理由 アクティビティの処理時間を正確に算出し、実作業時間と待機時間を区別できます。 入手先 単発のイベントでは、通常、開始時刻と同じです。所要時間のあるアクティビティでは、ワークフローログから取得するか、後続イベントを基に算出します。 例 2023-10-26T10:05:00Z2023-11-15T14:45:20Z2024-01-20T09:10:30Z | |||
決算・レポーティングの仕訳のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 仕訳の取消を処理 | 転記済みの仕訳を、逆仕訳を記録した新しい伝票を作成して取り消します。転記済み伝票のエラーを修正するための明示的な取引であり、監査証跡が残ります。 | ||
| 重要な理由 取消は、転記済み伝票にエラーがあったことを示します。取消率が高い場合、承認プロセスやデータ入力の品質に根本的な問題がある可能性があります。取消を追跡すると、初回処理の正確性を高めるのに役立ちます。 入手先 取消は明示的なイベントです。新しく作成された取消伝票のヘッダー(BKPF)には、取消対象の伝票への参照が取消伝票番号(STBLG)項目に記録されます。イベントの時刻には、新しい伝票の転記日を使用します。 記録 BKPF-STBLGに値が入力されている伝票を特定します。イベントのタイムスタンプには、取消伝票の転記日を使用します。 イベントタイプ explicit | |||
| 仕訳の消込を完了 | 仕訳の未消込明細を、請求書に対する支払いなど別の転記で相殺します。このアクティビティは特定の明細の照合を示し、実質的にその明細をクローズします。 | ||
| 重要な理由 このアクティビティは、多くの仕訳、特に仮勘定や未消込明細管理対象の勘定に関する仕訳で、最終的な照合手順を示します。転記から消込までの時間を分析すると、照合の効率を測定できます。 入手先 このイベントは、明細テーブル(BSEGまたはACDOCAビュー)から推定します。明細が消し込まれると、その明細の消込日(AUGDT)と消込伝票(AUGBL)が入力されます。 記録 イベントのタイムスタンプには、明細の消込日(BSEG-AUGDT)を使用します。 イベントタイプ inferred | |||
| 仕訳を作成 | このアクティビティは、システムで仕訳伝票を作成した時点を示します。ヘッダーテーブル(BKPF)にレコードが作成されますが、総勘定元帳にはまだ転記されていません。仕訳のライフサイクルはここから始まります。 | ||
| 重要な理由 これはプロセスの主要な開始イベントです。このイベントから転記までの時間を分析すると、全体のサイクルタイムを測定し、初期のデータ入力の遅れを特定できます。 入手先 SAPのBKPFテーブルにある作成日(CPUDT)と作成時刻(CPUTM)の項目を使い、対象の伝票番号(BELNR)に対するこのイベントを明示的に記録できます。 記録 イベントのタイムスタンプにはBKPF-CPUDTとBKPF-CPUTMを使用します。 イベントタイプ explicit | |||
| 仕訳を承認 | 権限を持つ管理者が仕訳を最終承認し、その妥当性と正確性を確認します。このアクティビティは、伝票を総勘定元帳に転記する前の最終ゲートです。 | ||
| 重要な理由 これは承認サイクルを締めくくる重要な節目です。この段階に至るまでの時間は、プロセス全体の所要時間を大きく左右し、承認者の処理効率を示す重要な指標となります。 入手先 このイベントは、最終承認の手順を示すワークフローログ、または伝票のステータス変更から推定します。承認者のユーザーIDとタイムスタンプは、ワークフローデータや変更ログから取得できます。 記録 ワークフローログで最終承認のタイムスタンプを特定するか、変更伝票でステータスが「承認済み」に変わった時刻を確認します。 イベントタイプ inferred | |||
| 仕訳を確認に提出 | 仕訳の作成者が、確認・承認ワークフローに正式に伝票を提出します。このアクティビティは、データ入力から正式な統制プロセスへの引き継ぎを示し、承認サイクルの開始点となります。 | ||
| 重要な理由 ここが承認サイクルタイムの開始点です。この時点から最終承認または却下までを測定すると、確認・承認段階におけるボトルネックを切り分けられます。 入手先 多くの場合、業務オブジェクトに関連付けられたワークフローログ(テーブルSWW_WIHEAD、SWWLOG)から取得します。また、伝票ヘッダー(BKPF)のカスタム項目のステータス変更から推定することもできます。 記録 ワークフロー項目の作成タイムスタンプ、またはステータス項目が「提出済み」や「確認中」に変わった時刻。 イベントタイプ inferred | |||
| 仕訳を転記 | 仕訳が総勘定元帳に正式に記録され、会社の財務諸表に反映されます。この時点で、伝票は恒久的な財務記録となります。 | ||
| 重要な理由 これは主要な成功の節目であり、中心となる処理サイクルの終了を示します。転記済み仕訳の処理量と、この段階に至るまでの時間は、プロセスマイニングの基本的な指標です。 入手先 このイベントは、BKPFテーブルの転記日(BUDAT)で明示的に記録されます。転記済み伝票では伝票ステータス(BSTAT)が空欄となり、保留中(「V」)や仮置き(「D」)の伝票と区別できます。 記録 イベントのタイムスタンプには転記日(BKPF-BUDAT)と入力日(BKPF-CPUDT)を使用します。BKPF-BSTATが空欄の場合、伝票は転記済みです。 イベントタイプ explicit | |||
| 仕訳を保留 | ユーザーが仕訳を転記せずに未完成の状態で保存し、後から入力を完了したり確認したりできるようにします。明示的な操作によって伝票ヘッダーのレコードが作成され、ステータスが「保留」となり、未転記の状態で保持されます。 | ||
| 重要な理由 保留は提出前によく行われる手順です。保留状態の期間を追跡すると、正式な確認・承認プロセスが始まる前のデータ入力や準備の遅れを特定できます。 入手先 BKPFテーブルでは、伝票ステータス項目(BSTAT)が「V」の伝票を保留中として識別します。イベントのタイムスタンプには作成日(CPUDT)を使用します。 記録 作成時点でBKPF-BSTAT = 'V'となっている伝票を抽出します。 イベントタイプ explicit | |||
| 仕訳を修正 | ユーザーが、却下または修正のために差し戻された仕訳を変更します。確認プロセスで指摘された問題に対応し、再提出するまでに必要な手戻りを示します。 | ||
| 重要な理由 このアクティビティから手戻りの発生状況を数値で把握できます。修正の頻度と所要時間を分析すると、非効率の原因を特定し、トレーニングやプロセスの明確化に向けた改善機会を見つけられます。 入手先 BKPFテーブルの最終変更日(AEDAT)を追跡し、以前に「却下」状態だった伝票の変更を推定できます。変更内容の詳細は、変更伝票から確認できます。 記録 却下後に行われた変更のタイムスタンプには、変更伝票ヘッダー(CDHDR-UDATE)を使用します。 イベントタイプ inferred | |||
| 仕訳を却下 | 確認者または承認者が仕訳を却下し、転記を差し止めます。通常、伝票は修正のため作成者に差し戻され、手戻りが発生します。 | ||
| 重要な理由 却下を追跡することは、プロセスの品質を把握し、よくあるエラーを特定するうえで重要です。却下率が高い場合、データの正確性や方針の理解、証憑の不足に問題がある可能性があります。 入手先 このイベントは、ワークフローログまたは仕訳伝票のカスタムステータス項目の変更から推定します。該当するステータス項目の変更伝票ログ(CDHDR/CDPOS)からタイムスタンプを取得できます。 記録 変更伝票(CDHDR/CDPOS)またはワークフローログで、ステータス項目が「却下」に変わったことを特定します。 イベントタイプ inferred | |||
| 手動転記を特定 | 仕訳が自動インターフェースやバッチジョブではなく、手動のトランザクションコードを使って転記されました。これは時間を伴うイベントではなく、転記アクティビティの分類です。 | ||
| 重要な理由 手動転記の特定は、自動化の取り組みに欠かせません。手動転記の割合が高い場合、サブシステムの連携や自動転記プログラムの利用によって、プロセスを効率化できる可能性があります。 入手先 伝票ヘッダーテーブル(BKPF)のトランザクションコード(TCODE)項目を分析して判定します。FB01、F-02、FB50など、既知の手動Tコードの一覧を使って仕訳を分類します。 記録 転記時点のBKPF-TCODEを、あらかじめ定めた手動トランザクションコードの一覧と照合してイベントを分類します。 イベントタイプ calculated | |||
| 証憑を添付 | ユーザーが請求書やスプレッドシートなどの証憑を1つ以上仕訳に添付します。通常、確認や監査の際に財務取引の根拠や背景を示すために行います。 | ||
| 重要な理由 確認前に証憑を添付することは、コンプライアンスの遵守と承認の効率化に欠かせません。このアクティビティを分析すると、文書化ルールの遵守状況と承認サイクルへの影響を測定できます。 入手先 通常は、汎用オブジェクトサービス(GOS)を通じて関連付けられた添付ファイルの作成タイムスタンプから推定します。SRGBTBRELテーブルで、業務オブジェクト(BKPF伝票など)と添付ファイルの関連を確認できます。 記録 GOSの添付ファイルテーブル(SRGBTBRELなど)を照会してBKPFオブジェクトへのリンクを確認し、添付ファイルの作成タイムスタンプを使用します。 イベントタイプ inferred | |||
| 転記後に仕訳を変更 | ユーザーが、総勘定元帳への転記後に仕訳の一部の項目を変更します。転記後はほとんどの財務データを変更できませんが、テキストや割当などの項目は変更できる場合があります。 | ||
| 重要な理由 このアクティビティは、コンプライアンス上の重要な確認項目です。転記後の変更は記録の改ざんを示す可能性があるため、不正の防止とデータの整合性確保に向けて注意深くモニタリングする必要があります。 入手先 変更伝票テーブル(CDHDR、CDPOS)から確実に推定できます。伝票番号に対応するCDHDRの変更日が転記日より後であれば、転記後に変更が行われたことを示します。 記録 CDHDRで、変更タイムスタンプ(UDATE/UTIME)が伝票の転記日(BKPF-BUDAT)より後になっているレコードを検索します。 イベントタイプ inferred | |||
データ抽出ガイド
ステップ
- 前提条件とアクセス権限:SAP S/4HANAの基盤データベースに対するクエリの実行、またはABAPレポートの実行に必要な権限を持つユーザーをご用意ください。CDSビューI_JournalEntry、I_JournalEntryItem、およびテーブルCDHDR、CDPOS、SRGBREL、SOOD、SWW_WI2OBJ、SWWLOGHISTへの読み取りアクセスが必要です。通常、SAP HANA StudioやDBeaverなどのデータベースクライアント、またはEclipse用SAP ABAP Development Tools(ADT)からアクセスします。
- システム固有の設定を確認:クエリを実行する前に、仕訳承認ワークフローで使用されているタスクコードを特定してください。SAPワークフロー管理者に確認し、申請、却下、承認の各イベントに対応するタスクID(例:TS12345678)を調べます。これらのIDは、最終クエリ内のプレースホルダーに設定します。
- 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ツールから結果全体を1つのCSVファイルにエクスポートします。特殊文字の問題を防ぐため、UTF-8エンコーディングを指定してください。
- アップロードの準備:プロセスマイニングツールにアップロードする前に、CSVファイルに必要なヘッダーが含まれていることを確認します。データはすでにイベントログ形式になっているため、追加の変換やピボット処理は通常必要ありません。
設定
- Core Data Services(CDS)ビュー:抽出では、ヘッダーデータに
I_JournalEntry、明細項目と金額の詳細にI_JournalEntryItemを主に使用します。これらのビューを通じて、ユニバーサルジャーナル(ACDOCA)のデータを、意味づけされた扱いやすい形式で参照できます。 - 関連テーブル:プロセス全体を把握するため、クエリでは次の標準SAPテーブルも結合します。
CDHDRとCDPOS:文書の変更履歴を追跡します。SRGBRELとSOOD:Generic Object Services(GOS)を通じて添付ファイルがリンクされた時点を特定します。SWW_WI2OBJとSWWLOGHIST:承認ワークフローの主なイベントを抽出します。
- 期間による絞り込み:処理性能を保つため、特定の期間に絞り込むことが重要です。
WHERE句ではI_JournalEntry.CreationDateTimeフィールドを使用してください。初回の分析では、3~6か月の期間を推奨します。 - 組織による絞り込み:対象となる法人に限定するため、必ず
CompanyCodeで絞り込んでください。大規模なシステムで全会社コードを一度に検索すると、実行に非常に長い時間がかかる場合があります。 - ワークフロータスクID:クエリにはワークフロータスクID(例:[Workflow Approved Task ID])のプレースホルダーがあります。IDはSAPの各環境で異なるため、ワークフローのアクティビティを抽出するには正しく設定する必要があります。設定しない場合、申請、承認、却下のイベントは記録されません。
- 前提条件:実行ユーザーには、財務、システム、ワークフロー関連テーブルに対する広範な読み取り権限が必要です。これらの権限は標準では付与されないため、個別に設定してください。
クエリの例 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 HANAデータベースへの直接SQLアクセスが承認されていること、および抽出ユーザーにBKPFとACDOCAへの読み取り権限があることを確認します。さらに、システムで必要となるワークフロー、添付ファイル、変更履歴、消込、取消の各データソースについても、読み取り権限を確認してください。データベースへの直接アクセスには、通常SAP HANA Database Explorer、SAP HANA Studio、または承認済みのSQLクライアントを使用します。システムで明示的にサポートされていない限り、SAPアプリケーションのトランザクション内で抽出クエリを実行しないでください。
- BKPFとACDOCAの物理スキーマを確認します。クライアント、会社コード、会計年度、文書番号、文書タイプ、転記日、作成日、作成時刻、ユーザー、ローカル通貨金額の各フィールドに加え、取消や消込に関するフィールドも確認してください。SAP S/4HANAの環境によってスキーマや利用できるフィールドが異なるため、クエリ内の角括弧付きプレースホルダーは、システムで確認したフィールドに置き換えます。
- ワークフローと添付ファイルのイベントについて、信頼できるデータソースを特定します。BKPFとACDOCAから会計文書や明細項目のデータは取得できますが、保留、申請、却下、修正、承認、添付のすべてのイベントを確実に取得できるわけではありません。ワークフローと添付ファイルのデータソースのプレースホルダーは、実装環境で承認されたビューまたはテーブルに置き換えてください。データソースが利用できない場合、イベントを推測して作成しないでください。該当するデータソースを設定するか、承認を得てアクティビティを対象外にしてください。
- 必要な期間、会社コード、文書タイプ、クライアントに合わせて抽出パラメーターを設定します。初回の検証には3~6か月の期間を推奨します。合意したプロセスの対象範囲に従い、業務イベントにはイベントのタイムスタンプ範囲を、会計イベントには転記日の範囲を使用してください。
- 承認済みのHANA SQLクライアントでSQLクエリ全体を実行します。クエリは、明示的に抽出した各アクティビティについてイベント行を1行作成します。会計イベントにはBKPFとACDOCAを使用し、ワークフロー、添付ファイル、変更、消込、取消のイベントには設定済みのソースビューを使用します。文書が存在するという理由だけでアクティビティを推定することはありません。
- 出力スキーマを確認します。JournalEntryIdはケース識別子、ActivityNameはアクティビティ名、EventTimeはイベントのタイムスタンプです。推奨される業務属性も、取得可能な場合は出力されます。EventTimeがタイムスタンプ形式であること、すべての行に空でないJournalEntryIdとActivityNameがあることを確認してください。
- 選択したクライアント、会社コード、会計年度、期間について、JournalEntryIdの重複を除いた値と想定されるBKPFの対象件数を比較し、会計データの対象範囲を照合します。ワークフローと添付ファイルは、会計データと保持期間やタイムスタンプのルールが異なる場合があるため、個別に照合してください。
- イベントの順序と重複の扱いを検証します。プロセス設計上、明細レベルのイベントが必要な場合を除き、ACDOCAの複数の明細項目によって会計イベントが重複しないようにしてください。クエリの集計ロジックを使い、仕訳とイベントタイプごとに会計イベントを1件にまとめます。利用可能な場合は、設定済みのソースイベントIDを保持してください。
- 結果をUTF-8のCSV、またはProcessMindが対応する別の表形式でエクスポートします。列名JournalEntryId、ActivityName、EventTimeは変更しないでください。ファイルをJournalEntryId、EventTimeの順に並べ替え、追加の属性は列として保持します。ファイルをProcessMindにアップロードし、JournalEntryIdをケース識別子、ActivityNameをアクティビティ、EventTimeをイベントのタイムスタンプとして設定してください。
設定
- 期間:まず3~6か月を対象にします。性能テストでは期間を短くし、行数とイベントの網羅性を確認してから対象期間を広げてください。
- クライアントと会社の対象範囲:[Client parameter]を設定し、CompanyCodeを対象となる法人に限定します。複数クライアントのシステムでは、クライアント条件を必ず指定してください。
- 会計データの対象範囲:[Document type filter]を設定し、必要に応じて会計年度や転記日でも絞り込みます。選択したデータソースで確実に取得できる場合に限り、転記済みと未転記の文書を両方含めてください。
- ワークフローの対象範囲:[Workflow event source]と、申請、却下、修正、承認の各アクティビティに対応するイベントタイプを設定します。タイムスタンプがワークフロー操作の作成、実行、完了のどの時点を示すか確認してください。
- 添付ファイルの対象範囲:[Attachment event source]と、添付ファイルを仕訳に関連付けるフィールドを設定します。データソースが添付ファイルの作成、差し替え、削除のどれを記録するか確認してください。
- 変更履歴の対象範囲:転記後の変更について[Change history source]を設定します。データソースから仕訳を特定でき、信頼できる変更日時を取得できることを確認してください。
- 消込の対象範囲:[Clearing source]と、消し込まれる会計文書と消込文書の関連付けを設定します。イベントを元の仕訳、消込文書、または両方のどれに割り当てるか決めてください。
- 取消の対象範囲:[Reversal source]と、元の文書と取消文書の関連付けを設定します。関連付けが取得できる場合、クエリは取消アクティビティを元のJournalEntryIdに割り当てます。
- 手動転記の分類:[Manual posting source]または検証済みの転記元フィールドを設定します。Manual Posting Identifiedは分類イベントです。転記日時、または承認済みの別の日時を一貫して使用してください。
- 通貨金額:ACDOCAのデータは明細項目単位です。クエリではローカル通貨金額を仕訳ごとに集計します。符号の扱いと、統計用、元帳固有、拡張元帳の各行を含めるか確認してください。
- 性能:必要な列だけを選択し、早い段階で絞り込み、ACDOCA全体の無制限なスキャンを避け、承認されたレポート実行時間帯に実行してください。対応している場合は、クライアント、会計年度、会社コード、転記日の条件でパーティションプルーニングを行います。
- 重複の処理:利用できる場合はソースイベントIDを使用します。データソースに技術的な重複レコードが含まれる場合は、実際に別々のワークフロー操作をまとめてしまわないよう、文書化された重複排除ルールを適用してください。
- 前提条件:必要なデータベース権限、承認済みのSAP HANA接続、設定済みのワークフローと添付ファイルのデータソースへのアクセス、適切なSAP財務会計およびワークフロー設定、ProcessMindが対応するエクスポート形式。
クエリの例 sql
WITH
accounting_base AS (
SELECT
b.[Client field] AS ClientId,
b.[Company code field] AS CompanyCode,
b.[Fiscal year field] AS FiscalYear,
b.[Document number field] AS AccountingDocumentNumber,
b.[Document type field] AS JournalEntryType,
b.[Created by field] AS CreatedByUser,
b.[Document date field] AS DocumentDate,
b.[Posting date field] AS PostingDate,
b.[Creation date field] AS CreationDate,
b.[Creation time field] AS CreationTime,
b.[Reversal document field] AS ReversalDocumentNumber,
b.[Reversed document field] AS ReversedDocumentNumber,
b.[Reversal fiscal year field] AS ReversalFiscalYear,
SUM(a.[Local currency amount field]) AS AmountInLocalCurrency,
MAX(a.[Local currency field]) AS LocalCurrency
FROM [Your schema].[BKPF] b
INNER JOIN [Your schema].[ACDOCA] a
ON a.[Client field] = b.[Client field]
AND a.[Company code field] = b.[Company code field]
AND a.[Fiscal year field] = b.[Fiscal year field]
AND a.[Document number field] = b.[Document number field]
WHERE b.[Client field] = '[Client parameter]'
AND b.[Company code field] IN ([Company code filter])
AND b.[Posting date field] BETWEEN '[Start date parameter]' AND '[End date parameter]'
AND b.[Document type field] IN ([Document type filter])
GROUP BY
b.[Client field],
b.[Company code field],
b.[Fiscal year field],
b.[Document number field],
b.[Document type field],
b.[Created by field],
b.[Document date field],
b.[Posting date field],
b.[Creation date field],
b.[Creation time field],
b.[Reversal document field],
b.[Reversed document field],
b.[Reversal fiscal year field]
),
base_cases AS (
SELECT
ClientId,
CompanyCode,
FiscalYear,
AccountingDocumentNumber,
CAST(CompanyCode || '/' || FiscalYear || '/' || AccountingDocumentNumber AS NVARCHAR(100)) AS JournalEntryId,
JournalEntryType,
CreatedByUser,
PostingDate,
AmountInLocalCurrency,
LocalCurrency,
CreationDate,
CreationTime,
ReversalDocumentNumber,
ReversedDocumentNumber,
ReversalFiscalYear
FROM accounting_base
),
created_events AS (
SELECT
JournalEntryId,
'Journal Entry Created' AS ActivityName,
CAST(CreationDate || ' ' || CreationTime AS TIMESTAMP) AS EventTime,
CreatedByUser,
CompanyCode,
JournalEntryType,
PostingDate,
AmountInLocalCurrency,
LocalCurrency
FROM base_cases
),
parked_events AS (
SELECT
CAST(w.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Parked' AS ActivityName,
CAST(w.[Event timestamp field] AS TIMESTAMP) AS EventTime,
w.[User field] AS CreatedByUser,
w.[Company code field] AS CompanyCode,
w.[Journal entry type field] AS JournalEntryType,
w.[Posting date field] AS PostingDate,
w.[Amount in local currency field] AS AmountInLocalCurrency,
w.[Local currency field] AS LocalCurrency
FROM [Your schema].[Workflow event source] w
WHERE w.[Client field] = '[Client parameter]'
AND w.[Event type field] = '[Parked event type]'
AND CAST(w.[Event timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
attachment_events AS (
SELECT
CAST(x.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Supporting Documentation Attached' AS ActivityName,
CAST(x.[Event timestamp field] AS TIMESTAMP) AS EventTime,
x.[User field] AS CreatedByUser,
x.[Company code field] AS CompanyCode,
x.[Journal entry type field] AS JournalEntryType,
x.[Posting date field] AS PostingDate,
x.[Amount in local currency field] AS AmountInLocalCurrency,
x.[Local currency field] AS LocalCurrency
FROM [Your schema].[Attachment event source] x
WHERE x.[Client field] = '[Client parameter]'
AND x.[Event type field] = '[Attachment created event type]'
AND CAST(x.[Event timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
submitted_events AS (
SELECT
CAST(w.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Submitted For Review' AS ActivityName,
CAST(w.[Event timestamp field] AS TIMESTAMP) AS EventTime,
w.[User field] AS CreatedByUser,
w.[Company code field] AS CompanyCode,
w.[Journal entry type field] AS JournalEntryType,
w.[Posting date field] AS PostingDate,
w.[Amount in local currency field] AS AmountInLocalCurrency,
w.[Local currency field] AS LocalCurrency
FROM [Your schema].[Workflow event source] w
WHERE w.[Client field] = '[Client parameter]'
AND w.[Event type field] = '[Submitted event type]'
AND CAST(w.[Event timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
rejected_events AS (
SELECT
CAST(w.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Rejected' AS ActivityName,
CAST(w.[Event timestamp field] AS TIMESTAMP) AS EventTime,
w.[User field] AS CreatedByUser,
w.[Company code field] AS CompanyCode,
w.[Journal entry type field] AS JournalEntryType,
w.[Posting date field] AS PostingDate,
w.[Amount in local currency field] AS AmountInLocalCurrency,
w.[Local currency field] AS LocalCurrency
FROM [Your schema].[Workflow event source] w
WHERE w.[Client field] = '[Client parameter]'
AND w.[Event type field] = '[Rejected event type]'
AND CAST(w.[Event timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
corrected_events AS (
SELECT
CAST(w.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Corrected' AS ActivityName,
CAST(w.[Event timestamp field] AS TIMESTAMP) AS EventTime,
w.[User field] AS CreatedByUser,
w.[Company code field] AS CompanyCode,
w.[Journal entry type field] AS JournalEntryType,
w.[Posting date field] AS PostingDate,
w.[Amount in local currency field] AS AmountInLocalCurrency,
w.[Local currency field] AS LocalCurrency
FROM [Your schema].[Workflow event source] w
WHERE w.[Client field] = '[Client parameter]'
AND w.[Event type field] = '[Corrected event type]'
AND CAST(w.[Event timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
approved_events AS (
SELECT
CAST(w.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Approved' AS ActivityName,
CAST(w.[Event timestamp field] AS TIMESTAMP) AS EventTime,
w.[User field] AS CreatedByUser,
w.[Company code field] AS CompanyCode,
w.[Journal entry type field] AS JournalEntryType,
w.[Posting date field] AS PostingDate,
w.[Amount in local currency field] AS AmountInLocalCurrency,
w.[Local currency field] AS LocalCurrency
FROM [Your schema].[Workflow event source] w
WHERE w.[Client field] = '[Client parameter]'
AND w.[Event type field] = '[Approved event type]'
AND CAST(w.[Event timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
manual_events AS (
SELECT
JournalEntryId,
'Manual Posting Identified' AS ActivityName,
CAST(PostingDate AS TIMESTAMP) AS EventTime,
CreatedByUser,
CompanyCode,
JournalEntryType,
PostingDate,
AmountInLocalCurrency,
LocalCurrency
FROM base_cases
WHERE [Manual posting condition verified for this system]
),
posted_events AS (
SELECT
JournalEntryId,
'Journal Entry Posted' AS ActivityName,
CAST(PostingDate AS TIMESTAMP) AS EventTime,
CreatedByUser,
CompanyCode,
JournalEntryType,
PostingDate,
AmountInLocalCurrency,
LocalCurrency
FROM base_cases
WHERE [Posted document condition verified for this system]
),
changed_events AS (
SELECT
CAST(c.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Changed After Posting' AS ActivityName,
CAST(c.[Change timestamp field] AS TIMESTAMP) AS EventTime,
c.[User field] AS CreatedByUser,
c.[Company code field] AS CompanyCode,
c.[Journal entry type field] AS JournalEntryType,
c.[Posting date field] AS PostingDate,
c.[Amount in local currency field] AS AmountInLocalCurrency,
c.[Local currency field] AS LocalCurrency
FROM [Your schema].[Change history source] c
WHERE c.[Client field] = '[Client parameter]'
AND c.[Post posting change indicator field] = '[Post posting change value]'
AND CAST(c.[Change timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
cleared_events AS (
SELECT
CAST(cl.[Journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Cleared' AS ActivityName,
CAST(cl.[Clearing timestamp field] AS TIMESTAMP) AS EventTime,
cl.[User field] AS CreatedByUser,
cl.[Company code field] AS CompanyCode,
cl.[Journal entry type field] AS JournalEntryType,
cl.[Posting date field] AS PostingDate,
cl.[Amount in local currency field] AS AmountInLocalCurrency,
cl.[Local currency field] AS LocalCurrency
FROM [Your schema].[Clearing source] cl
WHERE cl.[Client field] = '[Client parameter]'
AND CAST(cl.[Clearing timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
),
reversal_events AS (
SELECT
CAST(r.[Original journal entry ID field] AS NVARCHAR(100)) AS JournalEntryId,
'Journal Entry Reversal Processed' AS ActivityName,
CAST(r.[Reversal timestamp field] AS TIMESTAMP) AS EventTime,
r.[User field] AS CreatedByUser,
r.[Company code field] AS CompanyCode,
r.[Journal entry type field] AS JournalEntryType,
r.[Posting date field] AS PostingDate,
r.[Amount in local currency field] AS AmountInLocalCurrency,
r.[Local currency field] AS LocalCurrency
FROM [Your schema].[Reversal source] r
WHERE r.[Client field] = '[Client parameter]'
AND CAST(r.[Reversal timestamp field] AS DATE) BETWEEN '[Start date parameter]' AND '[End date parameter]'
)
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM created_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM parked_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM attachment_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM submitted_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM rejected_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM corrected_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM approved_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM manual_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM posted_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM changed_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM cleared_events
UNION ALL
SELECT JournalEntryId, ActivityName, EventTime, CreatedByUser, CompanyCode, JournalEntryType, PostingDate, AmountInLocalCurrency, LocalCurrency FROM reversal_events
ORDER BY JournalEntryId, EventTime, ActivityName; ステップ
- 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):必要に応じてこの任意の条件を追加し、「SA」(総勘定元帳転記)や「KR」(仕入先請求書)など、特定の仕訳タイプに絞り込めます。データ量を抑え、分析対象に合ったデータを取得しやすくなります。 - ファイルパス:出力ファイルを書き込むSAPアプリケーションサーバー上の論理ファイルパスが必要です。パスが有効であり、SAPシステムユーザーにそのディレクトリへの書き込み権限があることを確認してください。サーバーディレクトリの管理と確認には、トランザクション
AL11を使用します。 - ワークフロータスクID:ワークフローイベント(申請、承認、却下)の抽出ロジックには、組織の仕訳承認ワークフローで使用するタスクIDを設定する必要があります。多くの場合、タスクIDは個別に設定されているため、ワークフローのコンサルタントまたは開発者に確認してください。
- 前提条件:プログラムを実行するユーザーまたはシステムアカウントには、ABAPプログラムの作成と実行に必要な開発権限(
S_DEVELOP)に加え、財務テーブル(BKPF、ACDOCA)、変更ログテーブル(CDHDR、CDPOS)、ワークフローテーブル(SWW*)への広範な読み取りアクセスが必要です。
クエリの例 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. 利用を始める準備はできていますか?
このテンプレートを使ってデータを準備し、決算・レポーティングの仕訳プロセスに関する重要なインサイトを見つけましょう。今日からプロセスエクセレンスへの取り組みを始められます。
決算・レポーティングの仕訳を効率化
プロセスを改善し、決算・レポーティングの仕訳にかかるサイクルタイムを30%短縮しましょう。
クレジットカード不要。数分で設定できます。