CSAP_MAT_BOM_MAINTAIN を使用してフィールド値を空白に更新する方法

:red_question_mark: 質問内容

こんにちは。

Function Module CSAP_MAT_BOM_MAINTAIN を使用して、部品表 (MBOM) のいくつかの値をクリアしようとしています。このため、フィールドを空欄にしています。具体的には、stko-alt_textstko-bom_textstpo-item_text1 です。

しかし、結果として私が設定した値は完全に無視され、更新されません。

一方、これらのフィールドに空でない値を設定すると、確実に更新され、すべて正常に動作します。

私の質問は、これらのフィールドをクリアするにはどうすればよいか、です。値を空白に変更したいことを示す特別な文字はありますか? どんなアドバイスでも感謝します。

ありがとうございます。

以下は私のコードの一部です。

* clear header data
CLEAR: ls_stko1-alt_text,
       ls_stko1-bom_text.

* clear position data
LOOP AT lt_stpo INTO ls_stpo.
  CLEAR ls_stpo-item_text1.
  MODIFY lt_stpo FROM ls_stpo.
ENDLOOP.

...

CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
  EXPORTING
    material    = ls_mast-matnr
    plant       = ls_mast-werks
    bom_usage   = ls_mast-stlan
    alternative = ls_mast-stlal
    change_no   = ls_mast-aennr
    i_stko      = ls_stko1
  TABLES
    t_stpo      = lt_stpo
  EXCEPTIONS
    error       = 1.

:white_check_mark: 解決策 / ベストアンサー

★★★ THIS_IS_THE_ACCEPTED_SOLUTION ★★★

CSAP_MAT_BOM_MAINTAIN でフィールドをクリアするには、単に値を空白にするのではなく、削除フラグを設定する必要があります。

具体的には、以下のように対応する構造体の updkz フィールドに 'D' (Delete) を設定します。

  • ヘッダデータ (stko): i_stko-updkz = 'D' を設定します。
  • 明細データ (stpo): 各明細行の updkz フィールドに 'D' を設定します。

この updkz フラグは、Function Module に対して「このレコードを変更する」という指示を与えます。フィールドを空白に CLEAR するだけでは、Function Module は「このレコードを更新する必要がある」と認識しません。updkz = 'D' を設定することで、明示的に「このレコードの内容(フィールド値)を更新せよ」と伝え、その結果、渡された空白の値で上書きが行われるのです。

コード修正例:

* ヘッダデータの更新フラグを設定し、フィールドをクリア
ls_stko1-updkz = 'D'. " この行を追加
CLEAR: ls_stko1-alt_text,
       ls_stko1-bom_text.

* 明細データの更新フラグを設定し、フィールドをクリア
LOOP AT lt_stpo INTO ls_stpo.
  ls_stpo-updkz = 'D'. " この行を追加
  CLEAR ls_stpo-item_text1.
  MODIFY lt_stpo FROM ls_stpo.
ENDLOOP.

この変更により、Function Module は渡された構造体を「更新対象」として認識し、alt_textbom_textitem_text1 の各フィールドを空白に更新するようになります。


:globe_with_meridians: Source: Original Link | Translation: AI (DeepSeek V3)
(Original content rights reserved by the author)