0

ABAP 更新ステートメントに関して問題があります。1 つの update table ステートメントで「作業のコミット」を使用していますが、正常に動作しない場合と動作しない場合があります。

ステートメントを確認してください:

UPDATE mara
SET
      zzmanu     =  wa-sales_data2-zzmanu
      zzmatnr_sf =  wa-sales_data2-zzmatnr_sf
WHERE  matnr = wa-basic_data1-matnr.

if sy-subrc eq 0.
commit work.
wait up to 2 seconds.
ENDIF.

上記のコミット作業が問題を引き起こしているのでしょうか、それともテーブルを更新していない理由は何ですか。この場合のおすすめを教えてください。

4

3 に答える 3

2

コミットを次のように変更します

COMMIT WORK AND WAIT. 
IF SY-SUBRC NE 0.
  WRITE: / 'Update error! Check SM13'.
ENDIF.

BAPI_TRANSACTION_COMMIT をチェックすると、まさに WAIT パラメータで呼び出されたときに行われることです。必要に応じて、その汎用モジュールを使用して、標準エラー メッセージを表示することもできます。

更新に失敗した場合は、SM13 で原因を確認してください。ほとんどの場合、ロックの問題ですが、他の理由もある可能性があります。

いずれにせよ、UPDATE の前にオブジェクトのロックを含めるようにロジックを拡張する必要があります。

于 2015-11-25T11:06:50.930 に答える
2

SY-SUBRC が '4' の場合は、テーブル MARA の品目が存在しないか、値がwa-basic_data1-matnr入力できないため、変換する必要があります。

テーブル 'MARA' の 'MATNR' の値が SAP で構成され、範囲を使用して標準トランザクション 'MM01' および 'MM41' の品目に番号が自動的に割り当てられる場合があります。この動作はカスタム プログラムには適用されません。この状況では、関数モジュール ' CONVERSION_EXIT_MATN1_INPUT ' および ' CONVERSION_EXIT_MATN1_OUTPUT 'を必ず使用してください。

データ型 'MATNR' は CHAR(18) で、値 (この場合) は左側にゼロで格納されますが、数値にはゼロが含まれていません。これは、SAP が値を出力用に内部的に変換するため、ユーザーにはそれらのゼロが表示されないためです。

たとえば、トランザクション 'SE16N' または 'MM03' の MARA-MATNR の値が '9999999' の場合、格納される実際の値は '000000000009999999' です。トランザクション 'SE11' で同じテーブルを確認すると、今度は生データが表示されます。次のコードは、上記をもう少しよく説明できます。

DATA: lv_matnr TYPE matnr,
      wa_mara TYPE mara.

lv_matnr = '1234567'. " -> Not ready for input
SELECT SINGLE * FROM mara INTO wa_mara WHERE matnr eq lv_matnr.
WRITE sy-subrc. " -> sy-subrc = 4. Not found

CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' " Format for input
  EXPORTING
    INPUT              = lv_matnr " The value is '1234567'
  IMPORTING
    OUTPUT             = lv_matnr " The value will be formatted to '000000000001234567'
  EXCEPTIONS
    LENGTH_ERROR       = 1
    OTHERS             = 2
          .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

SELECT SINGLE * FROM mara INTO wa_mara WHERE matnr eq lv_matnr.
WRITE / sy-subrc. " -> sy-subrc = 0. Found

あなたの場合、これを試してください。

CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
  EXPORTING
    INPUT              = wa-basic_data1-matnr 
  IMPORTING
    OUTPUT             = wa-basic_data1-matnr " Add zeroes at the left
  EXCEPTIONS
    LENGTH_ERROR       = 1
    OTHERS             = 2
          .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

UPDATE mara
SET
      zzmanu     =  wa-sales_data2-zzmanu
      zzmatnr_sf =  wa-sales_data2-zzmatnr_sf
WHERE  matnr = wa-basic_data1-matnr.

if sy-subrc eq 0.
commit work.
wait up to 2 seconds.
ENDIF.

それが役に立てば幸い

于 2015-11-26T13:25:02.050 に答える
1

材料番号については、SAP がいわゆる「アルファ変換」を使用していることを知っておく必要があります。

英数字のマテリアル番号は左にバインドされ、数字のマテリアル番号は先行ゼロで右にバインドされます。

更新に必要な形式の材料番号がない場合、これは問題になる可能性があります。

したがって、Ax1123 はデータベース 123 の AX1123 になり、データベースの 000000000000000123 になります。

SAP は、conversion_exit_alpha_input や conversion_exit_alpha_output などの関数モジュールを使用して、DB 値と UI 表示を切り替えます。

于 2015-12-11T05:01:10.143 に答える