2016-10-31 47 views
2

私は今日の問題に直面しています:どのようにクストと非クストフィールドでマラテーブルを更新するには?MARAテーブルを更新する最適なソリューションは何ですか?

私はいくつかの解決策を見つけましたが、何が最善の解決策であるかを知りたいと思いますか?

私はHCMモジュールから来ました。このモジュールには、変更履歴があります。だから可能性があれば、ログの変更でmaraテーブルを更新したいと思います。

コンテキスト:

  1. 新しい値がavailables値にすでにある場合は、テーブルから1つのMARAエントリー(OK)
  2. 編集フィールド(OK)の各フィールドの
  3. チェックを選択します
  4. 更新テーブル

ロジック:

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. 

興味を持っている場合:)

+1

私はソリューション2ソリューション3のために行くだろう はお勧めしません。 – Christian

+0

こんにちは。ありがとう。実際、他のテーブルは関与しません。私はMARAテーブル以外の情報は持っていません。方法:マラデータの大量アップロード。もう一方は、別のプログラムまたは手動プロセスが使用されます。私はソル2に関する良い文書は見つけられませんでしたか? –

+3

解決策2は3つの中で最高です。 BAPIはSAPの公式なインターフェイスなので、内部機能モジュールが変更される可能性がありますが、更新またはアップグレード後も変更されない信頼性の高い接続が可能です。 BAPIの項目名は異なりますが、汎用モジュール宣言を見ると、それらが同じデータタイプを使用していることがわかります。ほとんどの場合、すでに内部フィールド名をBAPI fieldnameにマップするだけで十分です。通常、BAPIは標準英語のフィールド名を使用しますが、テーブルでは5〜6文字のフィールド名を使用することがよくあります。 –

答えて

0

最後にこれが選択されたソリューションです。拡張子はBAPI_MATERIAL_SAVEDATAです。あなたは他の関連するテーブルがあまりにも更新されないことを知っている限り、私はあなたがそれを使用したい場合はあなたを助けるために、コードをコメント:)

FORM update_mara 
    USING 
    us_result TYPE mara. "Input entry of mara with masterdata to update in the system 

    DATA : ls_mara   TYPE bapi_te_mara, 
      ls_head   TYPE bapimathead, 
      lt_extensionin TYPE TABLE OF bapiparex, 
      ls_extensionin TYPE bapiparex, 
      lt_extensioninx TYPE TABLE OF bapiparexx, 
      ls_extensioninx TYPE bapiparexx, 
      ls_return   TYPE bapiret2, 
      lv_x    TYPE char41, 
      lv_mara   TYPE string. "Container for all data of ls_mara 

    " MASTERDATA PART 
    MOVE-CORRESPONDING us_result TO ls_mara. 
    ls_mara-material = ls_head-material = us_result-matnr. 
    "At least the mendatory key field: 'material' 

    " DATA PART 
    " Use extension BAPI_TE_MARA 
    ls_extensionin-structure = 'BAPI_TE_MARA'. 
    lv_mara = ls_mara. 
    " Fill data into the extension 
    ls_extensionin+30(960) = lv_mara. 
    APPEND ls_extensionin TO lt_extensionin. 

    " FLAG PART 
    CLEAR lv_x. 
    DO 41 TIMES. "Don't forget to change 'lv_x TYPE char41' if needed 
    CONCATENATE lv_x 'X' INTO lv_x. 
    "Add an 'X' where you want to activate the update 
    "Here, it's for all fields 
    ENDDO. " End of the do loop for all fields of the mara 

    " Use extension BAPI_TE_MARAX 
    ls_extensioninx-structure = 'BAPI_TE_MARAX'. 
    ls_extensioninx-valuepart1(18) = us_result-matnr. 
    ls_extensioninx-valuepart1+19 = lv_x. 
    " The first part (18) of the extensioninx is the matnr and the next ones some 'X' flags to activate the update or not. 
    APPEND ls_extensioninx TO lt_extensioninx. 

    " PROCESS PART 
    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' 
    EXPORTING 
     headdata  = ls_head 
    IMPORTING 
     return  = ls_return 
    TABLES 
     extensionin = lt_extensionin 
     extensioninx = lt_extensioninx 
    . 

    IF ls_return-type = 'E'. 
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 
    ELSE. 
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 
     EXPORTING 
     wait = 'X'. 
    ENDIF. " End if of check of BAPI result 

ENDFORM.     " UPDATE_MARA 
1

使用ソリューション1、しかしこれらのカスタムフィールドは、あらかじめグループに割り当てるべきです!これは、パスでカスタマイズで行う必要があります:

ロジスティック一般 - >マテリアルマスター - >フィールドセレクション>何のグループがまだ存在しない場合は、新しいグループを作成する必要があります

フィールドの選択グループにフィールドを割り当てます。フィールドは/など、非アクティブ/アクティブ有効/無効になりますと、このグループは決定 コードは次のようになります。

CALL FUNCTION 'MATERIAL_MAINTAIN_DARK' 
EXPORTING 
    sperrmodus = ' ' 
    kz_prf = 'W' 
    max_errors = ' ' 
    p_kz_no_warn = 'X' 
    kz_verw = 'X' 
    kz_aend = 'X' 
    kz_dispo = 'X' 
    kz_test = ' ' 
    flag_muss_pruefen = ' ' 
    call_mode = 'ACT' 
IMPORTING 
    matnr_last = w_matnr_last 
    number_errors_transaction = w_nb_errors 
TABLES 
    amara_ueb = t_amara_ueb 
    amarm_ueb = t_amarm_ueb 
EXCEPTIONS 
    kstatus_empty = 1 
    tkstatus_empty = 2 
    t130m_error = 3 
    internal_error = 4 
    too_many_errors = 5 
    update_error = 6 
OTHERS = 7. 

IF sy-subrc <> 0. 
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO. 
ELSE. 
    COMMIT WORK. 
ENDIF. 
4

ソリューション2.期間。詳細は、@chrisianと@ dirk-trilsbeekの素晴らしいコメントを参照してください。

フィールドマッピングについてのご質問にお答えします。ユーザーフレンドリーな名前は、SAPの外部からのBAPIを使用している人にとっては優れていますが、SAP内部で認識されているフィールドにマッピングするのが難しくなります。幸運なことに、これらのケースではほとんどの場合、同じデータ要素をSAPが使用していました。それ以外の場合、異なるBAPIには、BAPI項目からデータベース項目に変換する変換機能モジュールが用意されていることがあります。材料BAPIのために、あなたがインスタンスのMARA_UEBERGEBENルーチンはFM MAP2I_BAPI_MARA_TO_MARA_UEBを呼び出し、このFMがあることに注意してください<TABLE>はMARA、MARCなどであるサブルーチン<TABLE> _UEBERGEBEN(これは<TABLE> _TRANSFERに変換)を確認することができます言及しますBAPI構造からMARAへの翻訳、例えばNET_WEIGHTはNTGEWにマップされます。

0

両方の溶液1と2が良好です。 FMの1つで標準フィールドを変更した後で、ソリューション3で行ったように、あなたは直接カストフィールドを記入することができます。

関連する問題