私は今日の問題に直面しています:どのようにクストと非クストフィールドでマラテーブルを更新するには?MARAテーブルを更新する最適なソリューションは何ですか?
私はいくつかの解決策を見つけましたが、何が最善の解決策であるかを知りたいと思いますか?
私はHCMモジュールから来ました。このモジュールには、変更履歴があります。だから可能性があれば、ログの変更でmaraテーブルを更新したいと思います。
コンテキスト:
- 新しい値がavailables値にすでにある場合は、テーブルから1つのMARAエントリー(OK)
- 編集フィールド(OK)の各フィールドの
- チェックを選択します
- 更新テーブル
ロジック:
DATA:
lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara.
lv_matnr = '000000000024856';
* Seelct data
"" matnr from CONVERSION_EXIT_MATN1_INPUT
SELECT SINGLE * INTO ls_mara FROM mara WHERE matnr = lv_matnr.
* Modification
ls_mara-vlumn = '999.9'.
"ls_mara-z* = '...'.
* Checks : volumn is numeric, ...
" [...]
* Update
" [...]
私はマラについての情報しか持っていません。関連するテーブルに関するデータはありません。
ソリューション1からMATERIAL_MAINTAIN_DARK
利用機能モジュールMATERIAL_MAINTAIN_DARK
。
CALL FUNCTION 'MATERIAL_MAINTAIN_DARK'
EXPORTING
kz_activ_cad = blank
flag_muss_pruefen = fest_x
sperrmodus = fest_e
max_errors = 0
p_kz_no_warn = fest_x " 'N' ?
kz_prf = blank " 's' ?
kz_verw = fest_x
kz_aend = fest_x
kz_dispo = fest_x
kz_test = blank
kz_mdip = blank
kz_mprp = blank
kz_ale = blank
kz_actv = blank
TABLES
AMARA_UEB = TMARA_UEB
AMERRDAT = lt_amerrdat
EXCEPTIONS
OTHERS = 7.
" Loop lt_amerrdat.
" CALL FUNCTION 'RPY_MESSAGE_COMPOSE' [...]
" WRITE:/ lv_errmsg.
" ROLLBACK WORK.
" or
" CALL FUNCTION 'DB_COMMIT'.
(私はコードhttps://archive.sap.com/discussions/thread/169786のこのロジックを使用)
問題:私は成功したコードを実行...しかし、今、私はいくつかの機能エラーをキャッチ。このFMの機能を正しく理解していれば、変更はT_CODE(MM01/02/03)を通じて実行されます。 しかし、各行の最初のT_CODEは何だったのかわかりません。使用されているT_CODEに応じて機能的な問題(記事カテゴリが正しくないなど)があります。
どうすればこれらの小切手をスキップできますか?または、最初のT_CODEを知っていますか?
ソリューション2からBAPI_MATERIAL_SAVEDATA
利用機能モジュールBAPI_MATERIAL_SAVEDATA
。 このFMは情報について
、(EXTENSION(X)を介して)+クスト標準フィールドとMARAテーブルを更新できるように私BAPI_TE_MARA
& BAPI_TE_MARAX
は次のようになります。
- MATERIAL(MATNR、CHAR、18) を
- .APPEND(ZBAPI_TE_MARAX)
- NOCHANGE(BAPIUPDATE、CHAR、1)
私は各Zを追加する必要が推測*このFMを使用する前に、そのフィールドは? また、テーブルのフィールドを更新するソリューションが見つかりませんでした。私がFMをチェックしている場合、いくつかのオブジェクトがありますが、列の名前は同じではありません。 このFMのフィールドとMARAテーブルのフィールドの間のマッピングをどのように見つけることができますか? 3
が、私は私のコードの整合性に私のチェックを行い持っ
ソリューションは、私は、単純なINSERT/UPDATE(MODIFY)を使用することができますね? これは最も簡単な解決方法です。すべての推奨事項、チュートリアルやアドバイスによって
CONCATENATE sy-mandt lv_matnr INTO lv_mara_key.
" Lock object
CALL FUNCTION 'ENQUEUE_E_TABLE'
EXPORTING
MODE_RSTABLE = 'E'
tabname = 'MARA'
varkey = lv_mara_key
EXCEPTIONS
foreign_lock = 1 system_failure = 2 OTHERS = 3.
ls_mara-ernam = sy-uname.
" ...
" std & custo
MODIFY mara FROM ls_mara.
" Unlock object
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
MODE_RSTABLE = 'E'
tabname = 'MARA'
varkey = lv_mara_key
EXCEPTIONS
foreign_lock = 1 system_failure = 2 OTHERS = 3.
興味を持っている場合:)
私はソリューション2ソリューション3のために行くだろう はお勧めしません。 – Christian
こんにちは。ありがとう。実際、他のテーブルは関与しません。私はMARAテーブル以外の情報は持っていません。方法:マラデータの大量アップロード。もう一方は、別のプログラムまたは手動プロセスが使用されます。私はソル2に関する良い文書は見つけられませんでしたか? –
解決策2は3つの中で最高です。 BAPIはSAPの公式なインターフェイスなので、内部機能モジュールが変更される可能性がありますが、更新またはアップグレード後も変更されない信頼性の高い接続が可能です。 BAPIの項目名は異なりますが、汎用モジュール宣言を見ると、それらが同じデータタイプを使用していることがわかります。ほとんどの場合、すでに内部フィールド名をBAPI fieldnameにマップするだけで十分です。通常、BAPIは標準英語のフィールド名を使用しますが、テーブルでは5〜6文字のフィールド名を使用することがよくあります。 –