AI生成(ABAPソースコード)

*----------------------------------------------------------------------*
*  Sample ABAP Report (for parsing / analysis exercises)               *
*  Encoding: UTF-8                                                     *
*----------------------------------------------------------------------*
REPORT zsample_parser_demo.

"--- Selection screen -------------------------------------------------
PARAMETERS: p_bukrs TYPE bukrs DEFAULT '1000'.
SELECT-OPTIONS: s_matnr FOR mara-matnr.

"--- Type definitions -------------------------------------------------
TYPES: BEGIN OF ty_result,
         bukrs      TYPE bukrs,
         matnr      TYPE matnr,
         mtart      TYPE mtart,
         matkl      TYPE matkl,
         maktx      TYPE maktx,
         created_on TYPE erdat,
       END OF ty_result.

TYPES: ty_t_result TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY.

"--- Data declarations ------------------------------------------------
DATA: gt_result TYPE ty_t_result,
      gs_result TYPE ty_result,
      gv_count  TYPE i,
      gv_msg    TYPE string.

CONSTANTS: c_true  TYPE abap_bool VALUE abap_true,
           c_false TYPE abap_bool VALUE abap_false.

"--- Main flow --------------------------------------------------------
START-OF-SELECTION.
  PERFORM initialize.
  PERFORM fetch_data USING p_bukrs CHANGING gt_result.
  PERFORM validate_data USING gt_result CHANGING gv_msg.
  IF gv_msg IS NOT INITIAL.
    MESSAGE gv_msg TYPE 'E'.
  ENDIF.
  PERFORM display_data USING gt_result.
  PERFORM finalize.

"--- Forms ------------------------------------------------------------
FORM initialize.
  gv_count = 0.
  gv_msg   = ``.
ENDFORM.

FORM fetch_data USING    iv_bukrs TYPE bukrs
                CHANGING ct_result TYPE ty_t_result.
  DATA: lt_mara TYPE STANDARD TABLE OF mara WITH EMPTY KEY,
        ls_mara TYPE mara,
        lv_lines TYPE i.

  " Select master data
  SELECT matnr mtart matkl erdat
    FROM mara
    INTO TABLE @lt_mara
    WHERE matnr IN @s_matnr.

  DESCRIBE TABLE lt_mara LINES lv_lines.
  IF lv_lines = 0.
    gv_msg = |No MARA rows found for selection.|.
    RETURN.
  ENDIF.

  LOOP AT lt_mara INTO ls_mara.
    CLEAR gs_result.
    gs_result-bukrs      = iv_bukrs.
    gs_result-matnr      = ls_mara-matnr.
    gs_result-mtart      = ls_mara-mtart.
    gs_result-matkl      = ls_mara-matkl.
    gs_result-created_on = ls_mara-erdat.

    " Fetch text (example of SELECT SINGLE)
    SELECT SINGLE maktx
      FROM makt
      INTO @gs_result-maktx
      WHERE matnr = @ls_mara-matnr
        AND spras = @sy-langu.

    APPEND gs_result TO ct_result.
    gv_count = gv_count + 1.
  ENDLOOP.
ENDFORM.

FORM validate_data USING    it_result TYPE ty_t_result
                   CHANGING cv_msg TYPE string.
  DATA lv_ok TYPE abap_bool VALUE abap_true.

  IF lines( it_result ) > 1000.
    lv_ok = abap_false.
    cv_msg = |Too many rows: { lines( it_result ) }.|.
  ENDIF.

  " Example: check for empty MATNR
  READ TABLE it_result INDEX 1 INTO gs_result.
  IF sy-subrc = 0 AND gs_result-matnr IS INITIAL.
    lv_ok = abap_false.
    cv_msg = |First row MATNR is initial.|.
ソース本体 トップレベル
%%{init: {'theme':'base','themeVariables':{ 'primaryColor':'white', 'primaryTextColor':'#000000', 'primaryBorderColor':'#000000', 'lineColor':'#808080', 'textColor':'#6A7FABCC', 'fontSize':'14px'}}}%% %%{ init: { 'flowchart': { 'curve': 'basis','wrap': true,'markdownAutoWrap': true,'wrappingWidth': 500 } } }%% graph TD; classDef default fill:#FFFFE0,stroke:#333,stroke-width:2px; classDef clrPattern1 fill:#FFFF00,stroke:#333,stroke-width:2px; classDef clrPattern2 fill:#F0E68C,stroke:#333,stroke-width:2px; classDef clrPattern3 fill:#ADD8E6,stroke:#333,stroke-width:2px; classDef clrPattern4 fill:#FFD700,stroke:#333,stroke-width:2px; classDef clrPattern5 fill:#FFC0CB,stroke:#333,stroke-width:2px; classDef clrPattern6 fill:#ADFF2F,stroke:#333,stroke-width:2px; classDef clrPattern7 fill:#D3D3D3,stroke:#333,stroke-width:2px; linkStyle default stroke:#808080,stroke-width:2px; %%データ設定 T([トップレベル開始]) 18(["33行目 メイン処理開始 'L33"]):::clrPattern7 19[["34行目 FORM呼出:initialize 'L34"]]:::clrPattern3 20[["35行目 FORM呼出:fetch_data ┗ 引数(USING):p_bukrs ┗ 変更(CHANGING):gt_result 'L35"]]:::clrPattern3 21[["36行目 FORM呼出:validate_data ┗ 引数(USING):gt_result ┗ 変更(CHANGING):gv_msg 'L36"]]:::clrPattern3 22{"37行目 gv_msg は初期状態でないか 'L37"}:::clrPattern1 24[/"38行目 MESSAGE gv_msg TYPE 'E' 'L38"/]:::clrPattern6 25(["39行目 そうでない場合 'L39"]):::clrPattern7 26(["39行目 条件文終了 'L39"]):::clrPattern7 27[["40行目 FORM呼出:display_data ┗ 引数(USING):gt_result 'L40"]]:::clrPattern3 28[["41行目 FORM呼出:finalize 'L41"]]:::clrPattern3 %%ルート設定 T-->18 18-->19 19-->20 20-->21 21-->22 22-->|条件文 真へ|24 22-->|条件文 偽へ|25 24-->26 25-->26 26-->27 27-->28
フォーム番号 1:initialize【初期化】
%%{init: {'theme':'base','themeVariables':{ 'primaryColor':'white', 'primaryTextColor':'#000000', 'primaryBorderColor':'#000000', 'lineColor':'#808080', 'textColor':'#6A7FABCC', 'fontSize':'14px'}}}%% %%{ init: { 'flowchart': { 'curve': 'basis','wrap': true,'markdownAutoWrap': true,'wrappingWidth': 500 } } }%% graph TD; classDef default fill:#FFFFE0,stroke:#333,stroke-width:2px; classDef clrPattern1 fill:#FFFF00,stroke:#333,stroke-width:2px; classDef clrPattern2 fill:#F0E68C,stroke:#333,stroke-width:2px; classDef clrPattern3 fill:#ADD8E6,stroke:#333,stroke-width:2px; classDef clrPattern4 fill:#FFD700,stroke:#333,stroke-width:2px; classDef clrPattern5 fill:#FFC0CB,stroke:#333,stroke-width:2px; classDef clrPattern6 fill:#ADFF2F,stroke:#333,stroke-width:2px; classDef clrPattern7 fill:#D3D3D3,stroke:#333,stroke-width:2px; linkStyle default stroke:#808080,stroke-width:2px; %%データ設定 29(["44行目 FORM開始:initialize. 'L44"]) 30["45行目 gv_count に 0 を代入する 'L45"] 31["46行目 gv_msg に `` を代入する 'L46"] 32(["47行目 FORM終了 'L47"]) %%ルート設定 29-->30 30-->31 31-->32
フォーム番号 2:fetch_data【マスタデータ取得処理】
%%{init: {'theme':'base','themeVariables':{ 'primaryColor':'white', 'primaryTextColor':'#000000', 'primaryBorderColor':'#000000', 'lineColor':'#808080', 'textColor':'#6A7FABCC', 'fontSize':'14px'}}}%% %%{ init: { 'flowchart': { 'curve': 'basis','wrap': true,'markdownAutoWrap': true,'wrappingWidth': 500 } } }%% graph TD; classDef default fill:#FFFFE0,stroke:#333,stroke-width:2px; classDef clrPattern1 fill:#FFFF00,stroke:#333,stroke-width:2px; classDef clrPattern2 fill:#F0E68C,stroke:#333,stroke-width:2px; classDef clrPattern3 fill:#ADD8E6,stroke:#333,stroke-width:2px; classDef clrPattern4 fill:#FFD700,stroke:#333,stroke-width:2px; classDef clrPattern5 fill:#FFC0CB,stroke:#333,stroke-width:2px; classDef clrPattern6 fill:#ADFF2F,stroke:#333,stroke-width:2px; classDef clrPattern7 fill:#D3D3D3,stroke:#333,stroke-width:2px; linkStyle default stroke:#808080,stroke-width:2px; %%データ設定 33(["49行目 FORM開始:fetch_data ┗ 引数: iv_bukrs TYPE bukrs CHANGING ct_result TYPE ty_t_result 'L49"]) 37["56行目 SELECT文: SELECT: SELECT matnr mtart matkl erdat FROM mara INTO TABLE @lt_mara WHERE matnr IN @s_matnr. 'L56"]:::clrPattern5 38{"62行目 条件式を評価する: lv_lines = 0 'L62"}:::clrPattern1 40["63行目 gv_msg に |No MARA rows found for selection.| を代入する 'L63"] 41["64行目 ここで処理を終了、ENDFORM にジャンプ 'L64"] 42(["65行目 そうでない場合 'L65"]):::clrPattern7 43(["65行目 条件文終了 'L65"]):::clrPattern7 44[/"67行目 内部テーブル lt_mara をループ処理: ┗ ワークエリア:ls_mara. 'L67"\]:::clrPattern2 45["68行目 変数の初期化:gs_result 'L68"] 46["69行目 gs_result-bukrs に iv_bukrs を代入する 'L69"] 47["70行目 gs_result-matnr に ls_mara-matnr を代入する 'L70"] 48["71行目 gs_result-mtart に ls_mara-mtart を代入する 'L71"] 49["72行目 gs_result-matkl に ls_mara-matkl を代入する 'L72"] 50["73行目 gs_result-created_on に ls_mara-erdat を代入する 'L73"] 51["76行目 SELECT文: SELECT: SELECT SINGLE maktx FROM makt INTO @gs_result-maktx WHERE matnr = @ls_mara-matnr AND spras = @sy-langu. 'L76"]:::clrPattern5 52[/"82行目 gs_resultにct_resultを追加する 'L82"/]:::clrPattern6 53["83行目 gv_count に gv_count + 1 を代入する 'L83"] 54(["84行目 繰返文終了 'L84"]):::clrPattern7 55(["85行目 FORM終了 'L85"]) %%ルート設定 33-->37 37-->38 38-->|条件文 真へ|40 38-->|条件文 偽へ|42 40-->41 41-->|RETURN|55 42-->43 43-->44 44-->|繰返し文継続へ|45 44-->|繰返文終了後の処理へ|55 45-->46 46-->47 47-->48 48-->49 49-->50 50-->51 51-->52 52-->53 53-->54 54-->|繰返文開始へ|44