質問内容
こんにちは。
Function Module CSAP_MAT_BOM_MAINTAIN を使用して、部品表 (MBOM) のいくつかの値をクリアしようとしています。このため、フィールドを空欄にしています。具体的には、stko-alt_text、stko-bom_text、stpo-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.
解決策 / ベストアンサー
★★★ 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_text、bom_text、item_text1 の各フィールドを空白に更新するようになります。
Source: Original Link | Translation: AI (DeepSeek V3)
(Original content rights reserved by the author)