SAP技術者のサンプルコード置き場

ABAPの動作確認をしたコードと簡単な説明を置いておきます。

【ABAP】VL10*系の一括処理ログ情報取得後、メッセージテキストを作成する一覧結果

こんにちは。 受注伝票の一覧アドオンに、出荷伝票のバッチ登録結果を表示したい、という要望があり、 サンプルコードを作ってみました。まあそれだけだと面白くもなんともないので、

  • OO ABAPライクに(インスタンスを使っているわけでもないのですが(笑))
  • メッセージの各値を渡すとメッセージテキストを返すメソッド(cl_sat_t100_message_svc=>get_text)を使用

ということをやってみました。

本当は、SELECT文の抽出の際にメソッドを呼び出しメッセージテキストも取得して LOOPレスにしたかったのですが、今の自分の知識ではできませんでした。 FIELDS句にメソッドのRETURNINGパラメータを持たせることはできそうなのですが、 引き渡しパラメータとしてテーブル項目(T2~MSGIDなど)を設定しようとするとエラーが出てしまいました。 ラッパメソッドを作って間接的に呼び出せば…?と試したりもしましたが、自分の知識不足なのか、うまくいきませんでした。

テストコードなので命名方法がバラバラなのはご容赦願います(笑)

CLASS test DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF typ_data,
             sammg  TYPE vbsk-sammg,
             smart  TYPE vbsk-smart,
             ernam  TYPE vbsk-ernam,
             erdat  TYPE vbsk-erdat,
             uzeit  TYPE vbsk-uzeit,
             vbnum  TYPE vbsk-vbnum,
             ernum  TYPE vbsk-ernum,
             vstel  TYPE vbsk-vstel,
             vtext  TYPE vbsk-vtext,
             vbeln  TYPE vbfs-vbeln,
             posnr  TYPE vbfs-posnr,
             etenr  TYPE vbfs-etenr,
             zaehl  TYPE vbfs-zaehl,
             msgid  TYPE vbfs-msgid,
             msgno  TYPE vbfs-msgno,
             msgty  TYPE vbfs-msgty,
             msgv1  TYPE vbfs-msgv1,
             msgv2  TYPE vbfs-msgv2,
             msgv3  TYPE vbfs-msgv3,
             msgv4  TYPE vbfs-msgv4,
             errmsg TYPE string,
           END OF typ_data,
           ttyp_data TYPE TABLE OF typ_data.
    CLASS-DATA: itab_data TYPE ttyp_data,    "静的データ定義
                w_msg TYPE symsg.

    CLASS-METHODS:  "Static Methodの定義
      main,
      add_msg CHANGING  table_data TYPE STANDARD TABLE,
      disp_data IMPORTING results TYPE STANDARD TABLE.

ENDCLASS.

CLASS test IMPLEMENTATION.
  METHOD main.
    SELECT
      FROM vbsk AS t1
      INNER JOIN vbfs AS t2
      ON t1~sammg = t2~sammg
      FIELDS
        t1~sammg,
        t1~smart,
        t1~ernam,
        t1~erdat,
        t1~uzeit,
        t1~vbnum,
        t1~ernum,
        t1~vstel,
        t1~vtext,
        t2~vbeln,
        t2~posnr,
        t2~etenr,
        t2~zaehl,
        t2~msgid,
        t2~msgno,
        t2~msgty,
        t2~msgv1,
        t2~msgv2,
        t2~msgv3,
        t2~msgv4,
        @space AS errmsg
      WHERE t1~smart = 'L'
      ORDER BY t1~smart, erdat, uzeit
      INTO TABLE @itab_data.

*   メッセージテキストを付与
    add_msg( CHANGING table_data = itab_data ).

*   Static Methodを同クラスから呼び出し
*    disp_data( results = itab_data ).
    disp_data( itab_data ). "必須のIMPORTパラメータなのでパラメータ名省略可

  ENDMETHOD.

* メッセージテキストをテーブルの各データに追加
  METHOD add_msg.
    FIELD-SYMBOLS <line> TYPE typ_data. "インライン定義すると項目がないとエラー
    LOOP AT table_data ASSIGNING <line>.
      w_msg-msgty = <line>-msgty.
      w_msg-msgid = <line>-msgid.
      w_msg-msgno = <line>-msgno.
      w_msg-msgv1 = <line>-msgv1.
      w_msg-msgv2 = <line>-msgv2.
      w_msg-msgv3 = <line>-msgv3.
      w_msg-msgv4 = <line>-msgv4.
      <line>-errmsg = cl_sat_t100_message_svc=>get_text( w_msg ).
    ENDLOOP.

  ENDMETHOD.

* 結果出力
  METHOD disp_data.
    cl_demo_output=>display( results ).
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  test=>main( ).   

f:id:free_croud:20201010111721p:plain
結果ショット1

f:id:free_croud:20201010111804p:plain
結果ショット2