二维码

[BDC] 使用BDC的CALL TRANSACTION编程方式导入数据

Twilight发表于 2015-01-16 16:08Twilight 最后回复于 2015-01-16 16:08 [复制链接] 9943 0

BDC的两种通用写法。  
1.    Call Transaction: 顾名思义,就是直接调用BDC进行数据批量导入。优点:方便快捷,程序处理方便。缺点:日志管理能力差,需自己建透明表来维护数据。我只是把它用作测试用途,不做正式使用。   
2.    BDC Insert:这是一种不直接运行,而是将BDC程序生成session,间接运行的一种方法。优点:通过T-code SM35可以进行运行管理及日志管理,方便查错。缺点:相对方法1来说实现起来比较繁琐。

call transaction方法将数据归集到BDCDATA 结构的内表中,然后导入到系统中,通过BDCMSGCOLL结构返回BDC导入操作的成功与否消息。
BDCDATA结构中比较关键的几个字段解释:
PROGRAM  -   BDC module pool
DYNPRO-        BDC Screen number
DYNBEGIN-    BDC screen start                                                         
FNAM-            Field name
FVAL-              BDC field value

1、需要导入的execl模板数据格式
SHDB 6.jpg
实际导入时,把前2行删掉

2、SHDB录制屏幕操作
我们是录制ME51的操作,然后生成标准步骤,用程序批量处理,所以录制时不可含有多余步骤
我们可以先在ME51中操作几遍,熟悉之后再操作SHDB录制屏幕,尽量不用回车,可以用点击替代。
SHDB 1.jpg
SHDB->输入录制屏幕产生记录的名称 和 需要录制的T-Code
SHDB 2.jpg
结束之后就可以看到这些代码,单击‘导出’按钮,可将数据导出到本地
BDC命令行的解读:  
T                            ME51                 : 表示调用TCODE ME51
BDC_OKCODE    =AB                    : 表示点了按钮    
BDC_OKCODE    /00                    : 表示回车 
BDC_OKCODE    XXXX                 : 一般表示为点击XXXX按扭 
SAPMM06B  0106  X                   : 表示调用程序的0106画面    
BDC_CURSOR   EBAN-LGORT    :表示需要输入值的字段
EBAN-MATNR &#160100702002       : 表示给字段MATNR赋值P100702002
(通常表、字段的表示格式为: XXXXXX-ZZZZZ , XXXXXX为表名,ZZZZ为字段名)

3、点击program按钮,将记录生成代码
SHDB 3.jpg
查看生成的代码,然后我们写程序就可以参考生成的代码了
SHDB 4.jpg

4、se38创建程序
  1. *Structure for error message
  2. TYPES : BEGIN OF ty_s_error,
  3.            msg_err(60) TYPE c,
  4.          END OF ty_s_error.

  5. *Input Path
  6. SELECTION-SCREEN BEGIN OF BLOCK blck WITH FRAME TITLE text-011.
  7. PARAMETERS:
  8.    p_file   TYPE rlgrap-filename,                  " File Path
  9.    e_file   TYPE rlgrap-filename OBLIGATORY,       " Error File Path
  10.    p_mode   TYPE c OBLIGATORY DEFAULT 'N'.         " Mode
  11. SELECTION-SCREEN END OF BLOCK blck.

  12. * Structure Decleration
  13. DATA :
  14.    BEGIN OF fs_field,
  15.      bsart TYPE eban-bsart,             " Document Type.
  16.      matnr TYPE eban-matnr,             " Material Number.
  17.      menge TYPE eban-menge,             " Quantity Requested.
  18.      werks TYPE eban-werks,             " Plant.
  19.   END OF fs_field.

  20. *Internal table decleration
  21. DATA:
  22.     t_field    LIKE TABLE OF fs_field,
  23.     t_bdcdata  LIKE TABLE OF bdcdata.

  24. DATA:
  25.    fs_bdcdata LIKE LINE OF t_bdcdata,   " Structure type of bdcdata
  26.     w_str  TYPE string.

  27. * Data decleration
  28. DATA:
  29.    wa_path TYPE string ,
  30.    wa_error TYPE string,
  31.    wa_cnt   TYPE i,
  32.    w_mode    TYPE c,
  33.    wa_cnt1(2) TYPE n,
  34.    it_output TYPE TABLE OF ty_s_error,
  35.    wa_output LIKE LINE OF it_output.

  36. AT SELECTION-SCREEN.
  37. * Mode 'A' = Foreground mode
  38. * Mode 'N' = Background mode
  39.   IF p_mode = 'A' OR p_mode = 'N' .
  40.     w_mode = p_mode.
  41.   ELSE.
  42. *Error Message
  43.     MESSAGE 'PLEASE ENTER THE MODE A or N' TYPE 'E'.
  44.   ENDIF.

  45. * Opening window for path selection
  46. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  47.   CALL FUNCTION 'F4_FILENAME'
  48.     EXPORTING
  49.       program_name  = syst-cprog
  50.       dynpro_number = syst-dynnr
  51.       field_name    = ' '
  52.     IMPORTING
  53.       file_name     = p_file.

  54.   TYPES:
  55.     fs_struct(4096) TYPE c OCCURS 0 .

  56.   DATA:
  57.     w_struct TYPE fs_struct.

  58. * Uploading excel file.
  59.   CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
  60.     EXPORTING
  61.       i_field_seperator          = 'X'
  62. *   I_LINE_HEADER              =
  63.       i_tab_raw_data             = w_struct
  64.       i_filename                 = p_file
  65.     TABLES
  66.       i_tab_converted_data       = t_field
  67.     EXCEPTIONS
  68.       conversion_failed          = 1
  69.       OTHERS                     = 2
  70.             .
  71.   IF sy-subrc <> 0.
  72.     MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
  73.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  74.   ENDIF.

  75. *Opening window for Error file download
  76. AT SELECTION-SCREEN ON VALUE-REQUEST FOR e_file.
  77.   CALL FUNCTION 'F4_FILENAME'
  78.     EXPORTING
  79.       program_name  = syst-cprog
  80.       dynpro_number = syst-dynnr
  81.       field_name    = ' '
  82.     IMPORTING
  83.       file_name     = e_file.

  84. * start of selection event.
  85. START-OF-SELECTION.

  86.   LOOP AT t_field INTO fs_field .
  87.     REFRESH: t_bdcdata.
  88.     CLEAR fs_bdcdata.
  89.     PERFORM populate_bdcdata.
  90.     PERFORM insert_data.
  91.   ENDLOOP.                               " LOOP AT it_c.

  92. *********************(populate_bdcdata)***********************
  93. * part 1
  94. FORM populate_bdcdata.
  95.   PERFORM :
  96.      fill_bdc_data USING 'SAPMM06B' '0100' 'X'  ' '  ' ',
  97.      fill_bdc_data USING  ''  ''  ''   'EBAN-BSART' fs_field-bsart,   " Document Type.
  98.      fill_bdc_data USING  ''  ''  ''   'BDC_OKCODE' '/00',            " Enter.

  99.      fill_bdc_data USING 'SAPMM06B'  '0106' 'X' ' ' ' ',
  100.      fill_bdc_data USING  '' '' '' 'EBAN-MATNR(01)'  fs_field-matnr,   " Material Number.
  101.      fill_bdc_data USING  '' '' ''  'EBAN-MENGE(01)' fs_field-menge,   " Quantity Requested.
  102.      fill_bdc_data USING  '' '' ''  'EBAN-WERKS(01)' fs_field-werks,   " Plant.
  103.      fill_bdc_data USING  '' '' ''  'BDC_OKCODE'   '/00',              " Enter.

  104.      fill_bdc_data USING 'SAPMM06B' '0102' 'X' ''  '' ,
  105.      fill_bdc_data USING  '' '' ''  'BDC_OKCODE' '=BU'.                 " Save.
  106. ENDFORM.                               " Form populate_bdc.

  107. * part 2
  108. FORM fill_bdc_data USING value(p_program)
  109.                        value(p_dynpro)
  110.                        value(p_dynbegin)
  111.                        value(p_fnam)
  112.                        value(p_fval).
  113.   CLEAR fs_bdcdata .
  114.   IF p_dynbegin = 'X' .
  115.     fs_bdcdata-program = p_program .
  116.     fs_bdcdata-dynpro  = p_dynpro .
  117.     fs_bdcdata-dynbegin = p_dynbegin .
  118.     APPEND fs_bdcdata TO t_bdcdata.
  119.   ELSE.
  120.     fs_bdcdata-fnam = p_fnam.
  121.     fs_bdcdata-fval = p_fval.
  122.     CONDENSE fs_bdcdata-fval.
  123.     APPEND fs_bdcdata TO t_bdcdata.
  124.   ENDIF.                               " IF p_dynbeg..
  125. ENDFORM .                              " Fill_entry

  126. *********************(insert_data)****************************
  127. FORM insert_data.
  128. *Data decleration for Error Message
  129.   DATA:
  130.        t_msg TYPE TABLE OF bdcmsgcoll,   " Collecting Error messages
  131.        w_msg TYPE bdcmsgcoll,
  132.        w_msg1(51).

  133. * Call transaction 'ME51'
  134.   CALL TRANSACTION 'ME51' USING t_bdcdata
  135.     MODE w_mode
  136.     UPDATE 'S'
  137.     MESSAGES INTO t_msg.

  138.   IF sy-subrc EQ 0.
  139. *    Uploaded into the database
  140.     WRITE :/ 'DATA UPLOADED IN TABLE EBAN...' .
  141.   ELSE.
  142. *    Error Found
  143.     LOOP AT t_msg INTO w_msg WHERE msgtyp EQ 'E'.
  144. *     Format Message
  145.       CALL FUNCTION 'MESSAGE_TEXT_BUILD'
  146.         EXPORTING
  147.           msgid               = w_msg-msgid
  148.           msgnr               = w_msg-msgnr
  149.           msgv1               = w_msg-msgv1
  150.           msgv2               = w_msg-msgv2
  151.           msgv3               = w_msg-msgv3
  152.           msgv4               = w_msg-msgv4
  153.         IMPORTING
  154.           message_text_output = w_msg1.
  155.       wa_output-msg_err = w_msg1.
  156. *Error message in downloaded file
  157.       DATA:wa_string(10) TYPE c.

  158.       wa_string = fs_field-matnr.
  159.       CONCATENATE wa_string wa_output-msg_err INTO wa_output-msg_err SEPARATED BY space.
  160.       APPEND wa_output-msg_err TO it_output.

  161.       wa_error = e_file.
  162.       CALL FUNCTION 'GUI_DOWNLOAD'
  163.         EXPORTING
  164. *         BIN_FILESIZE                    =
  165.           filename                        = wa_error
  166. *         FILETYPE                        = 'ASC'
  167. *         APPEND                          = ' '
  168.           write_field_separator           = 'X'
  169.         TABLES
  170.           data_tab                        = it_output
  171. *
  172.                 .
  173.       IF sy-subrc <> 0.
  174.         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  175.                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  176.       ENDIF.                           " IF sy-subrc <> 0.
  177.     ENDLOOP.
  178.   ENDIF.
  179. ENDFORM.                    "insert_data
复制代码

5、执行效果
SHDB 5.jpg
如果产生错误信息,则通过txt文件,导出到本地
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表