본문 바로가기
ABAP/소스코드

[Report] ZBDC - 미리보기 기능 추가된 BDC 실행 프로그램

by name_text 2023. 6. 26.

ZBDC

미리보기 기능 추가된 BDC 실행 프로그램

 

SAP 운영 중 대량의 트랜잭션을 처리해야 할 경우 BDC(Batch Data Communication)를 이용하여 CBO를 만들거나, 또는 LSMW(Legacy System Migration Workbench)를 이용하여 대량의 데이터를 처리 할 수 있습니다.

 

단, 긴급하게 처리를 요하는 경우나 일회성으로 끝나는 작업에 대해서는 ZBDC와 같이 BDC를 직접 실행할 수 있는 CBO를 이용하는것도 좋은 방법입니다.

 

#1. BDC 레코딩시 주의 사항

레코딩 후에 값을 입력받을 항목에 대해 필드 값을 삭제 후 BDC를 저장해야, ZBDC의 Excel Template에 입력항목으로 표시됩니다.

 

#2. 사용 방법

   1) BDC 레코딩 선택 또는 TXT파일로 된 BDC레코딩 파일 선택

  2) BDC 항목 더블클릭

  3) Make  template 클릭하여 Excel 양식 열기

  4) STARTDATA 부터 ENDDATA 까지 데이터 입력

  5) 데이터를 저장하여 "Processing"으로 파일을 불러오거나, 엑셀 데이터를 복사 후 "Paste"로 붙여넣기 실행

  6) 미리보기 데이터가 표시되면, 데이터 확인 후 "실행"을 눌러 BDC를 처리한다

 

#3. 소스코드

인터넷이 떠돌아 다니는 ZBDC 소스코드에 미리보기 기능만 추가한 내용입니다.

REPORT ZBDC LINE-COUNT 0 LINE-SIZE 80
       NO STANDARD PAGE HEADING.
*-----------------------------------------------------------------------
* BDC Data Upload by Recording
*-----------------------------------------------------------------------
*  |*            ; comment
*  |*FIELDNAME   ; field name
*  |*Description ;
*  |STARTDATA    ; data start
*  |
*  |
*  |ENDDATA      ; data end
*-----------------------------------------------------------------------
TABLES: apqi,
        tstct,
        dfies,
        x031l,
        t100.
*
INCLUDE <icon>.
*
DATA: bdc_params LIKE ctu_params.
DATA: dynflow  LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: sav_df   LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: bdc_data LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: prg_dyn(50), icode(30).
*
DATA: upload(14)   VALUE '<Excel Upload>',
      testing(14)  VALUE '<Test Display>',
      testone(10)  VALUE '<Test One>',
      session(17)  VALUE '<Process Session>',
      maketemp(15) VALUE '<Make template>',
      clip(7)      VALUE '<Paste>'.
*
DATA: BEGIN OF alpha,
        x1 TYPE hextyp VALUE 65,
        x2 TYPE hextyp VALUE 32,
      END   OF alpha.
DATA  readtype.
DATA  f_test.    "ok_code for test
DATA: dyn_tabix LIKE sy-tabix,
      dyn_order LIKE sy-tabix.
* function code for test
DATA: BEGIN OF mod_fcode OCCURS 10,
        f_test,
        tabix  LIKE sy-tabix,
      END   OF mod_fcode.
*
DATA: BEGIN OF ftext OCCURS 10,
        outputlen     LIKE dfies-outputlen,
        scrtext_s(14),
        scrtext_m(24),
        scrtext_l     LIKE dfies-scrtext_l,
        fieldtext     LIKE dfies-fieldtext,
        reptext       LIKE dfies-reptext,
        lineno(4),
        tabix         LIKE sy-tabix,
      END   OF ftext.
*
DATA: BEGIN OF fnam OCCURS 10,
        fnam  LIKE bdcdata-fnam,
        order LIKE sy-tabix,
      END   OF fnam.
*
DATA: BEGIN OF ford OCCURS 10,
        fnam  LIKE bdcdata-fnam,
        order LIKE sy-tabix,
      END   OF ford.
*
DATA: nodata VALUE '/'.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: l_mstring(512).
DATA  ccode(2).
DATA  tran_subrc TYPE sy-subrc.
DATA: filename     LIKE rlgrap-filename,
      filetype     LIKE rlgrap-filetype VALUE 'ASC',
      act_filename LIKE rlgrap-filename,
      filesize     TYPE i.
*
DATA: r_filename(40),
      p_filename(40).

DATA: gv_answer TYPE rsnewleng-fcode.

CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS:
      on_user_command FOR EVENT added_function OF cl_salv_events
        IMPORTING e_salv_function.
ENDCLASS.

CLASS lcl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    MOVE e_salv_function TO gv_answer.
    LEAVE TO SCREEN 0.
  ENDMETHOD.
ENDCLASS.

* Recording
SELECTION-SCREEN BEGIN OF BLOCK reco0 WITH FRAME TITLE t_reco0.
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_grpid.
    PARAMETERS:   p_grpid LIKE apqi-groupid MEMORY ID BDC_RECORDING.
    PARAMETERS:   p_mandt LIKE apqi-mandant OBLIGATORY DEFAULT sy-mandt.
  SELECTION-SCREEN END   OF LINE.
* Created on
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_credt.
    PARAMETERS: p_credt LIKE apqi-credate.
  SELECTION-SCREEN END   OF LINE.
* Created by
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_creur.
    PARAMETERS: p_creur LIKE apqi-creator.
  SELECTION-SCREEN END   OF LINE.
*
  SELECTION-SCREEN ULINE.
*
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_rfile.
    PARAMETERS: p_rfile(128) LOWER CASE MEMORY ID exrcd.
*PARAMETERS: P_DIR(128) LOWER CASE MEMORY ID GR9.
    SELECTION-SCREEN PUSHBUTTON (4) pb_txt USER-COMMAND fopen.
  SELECTION-SCREEN END   OF LINE.
*
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT  1(30)  t_rfile0.
    SELECTION-SCREEN COMMENT  33(40) t_rfile1.
  SELECTION-SCREEN END   OF LINE.
*
SELECTION-SCREEN END   OF BLOCK reco0.
*
SELECTION-SCREEN BEGIN OF BLOCK fsrc0 WITH FRAME TITLE t_fscr0.
  SELECTION-SCREEN BEGIN OF LINE.

* Options: read from Local PC
    SELECTION-SCREEN COMMENT  1(31) t_frpc1.
    PARAMETERS p_frpc RADIOBUTTON GROUP fsrc USER-COMMAND rb1.
    SELECTION-SCREEN COMMENT  35(15) t_frpc FOR FIELD p_frpc.
*selection-screen end   of line.
*selection-screen begin of line.
*        : Read from Server
    PARAMETERS p_frsr RADIOBUTTON GROUP fsrc.
    SELECTION-SCREEN COMMENT 53(15) t_frsr FOR FIELD p_frsr.
*
*parameters p_frpc radiobutton group fsrc.
*selection-screen comment  3(15) t_frpc.
*selection-screen end   of line.
*selection-screen begin of line.
*parameters p_frsr radiobutton group fsrc.
*selection-screen comment 3(15) t_frsr.
*

  SELECTION-SCREEN END   OF LINE.
*
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_fname MODIF ID fnm.
    PARAMETERS: p_fname LIKE rlgrap-filename
*                         DEFAULT 'C:\SAPWorkdir\MAT.TXT'
                             MEMORY ID dlf MODIF ID fnm.
  SELECTION-SCREEN END   OF LINE.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS: x_deflt  AS CHECKBOX DEFAULT 'X'.
    SELECTION-SCREEN COMMENT 3(70) t_deflt FOR FIELD x_deflt.
  SELECTION-SCREEN END   OF LINE.
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_nultxt.
    PARAMETERS: x_nulind   DEFAULT '!'.
  SELECTION-SCREEN END   OF LINE.
SELECTION-SCREEN END   OF BLOCK fsrc0.
*
SELECTION-SCREEN BEGIN OF BLOCK sess0 WITH FRAME TITLE t_sess0.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS: x_tran RADIOBUTTON GROUP btyp.
    SELECTION-SCREEN COMMENT 3(20) t_tran FOR FIELD x_tran.
  SELECTION-SCREEN END   OF LINE.
*
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_dmode.
    PARAMETERS: dmode LIKE ctu_params-dismode DEFAULT 'N'.
  SELECTION-SCREEN END   OF LINE.
*
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT 1(31) t_umode.
    PARAMETERS: umode LIKE ctu_params-updmode DEFAULT 'S'.
  SELECTION-SCREEN END   OF LINE.
*
  SELECTION-SCREEN ULINE.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS: x_ses RADIOBUTTON GROUP btyp.
    SELECTION-SCREEN COMMENT 3(20) t_ses FOR FIELD x_ses.
  SELECTION-SCREEN END   OF LINE.
  PARAMETERS: bdcgroup(12).
  PARAMETERS: username LIKE sy-uname DEFAULT sy-uname OBLIGATORY.
SELECTION-SCREEN END   OF BLOCK sess0.
*
SELECTION-SCREEN BEGIN OF LINE.
  PARAMETERS: p_cond AS CHECKBOX DEFAULT 'X'.
  SELECTION-SCREEN COMMENT 3(20) t_con FOR FIELD p_cond.
*SELECTION-SCREEN END   OF LINE.
*
*SELECTION-SCREEN BEGIN OF LINE.
  PARAMETERS: putmsg AS CHECKBOX DEFAULT 'X'.
  SELECTION-SCREEN COMMENT 26(20) t_pmsg FOR FIELD putmsg.
SELECTION-SCREEN END   OF LINE.
*
SELECTION-SCREEN BEGIN OF LINE.
  PARAMETERS: p_ignore AS CHECKBOX.
  SELECTION-SCREEN COMMENT 3(20) t_ig FOR FIELD p_ignore.
SELECTION-SCREEN END   OF LINE.
*
DATA: BEGIN OF xdat OCCURS 0,
        dat(1024),
      END   OF xdat.
*
RANGES: r_grpid FOR apqi-groupid,
        r_credt FOR apqi-credate,
        r_creur FOR apqi-creator.
*
DATA: apqitab        LIKE apqi OCCURS 0 WITH HEADER LINE,
      recording_type LIKE apqi-datatyp VALUE '%BDC'.
*
DATA: indata(1024) OCCURS 0 WITH HEADER LINE,
      indata_lines TYPE i.
*
DATA: len      TYPE i,
      n        TYPE i,
      o        TYPE i,
      seq      TYPE i,
      dat(128),
      ch.
*
DATA: BEGIN OF tab,
*         t TYPE x VALUE '09',
        t TYPE c,
      END   OF tab.
*
DATA: bdc_value(128) OCCURS 0 WITH HEADER LINE,
      bdc_index      TYPE i,
      bdc_count      TYPE i.
DATA  trancode LIKE tstc-tcode.
DATA: fieldname,
      start,
      end,
      data.
*
DATA: h LIKE d020s,
      f LIKE d021s OCCURS 0 WITH HEADER LINE,
      e LIKE d022s OCCURS 0 WITH HEADER LINE,
      m LIKE d023s OCCURS 0 WITH HEADER LINE.
*
DATA: BEGIN OF dynp,
        prog LIKE d020s-prog,
        dnum LIKE d020s-dnum,
      END OF dynp.
*
DATA: p_excel, p_tab.
TABLES: sscrfields.
DATA: g_fname     LIKE rlgrap-filename,
      g_mask      TYPE string,
      g_mode_open VALUE 'O',
      g_title     TYPE string VALUE 'FileUploadDialog'.
DATA: g_rfname LIKE rlgrap-filename.
DATA: sav_dir  LIKE rlgrap-filename.
*
* for excel
TYPE-POOLS: ole2.
*
DATA: xl_row    TYPE i,
      xl_column TYPE i.
DATA: e_font(20) VALUE 'Arial',
      e_size     TYPE i VALUE 11.
DATA: e_sheet_no       TYPE i VALUE 1,
      e_sheet_name(20) VALUE 'TEST',
      xl_title(100).
*
* Automation EXCEL
DATA: excel  TYPE ole2_object, books  TYPE ole2_object,
      book   TYPE ole2_object, sheets TYPE ole2_object,
      sheet  TYPE ole2_object, cells  TYPE ole2_object,
      cell   TYPE ole2_object, appl   TYPE ole2_object,
      font   TYPE ole2_object.
*
DATA: f_rc TYPE i.
DATA: l_len TYPE i,
      l_cur TYPE i.
*------------------------------------------------------------*
* AT SELECTION-SCREEN
*------------------------------------------------------------*
AT SELECTION-SCREEN.
* Recording File name
  IF sscrfields-ucomm = 'FOPEN'.
    IF p_rfile <> space.
      MOVE p_rfile TO g_fname.
      SET PARAMETER ID 'EXRCD' FIELD g_fname. "Recording Upload path
    ENDIF.
    PERFORM call_open_dialog_er USING 'txt'.
    IF sy-subrc = 0 AND g_fname <> space.
      MOVE g_fname TO p_rfile.
      SET PARAMETER ID 'EXRCD' FIELD g_fname. "Upload path

      IF g_fname <> space AND f_rc = 0.
        sav_dir = p_rfile = g_fname.
        l_len = strlen( g_fname ).
        DO l_len TIMES.
          l_cur = l_len - sy-index.
          IF g_fname+l_cur(1) = '\'.
            EXIT.
          ENDIF.
          IF l_cur = 0.
            EXIT.
          ENDIF.
        ENDDO.
*
        IF l_len >= l_cur.
          ADD 1 TO l_cur.
          MOVE g_fname+l_cur TO r_filename.
        ENDIF.
      ELSE.
        sav_dir = p_rfile.
      ENDIF.
    ENDIF.
  ENDIF.
* BDC Upload filename
  IF sscrfields-ucomm = 'FOPEN1'.
    IF p_fname <> space.
      MOVE p_fname TO g_fname.
      SET PARAMETER ID 'DLF' FIELD g_fname. "Recording Upload path
    ENDIF.
    PERFORM call_open_dialog_er USING 'xlsx'.
    IF sy-subrc = 0 AND g_fname <> space.
      p_fname = g_fname.
      SET PARAMETER ID 'DLF' FIELD g_fname. "Upload path
    ENDIF.
  ENDIF.


*
*------------------------------------------------------------*
* AT SELECTION-SCREEN ON .........
*------------------------------------------------------------*
AT SELECTION-SCREEN ON p_rfile.
  IF p_rfile = space.
    p_rfile = sav_dir.
    t_rfile1 = r_filename.
  ENDIF.
*
*------------------------------------------------------------*
* AT SELECTION-SCREEN-OUPUT
*------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*
  GET PARAMETER ID 'EXRCD' FIELD p_rfile.
  GET PARAMETER ID 'DLF' FIELD p_fname.
  t_rfile1 = r_filename.

  LOOP AT SCREEN.
    IF screen-group1 EQ 'FNM' AND p_frpc IS NOT INITIAL.
      screen-active = 0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
*
*------------------------------------------------------------*
* INITIALIZATION
*------------------------------------------------------------*
INITIALIZATION.
*
*  bdcgroup = 'ZBDCGROUP'.
  username = sy-uname.
  t_dmode  = 'Run mode'.
  t_umode  = 'Update mode'.
  t_tran   = 'Call transaction'.
  t_ses    = 'Generate session'.
  t_grpid  = 'Recording'.
  t_credt  = 'Created on'.
  t_creur  = 'Created by'.
  t_frpc   = 'From PC'.
  t_frsr   = 'From Server'.
  t_fname  = 'Path: file name of the BDC data'.
  t_fscr0  = 'BDC data'.
  t_reco0  = 'Selection for Recording'.
  t_sess0  = 'Processing type'.
  t_deflt  = 'Default Value: Use no space field value in Recording'.
  t_nultxt = 'Null indicator'.
  t_rfile  = 'External recording file'.
  t_con    = 'Condense data'.
  t_pmsg   = 'Put Message'.
  pb_txt   = icon_open_folder.
*  pb_txt1  = icon_open_folder.
  t_rfile0 = 'Selected Record file'.
  t_rfile1 = r_filename.
  t_frpc1  = 'Source Machine'.
  t_ig     = 'Ignore Space BDC Field'.
*
  GET PARAMETER ID 'EXRCD' FIELD p_rfile.
  GET PARAMETER ID 'DLF'   FIELD p_fname.

  CLEAR g_mask.
  IF sy-langu EQ '3'.
    CONCATENATE g_mask 'Excel 통합문서 (*.xlsx)|*.xlsx|' INTO g_mask.
    CONCATENATE g_mask 'Excel 97 - 2003 통합문서 (*.xls)|*.xls|' INTO g_mask.
    CONCATENATE g_mask 'CSV(쉼표로 분리) (*.csv)|*.csv|' INTO g_mask.
    CONCATENATE g_mask '텍스트 파일 (*.txt)|*.txt|' INTO g_mask.
*    CONCATENATE G_MASK '|모든 파일 (*)|*' INTO G_MASK.
  ELSE.
    CONCATENATE g_mask 'Excel Workbook (*.xlsx)|*.xlsx|' INTO g_mask.
    CONCATENATE g_mask 'Excel 97 - 2003 Workbook (*.xls)|*.xls|' INTO g_mask.
    CONCATENATE g_mask 'CSV(Comma Separated) (*.csv)|*.csv|' INTO g_mask.
    CONCATENATE g_mask 'Text file (*.txt)|*.txt|' INTO g_mask.
*    CONCATENATE G_MASK '|All files (*)|*' INTO G_MASK.
  ENDIF.

  p_frpc = abap_true.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_grpid.
  PERFORM f4if_grpid.
*
START-OF-SELECTION.
*
  PERFORM get_tab_char.
*
  IF p_grpid    IS INITIAL AND
     r_filename IS INITIAL.
    MESSAGE s208(00) WITH
       'Enter the Recording name or Ext.Recording file name'.
    EXIT.
  ENDIF.
*
  IF x_ses = 'X' AND bdcgroup IS INITIAL.
    MESSAGE s208(00) WITH 'Please, Enter the BDCGROUP Name'.
    LEAVE LIST-PROCESSING.
  ENDIF.
*
  IF NOT p_grpid IS INITIAL.
    PERFORM set_select_options.
    SELECT  FROM apqi INTO TABLE apqitab
             WHERE groupid  IN r_grpid
               AND credate  IN r_credt
               AND datatyp  = recording_type
               AND mandant  = p_mandt
               AND creator  IN r_creur
             ORDER BY credate DESCENDING cretime DESCENDING.
    DESCRIBE TABLE apqitab LINES sy-tfill.
    IF sy-tfill = 0.
      MESSAGE s108(04) WITH 'Not found recording !'.
      LEAVE LIST-PROCESSING.
    ENDIF.
    CLEAR r_filename.
  ELSEIF NOT r_filename IS INITIAL.
    PERFORM upload_the_recording.
    CLEAR icode.
    MOVE 1 TO sy-lsind.
    PERFORM put_screen_template.
    CLEAR icode.
  ELSE.
    MESSAGE s108(04) WITH
       'Please, Enter the Recording name or Ext.Recording file name'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  IF r_filename IS INITIAL.
    FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
*
    LOOP AT apqitab.
      WRITE: /1 sy-vline,
               (6) apqitab-mandant,  sy-vline,
              (12) apqitab-groupid,  sy-vline,
              (10) apqitab-credate,  sy-vline,
               (8) apqitab-cretime,  sy-vline,
              (12) apqitab-creator,  sy-vline,
               (5) apqitab-transcnt, sy-vline,
               (5) apqitab-msgcnt,   sy-vline.
      apqi = apqitab.
      HIDE: apqi-groupid, apqi-qid, apqi-mandant, apqitab.
    ENDLOOP.
    ULINE.
  ENDIF.
  CLEAR apqitab.
*
END-OF-SELECTION.
*

*
TOP-OF-PAGE.
*
  IF sy-lsind = 0.
    FORMAT COLOR COL_HEADING.
    ULINE.
    WRITE: /1 sy-vline,
             (6) 'Client',     sy-vline,
            (12) 'Recording',  sy-vline,
            (10) 'Date',       sy-vline,
             (8) 'Time',       sy-vline,
            (12) 'Created by', sy-vline,
             (5) 'Trans',      sy-vline,
             (5) 'Scrn',       sy-vline.
    ULINE.
  ENDIF.
*
AT LINE-SELECTION.
*
  IF NOT r_filename IS INITIAL.
    MOVE 2 TO sy-lsind.
  ENDIF.
*
  IF sy-lsind = 1.
    CHECK NOT apqi-groupid IS INITIAL.
    CLEAR icode.
    PERFORM put_screen_template.
    CLEAR icode.
  ELSEIF sy-lsind = 2.
    CLEAR icode.
    GET CURSOR FIELD icode.
*
    IF icode = 'UPLOAD' OR icode = 'TESTING' OR icode = 'TESTONE'.
      PERFORM upload_data.
      DESCRIBE TABLE indata LINES sy-tfill.
      IF sy-tfill > 0.
        PERFORM confirm_processing_step.
        IF indata_lines > 0.
          PERFORM make_bdc_data.
        ENDIF.
      ENDIF.
    ELSEIF icode = 'SESSION'.
      PERFORM process_session.
    ELSEIF icode = 'MAKETEMP'.
      PERFORM make_template_in_excel.
*      PERFORM save_recording.
    ELSEIF icode = 'CLIP'.
      PERFORM paste_from_clip.
      DESCRIBE TABLE indata LINES sy-tfill.
      MOVE 'UPLOAD' TO icode.
      IF sy-tfill > 0.
        PERFORM confirm_processing_step.
        IF indata_lines > 0.
          PERFORM make_bdc_data.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
*
*&---------------------------------------------------------------------*
*&      Form  put_screen_template
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM put_screen_template.
*
  DATA: l_alpha(2), l_hex(10), l_x1(4), l_x2(4), l_char(10).
  DATA: c_sw.
*
  REFRESH: ftext, fnam.
  CLEAR fnam.
  CLEAR dyn_order.
*
  alpha-x1 = 65.
  alpha-x2 = 32.
*
  IF r_filename IS INITIAL.
    IF icode IS INITIAL AND NOT p_grpid IS INITIAL.
      CALL FUNCTION 'BDC_OBJECT_READ'
        EXPORTING
          queue_id  = apqi-qid
          datatype  = recording_type
*         TRANS     = apqi-TRANS
        TABLES
          dynprotab = dynflow
        EXCEPTIONS
          not_found = 1
          OTHERS    = 99.
      IF sy-subrc <> 0.
        MESSAGE s208(00) WITH 'Cannot get the Recoreing info.'.
        EXIT.
      ENDIF.
    ENDIF.
  ELSE.
*

*
  ENDIF.
*
  NEW-PAGE LINE-SIZE 120.
*
  WRITE : /1  upload  COLOR 5 HOTSPOT.
  IF x_tran = 'X'.
    WRITE: testone    COLOR 5 HOTSPOT.
  ENDIF.
  WRITE: testing      COLOR 5 HOTSPOT.
  WRITE: clip         COLOR 5 HOTSPOT QUICKINFO 'From Clipboard'.
  WRITE: maketemp     COLOR 5 HOTSPOT.
  IF p_filename IS INITIAL.
    WRITE: (50) space.
  ELSE.
    WRITE: p_filename,indata_lines.
  ENDIF.
*
  ULINE.
  FORMAT COLOR COL_HEADING INTENSIFIED OFF.
* Recording Name
  WRITE AT : /1(sy-linsz) 'Recording   :'.
  IF r_filename IS INITIAL.
    WRITE 15 apqi-groupid.
  ELSE.
    WRITE 15 r_filename.
  ENDIF.
*
  ULINE.
*
  LOOP AT dynflow.
    dyn_tabix = sy-tabix.
*   tcode line
    IF dynflow-dynbegin = 'T'.         " Tcode
      tstct-tcode = dynflow-fnam.
      trancode    = tstct-tcode.
      SELECT SINGLE  FROM tstct WHERE sprsl = sy-langu
                                   AND tcode = tstct-tcode.
      FORMAT COLOR COL_KEY.
      WRITE AT : /1(sy-linsz) 'Transaction :'.
      WRITE:     15 tstct-tcode,
                    tstct-ttext.
      ULINE.
   start screen
    ELSEIF dynflow-dynbegin = 'X'.
      prg_dyn    = dynp-prog = dynflow-program.
      prg_dyn+41 = dynp-dnum = dynflow-dynpro.
      IMPORT DYNPRO h f e m ID dynp.
      CONDENSE prg_dyn.
      FORMAT COLOR COL_GROUP INTENSIFIED ON.
      WRITE AT : /1(sy-linsz) space,
              4 prg_dyn.
    ELSE.
      IF dynflow-fnam(4) NE 'BDC_' OR
         dynflow-fnam = 'BDC_OKCODE'.
*       NOT use default and have value
*       Increase Column order
        IF dynflow-fnam NE 'BDC_OKCODE'.
          IF NOT ( x_deflt = 'X' AND dynflow-fval NE space ).
            IF alpha-x2 = 32.
              alpha-x1 = alpha-x1 + 1.
              IF alpha-x1 > 90.
                IF alpha-x2 = 32.
                  alpha-x1 = alpha-x2 = 65.
                ENDIF.
              ENDIF.
            ELSE.
              alpha-x2 = alpha-x2 + 1.
              IF alpha-x2 > 90.
                alpha-x1 = alpha-x1 + 1.
                alpha-x2 = 65.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
*
        CLEAR dfies-fieldtext.
        IF dynflow-fnam = 'BDC_OKCODE'.
          dfies-fieldtext = 'F_CODE'.
          FORMAT COLOR COL_GROUP INTENSIFIED OFF.
          CLEAR c_sw.
        ELSE.
          FORMAT COLOR COL_NORMAL.
          PERFORM get_fieldname.
        ENDIF.
*
        IF c_sw = space.
          FORMAT INTENSIFIED ON.
          MOVE 'X' TO c_sw.
        ELSE.
          FORMAT INTENSIFIED OFF.
          CLEAR c_sw.
        ENDIF.
*
        WRITE: alpha-x1 TO l_x1,
               alpha-x2 TO l_x2.
        CONCATENATE '\X\' l_x1
                    '\X\' l_x2 INTO l_hex.

        CALL FUNCTION 'STPU1_HEX_TO_CHAR'
          EXPORTING
            hex_string  = l_hex
          IMPORTING
            char_string = l_char.
*
        MOVE l_char TO l_alpha.
*
        IF dynflow-fnam = 'BDC_OKCODE'.
          FORMAT INTENSIFIED OFF.
          WRITE: /6 dynflow-fnam(30) COLOR COL_GROUP INTENSIFIED OFF,
                 36 dfies-fieldtext(40).
        ELSE.
          WRITE: /6 dynflow-fnam(30) COLOR COL_POSITIVE,
                 36 dfies-fieldtext(40).
        ENDIF.
        IF dynflow-fnam = 'BDC_OKCODE'.
          DATA: len TYPE i, pos TYPE i.
        ELSEIF ( x_deflt = 'X' AND dynflow-fval NE space ).
          WRITE 76(5) '.'.
        ELSE.
          WRITE:76(5) l_alpha COLOR COL_TOTAL.
          ADD 1 TO fnam-order.
          MOVE dynflow-fnam  TO fnam-fnam.
          APPEND fnam.
        ENDIF.
*
        IF icode = 'TESTING'.
          READ TABLE sav_df INDEX dyn_tabix.
          dynflow-fval = sav_df-fval.
        ENDIF.
*
        IF dynflow-fnam = 'BDC_OKCODE'.
          WRITE: 81 dynflow-fval.
*          len = STRLEN( dynflow-fval ).
          len = 30.
          pos = 81 + len + 1.
          WRITE AT pos(1) f_test QUICKINFO 'Test Function' INPUT COLOR COL_NEGATIVE.
        ELSE.
          WRITE: 81 dynflow-fval.
          WRITE AT pos(1) f_test QUICKINFO 'Put Space' INPUT COLOR COL_NEGATIVE.
        ENDIF.
        HIDE: dyn_tabix.
*
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.                               " put_screen_template
*&---------------------------------------------------------------------*
*&      Form  upload_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM upload_data.
*
  IF p_frpc = 'X'.
    PERFORM call_open_dialog.
    REFRESH indata.
    IF NOT p_filename IS INITIAL.
      PERFORM set_extension.
      IF p_excel = 'X'.
        PERFORM upload_excel.
      ELSEIF p_tab = 'X'.
        PERFORM ws_upload.
      ENDIF.
      DESCRIBE TABLE indata LINES indata_lines.
    ENDIF.
  ELSE.
    DATA: open_msg(80).
    OPEN DATASET p_fname FOR INPUT IN TEXT MODE
                         ENCODING DEFAULT MESSAGE open_msg.
    IF sy-subrc NE 0.
      MESSAGE s453(00) WITH 'Data Open error :' open_msg.
      EXIT.
    ENDIF.
*
    MESSAGE s453(00) WITH 'Reading...' space.
    DO.
      READ DATASET p_fname INTO indata.
      IF sy-subrc NE 0. EXIT. ENDIF.
      APPEND indata.
    ENDDO.
    CLOSE DATASET p_fname.
  ENDIF.
*
  SET PARAMETER ID 'DLF' FIELD p_fname.
*
ENDFORM.                               " upload_data
*&---------------------------------------------------------------------*
*&      Form  make_bdc_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM make_bdc_data.
*
  PERFORM read_input_value_from_list.
*
  CLEAR bdc_count.
  CLEAR:start, end, data, fieldname.
*
  IF icode = 'UPLOAD' OR icode = 'TESTONE' OR icode = 'CLIP'.
    NEW-PAGE LINE-SIZE 255.
  ENDIF.
*
*  DESCRIBE TABLE indata LINES indata_lines.
*
  LOOP AT indata.
    IF indata(1) = '*'.                "comment row
      CONTINUE.
    ENDIF.
*
    IF indata(9) = 'STARTDATA'.        "data start row
      start = 'X'.
      data  = 'X'.
      IF fieldname = space.
        ford[] = fnam[].
      ENDIF.
      CLEAR fieldname.
    ENDIF.
*
    IF indata(7) = 'ENDDATA'.          "data finished row
      end = 'X'.
    ENDIF.
*
    IF indata(9) = 'FIELDNAME'.
      fieldname = 'X'.
    ENDIF.
*
    CHECK data      = 'X' OR
          fieldname = 'X'.
*
    len = strlen( indata ).
    CLEAR: n,o,seq,dat.
    REFRESH bdc_value.
    DO.
      IF n => len.
        EXIT.
      ENDIF.
*
      ch = indata+n(1).
      IF ch = tab.
        seq = seq + 1.
        PERFORM move_bdc.
        ADD 1 TO n.
        CLEAR: o, dat.
      ELSE.
        dat+o(1) = indata+n(1).
        ADD 1 TO: o, n.
      ENDIF.
    ENDDO.
*
    seq = seq + 1.
    PERFORM move_bdc.
    CLEAR dat.
*
    IF data = 'X'.
      PERFORM append_to_bdc.
    ENDIF.
*
    IF end = 'X' OR
      ( ( icode NE 'UPLOAD' AND icode NE 'CLIP' )
        AND ( start = 'X' ) ).
      EXIT.
    ENDIF.
  ENDLOOP.
*
  PERFORM close_bdc_group.
*
  IF start IS INITIAL.
    PERFORM put_error_msg.
  ENDIF.
*
  IF sy-subrc = 0.
    IF ( icode = 'UPLOAD' OR
         icode = 'CLIP' ) AND x_ses = 'X'.
      WRITE: / session COLOR 5 HOTSPOT.
      ULINE.
      WRITE: / 'BDC session created.',
             / sy-uline,
             / 'BDC session :', bdcgroup,
             / 'BDC Count   :', bdc_count.
    ELSEIF icode = 'TESTING'.
      PERFORM put_screen_template.
      sy-lsind = sy-lsind - 1.
    ENDIF.
  ENDIF.
*
  REFRESH indata.
  CLEAR   indata_lines.
*
ENDFORM.                               " make_bdc_data
*&---------------------------------------------------------------------*
*&      Form  move_bdc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM move_bdc.
*
  CLEAR ford.
*
  CHECK seq > 1.
  IF data = 'X'.  "DATA line
    bdc_value = dat.
    IF p_cond = 'X'.
      CONDENSE bdc_value.
    ENDIF.
    APPEND bdc_value.
  ELSEIF fieldname = 'X'.
    bdc_value = dat.
    CONDENSE bdc_value.
    READ TABLE fnam WITH KEY fnam = bdc_value.
    IF sy-subrc = 0.
      ford-order = fnam-order.
      ford-fnam  = fnam-fnam.
      APPEND ford.
*      MODIFY fnam INDEX sy-tabix TRANSPORTING order.
    ELSE.
      ford-fnam  = bdc_value.
      ford-order = seq - 1.
      APPEND ford.
    ENDIF.
  ENDIF.
ENDFORM.                               " move_bdc
*&---------------------------------------------------------------------*
*&      Form  append_to_bdc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM append_to_bdc.
*
  CLEAR: bdc_value, bdc_index.
  REFRESH bdc_data.
*
  LOOP AT dynflow.
*
    MOVE sy-tabix TO dyn_tabix.
*
    IF dynflow-dynbegin = 'T'.
      CONTINUE.
    ENDIF.
*
    bdc_data = dynflow.
    IF bdc_data-dynbegin = 'X' OR     "Start of Screen
       bdc_data-fnam(4)  = 'BDC_'.    "BDC_... fields
*     delete okcode for test
      READ TABLE mod_fcode WITH KEY tabix = dyn_tabix.
      IF sy-subrc = 0 AND mod_fcode-f_test = nodata.
        MOVE '/N' TO bdc_data-fval.
      ENDIF.
*
      APPEND bdc_data.
      CONTINUE.
    ENDIF.
*
    IF x_deflt = 'X' AND NOT bdc_data-fval IS INITIAL.
      APPEND bdc_data.
      CONTINUE.
    ENDIF.
*
    ADD 1 TO bdc_index.
    READ TABLE ford INDEX bdc_index.
    IF sy-subrc = 0.
      READ TABLE bdc_value INDEX ford-order.
      IF sy-subrc NE 0.
        CLEAR bdc_value.
      ENDIF.
    ENDIF.
*
    IF bdc_value = '!'.                " null field
      CONTINUE.
    ENDIF.
*
    IF p_ignore = 'X' AND bdc_value IS INITIAL.
      READ TABLE mod_fcode WITH KEY tabix = dyn_tabix.
      IF sy-subrc <> 0 OR mod_fcode-f_test = space.
        CONTINUE.
      ENDIF.
    ENDIF.
*
    bdc_data-fval = bdc_value.
    APPEND bdc_data.
  ENDLOOP.
*
  IF icode = 'TESTING'.
    CLEAR bdc_index.
    REFRESH sav_df.
    CLEAR sav_df.
    LOOP AT dynflow INTO sav_df.
      IF sav_df-dynbegin = 'T'.
        APPEND sav_df.
        CONTINUE.
      ENDIF.
*
      IF sav_df-dynbegin = 'X' OR
         sav_df-fnam(4)  = 'BDC_'.
        APPEND sav_df.
        CONTINUE.
      ENDIF.
*
      IF x_deflt = 'X' AND NOT sav_df-fval IS INITIAL.
        APPEND sav_df.
        CONTINUE.
      ENDIF.
*
      ADD 1 TO bdc_index.
      READ TABLE ford INDEX bdc_index.
      IF sy-subrc = 0.
        READ TABLE bdc_value INDEX ford-order.
        IF sy-subrc NE 0.
          bdc_value = '!!'.
        ENDIF.
      ELSE.
        bdc_value = '!!'.
      ENDIF.
      IF bdc_value = x_nulind OR       " null field
         bdc_value = '!!'.
        sav_df-fval = '<Null>'.
        APPEND sav_df.
        CLEAR sav_df.
        CONTINUE.
      ENDIF.
      sav_df-fval = bdc_value.
      APPEND sav_df.
    ENDLOOP.
  ENDIF.
*
  ADD 1 TO bdc_count.
*
  IF bdc_count = 1 AND icode = 'UPLOAD'.
    PERFORM open_bdc_group.
  ENDIF.
*
  IF x_ses = 'X'.
    IF icode = 'UPLOAD' OR icode = 'CLIP'.
      PERFORM bdc_insert.
    ENDIF.
  ELSEIF icode = 'TESTONE' OR icode = 'UPLOAD'
                           OR icode = 'CLIP'.
    ccode(1) = tab.
    TRANSLATE indata USING ccode.
    FORMAT COLOR COL_KEY INTENSIFIED OFF.
    WRITE: /(5) bdc_count , indata(120).
*   call transaction
    PERFORM call_transaction.
  ENDIF.
*
  IF putmsg = 'X'.
    PERFORM put_sapgui_message.
  ENDIF.
*
ENDFORM.                               " append_to_bdc
*&---------------------------------------------------------------------*
*&      Form  open_bdc_group
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM open_bdc_group.
*
  CHECK x_ses = 'X'.
*
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
      client              = sy-mandt
      group               = bdcgroup
      user                = username
      keep                = 'X'
    EXCEPTIONS
      client_invalid      = 1
      destination_invalid = 2
      group_invalid       = 3
      group_is_locked     = 4
      holddate_invalid    = 5
      internal_error      = 6
      queue_error         = 7
      running             = 8
      system_lock_error   = 9
      user_invalid        = 10
      OTHERS              = 11.
*
  IF sy-subrc NE 0.
    MESSAGE e435(00) WITH 'BDC GROUP Open Error !'.
  ENDIF.
*
ENDFORM.                               " open_bdc_group
*&---------------------------------------------------------------------*
*&      Form  close_bdc_group
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM close_bdc_group.
*
  CHECK x_ses = 'X'.
  CHECK icode = 'UPLOAD' OR icode = 'CLIP'.
  CALL FUNCTION 'BDC_CLOSE_GROUP'
    EXCEPTIONS
      not_open    = 1
      queue_error = 2
      OTHERS      = 3.
*
ENDFORM.                               " close_bdc_group
*&---------------------------------------------------------------------*
*&      Form  set_select_options
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_select_options.
*
  IF p_grpid CP '*'.
    r_grpid-option = 'CP'.
    r_grpid-sign = 'I'.
    r_grpid-low = p_grpid.
    APPEND r_grpid.
  ELSEIF p_grpid NE space.
    r_grpid-option = 'EQ'.
    r_grpid-sign = 'I'.
    r_grpid-low = p_grpid.
    APPEND r_grpid.
  ENDIF.
*
  IF NOT p_credt IS INITIAL.
    r_credt-option = 'EQ'.
    r_credt-sign = 'I'.
    r_credt-low = p_credt.
    APPEND r_credt.
  ENDIF.
*
  IF NOT p_creur IS INITIAL.
    r_creur-option = 'EQ'.
    r_creur-sign = 'I'.
    r_creur-low = p_creur.
    APPEND r_creur.
  ENDIF.
ENDFORM.                               " set_select_options
*&---------------------------------------------------------------------*
*&      Form  PROCESS_SESSION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_session.
*
  SET PARAMETER ID 'MPN' FIELD bdcgroup.
*
  CALL TRANSACTION 'SM35' AND SKIP FIRST SCREEN.

ENDFORM.                               " PROCESS_SESSION
*&---------------------------------------------------------------------*
*&      Form  GET_FIELDNAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_fieldname.
*
  DATA: t_line_nr(4).
*
  CLEAR ftext.
*
  f-ityp = '2'.
  f-fnam = dynflow-fnam.
  READ TABLE f WITH KEY fnam = f-fnam
                        ityp = f-ityp.
*
*  IF sy-subrc = 0 AND f-stxt NE space.
*    dfies-fieldtext = f-stxt.
*    EXIT.
*  ENDIF.
*
  IF dynflow-fnam CA '-'.
    x031l-tabname   = dynflow-fnam(sy-fdpos).
    sy-fdpos = sy-fdpos + 1.
    x031l-fieldname = dynflow-fnam+sy-fdpos.
  ELSE.
    CLEAR sy-fdpos.
    CLEAR x031l-fieldname.
    x031l-fieldname = dynflow-fnam+sy-fdpos.
  ENDIF.
*
  CLEAR t_line_nr.
  IF x031l-fieldname CA '('.
    t_line_nr = x031l-fieldname+sy-fdpos.
    x031l-fieldname = x031l-fieldname(sy-fdpos).
  ENDIF.
*
  readtype = 'X'.
  CLEAR dfies.
*
  DO.
    CALL 'C_DD_READ_FIELD'
         ID 'TYPE'      FIELD readtype
         ID 'TABNAME'   FIELD x031l-tabname
         ID 'FIELDNAME' FIELD x031l-fieldname
         ID 'LANGUAGE'  FIELD sy-langu.
    IF sy-subrc = 0. EXIT. ENDIF.
    IF readtype = space. EXIT. ENDIF.
    CLEAR readtype.
  ENDDO.
*
  MOVE dfies-outputlen TO ftext-outputlen.
  MOVE dfies-scrtext_s TO ftext-scrtext_s.
  MOVE dfies-scrtext_m TO ftext-scrtext_m.
  MOVE dfies-scrtext_l TO ftext-scrtext_l.
  MOVE dfies-fieldtext TO ftext-fieldtext.
  MOVE dfies-reptext   TO ftext-reptext.
  MOVE dyn_tabix       TO ftext-tabix.
  MOVE t_line_nr       TO ftext-lineno.
  APPEND ftext.
*
ENDFORM.                               " GET_FIELDNAME
*&---------------------------------------------------------------------*
*&      Form  BDC_INSERT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM bdc_insert.
*
  CALL FUNCTION 'BDC_INSERT'
    EXPORTING
      tcode          = trancode
    TABLES
      dynprotab      = bdc_data
    EXCEPTIONS
      internal_error = 1
      not_open       = 2
      queue_error    = 3
      tcode_invalid  = 4
      OTHERS         = 5.
*
  IF sy-subrc NE 0.
    MESSAGE e435(00) WITH 'BDC INSERT Error !'.
  ENDIF.
ENDFORM.                               " BDC_INSERT
*&---------------------------------------------------------------------*
*&      Form  CALL_TRANSACTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM call_transaction.
*
  DATA: w_dmode LIKE ctu_params-dismode VALUE 'A'.
*
  IF icode = 'UPLOAD'.
    w_dmode = dmode.
  ENDIF.
*
  REFRESH messtab.
*
  bdc_params-dismode  = w_dmode.
  bdc_params-updmode  = umode.
  bdc_params-cattmode = space.
  bdc_params-defsize  = 'X'.
  bdc_params-racommit = 'X'.
  bdc_params-nobinpt  = space.
  bdc_params-nobiend  = space.
*
  CALL TRANSACTION trancode USING bdc_data
                     OPTIONS    FROM bdc_params
*                   MODE     w_dmode
*                   UPDATE   umode
                   MESSAGES INTO messtab.
*
  tran_subrc = sy-subrc.
*
  PERFORM write_message TABLES messtab.
*
ENDFORM.                               " CALL_TRANSACTION
*&---------------------------------------------------------------------*
*&      Form  WRITE_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_MESSTAB  text
*----------------------------------------------------------------------*
FORM write_message TABLES   p_messtab STRUCTURE messtab.
*
  DATA: msg_type(10), msgtn(20).
*
  LOOP AT p_messtab.
    SELECT SINGLE  FROM t100 WHERE sprsl = p_messtab-msgspra
                              AND   arbgb = p_messtab-msgid
                              AND   msgnr = p_messtab-msgnr.
    CASE p_messtab-msgtyp.
      WHEN 'E'.
        FORMAT COLOR COL_NEGATIVE  INTENSIFIED OFF.
        MOVE '~<E>' TO msg_type.
      WHEN 'W'.
        FORMAT COLOR COL_TOTAL     INTENSIFIED ON.
        MOVE '~<W>' TO msg_type.
      WHEN 'S'.
        FORMAT COLOR COL_POSITIVE  INTENSIFIED OFF.
        MOVE '~<S>' TO msg_type.
      WHEN 'I'.
        FORMAT COLOR COL_NORMAL    INTENSIFIED OFF.
        MOVE '~<I>' TO msg_type.
      WHEN 'A'.
        FORMAT COLOR COL_GROUP     INTENSIFIED ON.
        MOVE '~<A>' TO msg_type.
        IF p_messtab-msgnr = '359' AND
           p_messtab-msgid = '00'.
          CONTINUE.
        ENDIF.
      WHEN 'X'.
        FORMAT COLOR COL_GROUP     INTENSIFIED ON.
        MOVE '~<X>' TO msg_type.
      WHEN OTHERS.
        FORMAT COLOR COL_BACKGROUND INTENSIFIED ON.
        MOVE '~<?>' TO msg_type.
    ENDCASE.

    CONCATENATE p_messtab-msgid p_messtab-msgnr INTO msgtn.
*
    IF sy-subrc = 0.
      l_mstring = t100-text.
      IF l_mstring CS '&1'.
        REPLACE '&1' WITH p_messtab-msgv1 INTO l_mstring.
        REPLACE '&2' WITH p_messtab-msgv2 INTO l_mstring.
        REPLACE '&3' WITH p_messtab-msgv3 INTO l_mstring.
        REPLACE '&4' WITH p_messtab-msgv4 INTO l_mstring.
      ELSE.
        REPLACE '&' WITH p_messtab-msgv1 INTO l_mstring.
        REPLACE '&' WITH p_messtab-msgv2 INTO l_mstring.
        REPLACE '&' WITH p_messtab-msgv3 INTO l_mstring.
        REPLACE '&' WITH p_messtab-msgv4 INTO l_mstring.
      ENDIF.
      CONDENSE l_mstring.
      WRITE: /11 msg_type, msgtn, l_mstring(120).
    ELSE.
      WRITE: /11 msg_type, p_messtab-msgid(4),
                           p_messtab-msgnr.
    ENDIF.
  ENDLOOP.
  IF tran_subrc NE 0.
    IF f_test IS INITIAL.
      FORMAT COLOR COL_NEGATIVE  INTENSIFIED OFF.
      WRITE: /11 'TRAN_SUBRC:', tran_subrc.
    ELSE.
      FORMAT COLOR COL_TOTAL  INTENSIFIED OFF.
      WRITE: /11 '<TESTMODE>:', tran_subrc.
    ENDIF.
  ENDIF.
ENDFORM.                               " WRITE_MESSAGE
*&---------------------------------------------------------------------*
*&      Form  SAVE_RECORDING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM save_recording.
*
*  APPEND apgitab TO xdat.
*
*  LOOP AT dynflow.
*    xdat = dynflow. APPEND xdat.
*  ENDLOOP.
*
*  CALL FUNCTION 'DOWNLOAD'
*    EXPORTING
*      filename     = filename
*      filetype     = filetype
*    IMPORTING
*      act_filename = act_filename
*      filesize     = filesize
*    TABLES
*      data_tab     = xdat.
*
*  IF filesize > 0.
*    MESSAGE i208(00) WITH 'Donwload finished.'.
*  ENDIF.
  MESSAGE i208(00) WITH 'Not Supported.'.
ENDFORM.                               " SAVE_RECORDING
*&---------------------------------------------------------------------*
*&      Form  UPLOAD_THE_RECORDING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM upload_the_recording.
*
*  MESSAGE i398(00) WITH 'Not Supported.'.
  DATA: l_fullpath  TYPE string.
  DATA: t_tcode LIKE tstc-tcode.
*
  REFRESH dynflow.
  l_fullpath = p_rfile.
*
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = l_fullpath
*     FILETYPE                = 'ASC'
      has_field_separator     = 'X'
*     HEADER_LENGTH           = 0
*      IMPORTING
    IMPORTING
      filelength              = filesize
*     HEADER                  =
    TABLES
      data_tab                = dynflow
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.
  IF sy-subrc = 0.
    MESSAGE s642(sm) WITH l_fullpath.
*    E_GLOB-MODIFIED = 'X'.
  ELSE.
*   File & does not exist
    MESSAGE i643(ms) WITH l_fullpath.
    LEAVE LIST-PROCESSING.
  ENDIF.
*
  READ TABLE dynflow INDEX 1.
  IF sy-subrc = 0 AND dynflow-dynbegin = 'T'.
    MOVE dynflow-fnam TO t_tcode.
    SELECT SINGLE tcode INTO t_tcode FROM tstc
                        WHERE tcode = t_tcode.
    IF sy-subrc NE 0.
      MESSAGE i108(04) WITH 'Cannot Support TCODE:' dynflow-fnam.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ELSE.
    MESSAGE i108(04) WITH 'Cannot Support Recording file.'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*  p_rfile = act_filename.
*  SET PARAMETER ID 'DLP' FIELD p_rfile.
*
*  IF filesize > 0.
*    LOOP AT xdat.
*      IF sy-tabix = 1.
*        apqitab = xdat.
*        IF apqitab-datatyp = '%BDC'.
*          APPEND apqitab.
*        ENDIF.
*        CONTINUE.
*      ENDIF.
*      dynflow = xdat.    APPEND dynflow.
*    ENDLOOP.
*    CLEAR p_grpid.
*  ENDIF.
*  REFRESH xdat.
*
ENDFORM.                               " UPLOAD_THE_RECORDING
*----------------------------------------------------------------------
*&---------------------------------------------------------------------*
*&      Form  call_open_dialog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM call_open_dialog .
  DATA: l_len TYPE i,
        l_cur TYPE i,
        rc    TYPE i.
  TYPE-POOLS: abap.
*
  DATA: l_wintitle TYPE string,           "title
        l_fullpath TYPE string,           "full path
        l_action   TYPE i,                "action
        l_filetab  TYPE filetable,        "file table
        l_rc       TYPE i.                "return code
  DATA: file_name TYPE string,
        file_path TYPE string.

  MOVE g_title TO l_wintitle.
*
  IF p_filename IS NOT INITIAL.
    MOVE p_filename TO file_name.
  ENDIF.
*
  IF NOT g_fname IS INITIAL.
    l_len = strlen( g_fname ).
    DO l_len TIMES.
      l_cur = l_len - sy-index.
      IF g_fname+l_cur(1) = '\'.
        EXIT.
      ENDIF.
      IF l_cur = 0.
        EXIT.
      ENDIF.
    ENDDO.
    IF l_len >= l_cur.
      MOVE g_fname(l_cur) TO file_path.
    ENDIF.
  ENDIF.
*
  CLEAR p_filename.
*
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = g_title
      default_filename        = file_name
*     default_extension       = 'txt'
      file_filter             = g_mask
      initial_directory       = file_path
      multiselection          = abap_false
    CHANGING
      file_table              = l_filetab
      rc                      = l_rc
      user_action             = l_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      OTHERS                  = 4.
*
  IF sy-subrc = 0.
    IF l_action = cl_gui_frontend_services=>action_cancel.
    ELSE.
      IF l_rc > 0.
        READ TABLE l_filetab INDEX 1 INTO g_fname.
        p_fname = g_fname.
        l_len = strlen( g_fname ).
        DO l_len TIMES.
          l_cur = l_len - sy-index.
          IF g_fname+l_cur(1) = '\'.
            EXIT.
          ENDIF.
          IF l_cur = 0.
            EXIT.
          ENDIF.
        ENDDO.
        IF l_len >= l_cur.
          ADD 1 TO l_cur.
          MOVE g_fname+l_cur TO p_filename.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
*
ENDFORM.                    " call_open_dialog
*&---------------------------------------------------------------------*
*&      Form  set_extension
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_extension .
  DATA: patt       TYPE string VALUE '.',
        text       TYPE string,
        result_tab TYPE match_result_tab.
  DATA: lv_extension TYPE string,
        lv_ext_s     TYPE i VALUE 0,
        lv_ext_e     TYPE i VALUE 0.
  FIELD-SYMBOLS <match> LIKE LINE OF result_tab.

  MOVE p_filename TO text.

  FIND ALL OCCURRENCES OF patt IN
       text
       RESULTS result_tab.

  LOOP AT result_tab ASSIGNING <match>.
    lv_ext_s = <match>-offset + <match>-length.
    lv_ext_e = strlen( text ) - lv_ext_s.
    IF strlen( text ) > lv_ext_s.
      lv_extension = text+lv_ext_s(lv_ext_e).
    ENDIF.
  ENDLOOP.

  TRANSLATE lv_extension TO UPPER CASE.

  CASE lv_extension.
    WHEN 'XLS' OR 'XLSX' OR 'CSV'.
      CLEAR p_tab.
      MOVE 'X' TO p_excel.
    WHEN 'TXT'.
      CLEAR p_excel.
      MOVE 'X' TO p_tab.
    WHEN OTHERS.
      CLEAR: p_excel, p_tab.
  ENDCASE.
ENDFORM.                    " set_extension
*&---------------------------------------------------------------------*
*&      Form  WS_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ws_upload .
*
  DATA: act_filename LIKE rlgrap-filename,
        f_len        TYPE i.
*
  REFRESH indata.
*
  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      filename                = p_fname
      filetype                = 'ASC'
    IMPORTING
      filelength              = f_len
    TABLES
      data_tab                = indata
    EXCEPTIONS
      conversion_error        = 1
      invalid_table_width     = 2
      invalid_type            = 3
      no_batch                = 4
      gui_refuse_filetransfer = 5
      unknown_error           = 6
      OTHERS                  = 7.
*
  IF sy-subrc NE 0.
    MESSAGE i398(00) WITH 'Data Open error'.
  ENDIF.
ENDFORM.                    " WS_UPLOAD
*&---------------------------------------------------------------------*
*&      Form  UPLOAD_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM upload_excel .
*
  DATA : exdat LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.
  DATA : e_srt_col TYPE i VALUE 1,
         e_srt_row TYPE i VALUE 1,
         e_end_col TYPE i VALUE 26,
         e_end_row TYPE i VALUE 65536.
*
* UPLOAD EXCEL FILE
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_fname
      i_begin_col             = e_srt_col
      i_begin_row             = e_srt_row
      i_end_col               = e_end_col
      i_end_row               = e_end_row
    TABLES
      intern                  = exdat
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2.
*  zcl_utility=>excel_upload(
*    EXPORTING
*      iv_filename             = CONV #( p_fname )
*      iv_begin_col            = e_srt_col
*      iv_begin_row            = e_srt_row
*      iv_end_col              = e_end_col
*      iv_end_row              = e_end_row
*    IMPORTING
*      et_intern               = DATA(exdat)
*    EXCEPTIONS
*      inconsistent_parameters = 1
*      upload_ole              = 2
*      excel_data_error        = 3
*      OTHERS                  = 4
*  ).
*  IF sy-subrc <> 0.
*    MESSAGE i398(00) WITH 'Data Upload Error !'.
*  ENDIF.
*
  DATA: f_col  TYPE i,
        offset TYPE i,
        len    TYPE i,
        n1     TYPE i.
  LOOP AT exdat INTO DATA(ls_exdat).

    AT NEW row.
      CLEAR: f_col, offset.
    ENDAT.
*
    ADD 1 TO f_col.
    IF f_col < ls_exdat-col.
      n1 = ls_exdat-col - f_col.
      DO n1 TIMES.
        ADD 1 TO f_col.
        MOVE tab TO indata+offset.
        ADD 1 TO offset.
      ENDDO.
    ENDIF.
*
    IF f_col = ls_exdat-col.
      MOVE ls_exdat-value TO indata+offset.
      len = strlen( ls_exdat-value ).
      offset = offset + len.
      MOVE tab TO indata+offset.
      ADD 1 TO offset.
    ENDIF.
*
    AT END OF row.
      offset = offset - 1.
      MOVE space TO indata+offset.
      APPEND indata.
    ENDAT.
  ENDLOOP.
*
ENDFORM.                    " UPLOAD_EXCEL
*&---------------------------------------------------------------------*
*&      Form  paste_from_clip
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM paste_from_clip .
*
  DATA: file_table TYPE filetable,
        rc         TYPE i,
        filedat    TYPE string.
  DATA: file_table_clip TYPE STANDARD TABLE OF file_table.
*
  DATA: BEGIN OF file_tab OCCURS 1,
          zeile(500) TYPE c,
        END OF file_tab.
*
  CALL METHOD cl_gui_frontend_services=>clipboard_import
    IMPORTING
      data                 = file_table_clip
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc = 3.
    MESSAGE e888(db). EXIT.
  ELSEIF sy-subrc <> 0.
    MESSAGE e889(db). EXIT.
  ENDIF.

  indata[] = file_table_clip[].
  CLEAR p_filename.
*
ENDFORM.                    " paste_from_clip
*&---------------------------------------------------------------------*
*&      Form  read_input_value_from_list
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM read_input_value_from_list .
*
  REFRESH mod_fcode.
*
  DO.
    CLEAR: f_test, dyn_tabix.
    READ LINE sy-index FIELD VALUE f_test dyn_tabix.
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.
    IF f_test = nodata.
      MOVE f_test    TO mod_fcode-f_test.
      MOVE dyn_tabix TO mod_fcode-tabix.
      APPEND mod_fcode.
    ENDIF.
  ENDDO.
*
  CLEAR f_test.
  DESCRIBE TABLE mod_fcode LINES sy-tfill.
  IF sy-tfill > 0.
    MOVE 'X' TO f_test.
  ENDIF.
ENDFORM.                    " read_input_value_from_list
*&---------------------------------------------------------------------*
*&      Form  make_template_in_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM make_template_in_excel .
  CREATE OBJECT excel 'EXCEL.APPLICATION'.
*
  CALL METHOD OF excel 'APPLICATION' = appl.
  SET PROPERTY OF appl 'STANDARDFONT' = e_font.
  SET PROPERTY OF appl 'STANDARDFONTSIZE' = e_size.
*
  CALL METHOD OF excel 'WORKBOOKS' = books.
  CALL METHOD OF books 'ADD' = book.  "ADD, OPEN
*
  CALL METHOD OF book 'sheets' = sheets.
  CALL METHOD OF sheets 'item' = sheet
    EXPORTING
    #1 = 1.
  CALL METHOD OF sheet 'Activate'.
*
  CALL METHOD OF sheet 'cells' = cells.
*
  LOOP AT dynflow.
*
    MOVE sy-tabix TO dyn_tabix.
*
    IF dynflow-dynbegin = 'T'.         " Tcode
*     Write Header Title to Excel
      MOVE dynflow-fnam TO e_sheet_name.
      SET PROPERTY OF sheet 'NAME' = e_sheet_name. " Name of Sheet

      CONCATENATE '*' tstct-ttext '(TCODE:' trancode ')/'
                  'Recording:' apqi-groupid
                  '(' x_deflt ')' INTO xl_title.
*
      PERFORM xl_put_to_cell USING 1 1 xl_title.
      PERFORM xl_put_to_cell USING 2 1 '*Description:'.
      PERFORM xl_put_to_cell USING 3 1 '*FIELDNAME'.
*
      PERFORM xl_put_to_cell USING 4  1 'STARTDATA'.
      PERFORM xl_put_to_cell USING 24 1 'ENDDATA'.
      xl_row = 2.
      xl_column = 1.
    ELSEIF dynflow-dynbegin = space.
*      e_size = 9.
*      SET PROPERTY OF sheet 'STANDARDFONTSIZE' = e_size.
      IF dynflow-fnam(4) NE 'BDC_'.
        IF NOT ( x_deflt = 'X' AND dynflow-fval NE space ).
          ADD 1 TO xl_column.
*
          READ TABLE ftext WITH KEY tabix = dyn_tabix.
          IF sy-subrc = 0.
            IF ftext-lineno NE space.
              CONCATENATE ftext-scrtext_m ftext-lineno INTO ftext-scrtext_m.
            ENDIF.
            PERFORM xl_put_to_cell USING xl_row xl_column ftext-scrtext_m.
          ENDIF.
*
          xl_row = xl_row + 1.
          PERFORM xl_put_to_cell USING xl_row xl_column dynflow-fnam.
*
          xl_row = xl_row + 1.
          IF dynflow-fval NE space.
            PERFORM xl_put_to_cell USING xl_row xl_column dynflow-fval.
          ENDIF.
          xl_row = xl_row - 2.

        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
*
  SET PROPERTY OF excel 'VISIBLE' = 1.
*
  FREE OBJECT cells.
  FREE OBJECT sheet.
  FREE OBJECT sheets.
  FREE OBJECT book.
  FREE OBJECT books.
  FREE OBJECT appl.
  FREE OBJECT excel.
*  DATA(lo_excel) = NEW zcl_excel( ).
*  DATA(lo_style) = lo_excel->add_new_style( ).
*  lo_style->font->bold = abap_true.
*  lo_style->font->size = 14.
*  DATA(lo_style_guid) = lo_style->get_guid( ).
*
*  LOOP AT dynflow.
**
*    MOVE sy-tabix TO dyn_tabix.
**
*    IF dynflow-dynbegin = 'T'.         " Tcode
**     Write Header Title to Excel
*      MOVE dynflow-fnam TO e_sheet_name.
*      DATA(lo_sheet) = lo_excel->get_active_worksheet( ).
*      lo_sheet->set_title( CONV #( e_sheet_name ) ).
*
*      CONCATENATE '*' tstct-ttext '(TCODE:' trancode ')/'
*                  'Recording:' apqi-groupid
*                  '(' x_deflt ')' INTO xl_title.
*
*      lo_sheet->set_column_width(
*        ip_column         = 1
*        ip_width_fix      = 12
*        ip_width_autosize = abap_false
*      ).
*
*      lo_sheet->set_cell(
*        ip_column            = 1
*        ip_row               = 1
*        ip_value             = xl_title
*        ip_style             = lo_style_guid
*      ).
*
*      lo_sheet->set_cell(
*        ip_column            = 1
*        ip_row               = 2
*        ip_value             = '*Description:'
*      ).
*      lo_sheet->set_cell(
*        ip_column            = 1
*        ip_row               = 3
*        ip_value             = '*FIELDNAME'
*      ).
*      lo_sheet->set_cell(
*        ip_column            = 1
*        ip_row               = 4
*        ip_value             = 'STARTDATA'
*      ).
*      lo_sheet->set_cell(
*        ip_column            = 1
*        ip_row               = 24
*        ip_value             = 'ENDDATA'
*      ).
*
*      xl_row = 2.
*      xl_column = 1.
*    ELSEIF dynflow-dynbegin = space.
**      e_size = 9.
**      SET PROPERTY OF sheet 'STANDARDFONTSIZE' = e_size.
*      IF dynflow-fnam(4) NE 'BDC_'.
*        IF NOT ( x_deflt = 'X' AND dynflow-fval NE space ).
*          ADD 1 TO xl_column.
*
*          lo_sheet->set_column_width(
*              ip_column         = xl_column
*              ip_width_fix      = 10
*              ip_width_autosize = abap_false
*            ).
*
*          READ TABLE ftext WITH KEY tabix = dyn_tabix.
*          IF sy-subrc = 0.
*            IF ftext-lineno NE space.
*              CONCATENATE ftext-scrtext_m ftext-lineno INTO ftext-scrtext_m.
*            ENDIF.
*            lo_sheet->set_cell(
*              ip_column            = xl_column
*              ip_row               = xl_row
*              ip_value             = ftext-scrtext_m
*            ).
*          ENDIF.
**
*          xl_row = xl_row + 1.
*          lo_sheet->set_cell(
*              ip_column            = xl_column
*              ip_row               = xl_row
*              ip_value             = dynflow-fnam
*            ).
**
*          xl_row = xl_row + 1.
*          IF dynflow-fval NE space.
*            lo_sheet->set_cell(
*              ip_column            = xl_column
*              ip_row               = xl_row
*              ip_value             = dynflow-fval
*            ).
*          ENDIF.
*          xl_row = xl_row - 2.
*
*        ENDIF.
*      ENDIF.
*    ENDIF.
*  ENDLOOP.
*
*  zcl_utility=>file_save_dialog(
*    EXPORTING
*      iv_default_extension   = 'XLSX'
*      iv_default_file_name   = |{ apqi-groupid }_Upload_Template.xlsx|
*      iv_bindata             = NEW zcl_excel_writer_2007( )->zif_excel_writer~write_file( lo_excel )
*      iv_and_open            = abap_true
*  ).
ENDFORM.                    " make_template_in_excel
*
FORM xl_put_to_cell USING row col value.
* here you get the CELL object
  CALL METHOD OF cells 'ITEM' = cell
    EXPORTING
    #1 = row
    #2 = col.
* here you use the CELL object
  SET PROPERTY OF cell 'VALUE' = value. " write VALUE to the excel cell
  GET PROPERTY OF cell 'FONT'  = font.
*
  IF row = 1.
    SET PROPERTY OF font 'BOLD' = 1.
    SET PROPERTY OF font 'SIZE' = 14.
  ELSE.
    SET PROPERTY OF font 'BOLD' = 0.
    SET PROPERTY OF font 'SIZE' = 9.
  ENDIF.
*
  FREE OBJECT cell.
  FREE OBJECT font.
*
ENDFORM.                    "FILL_CELL
*&---------------------------------------------------------------------*
*&      Form  CALL_OPEN_DIALOG_ER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM call_open_dialog_er USING p_default_extension.
  DATA: l_fullpath TYPE string,           "full path
        l_action   TYPE i,                "action
        l_filetab  TYPE filetable,        "file table
        l_rc       TYPE i.                "return code
  DATA: file_name TYPE string,
        file_path TYPE string.

  MOVE g_fname TO file_name.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = g_title
      default_filename        = file_name
      default_extension       = p_default_extension
      file_filter             = g_mask
      initial_directory       = file_path
      multiselection          = abap_false
    CHANGING
      file_table              = l_filetab
      rc                      = l_rc
      user_action             = l_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      OTHERS                  = 4.
  IF sy-subrc = 0.
    IF l_action = cl_gui_frontend_services=>action_cancel.
    ELSE.
      IF l_rc > 0.
        READ TABLE l_filetab INDEX 1 INTO g_fname.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " CALL_OPEN_DIALOG_ER
*&---------------------------------------------------------------------*
*&      Form  put_error_msg
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM put_error_msg .
*
  CALL FUNCTION 'POPUP_TO_CONFIRM_MSG_WITH_CALL'
    EXPORTING
      txt01                         = 'I Can''t found the ''STARTDATA'' tag.'
      txt02                         = space
      txt03                         = space
*             VALUE(TXT04) DEFAULT SPACE
*             VALUE(PAR01) DEFAULT SPACE
*             VALUE(PAR02) DEFAULT SPACE
*             VALUE(PAR03) DEFAULT SPACE
*             VALUE(PAR04) DEFAULT SPACE
      new_line1                     = 'X'
      new_line2                     = 'X'
      new_line3                     = 'X'
      title                         = 'Failure Upload file'
      length                        = 100
      txt_first_pushbutton          = 'Confirm.'
*             VALUE(TXT_SECOND_PUSHBUTTN) OPTIONAL
*             VALUE(FUNCT_MODULE) DEFAULT SPACE
    EXCEPTIONS
      function_module_missed        = 1
      text_second_pushbutton_missed = 2.
*
*    WRITE: / 'ERROR :' COLOR COL_NEGATIVE,
*             'I Can''t found the ''STARTDATA'' tag.'.

ENDFORM.                    " put_error_msg
*&---------------------------------------------------------------------*
*&      Form  CONFIRM_PROCESSING_STEP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM confirm_processing_step .
*
  DATA: t_tcode(60),
        t_datafile(60),
        t_record(60),
        t_question(60)     VALUE 'Processing data ?',
        t_indata_lines(10).
  DATA: t_text1(120),
        t_text2(120).
*
  DATA: answer.

  DATA: lt_disp_tab TYPE sesf_string_tab,
        ls_disp_tab LIKE LINE OF lt_disp_tab.

  indata_lines = 0.
  LOOP AT indata.
    IF indata(9) = 'STARTDATA'.        "data start row
      indata_lines = 1.
    ELSEIF indata(7) = 'ENDDATA'.          "data finished row
      ADD 1 TO indata_lines.
      EXIT.
    ELSE.
      IF indata_lines > 0.
        ADD 1 TO indata_lines.
      ENDIF.
    ENDIF.
  ENDLOOP.

  CONCATENATE 'Tcode:' tstct-tcode tstct-ttext INTO t_tcode
              SEPARATED BY space.
*
  CONCATENATE 'Data file:' p_filename INTO t_datafile
                           SEPARATED BY space.

  WRITE indata_lines TO t_indata_lines.
  CONCATENATE 'Record count:' t_indata_lines INTO t_record
                           SEPARATED BY space.

  CONCATENATE t_tcode t_question INTO t_text1 SEPARATED BY ' / '.
  t_text2 = t_record.
  IF p_filename IS NOT INITIAL.
    CONCATENATE t_text2 t_datafile INTO t_text2 SEPARATED BY ' / '.
  ENDIF.

* 미리보기 화면 추가
  DATA: lt_user_buttons TYPE STANDARD TABLE OF smp_dyntxt,
        lv_title        TYPE sytitle.
  MOVE t_text1 TO lv_title.
  lt_user_buttons = VALUE #(  ( text = '실행' icon_id = '@0V@'  icon_text = '실행' quickinfo = '실행' )
                              ( text = '취소' icon_id = '@0W@'  icon_text = '취소' quickinfo = '취소' ) ).
  CALL FUNCTION 'BKK_POPUP_DISPLAY_LIST'
    EXPORTING
      i_callback_program      = sy-repid
      i_callback_write_form   = 'DISPLAY_DATA'
      i_title                 = lv_title
      i_start_column          = 5
      i_start_row             = 5
      i_end_column            = 70
      i_end_row               = 15
      i_display_ok_button     = space
      i_display_cancel_button = space
*    IMPORTING
*     ANSWER                  = LV_ANSWER
    TABLES
      user_buttons            = lt_user_buttons.
ENDFORM.                    " CONFIRM_PROCESSING_STEP
*&---------------------------------------------------------------------*
*&      Form  put_sapgui_message
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM put_sapgui_message .
*
  DATA: t_text(50).
*
  MOVE 'Processing:' TO t_text.
  WRITE bdc_count    TO t_text+15(10).
  WRITE indata_lines TO t_text+30(10).
*
  MOVE '/' TO t_text+27(1).
  CONDENSE t_text.
*
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      text = t_text.
*
ENDFORM.                    " put_sapgui_message
*&---------------------------------------------------------------------*
*&      Form  get_tab_char
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_tab_char .
*
  DATA: l_tab(10), l_char_tab(10).
*
  MOVE '\X\09' TO l_tab.
*
  CALL FUNCTION 'STPU1_HEX_TO_CHAR'
    EXPORTING
      hex_string  = l_tab
    IMPORTING
      char_string = l_char_tab.
*
  MOVE l_char_tab TO tab.

ENDFORM.                    " get_tab_char
*&---------------------------------------------------------------------*
*& Form F4IF_GRPID
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- P_GRPID
*&---------------------------------------------------------------------*
FORM f4if_grpid.
  DATA : BEGIN OF lt_apqi OCCURS 0,
           groupid  LIKE apqi-groupid,
           userid   LIKE apqi-userid,
           creator  LIKE apqi-creator,
           credate  LIKE apqi-credate,
           cretime  LIKE apqi-cretime,
           transcnt LIKE apqi-transcnt,
           msgcnt   LIKE apqi-msgcnt,
         END OF lt_apqi.

  SELECT
    groupid
    userid
    creator
    credate
    cretime
    transcnt
    msgcnt
    INTO CORRESPONDING FIELDS OF TABLE lt_apqi
  FROM apqi
  WHERE datatyp EQ '%BDC'
    AND mandant EQ p_mandt.
  IF sy-subrc EQ 0.
    SORT lt_apqi BY groupid.
  ENDIF.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE  = ' '
      retfield        = 'GROUPID'
*     PVALKEY         = ' '
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_GRPID'
*     STEPL           = 0
      window_title    = 'Transaction Recordings'
*     VALUE           = ' '
      value_org       = 'S'
*     MULTIPLE_CHOICE = ' '
*     DISPLAY         = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM   = ' '
*     CALLBACK_METHOD =
*     MARK_TAB        =
*   IMPORTING
*     USER_RESET      =
    TABLES
      value_tab       = lt_apqi
*     FIELD_TAB       =
*     RETURN_TAB      =
*     DYNPFLD_MAPPING =
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_FIELD_CAT_LVC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM create_field_cat_lvc  TABLES p_table
                            USING  col_pos
                                   key
                                   fieldname
                                   reptext
                                   datatype
                                   outputlen
                                   convexit
                                   just
                                   nozero
                                   meins
                                   waers
                                   do_sum.
  DATA : st_fcat_lvc  LIKE lvc_s_fcat.
  st_fcat_lvc-col_pos   = col_pos.
  st_fcat_lvc-key       = key.
  st_fcat_lvc-fieldname = fieldname.
  st_fcat_lvc-reptext   = reptext.
  st_fcat_lvc-datatype  = datatype.
  st_fcat_lvc-outputlen = outputlen.
  st_fcat_lvc-convexit  = convexit.
  st_fcat_lvc-just      = just.
  st_fcat_lvc-no_zero   = nozero.
  st_fcat_lvc-qfieldname = meins.
  st_fcat_lvc-cfieldname = waers.
  st_fcat_lvc-do_sum     = do_sum.

  APPEND st_fcat_lvc TO p_table.
ENDFORM.                    " CREATE_FIELD_CAT_LVC

FORM display_data.
  FIELD-SYMBOLS : <dyn_table> TYPE STANDARD TABLE,
                  <dyn_wa>,
                  <dyn_field>.
  DATA : dy_table TYPE REF TO data,
         dy_line  TYPE REF TO data.
  DATA : lt_alv_fieldcat TYPE lvc_t_fcat.
  DATA : lv_idx       TYPE i,
         lv_tabix(10) TYPE n,
         lv_fname(20) TYPE c.

  DATA : lv_field(100) TYPE c.
  FIELD-SYMBOLS <lfs> TYPE any.

  CLEAR : lt_alv_fieldcat[].
  SORT fnam BY order.

  PERFORM create_field_cat_lvc TABLES lt_alv_fieldcat  USING
          0  'X'  'BDC_ROWIDX' 'INDEX' 'INT4'  '10'  ''  'R' ''  ''  ''  ''.

  LOOP AT fnam.
    lv_tabix = sy-tabix.
    CLEAR ftext.
    READ TABLE dynflow WITH KEY fnam = fnam-fnam.
    IF sy-subrc EQ 0.
      READ TABLE ftext WITH KEY tabix = sy-tabix.
    ENDIF.
    CONDENSE fnam-fnam NO-GAPS.
    IF ftext-fieldtext IS INITIAL.
      IF ftext-reptext IS NOT INITIAL.
        MOVE ftext-reptext TO ftext-fieldtext.
      ELSEIF ftext-scrtext_l IS NOT INITIAL.
        MOVE ftext-scrtext_l TO ftext-fieldtext.
      ELSEIF ftext-scrtext_m IS NOT INITIAL.
        MOVE ftext-scrtext_m TO ftext-fieldtext.
      ELSEIF ftext-scrtext_s IS NOT INITIAL.
        MOVE ftext-scrtext_s TO ftext-fieldtext.
      ELSE.
        MOVE fnam-fnam TO ftext-fieldtext.
      ENDIF.
    ENDIF.
*    REPLACE ALL OCCURRENCES OF REGEX '[^[:alnum:]|_|-]' IN fnam-fnam WITH SPACE.
    CONCATENATE 'F' lv_tabix INTO lv_fname.
    PERFORM create_field_cat_lvc TABLES lt_alv_fieldcat  USING
          fnam-order  ''  lv_fname ftext-fieldtext 'CHAR'  '50'  ''  'L' ''  ''  ''  ''.
  ENDLOOP.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_alv_fieldcat
    IMPORTING
      ep_table        = dy_table.

  ASSIGN dy_table->* TO <dyn_table>.

  CREATE DATA dy_line LIKE LINE OF <dyn_table>.

  ASSIGN dy_line->* TO <dyn_wa>.

  lv_idx = 0.
  CLEAR : start, data, end, fieldname, seq.
  LOOP AT indata.
    IF indata(1) = '*'.                "comment row
      CONTINUE.
    ENDIF.
*
    IF indata(9) = 'STARTDATA'.        "data start row
      start = 'X'.
      data  = 'X'.
      IF fieldname = space.
        ford[] = fnam[].
      ENDIF.
      CLEAR fieldname.
    ENDIF.
*
    IF indata(7) = 'ENDDATA'.          "data finished row
      end = 'X'.
    ENDIF.
*
    IF indata(9) = 'FIELDNAME'.
      fieldname = 'X'.
    ENDIF.
*
    CHECK data      = 'X' OR
          fieldname = 'X'.
*
    len = strlen( indata ).
    CLEAR: n,o,seq,dat.
    REFRESH bdc_value.
    DO.
      IF n => len.
        EXIT.
      ENDIF.
*
      ch = indata+n(1).
      IF ch = tab.
        seq = seq + 1.
        PERFORM move_bdc.
        ADD 1 TO n.
        CLEAR: o, dat.
      ELSE.
        dat+o(1) = indata+n(1).
        ADD 1 TO: o, n.
      ENDIF.
    ENDDO.
*
    seq = seq + 1.
    PERFORM move_bdc.
    CLEAR dat.

    IF start EQ 'X'.
      LOOP AT bdc_value.
        READ TABLE ford WITH KEY order = sy-tabix.
        IF sy-subrc EQ 0.
          lv_tabix = sy-tabix.
          CONCATENATE 'F' lv_tabix INTO lv_fname.
*          CONDENSE ford-fnam NO-GAPS.
*          REPLACE ALL OCCURRENCES OF REGEX '[^[:alnum:]|_|-]' IN ford-fnam WITH SPACE.
          CONCATENATE '<DYN_WA>-' lv_fname INTO lv_field.
          ASSIGN (lv_field) TO <lfs>.
          IF <lfs> IS ASSIGNED.
            <lfs> = bdc_value.
            UNASSIGN <lfs>.
          ENDIF.
        ENDIF.
      ENDLOOP.
      ADD 1 TO lv_idx.
      lv_field = '<DYN_WA>-BDC_ROWIDX'.
      ASSIGN (lv_field) TO <lfs>.
      IF <lfs> IS ASSIGNED.
        <lfs> = lv_idx.
        UNASSIGN <lfs>.
      ENDIF.
      APPEND <dyn_wa> TO <dyn_table>. CLEAR <dyn_wa>.
    ENDIF.
    IF end EQ 'X'.
      EXIT.
    ENDIF.
  ENDLOOP.

  CALL METHOD cl_salv_table=>factory
    IMPORTING
      r_salv_table = DATA(lr_salv)
    CHANGING
      t_table      = <dyn_table>.      "ALV로 출력할 Internal Table

  lr_salv->set_screen_status(
    pfstatus      =  'USER_BUTTONS'
    report        =  'SAPLFBK_TOOLS' ).
  lr_salv->get_display_settings( )->set_striped_pattern( cl_salv_display_settings=>true ).  "줄무늬 패턴
  lr_salv->get_columns( )->set_optimize( abap_true ).   "열 너비 최적화

  SORT lt_alv_fieldcat BY fieldname.
  DATA(lr_columns) = lr_salv->get_columns( ).
  DATA lr_column   TYPE REF TO cl_salv_column_table.

  LOOP AT lr_columns->get( ) INTO DATA(ls_columns).     "열 텍스트를 필드명으로 변경
    READ TABLE lt_alv_fieldcat INTO DATA(ls_alv_fieldcat) WITH KEY fieldname = ls_columns-columnname BINARY SEARCH.
    IF sy-subrc EQ 0.
      lr_column ?= lr_columns->get_column( ls_columns-columnname ).
      lr_column->set_short_text( CONV #( ls_alv_fieldcat-reptext ) ).
      lr_column->set_medium_text( CONV #( ls_alv_fieldcat-reptext ) ).
      lr_column->set_long_text( CONV #( ls_alv_fieldcat-reptext ) ).
      lr_column->set_key( CONV #( ls_alv_fieldcat-key ) ).
    ENDIF.
  ENDLOOP.

  "ALV 이벤트
  DATA(lr_event_tab) = lr_salv->get_event( ).
  DATA lr_events TYPE REF TO lcl_handle_events.
  CREATE OBJECT lr_events.
  SET HANDLER lr_events->on_user_command FOR lr_event_tab.
  lr_salv->display( ).            "ALV 출력

  IF gv_answer NE 'BUTTON1'.
    REFRESH indata.
    CLEAR indata_lines.
  ENDIF.
ENDFORM.

댓글