ABAP BDC 可输入不同事务码的BDC

先上源码,后面有使用截图

*&---------------------------------------------------------------------*
*& Report  ZBDC_TG
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZBDC_TG.

TABLES: sscrfields.
**====================================================================*
*
**<*> NOTES:
*> Titles and headers: Programmable Logic Data Interface (PLDI)
*> Selection texts:
* DISMOD: * Call mode
* EXT: Extended logic
* FILE1: Data file  (Tab delimited)
* FILE2: Logic Level 1 (Tab delimited
* FILE3: Logic Level 2 (Tab delimited)
* FILE_EXT: Extended logic (Tab delimited)
* SESSION: * Session name
* START: Data start at row
* TCODE: Transaction code
* MASK: Mask

*> Text symbols
* 001: Batch Input (BDC Session)
* 002: PLDI was created on June.27.1997 by budi_rachman@yahoo.com
* 003: Release 3.2
* 004: Call transaction
* 005: Max. 64 columns & 128 characters per cell
* 006: Max. 128 columns & 64 characters per cell
* 007: Max. 30 columns & 40 characters per cell
* 008: Data Structure
* 009: Max. 234 columns & 35 characters per cell
**====================================================================*
*

*$*$*******************************************************************
*$*$*                  Data declarations                              *
*$*$*******************************************************************

* Structure Max.30 cols and 40 chars per cell
DATA: BEGIN OF  t30x040 OCCURS 100,
  b01(40), u01(40), d01(40), i01(40), r01(40),
  b02(40), u02(40), d02(40), i02(40), r02(40),
  b03(40), u03(40), d03(40), i03(40), r03(40),
  b04(40), u04(40), d04(40), i04(40), r04(40),
  b05(40), u05(40), d05(40), i05(40), r05(40),
  b06(40), u06(40), d06(40), i06(40), r06(40),
END OF t30x040.

* Structure Max.128 cols and 64 chars per cell
DATA: BEGIN OF t128x64 OCCURS 1024,
  b001(64), r001(64), a001(64), c001(64),
  b002(64), r002(64), a002(64), c002(64),
  b003(64), r003(64), a003(64), c003(64),
  b004(64), r004(64), a004(64), c004(64),
  b005(64), r005(64), a005(64), c005(64),
  b006(64), r006(64), a006(64), c006(64),
  b007(64), r007(64), a007(64), c007(64),
  b008(64), r008(64), a008(64), c008(64),
  b009(64), r009(64), a009(64), c009(64),
  b010(64), r010(64), a010(64), c010(64),
  b011(64), r011(64), a011(64), c011(64),
  b012(64), r012(64), a012(64), c012(64),
  b013(64), r013(64), a013(64), c013(64),
  b014(64), r014(64), a014(64), c014(64),
  b015(64), r015(64), a015(64), c015(64),
  b016(64), r016(64), a016(64), c016(64),
  b017(64), r017(64), a017(64), c017(64),
  b018(64), r018(64), a018(64), c018(64),
  b019(64), r019(64), a019(64), c019(64),
  b020(64), r020(64), a020(64), c020(64),
  b021(64), r021(64), a021(64), c021(64),
  b022(64), r022(64), a022(64), c022(64),
  b023(64), r023(64), a023(64), c023(64),
  b024(64), r024(64), a024(64), c024(64),
  b025(64), r025(64), a025(64), c025(64),
  b026(64), r026(64), a026(64), c026(64),
  b027(64), r027(64), a027(64), c027(64),
  b028(64), r028(64), a028(64), c028(64),
  b029(64), r029(64), a029(64), c029(64),
  b030(64), r030(64), a030(64), c030(64),
  b031(64), r031(64), a031(64), c031(64),
  b032(64), r032(64), a032(64), c032(64),
END OF t128x64.

* Structure Max.64 cols and 128 chars per cell
DATA: BEGIN OF t64x128 OCCURS 1024,
  b001(128), r001(128), a001(128), c001(128),
  b002(128), r002(128), a002(128), c002(128),
  b003(128), r003(128), a003(128), c003(128),
  b004(128), r004(128), a004(128), c004(128),
  b005(128), r005(128), a005(128), c005(128),
  b006(128), r006(128), a006(128), c006(128),
  b007(128), r007(128), a007(128), c007(128),
  b008(128), r008(128), a008(128), c008(128),
  b009(128), r009(128), a009(128), c009(128),
  b010(128), r010(128), a010(128), c010(128),
  b011(128), r011(128), a011(128), c011(128),
  b012(128), r012(128), a012(128), c012(128),
  b013(128), r013(128), a013(128), c013(128),
  b014(128), r014(128), a014(128), c014(128),
  b015(128), r015(128), a015(128), c015(128),
  b016(128), r016(128), a016(128), c016(128),
END OF t64x128.

* Structure Max.234 cols and 35 chars per cell
DATA: BEGIN OF t234x35 OCCURS 1024,
      f01(35), a01(35),r01(35), a76(35), b01(35), i01(35),
      f02(35), a02(35),r02(35), a77(35), b02(35), i02(35),
      f03(35), a03(35),r03(35), a78(35), b03(35), i03(35),
      f04(35), a04(35),r04(35), a40(35), b04(35), i04(35),
      f05(35), a05(35),r05(35), a41(35), b05(35), i05(35),
      f06(35), a06(35),r06(35), a42(35), b06(35), i06(35),
      f07(35), a07(35),r07(35), a43(35), b07(35), i07(35),
      f08(35), a08(35),r08(35), a44(35), b08(35), i08(35),
      f09(35), a09(35),r09(35), a45(35), b09(35), i09(35),
      f10(35), a10(35),r10(35), a46(35), b10(35), i10(35),
      f11(35), a11(35),r11(35), a47(35), b11(35), i11(35),
      f12(35), a12(35),r12(35), a48(35), b12(35), i12(35),
      f13(35), a13(35),r13(35), a49(35), b13(35), i13(35),
      f14(35), a14(35),r14(35), a50(35), b14(35), i14(35),
      f15(35), a15(35),r15(35), a51(35), b15(35), i15(35),
      f16(35), a16(35),r16(35), a52(35), b16(35), i16(35),
      f17(35), a17(35),r17(35), a53(35), b17(35), i17(35),
      f18(35), a18(35),r18(35), a54(35), b18(35), i18(35),
      f19(35), a19(35),r19(35), a55(35), b19(35), i19(35),
      f20(35), a20(35),r20(35), a56(35), b20(35), i20(35),
      f21(35), a21(35),r21(35), a57(35), b21(35), i21(35),
      f22(35), a22(35),r22(35), a58(35), b22(35), i22(35),
      f23(35), a23(35),r23(35), a59(35), b23(35), i23(35),
      f24(35), a24(35),r24(35), a60(35), b24(35), i24(35),
      f25(35), a25(35),r25(35), a61(35), b25(35), i25(35),
      f26(35), a26(35),r26(35), a62(35), b26(35), i26(35),
      f27(35), a27(35),r27(35), a63(35), b27(35), i27(35),
      f28(35), a28(35),r28(35), a64(35), b28(35), i28(35),
      f29(35), a29(35),r29(35), a65(35), b29(35), i29(35),
      f30(35), a30(35),r30(35), a66(35), b30(35), i30(35),
      f31(35), a31(35),r31(35), a67(35), b31(35), i31(35),
      f32(35), a32(35),r32(35), a68(35), b32(35), i32(35),
      f33(35), a33(35),r33(35), a69(35), b33(35), i33(35),
      f34(35), a34(35),r34(35), a70(35), b34(35), i34(35),
      f35(35), a35(35),r35(35), a71(35), b35(35), i35(35),
      f36(35), a36(35),r36(35), a72(35), b36(35), i36(35),
      f37(35), a37(35),r37(35), a73(35), b37(35), i37(35),
      f38(35), a38(35),r38(35), a74(35), b38(35), i38(35),
      f39(35), a39(35),r39(35), a75(35), b39(35), i39(35),
END OF t234x35.


FIELD-SYMBOLS <ptr>.

CONSTANTS: eof VALUE '@',         "End of file 结束文件标识   logic文件
                                  "
           dat(3) VALUE 'DAT'.    "Data format

DATA:
  BEGIN OF i_logic1 OCCURS 100,
    name  LIKE bdcdata-fnam,
    value LIKE bdcdata-fval,
  END OF i_logic1.
DATA: i_logic2   LIKE i_logic1 OCCURS 100 WITH HEADER LINE,
      i_logic3   LIKE i_logic1 OCCURS 100 WITH HEADER LINE,
      i_bdctable LIKE bdcdata  OCCURS 100 WITH HEADER LINE, "最终拼成的bdcdata
      text(40),                        "Text 40 chars
      cacah TYPE i.                    "Jumlah transaksi

PARAMETERS:
  tcode LIKE tstc-tcode OBLIGATORY," DEFAULT 'MM01', Transaction code
  file2 LIKE rlgrap-filename OBLIGATORY DEFAULT 'C:\',      "Logic-1
  file3 LIKE rlgrap-filename,                               "Logic-2
  file_ext LIKE rlgrap-filename DEFAULT space, "Extended logic
  file1 LIKE rlgrap-filename,           "Data   数据文件
  mask DEFAULT '&'.                     "Skip processing

SELECT-OPTIONS:
  start FOR sy-tabix DEFAULT 1 TO 999999. "数据开始行

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: mode RADIOBUTTON GROUP clbi. "batch input: BDC Insert:这是一种不直接运行,而是将BDC程序生成session,间接运行的一种方法.
                                         "调用function 'BDC_INSERT'来把BDCDATA生成SESSION. 然后手工在SM35执行.
SELECTION-SCREEN COMMENT  3(42) text-001.
SELECTION-SCREEN END   OF LINE.
PARAMETERS:  session LIKE d0100-mapn DEFAULT sy-uname. "会话名而已.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: temp RADIOBUTTON GROUP clbi DEFAULT 'X'.
SELECTION-SCREEN COMMENT  3(42) text-004.
SELECTION-SCREEN END   OF LINE.
PARAMETERS: dismod LIKE ibipparms-callmode DEFAULT 'A'. "Processing Mode A:Display all screens E:Display errors N:Background processing
PARAMETERS: nobinpt LIKE ctu_params-nobinpt.
PARAMETERS: template LIKE rlgrap-filename.    "template file from SHDB   Recorded file
PARAMETERS: textfile LIKE rlgrap-filename.    "Converted file
SELECTION-SCREEN PUSHBUTTON /69(13) butok USER-COMMAND zget.
SELECTION-SCREEN BEGIN OF BLOCK btcx WITH FRAME TITLE text-008.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: s30x40 RADIOBUTTON GROUP btcx.
SELECTION-SCREEN COMMENT  3(42) text-007.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: s64x128 RADIOBUTTON GROUP btcx.
SELECTION-SCREEN COMMENT  3(42) text-005.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: s128x64 RADIOBUTTON GROUP btcx.
SELECTION-SCREEN COMMENT  3(42) text-006.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: s234x35 RADIOBUTTON GROUP btcx.
SELECTION-SCREEN COMMENT  3(42) text-009.
SELECTION-SCREEN END   OF LINE.

SELECTION-SCREEN END   OF BLOCK btcx.

*SELECTION-SCREEN BEGIN OF BLOCK BTCI WITH FRAME TITLE TEXT-003.
*SELECTION-SCREEN BEGIN OF LINE.
*SELECTION-SCREEN COMMENT 1(60) TEXT-002.
*SELECTION-SCREEN END OF LINE.
*
*SELECTION-SCREEN END   OF BLOCK BTCI.
*$*$*******************************************************************
*$*$*          F4输入帮助  选择文件框                                     *
*$*$*******************************************************************

AT SELECTION-SCREEN ON VALUE-REQUEST FOR file1.
  PERFORM call_file USING file1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR file2.
  PERFORM call_file USING file2.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR file_ext.
  PERFORM call_file USING file_ext.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR file3.
  PERFORM call_file USING file3.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR template.
  PERFORM call_file USING template.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR textfile.
  PERFORM call_file USING textfile.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'ZGET'.
    PERFORM generate_format_file USING template.
  ENDIF.

INITIALIZATION.
  MOVE 'Generate File' TO butok.

*$*$*******************************************************************
*$*$*            Call main routine                                    *
*$*$*******************************************************************

START-OF-SELECTION.

  PERFORM main_program.
  PERFORM call_report.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'ZGET'.
      PERFORM generate_format_file USING template.
  ENDCASE.
*---------------------------------------------------------------------*
*       FORM MAIN_PROGRAM                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM main_program.

* Logic level-1, level-2 and extended logic are being used
  IF file3 NE space AND file2 NE space AND file_ext NE space.
    PERFORM level_pldi USING 3.

* Only logic level-1 is being used
  ELSEIF file3 = space AND file2 NE space.
    PERFORM level_pldi USING 1.

** Logic level-1 and level-2 are being used
  ELSEIF file3 NE space AND file2 NE space.
    PERFORM level_pldi USING 2.

  ELSE.
    tcode = '<?>'.

  ENDIF.

ENDFORM.                    "MAIN_PROGRAM

*---------------------------------------------------------------------*
*       FORM CALL_REPORT                                              *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM call_report.
*> Report
  WRITE:/ 'Transaction code:', tcode.
  IF file1 EQ space.
    WRITE:/ 'Logic without data has been executed by', sy-uname.
  ELSEIF mode NE space.
    WRITE:/ 'There are ', cacah LEFT-JUSTIFIED.
    WRITE:  'records have been executed by', sy-uname.
    WRITE:/ 'which used batch input transaction.'.
    WRITE:/ 'Batch input name:', session, '.'.
    WRITE:/ 'Use SM35 for further execution.'.
  ELSE.
    WRITE:/ 'There are ', cacah LEFT-JUSTIFIED.
    WRITE:  'records have been executed by', sy-uname.
    WRITE:/ 'which used online transaction type', dismod, '.'.
  ENDIF.

ENDFORM.                    "CALL_REPORT

*---------------------------------------------------------------------*
*       FORM LEVEL_PLDI                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  LOGIC_LEVEL                                                   *
*---------------------------------------------------------------------*
FORM level_pldi USING logic_level.

  IF s64x128 = 'X'.
    PERFORM call_pldi TABLES t64x128 USING logic_level.
  ELSEIF s128x64 = 'X'.
    PERFORM call_pldi TABLES t128x64 USING logic_level.
  ELSEIF s234x35 = 'X'.
    PERFORM call_pldi TABLES t234x35 USING logic_level.
  ELSE.
    PERFORM call_pldi TABLES t30x040 USING logic_level.
  ENDIF.

ENDFORM.                    "LEVEL_PLDI

*---------------------------------------------------------------------*
*       FORM CALL_PLDI                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  DATA_STRUCT                                                   *
*  -->  LOGIC_LEVEL                                                   *
*---------------------------------------------------------------------*
FORM call_pldi TABLES data_struct USING logic_level.

  PERFORM zgenerate_data_convertion
    TABLES
            data_struct
            start
    USING
            tcode
            file1
            file2
            file3
            session
            mode
            dismod
            logic_level
            start-low
            file_ext
            cacah.

ENDFORM.                    "CALL_PLDI

*---------------------------------------------------------------------*
*       FORM ZGENERATE_DATA_CONVERTION                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  ITAB                                                          *
*  -->  START                                                         *
*  -->  TCODE                                                         *
*  -->  FILEDATA                                                      *
*  -->  FILEBDC                                                       *
*  -->  FILECHILD                                                     *
*  -->  SESSION                                                       *
*  -->  MODE                                                          *
*  -->  DISMOD                                                        *
*  -->  LEVEL                                                         *
*  -->  AWAL                                                          *
*  -->  FILEEXTENDED                                                  *
*  -->  CACAH                                                         *
*---------------------------------------------------------------------*
FORM zgenerate_data_convertion
   TABLES
            itab                  "data_struct  注释为调用的实参 方便查看 下同
            start                 "start
   USING
            tcode
            filedata              "file1  data
            filebdc               "file2  Logic Level 1
            filechild             "file3  Logic Level 2
            session               "session
            mode                  "mode
            dismod                "dismod
            level                 "logic_level
            awal                  "start-low
            fileextended          "file_ext
            cacah.                "cacah

*######################################################################
*@ Rutin ini berfungsi untuk mengubah file logic dan file data menjadi
*@ bentuk yang dimengerti oleh ABAP, yaitu BDC table.
*######################################################################

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* Standar WS_Upload yang mesti ada
*-----------------------------------*

  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      filename            = filebdc
      filetype            = dat
    TABLES
      data_tab            = i_logic1
    EXCEPTIONS
      conversion_error    = 1
      file_open_error     = 2
      file_read_error     = 3
      invalid_table_width = 4
      invalid_type        = 5
      no_batch            = 6
      unknown_error       = 7
      OTHERS              = 8.

  IF filedata <> space.
DATA:lv_raw TYPE truxs_t_text_data.

*---------------自增加 替换原上传数据文件函数-----------
*        实现excl文件上传。
*        20151113  yang
*----------------------------------
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
  EXPORTING
*   I_FIELD_SEPERATOR          =
*   I_LINE_HEADER              =
    I_TAB_RAW_DATA             = lv_raw
    I_FILENAME                 = filedata
  TABLES
    I_TAB_CONVERTED_DATA       =  itab
 EXCEPTIONS
   CONVERSION_FAILED          = 1
   OTHERS                     = 2
          .
              .
"---------------原来的上传数据函数-----------
*    CALL FUNCTION 'WS_UPLOAD'
*      EXPORTING
*        filename            = filedata
*        filetype            = dat
*      TABLES
*        data_tab            = itab
*      EXCEPTIONS
*        conversion_error    = 1
*        file_open_error     = 2
*        file_read_error     = 3
*        invalid_table_width = 4
*        invalid_type        = 5
*        no_batch            = 6
*        unknown_error       = 7
*        OTHERS              = 8.
*
  ELSE.
    ASSIGN COMPONENT 1 OF STRUCTURE itab TO <ptr>.
    <ptr> = '/'.
    APPEND itab.
    start = 1.
  ENDIF.
"-------------------------------------------------*

*if sy-subrc = 0.
* Tahap inisialisasi *
  PERFORM open_prog USING mode session.

* Pengecekan level logic *
  IF level = 1.
    PERFORM level_1 TABLES itab start USING cacah dismod tcode mode.

  ELSEIF level = 2.
    CALL FUNCTION 'WS_UPLOAD'
      EXPORTING
        filename            = filechild
        filetype            = dat
      TABLES
        data_tab            = i_logic2
      EXCEPTIONS
        conversion_error    = 1
        file_open_error     = 2
        file_read_error     = 3
        invalid_table_width = 4
        invalid_type        = 5
        no_batch            = 6
        unknown_error       = 7
        OTHERS              = 8.

   PERFORM level_2 TABLES itab start USING cacah dismod tcode mode awal
.

  ELSE.
    CALL FUNCTION 'WS_UPLOAD'
      EXPORTING
        filename            = filechild
        filetype            = dat
      TABLES
        data_tab            = i_logic2
      EXCEPTIONS
        conversion_error    = 1
        file_open_error     = 2
        file_read_error     = 3
        invalid_table_width = 4
        invalid_type        = 5
        no_batch            = 6
        unknown_error       = 7
        OTHERS              = 8.

    IF fileextended EQ space.
      CALL FUNCTION 'UPLOAD'
        EXPORTING
          filetype            = dat
        TABLES
          data_tab            = i_logic3
        EXCEPTIONS
          conversion_error    = 1
          file_open_error     = 2
          file_read_error     = 3
          invalid_table_width = 4
          invalid_type        = 5
          no_batch            = 6
          unknown_error       = 7
          OTHERS              = 8.
    ELSE.
      CALL FUNCTION 'WS_UPLOAD'
        EXPORTING
          filename            = fileextended
          filetype            = dat
        TABLES
          data_tab            = i_logic3
        EXCEPTIONS
          conversion_error    = 1
          file_open_error     = 2
          file_read_error     = 3
          invalid_table_width = 4
          invalid_type        = 5
          no_batch            = 6
          unknown_error       = 7
          OTHERS              = 8.
    ENDIF.

   PERFORM level_3 TABLES itab start USING cacah dismod tcode mode awal
.
  ENDIF.

  PERFORM close_prog USING mode.

ENDFORM.                    "ZGENERATE_DATA_CONVERTION

*---------------------------------------------------------------------*
*       FORM CALL_FILE                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  FILENAME                                                      *
*---------------------------------------------------------------------*
FORM call_file USING filename.

  CALL FUNCTION 'F4_FILENAME'
       EXPORTING
*           PROGRAM_NAME  = SYST-REPID
            dynpro_number = syst-dynnr
            field_name    = 'PATH'
       IMPORTING
            file_name     = filename.

ENDFORM.                    "CALL_FILE


**^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^****
*** PLDI (Programmable Logic Data Interface)
*** Fungsi-fungsi standar untuk PLDI
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* Konversi tabel 2 kolom menjadi tabel BDC *
*------------------------------------------*

FORM dynpro USING dynbegin name value.

  IF dynbegin =  'X'.
    CLEAR  i_bdctable.
    MOVE: name  TO i_bdctable-program,
          value TO i_bdctable-dynpro ,
          'X'   TO i_bdctable-dynbegin.
    APPEND i_bdctable.

  ELSE.

    CLEAR  i_bdctable.
    MOVE: name    TO i_bdctable-fnam,
          value   TO i_bdctable-fval.
    APPEND i_bdctable.

  ENDIF.

ENDFORM.                    "DYNPRO

*&---------------------------------------------------------------------
*
*&      Form  GENERATE_BDC
*&---------------------------------------------------------------------
*
*  Pemetaan dari logic file dan data file ke BDC map
*这函数时解析convert file 的,可以看出来data file应该是什么样的格式。
*----------------------------------------------------------------------
*
*  -->  logic file dan data file
*  <--  BDC table
*----------------------------------------------------------------------
*
FORM generate_bdc TABLES logic_t STRUCTURE i_logic1 USING data_t.

  FIELD-SYMBOLS <ptr>.
  DATA nx TYPE i.

  LOOP AT logic_t FROM '2'.

    IF logic_t-name = eof OR
       ( logic_t-name = space AND logic_t-value = space ).
      EXIT.

    ELSEIF logic_t-name(1) = '<' OR logic_t-value = space.
      CONTINUE.

    ELSEIF logic_t-value(1) = '&'.   "&后跟数字表示变量
      nx = logic_t-value+1(4).
      ASSIGN COMPONENT nx OF STRUCTURE data_t TO <ptr>.
      IF <ptr> NE mask.
        PERFORM dynpro USING
          ' ' logic_t-name <ptr>.
      ELSE.
        CONTINUE.
      ENDIF.

    ELSEIF logic_t-value(1) = '='.  "=后面表示固定值
      PERFORM dynpro USING
        ' ' logic_t-name logic_t-value+1(131).

    ELSEIF logic_t-name = 'BDC_OKCODE' OR logic_t-name = space.
      PERFORM dynpro USING
        ' ' 'BDC_OKCODE' logic_t-value.

    ELSEIF logic_t-name = 'BDC_CURSOR' OR logic_t-name = 'CURSOR'.
      PERFORM dynpro USING
        ' ' 'BDC_CURSOR' logic_t-value.

    ELSE.
      PERFORM dynpro USING
        'X' logic_t-name logic_t-value.
    ENDIF.

  ENDLOOP.

ENDFORM.                               " GENERATE_BDC


*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* Diproses secara On-Line (Call Transaction)
* atau menggunakan Batch Session
*--------------------------------------------*

FORM execute USING mode tcode dismod cacah.
  DATA: exe(100).
  DATA: opt TYPE ctu_params .
  IF nobinpt = 'X'.
    opt-nobinpt = 'X' .
  ELSE.
    opt-nobinpt = ''.
  ENDIF.
  opt-dismode = dismod.
  opt-updmode = 'S'.
  exe = 'Tcode: '.
  WRITE tcode TO exe+7 LEFT-JUSTIFIED.
  WRITE 'is being executed for record: ' TO exe+12 LEFT-JUSTIFIED.
  WRITE cacah TO exe+42 LEFT-JUSTIFIED.
  PERFORM proses USING exe.

  IF mode = 'X'. "bath input
    CALL FUNCTION 'BDC_INSERT'
      EXPORTING
        tcode     = tcode
      TABLES
        dynprotab = i_bdctable.
  ELSE.
    CALL TRANSACTION tcode
      USING i_bdctable
*      MODE dismod
*      UPDATE 'S'
      OPTIONS FROM opt.
  ENDIF.
ENDFORM.                               " SAVE_IT


*~~~~~~~~~~~~~~*
* Inisialisasi *
*--------------*

FORM open_prog USING mode session.
  DATA: text1(80).

  IF mode = 'X'.
    CALL FUNCTION 'BDC_OPEN_GROUP'
      EXPORTING
        client = sy-mandt
        group  = session
        user   = sy-uname
        keep   = 'X'.
  ENDIF.

ENDFORM.                    "OPEN_PROG

*~~~~~~~~~*
* Closing *
*---------*

FORM close_prog USING mode.

  IF mode = 'X'.
    CALL FUNCTION 'BDC_CLOSE_GROUP' .
  ENDIF.

ENDFORM.                               " CLOSE_PROG

*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* Indikator sedang melakukan proses *
*-----------------------------------*

FORM proses USING text.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      text   = text
    EXCEPTIONS
      OTHERS = 1.
ENDFORM.                    "PROSES


*~~~~~~~~~~~~~~~*
* Logic level 1 *
*---------------*
FORM level_1 TABLES itab start USING cacah dismod tcode mode.

  LOOP AT itab.  "itab 为data file
    IF sy-tabix IN start.
      ASSIGN COMPONENT 1 OF STRUCTURE itab TO <ptr>.
      IF <ptr> = eof. EXIT. ENDIF.
      REFRESH i_bdctable.
      PERFORM generate_bdc TABLES i_logic1 USING itab.
      ADD 1 TO cacah.
      PERFORM execute USING mode tcode dismod cacah.
    ENDIF.
  ENDLOOP.

ENDFORM.                                                    "LEVEL_1

*~~~~~~~~~~~~~~~*
* Logic level 2 *
*---------------*
FORM level_2 TABLES itab start USING cacah dismod tcode mode awal.

  LOOP AT itab.                        "ere sy-tabix in start.
    IF sy-tabix IN start.
      ASSIGN COMPONENT 1 OF STRUCTURE itab TO <ptr>.
      IF <ptr> = eof. EXIT. ENDIF.
      text = 'Processing at row '.
      WRITE sy-tabix TO text+18 LEFT-JUSTIFIED.
      PERFORM proses USING text.

      IF <ptr> NE space.
        IF sy-tabix NE awal.
          PERFORM dynpro USING ' ' 'BDC_OKCODE' '/11'.
          PERFORM execute USING mode tcode dismod cacah.
        ENDIF.
        REFRESH i_bdctable.
        PERFORM generate_bdc TABLES i_logic1 USING itab.
        ADD 1 TO cacah.
      ELSE.
        PERFORM generate_bdc TABLES i_logic2 USING itab.
      ENDIF.
    ENDIF.
  ENDLOOP.

  PERFORM dynpro USING ' ' 'BDC_OKCODE' '/11'.
  PERFORM execute USING mode tcode dismod cacah.
ENDFORM.                                                    "LEVEL_2

*~~~~~~~~~~~~~~~~*
* Extended logic *
*----------------*
FORM level_3 TABLES itab start USING cacah dismod tcode mode awal.

  DATA: data_ext(8192), temp(8192),
        sub_item VALUE space.

  LOOP AT itab.

    IF sy-tabix IN start.

      ASSIGN COMPONENT 1 OF STRUCTURE itab TO <ptr>.
** Check End-Of-File
      IF <ptr> = eof.
        EXIT.
      ENDIF.

      text = 'Processing at row '.
      WRITE sy-tabix TO text+18 LEFT-JUSTIFIED.
      PERFORM proses USING text.

** Check if any sub-item data or extended data uses '#' symbol
      IF <ptr> = '#'.                  "->Sub-item or extended-data
        PERFORM generate_bdc TABLES i_logic3 USING itab.
        sub_item = 'X'.     "->Sub-item data flag is activated
        CONTINUE.
      ENDIF.

** Process BDC for header data
      IF <ptr> NE space.
        IF sy-tabix NE awal.
          READ TABLE i_logic3 INDEX 2.
** There is no sub_item data or no extended data with '#' symbol
** or no extended logic
          IF i_logic3 NE space AND sub_item EQ space.
** Read extended data in the last item
            MOVE: itab TO temp,
                  data_ext TO itab.
            PERFORM generate_bdc TABLES i_logic3 USING itab.
            MOVE temp TO itab.
          ELSE.
** There is sub_item data or extended data with '#' symbol
** or no extended logic
** If sub-items are processed, it is saved automatically.
            PERFORM dynpro USING ' ' 'BDC_OKCODE' '/11'.
          ENDIF.
          PERFORM execute USING mode tcode dismod cacah.
          CLEAR sub_item.              "->Reset flag sub-item
        ENDIF.
        REFRESH i_bdctable.
        PERFORM generate_bdc TABLES i_logic1 USING itab.
        ADD 1 TO cacah.
      ELSE.
** Check whether data contains sub_item data
        IF sub_item = 'X'.
** After all sub-items are processed, back to item.
          PERFORM dynpro USING ' ' 'BDC_OKCODE' '/3'.
        ENDIF.
        PERFORM generate_bdc TABLES i_logic2 USING itab.
** Store last data into temporary field
        MOVE itab TO data_ext.
      ENDIF.
    ENDIF.
  ENDLOOP.

  READ TABLE i_logic3 INDEX 2.
  IF i_logic3 NE space AND sub_item EQ space.
** No sub-item data or extended data with '#' symbol
** and there is extended logic
    MOVE: data_ext TO itab.
    PERFORM generate_bdc TABLES i_logic3 USING itab.
  ELSE.
** There is sub-item or extended data, last extended data has '#'
** If sub-items are processed, it is saved automatically.
    PERFORM dynpro USING ' ' 'BDC_OKCODE' '/11'.
  ENDIF.
  PERFORM execute USING mode tcode dismod cacah.
ENDFORM.                                                    "LEVEL_3

*&---------------------------------------------------------------------
**
**&      Form  GENERATE_FORMAT_FILE
**&---------------------------------------------------------------------
**
**       text
**----------------------------------------------------------------------
**
**      -->P_TEMPLATE  text
**----------------------------------------------------------------------
**
*FORM generate_format_file USING  template.
*  DATA: bdctab TYPE bdcdata OCCURS 0 WITH HEADER LINE.
*  DATA: BEGIN OF outtext OCCURS 0,
*        fnam LIKE bdcdata-fnam,
*        fval LIKE bdcdata-fval,
*        END OF outtext.
*  DATA: leng(10).
**  DATA: BEGIN OF outtext OCCURS 0,
**        fnam(132),
**        fval(132),
**        END OF outtext.
*
*  CALL FUNCTION 'WS_UPLOAD'
*    EXPORTING
*      filename            = template
*      filetype            = dat
*    TABLES
*      data_tab            = bdctab
*    EXCEPTIONS
*      conversion_error    = 1
*      file_open_error     = 2
*      file_read_error     = 3
*      invalid_table_width = 4
*      invalid_type        = 5
*      no_batch            = 6
*      unknown_error       = 7
*      OTHERS              = 8.
*  IF sy-subrc NE 0 OR bdctab[] IS INITIAL.
*    WRITE: 'ERROR OPEN TEMPLATE FILE, PLEASE CHECK AGAIN!'.
*    EXIT.
*  ENDIF.
*  MOVE 'NAMEA' TO outtext-fnam.
*  MOVE 'VALUEA' TO outtext-fval.
*  INSERT outtext INDEX 1.
*  DELETE bdctab INDEX 1.
*  LOOP AT bdctab.
*    IF NOT ( bdctab-program IS INITIAL ).
*      CONCATENATE bdctab-program 'a' INTO outtext-fnam.
*      CONCATENATE bdctab-dynpro 'a' INTO outtext-fval.
*
**      outtext-fnam = bdctab-program.
**      outtext-fval = bdctab-dynpro.
*      APPEND outtext.
*      CONTINUE.
* ELSEIF ( bdctab-fnam NE 'BDC_CURSOR' AND bdctab-fnam NE 'BDC_SUBSCR' ).
*      CONCATENATE bdctab-fnam 'a' INTO outtext-fnam.
*      CONCATENATE bdctab-fval 'a' INTO outtext-fval.
**      outtext-fnam = bdctab-fnam.
**
**      outtext-fval = bdctab-fval.
*      APPEND outtext.
*    ENDIF.
*  ENDLOOP.
*  CLEAR outtext.
*  MOVE '@' TO outtext-fnam.
*  APPEND outtext.
*  CALL FUNCTION 'WS_DOWNLOAD'
*   EXPORTING
**   BIN_FILESIZE                  = ' '
**   CODEPAGE                      = ' '
*     filename                      = textfile
*     filetype                      = 'DAT'
**   MODE                          = ' '
**   WK1_N_FORMAT                  = ' '
**   WK1_N_SIZE                    = ' '
**   WK1_T_FORMAT                  = ' '
**   WK1_T_SIZE                    = ' '
**   COL_SELECT                    = ' '
**   COL_SELECTMASK                = ' '
**   NO_AUTH_CHECK                 = ' '
** IMPORTING
**   FILELENGTH                    =
*    TABLES
*      data_tab                      = outtext
**   FIELDNAMES                    =
** EXCEPTIONS
**   FILE_OPEN_ERROR               = 1
**   FILE_WRITE_ERROR              = 2
**   INVALID_FILESIZE              = 3
**   INVALID_TYPE                  = 4
**   NO_BATCH                      = 5
**   UNKNOWN_ERROR                 = 6
**   INVALID_TABLE_WIDTH           = 7
**   GUI_REFUSE_FILETRANSFER       = 8
**   CUSTOMER_ERROR                = 9
**   OTHERS                        = 10
*            .
*  IF sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*  ELSE.
*    MESSAGE s000(zyhy).
*  ENDIF.
*  LOOP AT outtext.
*    WRITE: /(20) outtext-fnam, (20) outtext-fval.
*  ENDLOOP.
*ENDFORM.                    " GENERATE_FORMAT_FILE


FORM GENERATE_FORMAT_FILE USING  TEMPLATE.
DATA: BDCTAB TYPE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF OUTTEXT OCCURS 0,
      FNAM LIKE BDCDATA-FNAM,
      FVAL LIKE BDCDATA-FVAL,
      END OF OUTTEXT.

 CALL FUNCTION 'WS_UPLOAD'
           EXPORTING
                FILENAME            = TEMPLATE
                FILETYPE            = DAT
           TABLES
                DATA_TAB            = BDCTAB
           EXCEPTIONS
                CONVERSION_ERROR    = 1
                FILE_OPEN_ERROR     = 2
                FILE_READ_ERROR     = 3
                INVALID_TABLE_WIDTH = 4
                INVALID_TYPE        = 5
                NO_BATCH            = 6
                UNKNOWN_ERROR       = 7
                OTHERS              = 8.
 IF SY-SUBRC NE 0 OR BDCTAB[] IS INITIAL.
 WRITE: 'ERROR OPEN TEMPLATE FILE, PLEASE CHECK AGAIN!'.
 EXIT.
 ENDIF.
 MOVE 'NAME' TO OUTTEXT-FNAM.
 MOVE 'VALUE' TO OUTTEXT-FVAL.
 INSERT OUTTEXT INDEX 1.
 DELETE BDCTAB INDEX 1.
 LOOP AT BDCTAB.
 IF NOT ( BDCTAB-PROGRAM IS INITIAL ).
 OUTTEXT-FNAM = BDCTAB-PROGRAM.
 OUTTEXT-FVAL = BDCTAB-DYNPRO.
 APPEND OUTTEXT.
 CONTINUE.
 ELSEIF ( BDCTAB-FNAM NE 'BDC_CURSOR' AND BDCTAB-FNAM NE 'BDC_SUBSCR' ).
 OUTTEXT-FNAM = BDCTAB-FNAM.
 OUTTEXT-FVAL = BDCTAB-FVAL.
 APPEND OUTTEXT.
 ENDIF.
ENDLOOP.
CLEAR OUTTEXT.
MOVE '@' TO OUTTEXT-FNAM.
APPEND OUTTEXT.
CALL FUNCTION 'WS_DOWNLOAD'
 EXPORTING
*   BIN_FILESIZE                  = ' '
*   CODEPAGE                      = ' '
   FILENAME                      = TEXTFILE
   FILETYPE                      = 'DAT'
*   MODE                          = ' '
*   WK1_N_FORMAT                  = ' '
*   WK1_N_SIZE                    = ' '
*   WK1_T_FORMAT                  = ' '
*   WK1_T_SIZE                    = ' '
*   COL_SELECT                    = ' '
*   COL_SELECTMASK                = ' '
*   NO_AUTH_CHECK                 = ' '
* IMPORTING
*   FILELENGTH                    =
  TABLES
    DATA_TAB                      = OUTTEXT
*   FIELDNAMES                    =
* EXCEPTIONS
*   FILE_OPEN_ERROR               = 1
*   FILE_WRITE_ERROR              = 2
*   INVALID_FILESIZE              = 3
*   INVALID_TYPE                  = 4
*   NO_BATCH                      = 5
*   UNKNOWN_ERROR                 = 6
*   INVALID_TABLE_WIDTH           = 7
*   GUI_REFUSE_FILETRANSFER       = 8
*   CUSTOMER_ERROR                = 9
*   OTHERS                        = 10
          .
IF SY-SUBRC <> 0.
 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
MESSAGE S000(ZYHY).
ENDIF.
LOOP AT OUTTEXT.
WRITE: /(20) OUTTEXT-FNAM, (20) OUTTEXT-FVAL.
ENDLOOP.
ENDFORM.                    " GENERATE_FORMAT_FILE


文本元素

 

 

使用: 注意录屏时不要出错或者反复换页输入,这样会有很多无效字段被录下来 

用bdc好屏后:

 导出:

 

导出的文本内容:

 

 运行程序转换: recorded file就是上面生成的txt,converted file 是转换后的文件路径

 转换后的文件内容(文件名不一样请忽略,截图不是在一个时间弄的):

 

然后根据你的需要修改,设置变量和常量,变量就用&1 &2这些代替,常量的话就在常量前面加上 = 号。屏幕SAPLMGMM不用管。下面我没设置常量

 数据文件:

 

 运行:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值