总帐凭证导入EXCEL,并且批量输入(FB50)的BDC

来源:互联网 发布:java编写计算器教程 编辑:程序博客网 时间:2024/05/21 08:45

总帐凭证批量输入BDC示例,其中关于循环添加项目的部分,没有做便于大家清楚不循环前是怎样的个状态,

*&---------------------------------------------------------------------**& Report  Z_TEST_FB50*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT  Z_TEST_FB50.DATA: BEGIN OF ITAB OCCURS 0,   BLDAT LIKE BKPF-BLDAT,  "凭证日期   WAERS LIKE BKPF-WAERS,  "公司代码 1000/2000   BUDAT LIKE BKPF-BUDAT,  "过帐日期   XBLNR LIKE BKPF-XBLNR,  "参照   BKTXT LIKE BKPF-BKTXT,  "抬头文本   BVORG LIKE BKPF-BVORG,  "往来凭证号   HKONT LIKE BSEG-HKONT,  "科目   SHKZG LIKE BSEG-SHKZG,  "借/贷 H/S   WRBTR LIKE BSEG-WRBTR,  "金额   MWSKZ like BSEG-MWSKZ,  "税金   ZUONR LIKE BSEG-ZUONR,  "项目分配编号   SGTXT LIKE BSEG-SGTXT,  "项目文本   KOSTL LIKE BSEG-KOSTL,  "成本中心   PRCTR LIKE BSEG-PRCTR,  "利润中心  END OF ITAB.DATA BEGIN OF IT_BDC OCCURS 0.  "IT_BDC是定义了内表,该内表就是存放BDC的操作步骤        INCLUDE STRUCTURE BDCDATA.DATA END OF IT_BDC.DATA: BEGIN OF GT_MESSTAB OCCURS 10. "message table        INCLUDE STRUCTURE BDCMSGCOLL.DATA: END OF GT_MESSTAB.DATA:   MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE."MESSTAB中保存的是执行完BDC系统的返回信息DATA:   WA_MESSTAB LIKE BDCMSGCOLL,        LC_INFORECORD(10) TYPE C.DATA:   LC_LINE TYPE I.DATA: BEGIN OF WA_RE_VAL,        ZZBID(18)   TYPE C,        STATUS(10) TYPE C,        TEXT(100)   TYPE C,      END OF WA_RE_VAL.DATA: GV_GROUP(12) TYPE C VALUE 'FB50L_ORD',      "BDC Name      GV_USER(12)  TYPE C,                           "BDC User      GV_KEEP(1)   TYPE C VALUE 'X',                 " ' '=Delete,'X'=keep after processing      GV_HOLDDATE  LIKE SY-DATUM.                    "DateTYPE-POOLS: slis.DATA: i_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,     "slis_t_fieldcat_alv WITH HEADER LINE,slis_t_fieldcat_alv      i_fieldcat_alv TYPE slis_t_fieldcat_alv WITH HEADER LINE,      i_events TYPE slis_t_event,              "alv事件      w_events LIKE LINE OF i_events,      gd_tab_group TYPE slis_t_sp_group_alv,*      gd_layout    TYPE lvc_s_layo,     "slis_layout_alv,      gd_layout    TYPE  slis_layout_alv,      usercommand TYPE slis_fieldname VALUE 'USERCOMMAND',      gd_repid     LIKE sy-repid.CONSTANTS:  c_begin_row TYPE i VALUE 1,       "Beginning row of excel file  c_begin_col TYPE i VALUE 1,       "Beginning column of excel file  c_end_row   TYPE i VALUE 9999,    "Ending row of excel file  c_end_col   TYPE i VALUE 55.      "Ending column of excel filePARAMETERS: BDCTYPE(1) TYPE C DEFAULT 'B' NO-DISPLAY,*            BDCMODE    LIKE BDCRUN-BDC_AMODUS DEFAULT 'A' NO-DISPLAY.            BDCMODE    LIKE BDCRUN-BDC_AMODUS DEFAULT 'N' NO-DISPLAY.SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t2.*PARAMETERS:cc AS CHECKBOX DEFAULT 'X'.PARAMETERS: pc_file(80).SELECTION-SCREEN END OF BLOCK b2.INITIALIZATION.*  t1 = '查询条件'.  t2 = '文件上传'.AT SELECTION-SCREEN ON VALUE-REQUEST FOR pc_file.  PERFORM sub_find USING pc_file.*&---------------------------------------------------------------------**&      Form  sub_find*&---------------------------------------------------------------------**       text*----------------------------------------------------------------------**      -->PC_FILE    text*----------------------------------------------------------------------*FORM sub_find USING pc_file.* Data for open dialog  DATA: l_filetab   TYPE filetable,        l_rc        TYPE i.  CLEAR l_filetab.  REFRESH l_filetab.* Open dialog  CALL METHOD cl_gui_frontend_services=>file_open_dialog    EXPORTING*      WINDOW_TITLE            = 'SAP Custom - Open File'*      DEFAULT_EXTENSION       =      default_filename        = '*.xls'*      FILE_FILTER             = '*.xls'      initial_directory       = 'd:\'      multiselection          = ''    CHANGING      file_table              = l_filetab      rc                      = l_rc    EXCEPTIONS      cntl_error              = 1      error_no_gui            = 2      not_supported_by_gui    = 3      OTHERS                  = 4.* Get file path  CHECK l_rc EQ 1.  READ TABLE l_filetab INDEX 1 INTO pc_file.ENDFORM.START-OF-SELECTION.  PERFORM uploaddata.   "从PC中上传文件到内表中  PERFORM layout_build. "2.用于定义ALV表单的相关格式、属性  PERFORM fields_build. "3.用来定义表单中的各个列的相关信息,比如列名等  PERFORM display_data. "4.用来显示ALV表单END-OF-SELECTION.*---------------------------------FORM TOOLBAR USING rt_extab TYPE slis_t_extab.                                "调用的FORM  SET PF-STATUS 'TOOLBAR1'.ENDFORM.                    "PF_STATUS_SET*&---------------------------------------------------------------------**&      2.RFORM uploaddata.   "从PC中上传文件到内表中*&---------------------------------------------------------------------*FORM uploaddata.  DATA: BEGIN OF i_excel OCCURS 0.          INCLUDE STRUCTURE alsmex_tabline.  DATA: END OF i_excel.  DATA: l_answer(1) TYPE c.  DATA: l_column TYPE i.  FIELD-SYMBOLS: <fs>.  DATA: l_pathname LIKE rlgrap-filename.  MOVE pc_file TO l_pathname.  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'    EXPORTING      filename                = l_pathname      i_begin_col             = c_begin_col      i_begin_row             = c_begin_row      i_end_col               = c_end_col      i_end_row               = c_end_row    TABLES      intern                  = i_excel    EXCEPTIONS      inconsistent_parameters = 1      upload_ole              = 2      OTHERS                  = 3.  IF sy-subrc <> 0.    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.  ELSE.    IF i_excel[] IS INITIAL.      CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'        EXPORTING*         DEFAULTOPTION        = 'Y'          diagnosetext1        = 'No data in excel'*         DIAGNOSETEXT2        = ' '*         DIAGNOSETEXT3        = ' '          textline1            = 'No data in excel'*         TEXTLINE2            = ' '          titel                = 'Confirm'*         START_COLUMN         = 25*         START_ROW            = 6*         CANCEL_DISPLAY       = 'X'        IMPORTING          answer               = l_answer.    ELSE.      DELETE i_excel WHERE row = '0001'.      SORT i_excel BY row col.      LOOP AT i_excel.        MOVE i_excel-col TO l_column.        ASSIGN COMPONENT l_column OF STRUCTURE ITAB TO <fs>.        MOVE i_excel-value TO <fs>.        AT END OF row.          APPEND ITAB.          CLEAR ITAB.        ENDAT.      ENDLOOP.    ENDIF.  ENDIF.ENDFORM.                    "UPLOADDATA*&---------------------------------------------------------------------**&      1.执行用户命令*&---------------------------------------------------------------------*FORM usercommand USING ucomm TYPE sy-ucomm selfield TYPE slis_selfield.   CASE sy-ucomm.*    WHEN 'DELE'.    WHEN 'SCPZ'.      PERFORM FRM_BDC_CALL.  ENDCASE.ENDFORM.                    "USER_COMMAND*&---------------------------------------------------------------------**&      2.Form  layout_build 设置alv显示格式和属性*&---------------------------------------------------------------------*FORM layout_build .**  i_layout-detail_popup = 'X'.        "是否弹出详细信息窗口**  i_layout-no_vline = ' '.            "这个用来设置列间隔线*  i_layout-colwidth_optimize = 'X'.   "优化列宽选项是否设置*  i_layout-detail_initial_lines = 'X'.    "show also initial lines*  i_layout-detail_titlebar = '详细内容'.   "设置弹出窗口的标题栏**  i_layout-f2code = '&ETA'.           "设置触发弹出详细信息窗口的功能码,这里是双击*gd_layout-info_fieldname = 'COLOR'.  "颜色值*  i_layout-no_colhead = ' '.*  gd_repid = sy-repid.                  "程序为当前程序*  gd_layout-stylefname = 'FIELD_STYLE'.*  gd_layout-zebra             = 'X'.ENDFORM. "layout_build*&---------------------------------------------------------------------**&      3.Form  fields_build 设置报表显示列属性信息*&---------------------------------------------------------------------*FORM fields_build .  REFRESH i_fieldcat_alv.  gd_repid = sy-repid.  CLEAR i_fieldcat.  DATA colnum TYPE i.  i_fieldcat-fieldname = 'BLDAT'.  i_fieldcat-seltext_s = '凭证日期'.  i_fieldcat-seltext_m = '凭证日期'.  i_fieldcat-seltext_l = '凭证日期'.  i_fieldcat-outputlen = 15.  i_fieldcat-key = 'X'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'WAERS'.  i_fieldcat-seltext_s = '公司代码'.  i_fieldcat-seltext_m = '公司代码'.  i_fieldcat-seltext_l = '公司代码'.*  i_fieldcat-outputlen = 20.*  i_fieldcat-key = 'X'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'BUDAT'.  i_fieldcat-seltext_s = '过帐日期'.  i_fieldcat-seltext_m = '过帐日期'.  i_fieldcat-seltext_l = '过帐日期'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'XBLNR'.  i_fieldcat-seltext_s = '参照'.  i_fieldcat-seltext_m = '参照'.  i_fieldcat-seltext_l = '参照'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'BKTXT'.  i_fieldcat-seltext_s = '抬头文本'.  i_fieldcat-seltext_m = '抬头文本'.  i_fieldcat-seltext_l = '抬头文本'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'BVORG'.  i_fieldcat-seltext_s = '往来凭证号'.  i_fieldcat-seltext_m = '往来凭证号'.  i_fieldcat-seltext_l = '往来凭证号'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'HKONT'.  i_fieldcat-seltext_s = '科目'.  i_fieldcat-seltext_m = '科目'.  i_fieldcat-seltext_l = '科目'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'SHKZG'.  i_fieldcat-seltext_s = '借/贷'.  i_fieldcat-seltext_m = '借/贷'.  i_fieldcat-seltext_l = '借/贷'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'WRBTR'.  i_fieldcat-seltext_s = '金额'.  i_fieldcat-seltext_m = '金额'.  i_fieldcat-seltext_l = '金额'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'ZUONR'.  i_fieldcat-seltext_s = '项目分配编号'.  i_fieldcat-seltext_m = '项目分配编号'.  i_fieldcat-seltext_l = '项目分配编号'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'SGTXT'.  i_fieldcat-seltext_s = '项目文本'.  i_fieldcat-seltext_m = '项目文本'.  i_fieldcat-seltext_l = '项目文本'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'KOSTL'.  i_fieldcat-seltext_s = '成本中心'.  i_fieldcat-seltext_m = '成本中心'.  i_fieldcat-seltext_l = '成本中心'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.  colnum = colnum + 1.  i_fieldcat-col_pos = colnum.  i_fieldcat-fieldname = 'PRCTR'.  i_fieldcat-seltext_s = '利润中心'.  i_fieldcat-seltext_m = '利润中心'.  i_fieldcat-seltext_l = '利润中心'.  APPEND i_fieldcat TO i_fieldcat_alv.  CLEAR i_fieldcat.ENDFORM.                    "fields_build*&---------------------------------------------------------------------**&      4.Form  display_data 用来显示ALV表单*&---------------------------------------------------------------------*FORM display_data .  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'   EXPORTING*     I_CALLBACK_USER_COMMAND           = 'USER_COMMAND'                               "用户触发事件*    i_callback_pf_status_set          = 'PF_STATUS_SET'(001)                        "调用用户事件和按钮事件     i_callback_program                = gd_repid                                      "当前程序     is_layout                         = gd_layout                                     "子函数layout_build填充的格式定义     it_fieldcat                       = i_fieldcat_alv[]                             "子函数fields填充的各列     it_events                         = i_events[]     " i_grid_title                      = ''       i_callback_user_command  =  usercommand              "3.处理事务     i_save                            = 'A'     i_callback_pf_status_set = 'TOOLBAR'    TABLES      t_outtab                          = ITAB.                                       "假设数据都在h_itab内表中  IF sy-subrc <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  ENDIF.ENDFORM.                    " display_data*&———————————————————————**&      Form  FRM_BDC_CALL*&———————————————————————**       循环的把EXCEL里面的数据放到系统里面*———————————————————————-*FORM FRM_BDC_CALL.  "LOOP AT IT_ITAB INTO WA_ITAB.  "UNAME1 = SY-UNAME.  SY-UNAME = 'GM000SYM'.                  "可以更改成有权限的用户帐号来执行。    GV_USER = SY-UNAME.  CALL FUNCTION 'BDC_OPEN_GROUP'    EXPORTING      CLIENT   = SY-MANDT      GROUP    = GV_GROUP      HOLDDATE = GV_HOLDDATE      KEEP     = GV_KEEP      USER     = GV_USER.    PERFORM FRM_BDC_FB50.             "FB50的具体BDC执行过程  CALL FUNCTION 'BDC_CLOSE_GROUP'.ENDFORM.                    "FRM_BDC_CALL*&———————————————————————**&      Form  FRM_BDC_FB50*&———————————————————————**       FB50的BDC*———————————————————————-*FORM FRM_BDC_FB50.  DATA: L_MODE TYPE C VALUE 'N'."BDC执行的模式  PERFORM BDC_DYNPRO      USING 'SAPMF05A' '1001'.  PERFORM BDC_FIELD      USING 'BDC_OKCODE' '=BU'.*  PERFORM BDC_FIELD       USING ‘BDC_SUBSCR’‘SAPMF05A                                1010HEAD′.  PERFORM BDC_FIELD      USING 'ACGL_HEAD-BLDAT'      '2012-12-04'.  PERFORM BDC_FIELD      USING 'ACGL_HEAD-WAERS'     'HKD'.  PERFORM BDC_FIELD      USING 'ACGL_HEAD-BUDAT'     '2012-12-05'.  PERFORM BDC_FIELD      USING 'ACGL_HEAD-XBLNR'     '参照'.  PERFORM BDC_FIELD      USING 'ACGL_HEAD-BKTXT'     '抬头文本'.  PERFORM BDC_FIELD      USING 'ACGL_HEAD-BVORG'     '往来凭证号'.*************************以下这部分可以循环添***********************************  PERFORM BDC_FIELD      USING 'ACGL_ITEM-HKONT(01)' '700245'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-SHKZG(01)' 'S'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-WRBTR(01)' '100'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-MWSKZ(01)' 'J0'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-ZUONR(01)' '项目分配编号'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-SGTXT(01)' '项目文本'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-KOSTL(01)' '8001052'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-PRCTR(01)' '900098'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-HKONT(02)' '700245'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-SHKZG(02)' 'H'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-WRBTR(02)' '100'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-MWSKZ(02)' 'J0'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-ZUONR(02)' '项目分配编号'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-SGTXT(02)' '项目文本3'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-KOSTL(02)' '8000002'.  PERFORM BDC_FIELD      USING 'ACGL_ITEM-PRCTR(02)' '900098'.*************************以下这部分可以循环添***********************************  CALL TRANSACTION  'FB50' USING IT_BDC MODE L_MODE UPDATE 'S' MESSAGES INTO MESSTAB.   "S-代表同步执行,既立刻执行; N-后台执行  IF SY-SUBRC = 0.    COMMIT WORK.*读信息记录编号    READ TABLE MESSTAB INTO WA_MESSTAB WITH KEY MSGTYP = 'S'.    MESSAGE ID     WA_MESSTAB-MSGID           TYPE   'S'           NUMBER WA_MESSTAB-MSGNR          INTO   WA_RE_VAL-TEXT           WITH   WA_MESSTAB-MSGV1                  WA_MESSTAB-MSGV2                  WA_MESSTAB-MSGV3                  WA_MESSTAB-MSGV4.    WRITE:/ WA_RE_VAL-TEXT.  ELSE.*执行失败,写失败原因    ROLLBACK WORK.    READ TABLE MESSTAB INTO WA_MESSTAB WITH KEY MSGTYP = 'E'.    MESSAGE ID     WA_MESSTAB-MSGID            TYPE   'E'            NUMBER WA_MESSTAB-MSGNR          INTO   WA_RE_VAL-TEXT            WITH   WA_MESSTAB-MSGV1                   WA_MESSTAB-MSGV2                   WA_MESSTAB-MSGV3                   WA_MESSTAB-MSGV4.    WRITE:/ WA_RE_VAL-TEXT.  ENDIF.  REFRESH MESSTAB.  CLEAR: WA_MESSTAB,WA_RE_VAL,IT_BDC,IT_BDC[].ENDFORM.*&———————————————————————**&      Form  BDC_DYNPRO*&———————————————————————**       填写程序与屏幕*———————————————————————-**     –>  PR_PROGRAM     程序*     –>  PR_DYNPRO      屏幕*———————————————————————-*FORM BDC_DYNPRO USING PR_PROGRAM PR_DYNPRO.  CLEAR IT_BDC.  IT_BDC-PROGRAM  = PR_PROGRAM.  IT_BDC-DYNPRO   = PR_DYNPRO.  IT_BDC-DYNBEGIN = 'X'.  APPEND IT_BDC.ENDFORM.                               " BDC_DYNPRO*&———————————————————————**&      Form  BDC_FIELD*&———————————————————————**       填写字段与值*———————————————————————-**     –>  PR_FNAM     字段*     –>  PR_FVAL     值*———————————————————————-*FORM BDC_FIELD USING PR_FNAM PR_FVAL.  CLEAR IT_BDC.  IT_BDC-FNAM = PR_FNAM.  IT_BDC-FVAL = PR_FVAL.  APPEND IT_BDC.ENDFORM.                    "FRM_BDC_FIELD


原创粉丝点击