使用する
BAPI Change()は、販売注文などのSAPビジネスオブジェクトタイプの既存のインスタンスを変更します。
BAPI Change()はインスタンスメソッドですが、BAPI ChangeMultiple()はクラスメソッド(インスタンスに依存しない)です。
特徴
BAPIインターフェース
パラメータのインポート
インポートパラメータを定義するときは、次の点に注意する必要があります。
-
Change()BAPIはインスタンスメソッドであるため、対応するビジネスオブジェクトタイプのキー項目は、汎用モジュールのインポートパラメータとして登録する必要があります。これらのパラメータの名前は、BORのオブジェクトキーの名前と同じである必要があり、同じデータ要素を持っている必要があります。
-
BAPIには、テスト実行を実行できるようにするTestRunパラメーターも必要です。このパラメーターに値「X」が含まれている場合、BAPIは正常に実行されますが、結果は更新タスクに書き込まれません。このようにして、BAPI BapiService.TransactionCommitの実行後、すべての結果(たとえば、アプリケーションログなど)を評価できますが、BAPIはデータベースを変更していません。
-
変更を必要とせずに顧客がBAPIのインポートパラメータを拡張できるようにする場合は、パラメータExtensionInを作成する必要があります。Change() BAPIでカスタマ拡張コンセプトを実装する方法に関する拡張パラメータおよび推奨事項については、 BAPIに対するカスタマ拡張を参照してください。
-
Change by Flaggingの概念に従って、 Change()メソッドを実装します。ここでは、変更された値を含むフィールドを持つすべてのパラメーターに対して変更パラメーターを作成する必要があります。これらの変更パラメータは、変更された値を含むパラメータフィールドと変更されていないパラメータフィールドを区別するのに役立ちます。
パラメータのエクスポート
エクスポートパラメータを定義するときは、次の点に注意する必要があります。
-
得意先が変更を必要とせずにBAPIのエクスポートパラメータを拡張できるようにする場合は、パラメータExtensionOutを作成する必要があります。Change() BAPIでカスタマ拡張コンセプトを実装する方法に関する拡張パラメータおよび推奨事項については、 BAPIに対するカスタマ拡張を参照してください。
-
メソッドコールバックからのメッセージを呼び出し元のプログラムに報告するには、エクスポートパラメータReturnを作成する必要があります。同期的または非同期的に呼び出されるChange() BAPIの結果が広範囲に監視されるようにするには、Returnパラメーターを入力するための次の規則に従う必要があります。
-
Change() BAPIが正常に実行される場合は、次の標準化されたT100メッセージをReturnパラメーターで渡す必要があります。
次の点に注意する必要があります。
-
フィールドMESSAGE_V1には、 SalesOrderなどのビジネスオブジェクトタイプの外部名が含まれています。
-
後続の呼び出しで変更されるオブジェクトにアクセスできるキーは、フィールドMESSAGE_V2に返されます。これは、外部番号割当を使用する場合は外部キー、内部番号割当を使用する場合は内部キーです。オブジェクトに複数のキーフィールドがある場合、これらのキーフィールドの値をMESSAGE_V2で連結する必要があります。連結では、BORでキーフィールドが定義されている順序を順守する必要があります。さらに、各キーフィールドには最大長を使用する必要があります。これには、パディングの使用が必要になる場合があります。
-
Change() BAPIの実行中にエラーが発生した場合、アプリケーション固有のエラーメッセージに加えて、次の標準化されたT100メッセージをReturnパラメーターで渡す必要があります。
さまざまなフィールドの意味は、正常に実行された場合と同じです。
-
-
標準化されたメッセージに加えて、 Returnパラメーターにさらにメッセージを書き込むことができます。エラーが発生した場合、エラーを詳細に説明するメッセージが返されることが特に重要です。したがって、構造BAPIRET2のすべての項目を使用する必要があります。特に、 Parameter、 Row、およびFieldの各フィールドに入力する必要があります。
-
BAPIコーディング
Change()BAPIを実装するための可能な戦略
データベースの変更を引き起こすBAPI(たとえば、 Change()およびCreate() BAPI)では、変更されるパラメーターフィールド(変更関連フィールド)と変更されないままのパラメーターフィールドを区別できる必要があります。
初期値は有効な新しい値を表すこともあるため、初期値を使用することは解決策ではありません。また、ABAPプログラミング言語および他の開発プラットフォームでは、空のフィールドを示すために値”NULL”をデータ型に割り当てないでください。
したがって、変更関連フィールドは、ヘルプ構造を使用して識別する必要があります。これを行うには2つの方法があります。
-
変更された値を含むフィールドを識別するためのフィールドのフラグ付けこのアプローチでは、追加の「パラメーターの変更」にフラグを含めると、変更された値を含むパラメーターフィールドが識別されます。
-
追加の変更パラメータは、変更されたフィールド値を含むBAPIのすべてのパラメータに対して、同じ数のフィールドと同じフィールド名で作成する必要があります。
-
BAPIが呼び出されると、対応するパラメーターの対応するものに変更が含まれている追加の変更パラメーターのフィールドに、更新フラグをマークする必要があります。
変更されたフィールドを識別するために変更パラメーターを作成するときは、以下の規則に従ってください。
-
追加の変更パラメーターの名前は、接尾辞「X」が付いたパラメーター名で構成されます。たとえば、パラメーターの名前がEquiSalesの場合、追加の変更パラメーターの名前はEquiSalesXです。。
-
追加の変更パラメーターには、パラメーターとまったく同じ数のフィールドと同じフィールド名が含まれている必要があります。更新項目のデータエレメントとしてデータエレメントBAPIUPDATE(CHAR 1)を使用する必要があります。これには、次の値を指定できます。
-
パラメータがテーブルの場合、追加の変更パラメータもテーブルである必要があります。
-
-
フィールドを比較して、変更された値を含むフィールドを特定する
このアプローチでは、2つのパラメーターを比較します。1つは現在の有効なデータを含み、もう1つは新しい変更されたデータを含み、変更された値を含むフィールドを識別します。
Change() BAPIが呼び出されると、データベース内の現在のデータと新しい変更されたデータを対応するパラメーターに入力する必要があります。現在のデータセットは、たとえば、呼び出されたGetDetail() BAPIから転送できます。
次の比較を行うことができます。
-
現在のデータを最初にデータベースの内容と照合して、その間に変更されたかどうかを確認できます。このようにして、 GetDetail() BAPIによってデータが読み取られてからデータベースが更新されるまでの間に行われたデータベースの変更を識別できます。
-
両方のパラメーターのデータは、フィールドごとに比較できます。対応する2つの項目のデータが異なる場合は、関連する値を新しいデータとともにパラメータから転送する必要があります。
変更されたデータを含むフィールドを比較する場合は、次の点に注意してください。
-
呼び出し側プログラムは、 Change() BAPIのすべてのパラメーターフィールドにデータを提供できる必要があります。このため、 Change() BAPIのパラメータフィールドは、同じビジネスオブジェクトタイプのGetDetail() BAPIのフィールドと完全に同じである必要があります。
-
比較するパラメーターの名前は同じである必要がありますが、変更されたデータを含むパラメーターには、接尾辞「New」が付いている必要があります。
-
両方のパラメーターは、まったく同じフィールドと同じ構造を持っている必要があります。
-
設定のカスタマイズとの非互換性の回避
カスタマイジングで設定された特定の値が、BAPIインターフェースで異なって表示される可能性があります。これらの値は、 Change() BAPIで上書きできません。
カスタマイジング設定との非互換性を回避するには、次の方法でChange() BAPIを実装する必要があります。
-
BAPIはすべてのフィールドを転送し、それらをカスタマイジング設定と照合する必要があります。カスタマイジング設定が項目を書き込み禁止している場合、この項目のデータをBAPIインタフェースのデータで上書きすることはできません。
-
非互換性が発生するたびに、呼び出し側プログラムのReturnパラメーターでエラーメッセージを返す必要があります。
-
カスタマイジングによってデフォルト値が割り当てられ、したがって書き込み保護されているすべてのフィールドを文書化する必要があります。変更の例()BAPI