• SAP BDC 技术的分类(转)


    首先, 解释BDC这三个英文的意思, 普遍都认同是(Batch Data Communication). 然后下面是一些相关的术语解释:

    Batch Input: 批输入, 用于大批量, 非实时性( 对速度要求比较低) 的数据传输 使用BDC_OPEN_GROUP, BDC_INSERT_GROUP, BDC_CLOSE_GROUP这几个function实现批输入会话的操作. 然后通过批输入会话将数据传输到SAP.

    Call Transaction: 调用事务, 与批输入的差异主要是在于数据传输过程不生成批输入会话, 数据在程序运行过程中直接通过调用CALL TRANSACTION USING BDC表传输至SAP.

    Direct Input: 直接输入, 其主要优点是速度最快, 不生成会话, 数据被直接输入至SAP. 不存在事务屏幕处理过程(批输入和调用事务中均包含该过程), 直接输入的效率较高, 系统负载较小. 使用TCODE BMV0.

    但是我们不该把BDC技术只局限于录屏幕, 批输入和调用事务上, 其实以下技术都可以实现BDC, 比如BAPI, IDOC.

    BAPI: 业务应用程序接口, SAP作为一个完善的系统, 每个应用中都有包含标准的数据传输接口.

    IDOC: 中间文档, ALE和EDI属于系统间数据传输的接口, IDOC中包含数据结构的定义和数据的处理逻辑, 是传输的介质.

    这个图参照了黄佳写的<<SAP业务数据传输指南>>.  下面我来详细举例一下其中几种技术.

    一, 调用事务, 主要使用该语句

    CALL TRANSACTION '事务代码' USING bdc表 MODE m UPDATE 'S' MESSAGES INTO mssg.

    bdc表是参考bdcdata结构定义的内表, 主要存储屏幕处理所需要的关键数据, 其结构如下:

    字段名 类型 长度 小数 描述
    PROGRAM CHAR 40 0 BDC module pool
    DYNPRO NUMC 4 0 BDC Screen number
    DYNBEGIN CHAR 1 0 BDC screen start
    FNAM CHAR 132 0 Field name
    FVAL CHAR 132 0 BDC field value

    MODE m 是指Processing Mode, 共有4种处理模式:

    模式 英文描述
    A Display all screens
    E Display errors
    N Background processing
    P Background processing; debugging possible

    UPDATE 'S'  是指更新模式, 共有3种更新模式,一般使用'S'模式:

    模式 描述
    A 异步
    S 同步
    L 本地

    MESSAGES INTO mssg 的意思是将处理信息导入到一个参考bdcmsgcoll结构的内表, 方便查错.

    下面是一个上传物料中文描述的简单例子:

    1. *&---------------------------------------------------------------------*  
    2. *& Report  ZBDC_TEST1  
    3. *& 调用事务  
    4. *&---------------------------------------------------------------------*  
    5. *&  Author: Jun  
    6. *&  
    7. *&---------------------------------------------------------------------*  
    8.   
    9. REPORT  zbdc_test1.  
    10.   
    11. ************************************************************************  
    12. * D A T A  
    13. ************************************************************************  
    14.   
    15. CONSTANTS: c_def_path LIKE rlgrap-filename VALUE 'c:\file.txt'.  
    16. DATA: BEGIN OF mssg OCCURS 0.  
    17.         INCLUDE STRUCTURE bdcmsgcoll.  
    18. DATA: END OF mssg.  
    19.   
    20.   
    21. DATA: BEGIN OF zitab_bdc OCCURS 0.  
    22.         INCLUDE STRUCTURE bdcdata.  
    23. DATA: END OF zitab_bdc.  
    24.   
    25. DATA: BEGIN OF t_main OCCURS 0,  
    26.       matnr(18),  
    27.       maktx(40),  
    28.       END OF t_main.  
    29.   
    30. DEFINE dynpro.  
    31.   
    32.   CLEAR zitab_bdc.  
    33.   IF &1 = 'X'.  
    34.   
    35.     MOVE: 'X' TO zitab_bdc-dynbegin,  
    36.                 &2  TO zitab_bdc-program,  
    37.                 &3 TO zitab_bdc-dynpro.  
    38.   
    39.   ELSE.  
    40.   
    41.     MOVE: &2 TO zitab_bdc-fnam,  
    42.                 &3 TO zitab_bdc-fval.  
    43.   
    44.   ENDIF.  
    45.   
    46.   APPEND zitab_bdc.  
    47.   
    48. END-OF-DEFINITION.  
    49.   
    50. SELECTION-SCREEN BEGIN OF BLOCK sc1 WITH FRAME TITLE text-s01.  
    51. PARAMETER: f_cap TYPE rlgrap-filename OBLIGATORY DEFAULT c_def_path.  
    52. PARAMETER: m TYPE ctu_mode DEFAULT 'N'.  
    53. SELECTION-SCREEN END OF BLOCK sc1.  
    54.   
    55.   
    56. ************************************************************************  
    57. * S T A R T O F S E L E C T I O N  
    58. ************************************************************************  
    59. START-OF-SELECTION.  
    60.   WRITE : / 'Start creation of BDC session',sy-mandt,sy-uname,sy-uzeit.  
    61.   PERFORM get_codepage.  
    62.   PERFORM call_upload TABLES t_main USING f_cap.  
    63.   PERFORM update_data.  
    64.   
    65.   WRITE: / 'Finished!'.  
    66.   
    67.   
    68. ************************************************************************  
    69. * F O R M S  
    70. ************************************************************************  
    71. *&---------------------------------------------------------------------*  
    72. *&  
    73. *&      Form  GET_CODEPAGE  
    74. *&---------------------------------------------------------------------*  
    75. FORM get_codepage.  
    76.   
    77.   DATA: cncoden TYPE abap_encod,  
    78.         cncode type  CPCODEPAGE.  
    79.   
    80.   CALL FUNCTION 'NLS_GET_FRONTEND_CP'  
    81.     EXPORTING  
    82.       langu                 = '1'  
    83.     IMPORTING  
    84.       frontend_codepage     = cncode  
    85.     EXCEPTIONS  
    86.       illegal_syst_codepage = 21  
    87.       no_frontend_cp_found  = 23  
    88.       internal_or_db_error  = 25.  
    89.   MOVE: cncode TO cncoden.  
    90. ENDFORM.  
    91.   
    92. *&---------------------------------------------------------------------*  
    93. *&  
    94. *&      Form  CALL_UPLOAD  
    95. *&---------------------------------------------------------------------*  
    96.   
    97. FORM call_upload TABLES p_tab USING p_fname.  
    98.   
    99.   DATA: tmp_filename TYPE string.  
    100.   
    101.   tmp_filename = p_fname.  
    102.   
    103.   
    104.     CALL METHOD cl_gui_frontend_services=>gui_download  
    105.       EXPORTING  
    106.         filename                = tmp_filename  
    107.         write_field_separator     = 'X'  
    108.         codepage                = cncoden  
    109.       CHANGING  
    110.         data_tab                = p_tab  
    111.       EXCEPTIONS  
    112.         file_write_error        = 1  
    113.         no_batch                = 2  
    114.         gui_refuse_filetransfer = 3  
    115.         invalid_type            = 4  
    116.         no_authority            = 5  
    117.         unknown_error           = 6  
    118.         header_not_allowed      = 7  
    119.         separator_not_allowed   = 8  
    120.         filesize_not_allowed    = 9  
    121.         header_too_long         = 10  
    122.         dp_error_create         = 11  
    123.         dp_error_send           = 12  
    124.         dp_error_write          = 13  
    125.         unknown_dp_error        = 14  
    126.         access_denied           = 15  
    127.         dp_out_of_memory        = 16  
    128.         disk_full               = 17  
    129.         dp_timeout              = 18  
    130.         file_not_found          = 19  
    131.         dataprovider_exception  = 20  
    132.         control_flush_error     = 21  
    133.         not_supported_by_gui    = 22  
    134.         error_no_gui            = 23  
    135.         OTHERS                  = 24.  
    136.   
    137. if sy-subrc <> 0.  
    138. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
    139. *            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
    140. endif.  
    141.   
    142. ENDFORM.                    "call_upload  
    143. *&---------------------------------------------------------------------*  
    144. *&      Form  update_data  
    145. *&---------------------------------------------------------------------*  
    146. *       text  
    147. *----------------------------------------------------------------------*  
    148. FORM update_data.  
    149.   
    150.   REFRESH zitab_bdc.  
    151.   
    152.   LOOP AT t_main.  
    153.     PERFORM call_transaction.  
    154.   ENDLOOP.  
    155. ENDFORM.                    "update_data  
    156.   
    157. *&---------------------------------------------------------------------*  
    158. *&      Form  call_transaction  
    159. *&---------------------------------------------------------------------*  
    160. *       text  
    161. *----------------------------------------------------------------------*  
    162. FORM call_transaction.  
    163.   
    164. dynpro: 'X'   'SAPLMGMM'  '0060',  
    165.              ' '   'RMMG1-MATNR'   t_main-matnr,  
    166.              ' '   'BDC_OKCODE'    '/00'.  
    167.   
    168. dynpro: 'X'   'SAPLMGMM'   '0070',  
    169.              ' '   'MSICHTAUSW-KZSEL(01)'  'X',  
    170.              ' '   'BDC_OKCODE'  '=ENTR'.  
    171.   
    172. dynpro: 'X'   'SAPLMGMM'    '4004',  
    173.              ' '   'BDC_OKCODE'  '=ZU01'.  
    174.   
    175. dynpro:  'X'   'SAPLMGMM'    '4300',  
    176.               ' '   'SKTEXT-SPRAS(02)'  'ZH',  
    177.               ' '   'SKTEXT-MAKTX(02)'  t_main-maktx,  
    178.               ' '   'BDC_OKCODE'    '=BU'.  
    179.   
    180.   
    181.   CALL TRANSACTION 'MM02' USING zitab_bdc MODE m UPDATE 'S' MESSAGES INTO mssg.  
    182.   
    183.   IF sy-subrc NE 0.  
    184.     MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno  
    185.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  
    186.   ENDIF.  
    187.   REFRESH: zitab_bdc,mssg.  
    188.   
    189. ENDFORM.                    " CALL_TRANSACTION  

    二, 批输入, 主要使用BDC_OPEN_GROUP, BDC_INSERT_GROUP, BDC_CLOSE_GROUP这几个function实现批输入会话的操作. 然后通过批输入会话将数据传输到SAP.

    以下是Batch Input的例子, 是把前面的程序改了一下完成的, 注意红色的地方就是不同处:

    1. *&---------------------------------------------------------------------*  
    2. *& Report  ZBDC_TEST2  
    3. *&  批输入  
    4. *&---------------------------------------------------------------------*  
    5. *&  Author: Jun  
    6. *&  
    7. *&---------------------------------------------------------------------*  
    8.   
    9. REPORT  zbdc_test2.  
    10.   
    11. ************************************************************************  
    12. * D A T A  
    13. ************************************************************************  
    14.   
    15. CONSTANTS: c_def_path LIKE rlgrap-filename VALUE 'c:\file.txt'.  
    16.   
    17. DATA: BEGIN OF zitab_bdc OCCURS 0.  
    18.         INCLUDE STRUCTURE bdcdata.  
    19. DATA: END OF zitab_bdc.  
    20.   
    21. DATA: BEGIN OF t_main OCCURS 0,  
    22.       matnr(18),  
    23.       maktx(40),  
    24.       END OF t_main.  
    25.   
    26. DEFINE dynpro.  
    27.   
    28.   CLEAR zitab_bdc.  
    29.   IF &1 = 'X'.  
    30.   
    31.     MOVE: 'X' TO zitab_bdc-dynbegin,  
    32.         &2  TO zitab_bdc-program,  
    33.         &3 TO zitab_bdc-dynpro.  
    34.   
    35.   ELSE.  
    36.   
    37.     MOVE: &2 TO zitab_bdc-fnam,  
    38.  &3 TO zitab_bdc-fval.  
    39.   
    40.   ENDIF.  
    41.   
    42.   APPEND zitab_bdc.  
    43.   
    44. END-OF-DEFINITION.  
    45.   
    46. SELECTION-SCREEN BEGIN OF BLOCK sc1 WITH FRAME TITLE text-s01.  
    47. PARAMETER: f_cap TYPE rlgrap-filename OBLIGATORY DEFAULT c_def_path.  
    48. SELECTION-SCREEN END OF BLOCK sc1.  
    49.   
    50.   
    51. ************************************************************************  
    52. * S T A R T O F S E L E C T I O N  
    53. ************************************************************************  
    54. START-OF-SELECTION.  
    55.   WRITE : / 'Start creation of BDC session',sy-mandt,sy-uname,sy-uzeit.  
    56.   PERFORM get_codepage.  
    57.   PERFORM call_upload TABLES t_main USING f_cap.  
    58.   PERFORM update_data.  
    59.   
    60.   WRITE: / 'Finished!'.  
    61.   
    62.   
    63. ************************************************************************  
    64. * F O R M S  
    65. ************************************************************************  
    66. *&---------------------------------------------------------------------*  
    67. *&  
    68. *&      Form  GET_CODEPAGE  
    69. *&---------------------------------------------------------------------*  
    70. FORM get_codepage.  
    71.   
    72.   DATA: cncoden TYPE abap_encod,  
    73.         cncode type  CPCODEPAGE.  
    74.   
    75.   CALL FUNCTION 'NLS_GET_FRONTEND_CP'  
    76.     EXPORTING  
    77.       langu                 = '1'  
    78.     IMPORTING  
    79.       frontend_codepage     = cncode  
    80.     EXCEPTIONS  
    81.       illegal_syst_codepage = 21  
    82.       no_frontend_cp_found  = 23  
    83.       internal_or_db_error  = 25.  
    84.   MOVE: cncode TO cncoden.  
    85. ENDFORM.  
    86.   
    87. *&---------------------------------------------------------------------*  
    88. *&  
    89. *&      Form  CALL_UPLOAD  
    90. *&---------------------------------------------------------------------*  
    91.   
    92. FORM call_upload TABLES p_tab USING p_fname.  
    93.   
    94.   DATA: tmp_filename TYPE string.  
    95.   
    96.   tmp_filename = p_fname.  
    97.   
    98.   
    99.     CALL METHOD cl_gui_frontend_services=>gui_download  
    100.       EXPORTING  
    101.         filename                = tmp_filename  
    102.  write_field_separator     = 'X'  
    103.         codepage                = cncoden  
    104.       CHANGING  
    105.         data_tab                = p_tab  
    106.       EXCEPTIONS  
    107.         file_write_error        = 1  
    108.         no_batch                = 2  
    109.         gui_refuse_filetransfer = 3  
    110.         invalid_type            = 4  
    111.         no_authority            = 5  
    112.         unknown_error           = 6  
    113.         header_not_allowed      = 7  
    114.         separator_not_allowed   = 8  
    115.         filesize_not_allowed    = 9  
    116.         header_too_long         = 10  
    117.         dp_error_create         = 11  
    118.         dp_error_send           = 12  
    119.         dp_error_write          = 13  
    120.         unknown_dp_error        = 14  
    121.         access_denied           = 15  
    122.         dp_out_of_memory        = 16  
    123.         disk_full               = 17  
    124.         dp_timeout              = 18  
    125.         file_not_found          = 19  
    126.         dataprovider_exception  = 20  
    127.         control_flush_error     = 21  
    128.         not_supported_by_gui    = 22  
    129.         error_no_gui            = 23  
    130.         OTHERS                  = 24.  
    131.   
    132. if sy-subrc <> 0.  
    133. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
    134. *            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
    135. endif.  
    136.   
    137. ENDFORM.                    "call_upload  
    138. *&---------------------------------------------------------------------*  
    139. *&      Form  update_data  
    140. *&---------------------------------------------------------------------*  
    141. *       text  
    142. *----------------------------------------------------------------------*  
    143. FORM update_data.  
    144.   
    145. <font color="#ff0000">    CALL FUNCTION 'BDC_OPEN_GROUP'  
    146.       EXPORTING  
    147.         CLIENT              = SY-MANDT  
    148.         GROUP               = P_S_NAME  
    149.         KEEP                = 'X'  
    150.         USER                = SY-UNAME  
    151.       EXCEPTIONS  
    152.         CLIENT_INVALID      = 1  
    153.         DESTINATION_INVALID = 2  
    154.         GROUP_INVALID       = 3  
    155.         GROUP_IS_LOCKED     = 4  
    156.         HOLDDATE_INVALID    = 5  
    157.         INTERNAL_ERROR      = 6  
    158.         QUEUE_ERROR         = 7  
    159.         RUNNING             = 8  
    160.         SYSTEM_LOCK_ERROR   = 9  
    161.         USER_INVALID        = 10  
    162.         OTHERS              = 11.</font>  
    1. <font color="#ff0000">    IF SY-SUBRC <> 0.  
    2.       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
    3.               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
    4.     ENDIF.  
    5. </font>  
    6.   
    7.   REFRESH zitab_bdc.  
    8.   
    9.   LOOP AT t_main.  
    10.     PERFORM  batch_input.  
    11.   
    12.   ENDLOOP.  
    13.   
    14. <font color="#ff0000">    CALL FUNCTION 'BDC_CLOSE_GROUP'  
    15.     EXCEPTIONS  
    16.       NOT_OPEN    = 1  
    17.       QUEUE_ERROR = 2  
    18.       OTHERS      = 3.  
    19.   
    20.     IF SY-SUBRC <> 0.  
    21.       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
    22.               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
    23.     ENDIF.  
    24. </font>  
    25. ENDFORM.                    "update_data  
    26.   
    27. *&---------------------------------------------------------------------*  
    28. *&      Form  batch_input  
    29.   
    30. *&---------------------------------------------------------------------*  
    31. *       text  
    32. *----------------------------------------------------------------------*  
    33. FORM batch_input.  
    34.   
    35. dynpro:  
    36.   'X'   'SAPLMGMM'  '0060',  
    37.   ' '   'RMMG1-MATNR'   t_main-matnr,  
    38.   ' '   'BDC_OKCODE'    '/00'.  
    39.   
    40.   dynpro:  
    41.   'X'   'SAPLMGMM'   '0070',  
    42.   ' '   'MSICHTAUSW-KZSEL(01)'  'X',  
    43.   ' '   'BDC_OKCODE'  '=ENTR'.  
    44.   
    45. dynpro:  
    46.   'X'   'SAPLMGMM'    '4004',  
    47.   ' '   'BDC_OKCODE'  '=ZU01'.  
    48.   
    49. dynpro:  
    50.   'X'   'SAPLMGMM'    '4300',  
    51.   ' '   'SKTEXT-SPRAS(02)'  'ZH',  
    52.   ' '   'SKTEXT-MAKTX(02)'  t_main-maktx,  
    53.   ' '   'BDC_OKCODE'    '=BU'.  
    54.   
    55. <font color="#ff0000">    CALL FUNCTION 'BDC_INSERT'  
    56.       EXPORTING  
    57.         TCODE            = 'MM02'  
    58.       TABLES  
    59.         DYNPROTAB        = zitab_bdc  
    60.       EXCEPTIONS  
    61.         INTERNAL_ERROR   = 1  
    62.         NOT_OPEN         = 2  
    63.         QUEUE_ERROR      = 3  
    64.         TCODE_INVALID    = 4  
    65.         PRINTING_INVALID = 5  
    66.         POSTING_INVALID  = 6  
    67.         OTHERS           = 7.  
    68.   
    69.   
    70.       IF SY-SUBRC <> 0.  
    71.         MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
    72.                 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
    73.       ENDIF.</font>  
    74.   
    75.   REFRESH: zitab_bdc.  
    76.   
    77. ENDFORM.     
    三, BAPI是SAP标准的API, 在多系统的环境下,我们可以通过ALE/EDI技术使用RFC和BAPI实现数据传输工作. 但是也可以自己编写程序实现本地执行传输工作. 下面是一个使用BAPI传输PO的例子:
    1. <pre class="csharp" name="code">*&---------------------------------------------------------------------*  
    2. *& Report  ZCON0026  
    3. *&  
    4. *&---------------------------------------------------------------------*  
    5. *&  Author: Jun  
    6. *&  
    7. *&---------------------------------------------------------------------*  
    8.   
    9. REPORT  ZCON0026.  
    10.   
    11. FIELD-SYMBOLS : <fs></fs>.  
    12. <font color="#ff0000">DATA:wa_pohead  TYPE bapimepoheader.  
    13. DATA:wa_poheadx TYPE bapimepoheaderx.  
    14. DATA:wa_poaddrvendor TYPE bapimepoaddrvendor.  
    15. DATA:wa_testrun TYPE bapiflag-bapiflag.</font>  
    16. DATA:g_ebeln TYPE ekko-ebeln.   "Purchasing Document Header  
    17. DATA:g_mtart TYPE mtart.  
    18.   
    19. <font color="#ff0000">DATA:it_return    TYPE bapiret2       OCCURS 0 WITH HEADER LINE.  
    20. DATA:it_msg       TYPE bapiret2       OCCURS 0 WITH HEADER LINE.</font>  
    21. DATA:BEGIN OF it_msg1 OCCURS 0,  
    22.           ebeln LIKE ekpo-ebeln,  
    23.           type like bapiret2-type,  
    24.           message LIKE bapiret2-message,  
    25.           old_po like ekpo-ebeln,  
    26.      END  OF it_msg1.  
    27. <font color="#ff0000">DATA:it_poitem    TYPE bapimepoitem   OCCURS 0 WITH HEADER LINE.  
    28. DATA:it_poitemx   TYPE bapimepoitemx  OCCURS 0 WITH HEADER LINE.  
    29. DATA:it_pocondh   TYPE bapimepocondheader OCCURS 0 WITH HEADER LINE.  
    30. DATA:it_pocondhx  TYPE bapimepocondheaderx OCCURS 0 WITH HEADER LINE.  
    31. DATA:it_pocond    TYPE bapimepocond   OCCURS 0 WITH HEADER LINE.  
    32. DATA:it_pocondx   TYPE bapimepocondx  OCCURS 0 WITH HEADER LINE.  
    33. DATA:it_potexth   TYPE bapimepotextheader  OCCURS 0 WITH HEADER LINE.  
    34. DATA:it_potexti   TYPE bapimepotext  OCCURS 0 WITH HEADER LINE.  
    35. DATA:it_popartner TYPE bapiekkop  OCCURS 0 WITH HEADER LINE.  
    36. DATA:it_extens    TYPE bapiparex  OCCURS 0 WITH HEADER LINE.    "Customer's Own Fields  
    37. DATA:it_poaccount TYPE bapimepoaccount  OCCURS 0 WITH HEADER LINE.  
    38. DATA:it_poaccountx TYPE bapimepoaccountx  OCCURS 0 WITH HEADER LINE.  
    39. DATA:it_poche      TYPE bapimeposchedule OCCURS 0 WITH HEADER LINE.  
    40. DATA:it_pochex     TYPE bapimeposchedulx OCCURS 0 WITH HEADER LINE.  
    41. DATA:purchseorder TYPE BAPIMEPOHEADER-PO_NUMBER.</font>  
    42.   
    43. DATA:g_poitem TYPE ebelp.   "Item Number of Purchasing Document  
    44. DATA:g_meng LIKE ekpo-menge.    "Purchase Order Quantity  
    45. DATA:l_intern TYPE kcde_cells OCCURS 0 WITH HEADER LINE.  
    46. DATA:len_str TYPE i,  
    47.      l_index TYPE i.  
    48.   
    49. DATA:BEGIN OF it_data OCCURS 0,  
    50. *       doc_type(004),   </pre>  
    51. <pre class="csharp" name="code">       po(010),  "PO NO  
    52.        material(018),  
    53.        vendor(010),  
    54.        invoice_no(15),  "Invoice Number(Header text)  
    55.        pmnttrms(004),   "Paymentterms  
    56.        quantity(017),  
    57.        doc_date(008),  
    58.        gr_to_date(008), "Delivery date  
    59.        shippingin(10),  "Ship Date(Header Text)  
    60.        eta_hk(10),      "Date of ETA HK(Header Text)  
    61.        trsp_metd(10),   "Transportion Method(Header Text)  
    62.        container_no(20),  "COntainer Number(Header Text)  
    63.        lc_number(20),   "LC Number(Header Text)  
    64.        load_date(10),   "Load Date(Header Text)  
    65.        arr_hk(10),      "Date of Arr. Date(Header Text)  
    66.        remark(20),      "Header remark(Header Text)  
    67.        currency(005),  
    68.        cond_pb00(038),  "Net price  
    69.        cond_p_unt(5),    "Price Unit  
    70.   
    71. END OF it_data.  
    72. DATA:BEGIN OF it_head OCCURS 0,  
    73.        comp_code(4),    "Company Code  
    74.        doc_type(004),   "######  
    75.        po_number(010),  
    76.        po(010),  
    77.        vendor(010),     "######  
    78.        doc_date(008),   "####  
    79.        purch_org(004),  "####  
    80.        pur_group(003),  "####  
    81.        pmnttrms(004),   "####  
    82.        incoterms1(003), "######  
    83.        incoterms2(028), "######  
    84.        currency(005),   "####  
    85.        exch_rate(014),  "##  
    86.        text_pohzs(132), "Header Remark  
    87.        shippingin(132), "SHIPPING INSTRUCTION  
    88.        prppayment(132), "PAYMENT TERM FOR PRP  
    89.        delivery(132),   "DELIVERY  
    90.        attention(132),  "ATTENTION  
    91.        name_2(040),                                         "#####2  
    92.        name_3(040),                                         "#####3  
    93.        name_4(040),                                         "#####4  
    94.        street(040),     "##  
    95.        str_suppl2(040), "##4  
    96.        location(040),   "##5  
    97.        postl_cod1(010), "######  
    98.        country(003),    "####  
    99.        tel1_numbr(030), "##  
    100.        fax_number(030), "##  
    101.        billty(002),     "########  
    102.        billpo(010),     "######  
    103.        purcty(002),     "########  
    104.        purcpo(010),     "#####  
    105.        patety(002),     "########  
    106.        patepo(010),     "######  
    107.        shipty(002),     "########  
    108.        shippo(010),     "######  
    109.        COLLECT_NO(010),   "Collective Number  
    110.      END   OF it_head.  
    111. DATA:BEGIN OF it_item OCCURS 0,  
    112.        po_number(010),  "  
    113.        po(010),  
    114.        acctasscat(001), "######  
    115.        item_cat(001),   "####  
    116.        material(018),   "######  
    117.        short_text(040), "####  
    118.        quantity(017),   "######  
    119.        po_unit(003),    "####  
    120.        gr_to_date(008), "####  
    121.        cond_pb00(038),  "Net Price  
    122.        cond_p_unt(005), "########  
    123.        cond_za00(038),  "UNZ#UTE######  
    124.        matl_group(009), "####  
    125.        plant(004),      "##  
    126.        over_dlv_tol(005),"########  
    127.        tax_code(002),    "##/######  
    128.        costcenter(010),  "####  
    129.        poit_text(132),   "PO####  
    130.        pobz_text(132),   "PO####  
    131.        valuepart1(240),  "Exfact Date  
    132.        valuepart2(240),  "Arr.HK Date  
    133.      END OF it_item.  
    134. DATA:g_menge LIKE ekpo-netpr.  
    135. ******************************************************************  
    136. *   PARAMETERS & SELECTION-OPTIONS  
    137. ******************************************************************  
    138. SELECTION-SCREEN BEGIN OF BLOCK sel  WITH FRAME TITLE text-001.  
    139. PARAMETERS:p_upload RADIOBUTTON GROUP radi,  
    140.            p_uptemp RADIOBUTTON GROUP radi.  
    141. PARAMETERS:p_flag  AS CHECKBOX .  
    142. SELECTION-SCREEN END OF BLOCK sel.  
    143.   
    144. SELECTION-SCREEN BEGIN OF BLOCK mod  WITH FRAME TITLE text-002.  
    145. PARAMETERS:p_file LIKE  rlgrap-filename DEFAULT 'c:\podata',  
    146.            p_log  LIKE  rlgrap-filename DEFAULT 'c:\polog.xls'.  
    147. SELECTION-SCREEN END OF BLOCK mod.  
    148.   
    149. START-OF-SELECTION.  
    150.   IF p_upload = 'X'.  
    151.     PERFORM upload_file.  
    152.     PERFORM upload_data.  
    153.   ENDIF.  
    154.   
    155.   
    156. *&--------------------------------------------------------------------*  
    157. *&      Form  upload_file  
    158. *&--------------------------------------------------------------------*  
    159. *       text  
    160. *---------------------------------------------------------------------*  
    161. FORM upload_file.  
    162.   
    163.   TRANSLATE p_file TO UPPER CASE.  
    164.   len_str = STRLEN( p_file ).  
    165.   len_str = len_str - 4.  
    166.   IF p_file+len_str(4) <> '.XLS'.  
    167.     CONCATENATE p_file '.XLS' INTO p_file.  
    168.   ENDIF.  
    169.   CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'  
    170.     EXPORTING  
    171.       filename                = p_file  
    172.       i_begin_col             = 1  
    173.       i_begin_row             = 2  
    174.       i_end_col               = 256  
    175.       i_end_row               = 65535  
    176.     TABLES  
    177.       intern                  = l_intern  
    178.     EXCEPTIONS  
    179.       inconsistent_parameters = 1  
    180.       upload_ole              = 2  
    181.       OTHERS                  = 3.  
    182.   IF sy-subrc <> 0.  
    183.   ENDIF.  
    184.   
    185.   SORT l_intern BY row col.  
    186.   LOOP AT l_intern.  
    187.     MOVE l_intern-col TO l_index.  
    188.     ASSIGN COMPONENT l_index OF STRUCTURE it_data TO <fs></fs>.  
    189.     MOVE l_intern-value TO <fs></fs>.  
    190.     AT END OF row.  
    191.       APPEND it_data.  
    192.       CLEAR  it_data.  
    193.     ENDAT.  
    194.   ENDLOOP.  
    195.   
    196. ENDFORM.                    "UPLOAD_FILE  
    197. *&---------------------------------------------------------------------*  
    198. *&      Form  UPLOAD_DATA  
    199. *&---------------------------------------------------------------------*  
    200. FORM upload_data .  
    201.   CLEAR:it_head,it_item.  
    202.   LOOP AT it_data.  
    203.     MOVE-CORRESPONDING it_data TO it_head.  
    204.     it_head-COLLECT_NO = it_data-po.  
    205.     COLLECT it_head.  
    206.     MOVE-CORRESPONDING it_data TO it_item.  
    207.     APPEND  it_item.  
    208.   ENDLOOP.  
    209.   REFRESH it_msg.  
    210.   
    211.   
    212.   LOOP AT it_head.  
    213.     CLEAR: it_potexth,wa_pohead,wa_poheadx,wa_poaddrvendor.  
    214.     REFRESH:it_potexth,it_popartner.  
    215. *Document Type  
    216.     wa_pohead-doc_type = 'NB'.  
    217.     wa_poheadx-doc_type = 'X'.  
    218.   
    219. *Vendor Number  
    220.     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'  
    221.       EXPORTING  
    222.         input  = it_head-vendor  
    223.       IMPORTING  
    224.         output = it_head-vendor.  
    225.     wa_pohead-vendor = it_head-vendor.  
    226.     wa_poheadx-vendor = 'X'.  
    227. *Document Date  
    228.     wa_pohead-doc_date = it_head-doc_date.  
    229.     wa_poheadx-doc_date = 'X'.  
    230.   
    231. *Collective Number  
    232.     wa_pohead-COLLECT_NO = it_head-COLLECT_NO.  
    233.     wa_poheadx-COLLECT_NO = 'X'.  
    234.   
    235. *Company Code  
    236.       wa_pohead-comp_code = '8200'.  
    237.       wa_poheadx-comp_code = 'X'.  
    238.   
    239.   
    240. *Purchase Organise  
    241.       wa_pohead-purch_org = '8200'.  
    242.   
    243. *Purchase Group  
    244.       wa_pohead-pur_group = '003'.  
    245.       wa_poheadx-pur_group = 'X'.  
    246.   
    247. *Payment term  
    248.       wa_pohead-pmnttrms = it_head-pmnttrms.  
    249.       wa_poheadx-pmnttrms = 'X'.  
    250.   
    251. *Currency  
    252.     wa_pohead-currency = it_head-currency.  
    253.     wa_poheadx-currency = 'X'.  
    254.   
    255. *Purchase Order Header Text  
    256.       it_potexth-text_line = it_data-remark.    "Header Remark(Header Text)  
    257.       it_potexth-po_number = it_head-po_number.  
    258.       it_potexth-text_id   = 'F01'.  
    259.       APPEND it_potexth.  
    260.       CLEAR it_potexth.  
    261.   
    262. *SHIPPING INSTRUCTION  
    263.     it_potexth-text_line = it_head-shippingin.  "Ship Date(Header Text)  
    264.     it_potexth-po_number = it_head-po_number.  
    265.     it_potexth-text_id   = 'F02'.  
    266.     APPEND it_potexth.  
    267.     CLEAR it_potexth.  
    268. *PAYMENT TERM FOR PRP  
    269.     it_potexth-text_line = it_data-load_date.  "Load Date(Header Text)  
    270.     it_potexth-po_number = it_head-po_number.  
    271.     it_potexth-text_id   = 'F03'.  
    272.     APPEND it_potexth.  
    273.     CLEAR it_potexth.  
    274. *Date of ETA HK  
    275.     it_potexth-text_line = it_data-eta_hk.    "Date of ETA HK  
    276.     it_potexth-po_number = it_head-po_number.  
    277.     it_potexth-text_id   = 'F04'.  
    278.     APPEND it_potexth.  
    279.     CLEAR it_potexth.  
    280. *Date of Arr HK  
    281.     it_potexth-text_line = it_data-arr_hk.    "Date of Arr HK  
    282.     it_potexth-po_number = it_head-po_number.  
    283.     it_potexth-text_id   = 'F05'.  
    284.     APPEND it_potexth.  
    285.     CLEAR it_potexth.  
    286.   
    287. *Transpotion Method  
    288.     it_potexth-text_line = it_data-trsp_metd.  
    289.     it_potexth-po_number = it_head-po_number.  
    290.     it_potexth-text_id   = 'F06'.  
    291.     APPEND it_potexth.  
    292.     CLEAR it_potexth.  
    293.   
    294. *Container Number  
    295.     it_potexth-text_line = it_data-container_no.  
    296.     it_potexth-po_number = it_head-po_number.  
    297.     it_potexth-text_id   = 'F07'.  
    298.     APPEND it_potexth.  
    299.     CLEAR it_potexth.  
    300.   
    301. *LC Number  
    302.     it_potexth-text_line = it_data-lc_number.  
    303.     it_potexth-po_number = it_head-po_number.  
    304.     it_potexth-text_id   = 'F08'.  
    305.     APPEND it_potexth.  
    306.     CLEAR it_potexth.  
    307.   
    308. *Invoice Number  
    309.     it_potexth-text_line = it_data-invoice_no.  
    310.     it_potexth-po_number = it_head-po_number.  
    311.     it_potexth-text_id   = 'F09'.  
    312.     APPEND it_potexth.  
    313.     CLEAR it_potexth.  
    314.   
    315.   
    316. *Purchase Order Item Information  
    317.     CLEAR g_poitem.  
    318.     REFRESH: it_poitemx,it_poitem,it_pocond,it_pocondx,  
    319.              it_poche,it_pochex .  
    320.   
    321.     LOOP AT it_item.  
    322.       IF  it_item-po EQ it_head-po.  
    323.         CLEAR:it_poitem, it_poitemx.  
    324.         g_poitem = g_poitem + 10.  
    325.         it_poitem-po_item = g_poitem.  
    326.         it_poitemx-po_item = g_poitem.  
    327.         it_poitem-item_cat = it_item-item_cat.  
    328.         it_poitemx-item_cat = 'X'.  
    329.         it_poitemx-po_itemx = 'X'.  
    330.         CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'  
    331.           EXPORTING  
    332.             input  = it_item-material  
    333.           IMPORTING  
    334.             output = it_item-material.  
    335.   
    336.         it_poitem-material = it_item-material.  
    337.         it_poitemx-material = 'X'.  
    338.         IF it_item-short_text IS NOT INITIAL.  
    339.           it_poitem-short_text = it_item-short_text.  
    340.           it_poitemx-short_text = 'X'.  
    341.   
    342.         ENDIF.  
    343.   
    344.         CLEAR g_meng.  
    345.         g_meng = it_item-quantity.  
    346.         it_poitem-quantity = g_meng.  
    347.         it_poitemx-quantity = 'X'.  
    348.         it_poitem-po_unit =  it_item-po_unit.  
    349.         it_poitemx-po_unit =  'X'.  
    350.   
    351.         CLEAR g_mtart.  
    352.         SELECT SINGLE mtart INTO g_mtart FROM mara  
    353.                 WHERE matnr EQ it_item-material.  
    354.         IF g_mtart EQ 'ZNON'.  
    355.           it_poitem-acctasscat = 'Z'.  
    356.           it_poitemx-acctasscat = 'X'.  
    357.         ENDIF.  
    358.   
    359.   
    360.         CLEAR:  it_poche,it_pochex.  
    361.         it_poche-po_item   = g_poitem.  
    362.         it_pochex-po_item  = g_poitem.  
    363.         it_poche-sched_line   = g_poitem.  
    364.         it_pochex-sched_line  = g_poitem.  
    365.         it_poche-delivery_date  = it_item-gr_to_date.  
    366.         it_pochex-delivery_date  = 'X'.  
    367.   
    368.         it_poche-quantity   = g_meng.  
    369.         it_pochex-quantity  = 'X'.  
    370.   
    371.         it_pochex-po_itemx = 'X'.  
    372.         it_pochex-sched_linex = 'X'.  
    373.   
    374.   
    375.         APPEND: it_poche,it_pochex.  
    376.   
    377.         it_poitem-plant = '8200'.  
    378.         it_poitemx-plant = 'X'.  
    379.         IF it_item-matl_group IS NOT INITIAL.  
    380.           it_poitem-matl_group = it_item-matl_group.  
    381.           it_poitemx-matl_group = 'X'.  
    382.         ENDIF.  
    383.         it_poitem-over_dlv_tol = it_item-over_dlv_tol.  
    384.         it_poitemx-over_dlv_tol = 'X'.  
    385.         it_poitem-tax_code = it_item-tax_code.  
    386.         it_poitemx-tax_code = 'X'.  
    387.         g_menge = it_item-cond_pb00.  
    388.   
    389.         IF g_menge EQ  0.  
    390.           it_poitem-free_item = 'X'.  
    391.           it_poitemx-free_item = 'X'.  
    392.         ELSE.  
    393.           it_poitem-free_item = ''.  
    394.           it_poitemx-free_item = 'X'.  
    395.         ENDIF.  
    396.   
    397.         it_poitem-matl_group = it_item-matl_group.  
    398.         it_poitemx-matl_group = 'X'.  
    399.   
    400.   
    401.         IT_POITEM-NET_PRICE = IT_ITEM-COND_PB00.  
    402.         IT_POITEMX-NET_PRICE = 'X'.  
    403.         it_poitem-price_unit = it_item-cond_p_unt.  
    404.         it_poitemx-price_unit = 'X'.  
    405.         APPEND:it_poitemx,it_poitem.  
    406.   
    407.   
    408. *ConditionS  
    409.         CLEAR it_pocond.  
    410.         it_pocond-cond_type = 'PB00'.  
    411.         it_pocond-itm_number = it_poitem-po_item.  
    412.         it_pocond-cond_value = IT_ITEM-COND_PB00.  
    413.         it_pocond-cond_p_unt  =  it_item-cond_p_unt.  
    414.         it_pocond-currency    = it_head-currency.  
    415.         it_pocond-change_id   = 'U'.  
    416.         APPEND it_pocond.  
    417.   
    418.         CLEAR it_pocondx.  
    419.         it_pocondx-cond_type = 'X'.  
    420.         it_pocondx-itm_number = it_poitem-po_item.  
    421.         it_pocondx-cond_value = 'X'.  
    422.         it_pocondx-cond_p_unt = 'X'.  
    423.         it_pocondx-currency    = 'X'.  
    424.         it_pocondx-change_id   = 'X'.  
    425.         APPEND it_pocondx.  
    426.   
    427.       ENDIF.  
    428.     ENDLOOP.  
    429.   
    430.     wa_testrun = p_flag.  
    431.     DELETE it_item WHERE  po EQ it_head-po.  
    432.     SELECT SINGLE ebeln INTO g_ebeln FROM ekko  
    433.         WHERE ebeln EQ wa_pohead-po_number.  
    434.     IF sy-subrc NE 0.  
    435. <font color="#ff0000">      CALL FUNCTION 'BAPI_PO_CREATE1'  
    436.         EXPORTING  
    437.           poheader     = wa_pohead  
    438.           poheaderx    = wa_poheadx  
    439.           poaddrvendor = wa_poaddrvendor  
    440.           testrun      = wa_testrun  
    441.         IMPORTING  
    442.           EXPPURCHASEORDER        = purchseorder  
    443.         TABLES  
    444.           return       = it_return  
    445.           poitem       = it_poitem  
    446.           poitemx      = it_poitemx  
    447.           poschedule   = it_poche  
    448.           poschedulex  = it_pochex  
    449.           pocond       = it_pocond  
    450.           pocondx      = it_pocondx  
    451.           potextheader = it_potexth  
    452.           potextitem   = it_potexti  
    453.           popartner    = it_popartner.</font>  
    454.   
    455. <font color="#ff0000">CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.  
    456.     WAIT UP TO 1 SECONDS.</font>  
    457.     REFRESH: it_poitem,it_poitemx,it_poche,it_pochex,  
    458.              it_pocond,it_pocondx,it_potexth,it_potexti,it_popartner.  
    459.     CLEAR:it_return,it_poitem,it_poitemx,it_poche,it_pochex,  
    460.              it_pocond,it_pocondx,it_potexth,it_potexti,it_popartner.  
    461.     DELETE it_item WHERE po EQ it_head-po.  
    462.     DELETE it_head WHERE po EQ it_head-po.  
    463. *    LOOP AT it_return WHERE type EQ 'E'.  
    464.     LOOP AT it_return.  
    465.       MOVE-CORRESPONDING it_return TO it_msg1.  
    466. *      it_msg1-ebeln = wa_pohead-po_number.  
    467.       it_msg1-ebeln = purchseorder.  
    468.       it_msg1-old_po = it_head-po.  
    469.       APPEND it_msg1.  
    470.       clear it_msg1.  
    471.     ENDLOOP.  
    472.     ENDIF.  
    473.   
    474.   ENDLOOP.  
    475.   
    476.   
    477.   CALL FUNCTION 'WS_DOWNLOAD'  
    478.     EXPORTING  
    479.       filename                = p_log  
    480.       filetype                = 'DAT'  
    481.       mode                    = 'O'  
    482.     TABLES  
    483.       data_tab                = it_msg1  
    484.     EXCEPTIONS  
    485.       invalid_filesize        = 1  
    486.       invalid_table_width     = 2  
    487.       invalid_type            = 3  
    488.       no_batch                = 4  
    489.       unknown_error           = 5  
    490.       gui_refuse_filetransfer = 6  
    491.       OTHERS                  = 7.  
    492.   IF sy-subrc <> 0.  
    493.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno  
    494.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  
    495.   ENDIF.  
    496.   
    497. ENDFORM.                    " UPLOAD_DATA  
    498. </pre>  

    四, 最后说的是使用ALE技术, 利用IDOC和BAPI实现数据传输功能。我在这里提供一个链接,这是郭裕老师的在线课程录像下载, 主要讲述的是ALE技术和MASTER DATA DISTRIBUTION技术:http://www.itpub.net/494989,1.html

  • 相关阅读:
    JavaScript 学习16.简化对象写法 上海
    JavaScript 学习11.字符串 String 对象 上海
    JavaScript 学习12.模板字符串(Template Strings) 上海
    JavaScript 学习10.使用const声明常量 上海
    JavaScript 学习9.使用let声明变量 上海
    JavaScript 学习13.Set 集合对象 上海
    一文讲透为Power Automate for Desktop (PAD) 实现自定义模块 附完整代码
    是时候使用 YAML 来做配置或数据文件了
    在博客文章中使用mermaid 定义流程图,序列图,甘特图
    .netcore+vue 实现压缩文件下载
  • 原文地址:https://www.cnblogs.com/levin/p/1543179.html
Copyright © 2020-2023  润新知