Code20070209 - ooxxvv/MySAPnotes GitHub Wiki

Code20070209

  • 可動態產生 List 的表頭
  • 標題的欄位名稱及長度是設在 Text Symbols 中,欄位長度是以 mLen 來決定
  • 設定時用一個英文字母 (通常用 H) 加上兩碼數字 (欄位的順序) 來當作 Symbol 名稱
  • 在產生標題時代入所設定的英文字母,就會自動將標題欄位依照所設定的順序依序列出
  • 在產生 List 時,可呼叫 define_line_types 這個 Form 來將欄位的長度帶入以 Line 為開頭的 structure 中
  • 在 Write TO 時,可從這個 structure 中捉取欄位長度

Code

Include Z_TITLE

*----------------------------------------------------------------------*
*  INCLUDE Z_TITLE                         *
*----------------------------------------------------------------------*
DATA: BEGIN OF line1,
    c00 TYPE i,
    c01 TYPE i,
    c02 TYPE i,
    c03 TYPE i,
    c04 TYPE i,
    c05 TYPE i,
    c06 TYPE i,
    c07 TYPE i,
    c08 TYPE i,
    c09 TYPE i,
    c10 TYPE i,
    c11 TYPE i,
    c12 TYPE i,
    c13 TYPE i,
    c14 TYPE i,
    c15 TYPE i,
    c16 TYPE i,
    c17 TYPE i,
    c18 TYPE i,
    c19 TYPE i,
    c20 TYPE i,
    c21 TYPE i,
    c22 TYPE i,
    c23 TYPE i,
    c24 TYPE i,
    c25 TYPE i,
    c26 TYPE i,
    c27 TYPE i,
    c28 TYPE i,
    c29 TYPE i,
    c30 TYPE i,
    c31 TYPE i,
    c32 TYPE i,
    c33 TYPE i,
    c34 TYPE i,
    c35 TYPE i,
    c36 TYPE i,
    c37 TYPE i,
    c38 TYPE i,
    c39 TYPE i,
    c40 TYPE i,
   END OF line1.
DATA: line2 LIKE line1,
   line3 LIKE line1.

DATA: it_textpoolt LIKE textpoolt OCCURS 0 WITH HEADER LINE,
    it_listext LIKE textpoolt OCCURS 0 WITH HEADER LINE .

*----------------------------------------------------------------*
* DEFINE VARIANCE
*----------------------------------------------------------------*
DATA : BEGIN OF st_page,
     lnfir LIKE sy-tabix,
     loopc LIKE sy-loopc,
     lnmax LIKE sy-tabix,
    END OF st_page.

DATA : BEGIN OF t_exbtn OCCURS 0,
     fcode(30),
    END OF t_exbtn.
DATA : t_adfcd LIKE t_exbtn OCCURS 0 WITH HEADER LINE.

DATA : wcur_field(30),
    wcur_line LIKE sy-tabix,
    wcur_table(10),
    wcur_tab(20),
    wcur_line1 LIKE sy-tabix,
    wcur_line2 LIKE sy-tabix,
    w_ans(1).

LOAD-OF-PROGRAM.
 FIELD-SYMBOLS <lf> TYPE ANY.
 DATA: l_listext(8).

 IF it_textpoolt[] IS INITIAL.
  CALL FUNCTION 'GET_REPT_FOR_VERSIONS'
   EXPORTING
    program =sy-cprog
    r3state ='A'
   TABLES
    t_textpool=it_textpoolt
   EXCEPTIONS
    not_found=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.
 ENDIF.

 IF it_listext[] IS INITIAL.
  CALL FUNCTION 'GET_REPT_FOR_VERSIONS'
   EXPORTING
    program ='ZIACONTEXTS'  "'ZIFWTEXTS'
    r3state ='A'
   TABLES
    t_textpool=it_listext
   EXCEPTIONS
    not_found=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.

  LOOP AT it_listext WHERE key CP 'L*'.
   CONCATENATE 'TEXTL' it_listext-key(3) INTO l_listext.
   ASSIGN (l_listext) TO <lf>.
   IF <lf> IS ASSIGNED.
    <lf>=it_listext-entry.
   ENDIF.
  ENDLOOP.
 ENDIF.

*----------------------------------------------------------------*
* DEFINE MARCRO
*----------------------------------------------------------------*
 DEFINE delk.
  loop at &1.
   check &1(1)=&2.
   delete &1 index sy-tabix.
  endloop.
 END-OF-DEFINITION.

*----------------------------------------------------------------*
* DEFINE MARCRO
*----------------------------------------------------------------*
 DEFINE sorting.
  split wcur_field at '-' into wcur_table wcur_tab.
  sort &1 by (wcur_tab) &2.
 END-OF-DEFINITION.

*----------------------------------------------------------------*
* DEFINE MARCRO
*----------------------------------------------------------------*
 DEFINE sel.
  loop at &1.
   &1(1)=&2.
   modify &1 index sy-tabix.
  endloop.
 END-OF-DEFINITION.

*----------------------------------------------------------------*
* MACRO POP_WIN
*----------------------------------------------------------------*
 DEFINE pop_win.
  perform popup_message using &1 w_ans.
  case w_ans.
   when '1'.
** --> Yes
    perform &2.
   when '2'.
** --> No
    perform &3.
   when 'A'.
** --> Cancel
  endcase.
 END-OF-DEFINITION.
*----------------------------------------------------------------*
* FORM COMMON COMMAND
*----------------------------------------------------------------*
FORM common_command TABLES p_table
           USING p_ucomm p_lnfir.
 CASE p_ucomm.
  WHEN 'BACK'.
   LEAVE TO SCREEN 0.
*   SET SCREEN 0.
*   LEAVE SCREEN.
  WHEN 'P+' OR 'P++' OR 'P-' OR 'P--'.
   DESCRIBE TABLE p_table LINES st_page-lnmax.
   PERFORM get_first_line USING p_lnfir.
   PERFORM get_top_line USING p_ucomm.
   PERFORM set_first_line USING p_lnfir.
  WHEN 'ASDN'.
   sorting p_table ascending.
  WHEN 'DSCN'.
   sorting p_table descending.
  WHEN 'DELE'.
   delk p_table 'X'.
  WHEN 'SELA'.
   sel p_table 'X'.
  WHEN 'DSEL'.
   sel p_table ''.
  WHEN 'SEBL'.
   IF wcur_line1=0.
    wcur_line1=wcur_line.
   ELSEIF wcur_line1 < wcur_line.
    wcur_line2=wcur_line.
   ELSEIF wcur_line1 > wcur_line.
    wcur_line2=wcur_line1.
    wcur_line1=wcur_line.
   ENDIF.
   CHECK wcur_line1 <> 0 AND wcur_line2 <> 0.
   LOOP AT p_table FROM wcur_line1 TO wcur_line2.
    p_table(1)='X'.
    MODIFY p_table INDEX sy-tabix.
   ENDLOOP.
   CLEAR : wcur_line1,wcur_line2.
 ENDCASE.
ENDFORM.          "COMMON_COMMAND

*&------------------------------------------------------------------
*&   Form GET_TOP_LINE
*&------------------------------------------------------------------
FORM get_top_line USING  p_ucomm.
 CALL FUNCTION 'FI_CUST_SCROLL'
  EXPORTING
   i_input=0
   i_lnfir=st_page-lnfir
   i_lnmax=st_page-lnmax
   i_loopc=st_page-loopc
   i_okcod=p_ucomm
  IMPORTING
   e_lnfir=st_page-lnfir.

ENDFORM.          " GET_TOP_LINE

*----------------------------------------------------------------*
* MODULE SET_CURSOR
*----------------------------------------------------------------*
MODULE set_cursor OUTPUT.
 SET CURSOR FIELD wcur_field LINE wcur_line.
ENDMODULE.          "SET_CURSOR OUTPUT

*----------------------------------------------------------------*
* MODULE GET_CURSOR
*----------------------------------------------------------------*
MODULE get_cursor INPUT.
 GET CURSOR FIELD wcur_field LINE wcur_line.
ENDMODULE.          "GET_CURSOR INPUT

*----------------------------------------------------------------*
* FORM GET_FIRST_LINE
*----------------------------------------------------------------*
FORM get_first_line USING p_lnfir.
 IF sy-ucomm='P+' OR sy-ucomm='P++' OR sy-ucomm='P-' OR
   sy-ucomm='P--'.
  MOVE p_lnfir TO st_page-lnfir.
 ENDIF.
ENDFORM.          "GET_FIRST_LINE

*----------------------------------------------------------------*
* FORM SET_FIRST_LINE
*----------------------------------------------------------------*
FORM set_first_line USING p_lnfir.
 IF sy-ucomm='P+' OR sy-ucomm='P++' OR sy-ucomm='P-' OR
   sy-ucomm='P--'.
  MOVE st_page-lnfir TO p_lnfir.
 ENDIF.
ENDFORM.          "SET_FIRST_LINE

*----------------------------------------------------------------*
* FORM POPUP_MESSAGE
*----------------------------------------------------------------*
FORM popup_message USING p_msg p_ans.
 CALL FUNCTION 'POPUP_TO_CONFIRM'
  EXPORTING
*   TITLEBAR         =' '
*   DIAGNOSE_OBJECT      =' '
   text_question       =p_msg
   text_button_1       ='Yes'
*   ICON_BUTTON_1       =' '
   text_button_2       ='No'
*   ICON_BUTTON_2       =' '
   default_button      ='3'
   display_cancel_button   ='X'
*   USERDEFINED_F1_HELP    =' '
*   START_COLUMN       =25
*   START_ROW         =6
*   POPUP_TYPE         =
  IMPORTING
   answer          =p_ans
*  TABLES
*   PARAMETER          =
  EXCEPTIONS
   text_not_found      =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.

ENDFORM.          "POPUP_MESSAGE

*----------------------------------------------------------------*
* FORM INCLUDE_FCODE
*----------------------------------------------------------------*
FORM include_fcode USING p_fcode.
 LOOP AT t_exbtn WHERE fcode=p_fcode.
  DELETE t_exbtn INDEX sy-tabix.
 ENDLOOP.

ENDFORM.          "INCLUDE_FCODE
*----------------------------------------------------------------*
* FORM APPEND_FCODE
*----------------------------------------------------------------*
FORM append_fcode USING p_fcode.
 MOVE p_fcode TO t_exbtn-fcode.
 APPEND t_exbtn.

ENDFORM.          "APPEND_FCODE
*&---------------------------------------------------------------------*
*&   Form DISPLAY_FCODE
*&---------------------------------------------------------------------*
FORM display_fcode USING p_fcode.
 LOOP AT t_exbtn WHERE fcode=p_fcode.
  DELETE t_exbtn INDEX sy-tabix.
 ENDLOOP.
ENDFORM.          " DISPLAY_FCODE
*&---------------------------------------------------------------------*
*&   Form EXCHANGE_RATE_CONVERT
*&---------------------------------------------------------------------*
FORM exchange_rate_convert USING  p_f_waers
                   p_l_waers
                   p_budat
*                   p_kursf
                   p_f_wrbtr
                   p_l_wrbtr.

 DATA: l_kursf LIKE bkpf-kursf,
    l_fe_factor TYPE p DECIMALS 3,
    l_le_factor TYPE p DECIMALS 3,
    l_fw_factor TYPE p DECIMALS 3,
    l_lw_factor TYPE p DECIMALS 3.

 CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
  EXPORTING
   currency    =p_f_waers
  IMPORTING
   factor     =l_fw_factor
  EXCEPTIONS
   too_many_decimals=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.

 CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
  EXPORTING
   currency    =p_l_waers
  IMPORTING
   factor     =l_lw_factor
  EXCEPTIONS
   too_many_decimals=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.

 CALL FUNCTION 'READ_EXCHANGE_RATE'
  EXPORTING
   client     =sy-mandt
   date      =p_budat
   foreign_currency=p_f_waers
   local_currency =p_l_waers
   type_of_rate  ='M'
  IMPORTING
   exchange_rate =l_kursf
   foreign_factor =l_fe_factor
   local_factor  =l_le_factor
  EXCEPTIONS
   no_rate_found =1
   no_factors_found=2
   no_spread_found=3
   derived_2_times=4
   overflow    =5
   zero_rate   =6
   OTHERS     =7.

 IF sy-subrc <> 0.
  EXIT.
 ENDIF.

 IF l_kursf < 0.
  MULTIPLY l_kursf BY -1.
  p_l_wrbtr=p_f_wrbtr * l_fw_factor / l_kursf / l_fe_factor
       * l_le_factor / l_lw_factor.
 ELSE.
*-- modify by brian 02/20/2006 -->
*  p_l_wrbtr=p_f_wrbtr * l_fw_factor * l_kursf / l_fe_factor
*       * l_le_factor / l_lw_factor.
  p_l_wrbtr=p_f_wrbtr * l_fw_factor * l_kursf / l_fe_factor
       * l_le_factor." * l_lw_factor.
*-- modify by brian 02/20/2006 <--
 ENDIF.

* p_kursf=l_kursf / l_fe_factor * l_le_factor.

ENDFORM.          " EXCHANGE_RATE_CONVERT
*&---------------------------------------------------------------------*
*&   Form REPORT_HEADER
*&---------------------------------------------------------------------*
FORM report_header USING value(p_repid)
             value(p_lines)
             value(p_color)
             value(p_ngape).

 DATA: l_index TYPE sy-index.
 DATA: l_field(20).

 DATA: l_ln TYPE i,
     l_cp(2) TYPE c.

 FIELD-SYMBOLS : <f1> TYPE c,
         <f2> TYPE i.

 l_ln=STRLEN( p_lines ).
 DO l_ln TIMES.
  l_index=sy-index - 1.
  ASSIGN p_lines+l_index(1) TO <f1>.
  CHECK <f1> IS ASSIGNED.
  NEW-LINE.
  CONCATENATE <f1> '*' INTO l_cp.
  LOOP AT it_textpoolt WHERE id='I' AND key CP l_cp
             AND lang=sy-langu.

   IF p_ngape='X'.
    CASE it_textpoolt-entry(2).
     WHEN '/L'.
      WRITE AT (it_textpoolt-length) it_textpoolt-entry+2
                           COLOR=p_color
                           NO-GAP
                           LEFT-JUSTIFIED .
     WHEN '/R'.
      WRITE AT (it_textpoolt-length) it_textpoolt-entry+2
                           COLOR=p_color
                           NO-GAP
                           RIGHT-JUSTIFIED .

     WHEN OTHERS.
      WRITE AT (it_textpoolt-length) it_textpoolt-entry
                           COLOR=p_color
                           NO-GAP
                           CENTERED.

    ENDCASE.
   ELSE.
    CASE it_textpoolt-entry(2).
     WHEN '/L'.
      WRITE AT (it_textpoolt-length) it_textpoolt-entry+2
                           COLOR=p_color
                           LEFT-JUSTIFIED .
     WHEN '/R'.
      WRITE AT (it_textpoolt-length) it_textpoolt-entry+2
                           COLOR=p_color
                           RIGHT-JUSTIFIED .

     WHEN OTHERS.
      WRITE AT (it_textpoolt-length) it_textpoolt-entry
                           COLOR=p_color
                            CENTERED.

    ENDCASE.
   ENDIF.
  ENDLOOP.

 ENDDO.


 IF l_ln > 1.
  ULINE.
 ELSE.
  NEW-LINE.
  LOOP AT it_textpoolt WHERE id='I' AND key CP l_cp
             AND lang=sy-langu.
   IF p_ngape='X'.
    WRITE AT : (it_textpoolt-length) sy-uline NO-GAP.
   ELSE.
    WRITE AT : (it_textpoolt-length) sy-uline.
   ENDIF.
  ENDLOOP.
 ENDIF.
ENDFORM.          " REPORT_HEADER
*&---------------------------------------------------------------------*
*&   Form DEFINE_LINE_TYPES
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM define_line_types USING  value(p_lines).
 DATA: l_index TYPE sy-index.
 DATA: l_field(20) ,
     l_field2(1).

 DATA: l_line TYPE n,
     l_ln TYPE i,
     l_cp(2) TYPE c.

 FIELD-SYMBOLS : <f1> TYPE c,
         <f2> TYPE i.

 l_ln=STRLEN( p_lines ).
 DO l_ln TIMES.
  CLEAR l_field2.
  l_line=sy-index.
  l_index=sy-index - 1.
  l_field2=p_lines+l_index(1).
  CHECK NOT l_field2 IS INITIAL.
  ASSIGN l_field2 TO <f1>.
  CONCATENATE <f1> '*' INTO l_cp.
  LOOP AT it_textpoolt WHERE id='I' AND key CP l_cp
             AND lang=sy-langu.

   CONCATENATE 'LINE' l_line '-C' it_textpoolt-key+1(2) INTO l_field.
   ASSIGN (l_field) TO <f2>.
   <f2>=it_textpoolt-length.
  ENDLOOP.
 ENDDO.

ENDFORM.          " DEFINE_LINE_TYPES
*&---------------------------------------------------------------------*
*&   Form DEFINE_LINE_TYPES
*&---------------------------------------------------------------------*
FORM check_authorize USING  p_bnarea p_bukrs p_actvt.
* CALL FUNCTION 'ZIEB_AUTH_CHECK'
*  EXPORTING
*   i_bnarea=p_bnarea
*   i_bukrs=p_bukrs
*   i_actvt=p_actvt
*  EXCEPTIONS
*   no_auth=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.
ENDFORM.          " define_line_types
*&---------------------------------------------------------------------*
*&   Form YE_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM ye_top_of_page USING bukrs title2 title3 yes no all
              main from to.
 DATA: flag(3),
    l_date LIKE sy-datum.

 CASE 'X'.
  WHEN yes. flag='Y'.
  WHEN no. flag='N'.
  WHEN all. flag='ALL'.
 ENDCASE.


* CALL FUNCTION 'ZIEB_REPORT_TITLE2'
*  EXPORTING
*   repid          =sy-cprog
*   linsz          =sy-linsz
*   bukrs          =bukrs
*   title2         =title2
*   title3         =title3
*   flag          =flag
*   main          =main
*   from          =from
*   to           =to
*  EXCEPTIONS
*   company_or_plant_required=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.

ENDFORM.          " YE_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*&   Form YE_end_OF_page
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM ye_end_of_page .
 DATA len TYPE i.

 len=sy-linsz / 2 - 10.
 WRITE AT: /(len) sy-uline,
       (16) '<TO be Continue>',
       (len) sy-uline.

ENDFORM.          " YE_end_OF_page
*&---------------------------------------------------------------------*
*&   Form YE_END_OF_LIST
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM ye_end_of_list .
 DATA len TYPE i.

 len=sy-linsz / 2 - 4.
 WRITE AT: /(len) sy-uline,
       (5)  '<End>',
       (len) sy-uline.



ENDFORM.          " YE_END_OF_LIST
*&---------------------------------------------------------------------*
*&   Form CONVERSION_EXIT_MATN1_INPUT
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
*   -->P_ITAB_MATNR text
*   -->P_ITAB_MATNR text
*----------------------------------------------------------------------*
FORM conversion_exit_matn1_input USING  input
                 CHANGING output.
 CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
  EXPORTING
   input   =input
  IMPORTING
   output   =output
  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.
ENDFORM.          " CONVERSION_EXIT_MATN1_INPUT
}}}

## Add-on Functions
### ZCREATE_TITLE
{{{#!abap
FUNCTION ZCREATE_TITLE.
*"----------------------------------------------------------------------
*"*"Local interface/
*" IMPORTING
*"   REFERENCE(REPID) TYPE C DEFAULT SY-CPROG
*"   REFERENCE(LINSZ) LIKE SY-LINSZ DEFAULT SY-LINSZ
*"   REFERENCE(BUKRS) LIKE T001-BUKRS OPTIONAL
*"   REFERENCE(WERKS) LIKE T001W-WERKS OPTIONAL
*"   REFERENCE(DATE) LIKE SY-DATUM OPTIONAL
*"   REFERENCE(TIME) LIKE SY-UZEIT OPTIONAL
*"   REFERENCE(TITLE2) LIKE SY-TITLE OPTIONAL
*"   REFERENCE(TITLE3) LIKE SY-TITLE OPTIONAL
*" EXCEPTIONS
*"   COMPANY_OR_PLANT_REQUIRED
*"----------------------------------------------------------------------
 DATA: l_title_len TYPE i,
    l_title2_len TYPE i,
    l_title3_len TYPE i.

 IF bukrs IS INITIAL AND werks IS INITIAL.
  RAISE company_or_plant_required.
 ENDIF.

 l_title_len=STRLEN( sy-title ).
 l_title2_len=STRLEN( title2 ).
 l_title3_len=STRLEN( title3 ).

 IF repid <> w_repid
   OR linsz <> w_linsz
   OR bukrs <> w_bukrs
   OR len-title <> l_title_len
   OR len-title2 <> l_title2_len
   OR len-title3 <> l_title3_len.
  w_repid=repid.
  w_linsz=linsz.

* If company code is blank the use plant code to get company code
  IF NOT bukrs IS INITIAL.
   w_bukrs=bukrs.
  ELSE.
   SELECT SINGLE k~bukrs INTO w_bukrs
    FROM t001w AS w JOIN t001k AS k ON k~bwkey=w~bwkey
    WHERE w~werks=werks.
  ENDIF.

  w_title2=title2.
  w_title3=title3.
  PERFORM prepare_global_data.
 ENDIF.

***  first line
 WRITE:/ 'Program Name /', repid,
     AT pos-comp_name(len-comp_name) lab-comp_name,
     AT pos-r_side lab-pageno,
     (8) sy-pagno RIGHT-JUSTIFIED NO-GAP.
***  second line
 WRITE:/ lab-date, sy-datum,
     AT pos-title(len-title) sy-title,
     AT pos-r_side lab-usrname, (12) sy-uname CENTERED.
** 3rd line
 WRITE:/ lab-time, sy-uzeit,
     AT pos-title2(len-title2) title2,
     AT pos-r_side lab-tcode, (12) sy-tcode CENTERED.
** 4rd line
 WRITE AT :(linsz) title3 centered.

 ULINE :(linsz).
ENDFUNCTION.
}}}

## Write TOP-OF-PAGE
{{{#!abap
 FIELD-SYMBOLS: <len> TYPE i,
         <nam> TYPE ANY.
 DATA: l_name TYPE string,
    l_index TYPE string.

 CALL FUNCTION 'ZCREATE_TITLE'
    EXPORTING
      repid          =sy-cprog
      linsz          =sy-linsz
      bukrs          =c_bukrs
      date          =sy-datum
      time          =sy-uzeit
    EXCEPTIONS
      company_or_plant_required=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.

 PERFORM report_header USING SY-REPID  "REPORT ID
               'H'     "TEXT-T*
                2     "COLOR
               '' .    "NO-GAP

Write LIST

 PERFORM define_line_types USING 'H'.

 LOOP AT gt_list.
  WRITE AT: (line1-c01) gt_list-bstnk,
       (line1-c02) gt_list-vbeln,
       (line1-c03) gt_list-audat,
       (line1-c04) gt_list-matnr,
       (line1-c05) gt_list-arktx,
       (line1-c06) gt_list-kwmeng,
       (line1-c07) gt_list-werks,
       (line1-c08) gt_list-lgort,
       (line1-c09) gt_list-kzwi1,
       (line1-c10) gt_list-vbeln_r,
       (line1-c11) gt_list-audat_r,
       (line1-c12) gt_list-kzwi1_r,
       (line1-c13) gt_list-waerk_r,
       (line1-c14) gt_list-kzwi1_rl,
       (line1-c15) gt_list-rsnum,
       (line1-c16) gt_list-bdter,
       (line1-c17) gt_list-mblnr,
       (line1-c18) gt_list-wempf,
       (line1-c19) gt_list-matnr_r,
       (line1-c20) gt_list-maktx_r,
       (line1-c21) gt_list-bdmng_r,
       (line1-c22) gt_list-exbwr,
       (line1-c23) gt_list-ablad,
       (line1-c24) gt_list-kostl.

  CLEAR: gt_list.
  NEW-LINE.
 ENDLOOP.
⚠️ **GitHub.com Fallback** ⚠️