【SAP】IDocについて整理してみた

## 1. 目的
IDocのI/Fを構築する場合、色々な設定が必要になります。送信側、受信側、送るもの、標準の仕組みの有無によっても設定内容が変わってきます。
どういう場合にどういう設定をしたらよいのか、また、それらの背景にある仕組みがどうなっているか気になったので、まとめました。

## 2. 用語
この記事に出てくる用語について説明します。

| 用語       |説明 |
|:-----------------|:------------------|
| ALE             |Application Link Enablementの略。SAPとSAP、もしくはSAPと非SAPシステムの間でビジネスデータをやり取りするための仕組み|
| IDoc             |Intermediate Documentの略。ALEで連携されるデータを格納する構造|

筆者はIDocの送受信をコントロールしているのがALEというレイヤだという理解です。

#### 参考
[Guru99: ALE, EDI & IDocs Introducion & Difference: SAP Tutorial](https://www.guru99.com/what-is-edi-ale-and-idoc.html)

## 3. 基本の設定
どんなIDocにも共通するのは、以下の2つの点です。送信側、受信側双方で設定が必要です。

### 3-1. データの構造に関する取り決め
やりとりするデータ構造を送信側、受信側であらかじめ定義する必要があります。このデータ構造のことをメッセージタイプ、IDocタイプ（または基本タイプ）といいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4a684dc6-fc75-de7d-aed8-6f06e69fbccd.png)

メッセージタイプはどのようなデータを送るのかを表す論理的な名前で、具体的な構造定義はIDocタイプでおこないます。一つのメッセージタイプに複数のIDocタイプをひもづけることができます。IDocタイプはメッセージタイプの末尾に01, 02などの連番（バージョン）をつけた形になっており、バージョンによって構造が微妙に変わります。どのバージョンでやりとりするかは、送受信側で合意する必要があります。

#### IDocタイプの構成
IDocタイプは複数のセグメントで構成されています。セグメント1つ1つが構造になっています。セグメントは階層にすることもできます。また、同じセグメントが複数登場する場合もあります。（たとえば、発注明細のように）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3139e1b8-e134-1054-0796-a1d7543b243c.png)


#### 関連するトランザクション
| Tr-cd       |説明 |
|:-----------------|:------------------|
| WE31             |セグメントの定義 |
| WE30             |IDocタイプの定義 |
| WE81             |メッセージタイプの定義 |
| WE82             |メッセージタイプとIDocタイプのひもづけ |

### 3-2. 連携先に対する取り決め
IDocをどこに送るのか、あるいはどこからもらうのかを定義するために、パートナープロファイルの設定が必要です。パートナープロファイルを設定するための前提として、論理システム、RFC宛先、ポートの設定が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3e0bc938-f2c2-4963-66b2-fb9c6718c921.png)

#### 関連するトランザクション
| Tr-cd       |説明 |
|:-----------------|:------------------|
| BD54             |論理システムの定義 |
| SM59             |RFC宛先の定義 |
| WE21             |ポートの定義 |
| WE20             |パートナープロファイルの定義 |

#### 設定手順の参考
[SAP Technical.COM: Step-by-step guide to ALE and IDOCs](https://web.archive.org/web/20161128185214/http://saptechnical.com/Tutorials/ALE/Guide/Index.htm)
[Application Link Enabling (ALE)](https://community.sap.com/t5/enterprise-resource-planning-blogs-by-members/application-link-enabling-ale/ba-p/13653098)

## 4. IDoc受信の設定
### 4-1. IDoc受信の流れ
IDoc送信をキックする方法は色々ありますが（後述）、受信の流れは基本的に以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9886d955-5569-47f6-158e-993586376fe7.png)


1. ALEレイヤがカスタマイズの設定を読み込んで、どの汎用モジュールを呼ぶか決定する
2. 汎用モジュールが呼ばれ、IDocのデータが渡される
3. 汎用モジュールがDB更新などの処理を行い、結果（成功/エラー）を返す
4. エラーの場合、ALEレイヤがIDocに割り当てられたワークフローのイベントを起動する

#### 参考
[SAP Documentation: IDoc Interface/ALE>Implementation of Inbound Processing](https://help.sap.com/doc/7aca891b728810148a4b1a83b0e91070/1610%20002/en-US/frameset.htm?4a66f15fcbff260be10000000a42189b.html)

### 4-2. IDoc受信の設定
IDocデータを受信するには、以下の設定が必要です。
1. 受信用汎用モジュールを登録 (Tr-cd: SE37)
2. 受信用汎用モジュールをメッセージタイプ、IDocタイプの組に割り当てる (Tr-cd: WE57)
3. 受信用汎用モジュールの属性を設定 (Tr-cd: BD51)
4. 受信用のプロセスコードを定義 (Tr-cd: WE42) 
5. パートナープロファイルの設定 (Tr-cd: WE20) 

受信用の汎用モジュールは決まったインターフェース（パラメータ）を持つ必要があります。新規に作る場合は、標準の汎用モジュールを参照して作成します。

各設定の関係は以下のようになります。行きつくところはパートナープロファイルで、パートナープロファイルの受信側の1行には、1つのメッセージタイプとプロセスコードの組み合わせを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c1ac4222-a705-0bf3-fca0-979b4784d833.png)


受信側のパートナープロファイル設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1e259859-3932-1be8-74c1-b76db6e599ea.png)

#### 設定手順の参考
[SAP Technical.COM: Step-by-step guide to ALE and IDOCs](https://web.archive.org/web/20161128185214/http://saptechnical.com/Tutorials/ALE/Guide/Page6.htm)

## 5. 目的により変わる、IDoc送信のキックの仕方
IDocに関して一番悩ましい（と私が思っている）のが、送信をどうやってキックするかということです。SAP標準の仕組みが用意されている場合もあるので、まずは標準で何ができるのか調べることが必要です。

## 5-1. 標準編
### 5-1-1. マスタデータ
品目マスタ、得意先、仕入先などのマスタデータは標準で送信の仕組みが用意されています。送信可能なマスタデータは以下を参考にしてください。
[Distributable Master Data Objects](https://help.sap.com/viewer/e443f164b005443b9d5b0af01d1f1dba/6.00.31/en-US/4abb4a6d479926c4e10000000a42189b.html)
※上記は一例で、対象の製品、バージョンによって変わるので、自社の環境に合わせたドキュメントをご参照ください。

#### マスタデータ送信の仕組み
マスタデータの送信には**変更ポインタ**が使われます。変更ポインタとは、マスタデータが変更されたときに書き込まれ、IDoc送信対象であることを表すレコードです。（テーブル：BDCP2）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5584c911-8a5d-f5f0-c2bb-ea03a2578074.png)
[SAP Library: Distributing Master Data with the SMD Tool](https://help.sap.com/saphelp_470/helpdata/en/0b/2a61ca507d11d18ee90000e8366fc2/frameset.htm) より引用

マスタデータを変更すると変更文書(CDHDR, CDPOS)が登録されます。その際、Shared Master Data (SMD) ツール（図の緑の部分）の中で変更ポインタを生成するかどうかが判断されます。
変更ポインタが登録された後で、バックグラウンドジョブまたはマニュアルでIDocを生成し、送信します。

#### マスタデータ送信のための設定
マスタデータを送信するためには、以下の設定が必要です。
1. 変更ポインタを有効化する（グローバル）(Tr-cd: BD61)
2. 変更ポインタを有効化する（メッセージタイプごと）(Tr-cd: BD50)
3. 変更ポインタを生成する対象の項目を定義する（必要に応じて）(Tr-cd: BD52)
4. 分散モデルを登録する (Tr-cd: BD64)

3.は、連携先のシステムに関係する項目が変更されたときだけ変更ポインタを登録したい場合に使います。
プログラムRBDMIDOCを実行すると、変更ポインタを拾ってIDocが登録されます。

##### 分散モデルとは
分散モデルとは、Distribution modelの訳です。複数システムにデータを配信するための設定を行うものです。
送信システム、受信システム、どのメッセージタイプをやり取りするのか、フィルタの設定（必要に応じて）などを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/a896bb51-ed68-ac92-fa64-ad6988af3122.png)

うまくいけばここからパートナープロファイル、ポートを自動で生成することができます。自動生成されなければ（原因は色々あります）、マニュアルで登録しても問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ad18ef7e-8240-838c-790f-77da7b041021.png)

##### 設定手順の参考
[Transferring Material Master from One Client to Another Client in same SAP System By using ALE IDOC](http://freesapabap.blogspot.com/2013/10/transferring-material-master-from-one.html)
[Generate iDocs Using Change Pointers in SAP](https://sapintegrationhub.com/abap/ale-idoc/how-to-generate-idocs-using-change-pointers-in-sap/)

### 5-1. トランザクションデータ
受注、発注、出荷などのトランザクションデータを送信する方法として代表的なのは、出力管理の仕組みを使うことです。

#### 出力管理とは
伝票が登録、変更されたときに、印刷、メール、IDocなどの出力を生成する仕組みのことです。出力レコードを生成するためには、出力のカスタマイズ、および出力マスタが必要です。
出力管理の設定については、以下のページが詳しいので参考にしてください。
[SAP Technical: Configuring Message Control and understanding how Message Control works](http://saptechnical.com/Tutorials/ALE/MessageControl/Index.htm)

#### 出力管理でIDocを送信するまでの流れ
以下の流れで、出力が生成された後にIDocが送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/cf24a1ba-9aed-5fab-2e5a-d0f81f1fb30c.png)

1. 伝票が登録されると、出力マスタの設定に従って出力レコードが登録される
2. 出力ルーチンの中で、出力レコードの取引先を条件にパートナープロファイルを読み込む。パートナープロファイルに設定されたプロセスコードから、IDoc出力（マッピング）用の汎用モジュールが決定される
3. IDoc出力用汎用モジュールがアプリケーションデータをIDocの構造に設定して返す
4. 出力用ルーチンからIDocを送信する

#### 必要な設定
出力管理の仕組みを使ってIDocを送信するには、以下の設定が必要です。
標準のIDoc出力用汎用モジュールが用意されている場合は以下の設定だけでOKです。
1. 出力タイプの設定　（各アプリケーションの出力のカスタマイズから）
2. 出力タイプを出力決定表に割り当て　（同上）
3. パートナープロファイルの設定 (Tr-cd: WE20)

出力用の標準の汎用モジュールが用意されておらず、自分で作る場合は以下の設定も必要です。

- 汎用モジュールを登録 (Tr-cd: SE37)
- 送信用のプロセスコードを定義 (Tr-cd: WE41)

#### 設定例
以下はシップメント伝票をIDocで送信するための設定の例です。

出力タイプへの出力ルーチン割り当て
プログラム：RSNASTED、ルーチン：EDI_PROCESSINGを使用します。これは他の種類の伝票でも共通です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/69724e3c-4a53-b851-cb34-cd1fa8f68724.png)
パートナープロファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1667457f-11cd-b1b9-0f00-7d8a3bf3d0d9.png)
送信用のプロセスコード割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e81b8387-59b5-29e5-b08e-becbe859b03a.png)
プロセスコードに割り当てられた汎用モジュール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ab413fde-0f90-580b-5cd0-b0b9760eb7a3.png)

#### その他の方法
出力管理以外の方法としては、ワークフロー、BAdI、アドオンプログラムなどの中でIDocを送信する方法もあります。要するに、IDocの構造にデータがセットされていて、パートナープロファイルの設定があれば、トリガは何であれ送ることができるということです。

その際は、MASTER_IDOC_DISTRIBUTE というジェネリックな汎用モジュールを使うことができます。使用例は[こちら](http://saptechnical.com/Tutorials/ALE/Guide/Page5.htm)をご参照ください。
この汎用モジュールを使う場合は、IDocのコントロールレコード（パートナー、メッセージタイプ、IDocタイプ等）や、セグメントを呼び出し側で設定する必要があります。
あるいは、ビジネスオブジェクトにひもづくBAPIを使って送信することもできます。この場合、IDoc構造へのマッピングと送信はBAPIが行ってくれます。BAPIを使う方法については以下の記事をご参照ください。
[Generated ALE-IDOC Interfaces](https://blogs.sap.com/2015/10/15/generated-ale-idoc-interfaces/)


## 6. この記事でカバーできていないトピック
ここでは書けていませんが、IDocに関して以下のトピックも気になっています。

- 標準BAPIを使ったIDoc送信
- [IDocの拡張](https://blogs.sap.com/2022/11/08/creation-of-idoc-extension-for-basic-type-invoic01-step-by-step-and-real-business-scenario/)
- 標準の送受信汎用モジュールに対する拡張