SAP FI 会计凭证批量创建实现 客户/供应商/资产

59 篇文章 6 订阅

统驭科目+特别总账标记 → 总账科目 

主要SAP 会计凭证 BAPI 

1、检查凭证参数是否有问题 BAPI_ACC_DOCUMENT_CHECK

2、产生凭证编号并占用 BAPI_ACC_DOCUMENT_POST 

      注意:不及时commit的情况下 不会产生会计凭证 

3、BAPI_TRANSACTION_COMMIT

 Excel分页签导入格式

抬头页签:

总账页签:

 客商页签

 税页签 

执行结果

双击会计凭照号  用FB03打开会计凭证

上代码

*&---------------------------------------------------------------------*
*& Report  ZDIA_FIDOC_C_FROM_XLS_F_02
*&
*&---------------------------------------------------------------------*
*& date : 20220830
*& author: gavin

*& tcode:ZF-02
*&---------------------------------------------------------------------*
REPORT ZDIA_FIDOC_C_FROM_XLS_F_02.
TABLES:SSCRFIELDS,MKPF,MSEG.
FIELD-SYMBOLS: <FS>.

INCLUDE OLE2INCL.  " FOR OLE

DATA: EXCEL TYPE OLE2_OBJECT,
      BOOKS TYPE OLE2_OBJECT,
      SHEET TYPE OLE2_OBJECT,
      CELL  TYPE OLE2_OBJECT.
DATA:L_FILENAME TYPE STRING,L_MUBAN TYPE STRING.
DATA:GV_FULLPATH TYPE STRING,GV_PATH TYPE STRING,GV_NAME TYPE STRING.

DATA: IT_FIELDCAT TYPE LVC_T_FCAT,
      WA_LAYOUT   TYPE LVC_S_LAYO.

DATA: IT_OUTPUT TYPE REF TO DATA,
       PPFILE  TYPE RLGRAP-FILENAME,
WA_OUTPUT TYPE REF TO DATA.
FIELD-SYMBOLS: <IT_OUTPUT>     TYPE STANDARD TABLE,
<WA_OUTPUT>.

DATA:
      STDATUM LIKE SY-DATUM,
      STUZEIT LIKE SY-UZEIT,
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
GS_LAYOUT   TYPE SLIS_LAYOUT_ALV.

*head
DATA:BEGIN OF HEADWTAB,
  HEADTXT LIKE BKPF-BKTXT,"凭证日期
  BUKRS LIKE BKPF-BUKRS,"过账日期
  DOCDATE LIKE BKPF-BLDAT, "抬头文本
  PSTDATE LIKE BKPF-BUDAT,"GMCODE
  DOCTYPE like BKPF-BLART,"会计凭证类型
  NETPST LIKE BAPIACHE09-NEG_POSTNG,"反记账
  GLITEMS TYPE I,"总账开始
  GLITEME TYPE I, "总账结束
  CVITEMS TYPE I,"客户供应商 开始
  CVITEME TYPE I,"客户供应商 结束
  TAXITEMS TYPE I, "税开始
  TAXITEME TYPE I, "税结束
  BELNR TYPE BKPF-BELNR," 会计凭证
  STATUS TYPE C,"状态
  MSGTXT(255) TYPE C, " 失败文本描述
  END OF HEADWTAB.

DATA:BEGIN OF GLITEMWTAB,
  itemacc LIKE BAPIACGL09-ITEMNO_ACC,"行序号
  BSCHL LIKE ZFIDOCEXT-BSCHL,"记账码
  GL_ACCOUNT LIKE BAPIACGL09-GL_ACCOUNT,"科目
  ITEM_TEXT LIKE BAPIACGL09-ITEM_TEXT,"行项目文本
  BUS_AREA LIKE BAPIACGL09-BUS_AREA,"业务范围
  ALLOC_NMBR like  BAPIACGL09-ALLOC_NMBR,"分配
  TAXCODE LIKE  BAPIACTX09-TAX_CODE,"税码
  ACCT_TYPE LIKE BAPIACGL09-ACCT_TYPE,"科目类型  资产 = A
  CS_TRANS_T LIKE BAPIACGL09-CS_TRANS_T,"事务类型  资产必输
  DOC_TYPE LIKE BAPIACGL09-DOC_TYPE, "凭证类型
  COSTCENTER LIKE BAPIACGL09-COSTCENTER,"成本中心
  ASSET_NO like BAPIACGL09-ASSET_NO, " 主资产编号
  SUB_NUMBER LIKE BAPIACGL09-SUB_NUMBER,"次资产编号
  CURRENCY LIKE  BAPIACCR09-CURRENCY,"货币
  AMOUNT like  BAPIACCR09-AMT_DOCCUR, "金额
  RSTGR like ZFIDOCEXT-RSTGR, "原因代码
END OF GLITEMWTAB.

DATA:BEGIN OF VCITEMWTAB,
  itemacc LIKE BAPIACGL09-ITEMNO_ACC,"行序号
  BSCHL LIKE ZFIDOCEXT-BSCHL,"记账码
  KNRVOR LIKE kna1-KUNNR,"客户或者供应商
  BUKRS LIKE BAPIACAR09-COMP_CODE,"公司
  BUS_AREA LIKE BAPIACGL09-BUS_AREA,"业务范围
  ITEM_TEXT LIKE BAPIACGL09-ITEM_TEXT,"行项目文本
  ALLOC_NMBR like  BAPIACGL09-ALLOC_NMBR,"分配
  DORK TYPE C,"客户/供应商 D客户/K供应商
  SP_GL_IND TYPE C,"特别总账标识
  CURRENCY LIKE  BAPIACCR09-CURRENCY,"货币
  AMOUNT LIKE  BAPIACCR09-AMT_DOCCUR, "金额
  RSTGR LIKE ZFIDOCEXT-RSTGR, "原因代码
END OF VCITEMWTAB.

DATA:BEGIN OF TAXITEMWTAB,
  itemacc LIKE BAPIACGL09-ITEMNO_ACC,"行序号
  BSCHL LIKE ZFIDOCEXT-BSCHL,"记账码
  GL_ACCOUNT LIKE BAPIACGL09-GL_ACCOUNT,"科目
  TAXCODE LIKE  BAPIACTX09-TAX_CODE,"税码
  CURRENCY LIKE  BAPIACCR09-CURRENCY,"货币
  AMOUNT LIKE  BAPIACCR09-AMT_DOCCUR, "金额
  RSTGR LIKE ZFIDOCEXT-RSTGR, "原因代码
END OF TAXITEMWTAB.

DATA:SHEADITAB LIKE STANDARD TABLE OF HEADWTAB.
data:WHead like HEADWTAB.
DATA:SGLITEMITAB LIKE STANDARD TABLE OF GLITEMWTAB.
DATA:SUBGLITEMTAB LIKE STANDARD TABLE OF GLITEMWTAB.
DATA:GLWITEM LIKE GLITEMWTAB.
DATA:SVCITEMITAB LIKE STANDARD TABLE OF VCITEMWTAB.
DATA:SUBVCITEMTAB LIKE STANDARD TABLE OF VCITEMWTAB.
DATA:VCWITEM LIKE VCITEMWTAB.
DATA:STAXITEMITAB LIKE STANDARD TABLE OF TAXITEMWTAB.
DATA:SUBTAXITEMTAB LIKE STANDARD TABLE OF TAXITEMWTAB.
DATA:TAXWITEM LIKE TAXITEMWTAB.

DATA:
      FILETAB TYPE FILETABLE WITH HEADER LINE.
*import
data:lst TYPE i,lend TYPE i,RC TYPE I.

DATA:runnercnt TYPE I,
      sumrcnt TYPE I.
DATA:pdate TYPE sy-datum.

DATA: ll_lines(10),"行数
      ll_tabix(10),"循环标号
      ll_pecnt TYPE p LENGTH 6 DECIMALS 2,"百分比
      ll_pecet(6),"百分数
      ll_text(40)."消息
CLEAR: ll_lines,ll_tabix,ll_pecnt,ll_pecet,ll_text.

*&---------------------------------------------------------------------*
*& 选择界面
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TXT1 .

PARAMETER: P_FILE  TYPE STRING DEFAULT ''.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 5(20) but1 USER-COMMAND bt1.
*SELECTION-SCREEN PUSHBUTTON 30(20) but2 USER-COMMAND bt2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK BLK1.

SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TXT2 .
PARAMETER:  PHCOLST TYPE I DEFAULT 1,
            PHCOLED TYPE I DEFAULT 12,
            PHROWST TYPE I DEFAULT 2,
            PHROWED TYPE I DEFAULT 20.
SELECTION-SCREEN END OF BLOCK BLK2.

SELECTION-SCREEN BEGIN OF BLOCK BLK3 WITH FRAME TITLE TXT3 .
PARAMETER: PGLCOLST TYPE I DEFAULT 2,
PGLCOLED TYPE I DEFAULT 16,
PGLROWST TYPE I DEFAULT 2,
PGLROWED TYPE I DEFAULT 100.
SELECTION-SCREEN END OF BLOCK BLK3.

SELECTION-SCREEN BEGIN OF BLOCK BLK4 WITH FRAME TITLE TXT4 .
PARAMETER: PCVCOLST TYPE I DEFAULT 2,
PCVCOLED TYPE I DEFAULT 13,
PCVROWST TYPE I DEFAULT 2,
PCVROWED TYPE I DEFAULT 100.
SELECTION-SCREEN END OF BLOCK BLK4.

SELECTION-SCREEN BEGIN OF BLOCK BLK5 WITH FRAME TITLE TXT5 .
PARAMETER: PTXCOLST TYPE I DEFAULT 2,
PTXCOLED TYPE I DEFAULT 8,
PTXROWST TYPE I DEFAULT 2,
PTXROWED TYPE I DEFAULT 100.
SELECTION-SCREEN END OF BLOCK BLK5.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK DESC WITH FRAME TITLE BLKTEXT1.
SELECTION-SCREEN COMMENT 1(78) TXT11.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT 1(78) TXT21.
SELECTION-SCREEN SKIP.
*  SELECTION-SCREEN COMMENT 1(78) TXT3.
*  SELECTION-SCREEN SKIP.
*  SELECTION-SCREEN COMMENT 1(78) TXT4.
*  SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT 1(78) TXT6.
SELECTION-SCREEN END OF BLOCK DESC.

INITIALIZATION.
  TXT1 = '请输入条件'.
  TXT2  = '请检查模板抬头行列开始结束'.
  TXT3 = '请检查模板总账行项目行列开始结束'.
  TXT4 = '请检查模板客户/供应商行项目行列开始结束'.
  TXT5 = '请检查模板税行项目行列开始结束'.

  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name                  = ICON_BW_REF_STRUCTURE_SAP
      TEXT                  = '模板下载'
      INFO                  = '模板下载'
    IMPORTING
      result                = but1
    EXCEPTIONS
      icon_not_found        = 1
      outputfield_too_short = 2
      OTHERS                = 3.

  BLKTEXT1 = '使用场景和逻辑简介'.
  TXT11 = '需求来源:田德诗  功能:通过Excel模板批量生成F-02物料凭证,'.
  TXT21 = ''.

  pdate = 20220830.CLEAR sumrcnt.
  PERFORM getrunstatic(ZPRT_FI_SCCB1L) USING pdate sy-REPID CHANGING runnercnt sumrcnt.
  TXT6 = '运行情况:总共' && runnercnt && '用户运行了' && sumrcnt && '次,'.
  pdate = sy-datum.pdate+4(4) = '0101'.CLEAR sumrcnt.
  PERFORM getrunstatic(ZPRT_FI_SCCB1L) USING pdate sy-REPID CHANGING runnercnt sumrcnt.
  TXT6 = TXT6 && '本年度总共' && runnercnt && '用户运行了' && sumrcnt && '次,'.
  pdate = sy-datum.pdate+6(2) = '01'.CLEAR sumrcnt.
  PERFORM getrunstatic(ZPRT_FI_SCCB1L) USING pdate sy-REPID CHANGING runnercnt sumrcnt.
  TXT6 = TXT6 && '本月度总共' && runnercnt && '用户运行了' && sumrcnt && '次'.


*&---------------------------------------------------------------------
AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'BT1'.
      PERFORM DOWNLOAD_DATA.
  ENDCASE.

*  选择文件
AT selection-SCREEN ON VALUE-request FOR P_FILE.
*  选择文件
*  PERFORM GET_FILENAME USING P_FILE.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      DEFAULT_FILENAME = P_FILE
    CHANGING
      RC               = RC
      FILE_TABLE       = FILETAB[].

  READ TABLE  FILETAB INDEX  1.
  IF SY-SUBRC EQ 0.
    P_FILE = FILETAB-FILENAME.
  ENDIF.
  PPFILE = P_FILE.

start-of-selection.

*--取得销售订单抬头数据
  PERFORM UPOLOAD_FILE TABLES SHEADITAB USING 'HEAD' PHCOLST PHROWST PHCOLED PHROWED .
  PERFORM UPOLOAD_FILE TABLES SGLITEMITAB USING 'ACCOUNTGL' PGLCOLST PGLROWST PGLCOLED PGLROWED.
  PERFORM UPOLOAD_FILE TABLES SVCITEMITAB USING 'CUST_VENDOR' PCVCOLST PCVROWST PCVCOLED PCVROWED.
  PERFORM UPOLOAD_FILE TABLES STAXITEMITAB USING 'TAX' PTXCOLST PTXROWST PTXCOLED PTXROWED.
  PERFORM WRITERPTRUNRECORD(ZDIA_SO_C_FROM_XLSMODEL) USING sy-TCODE SY-CPROG sy-datum sy-UZEIT '20220831' 'FICO-'.
  PERFORM DISALV .

*&---------------------------------------------------------------------*
*&      Form  fillresult2file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->COL        text
*      -->LOW        text
*      -->VALUE      text
*----------------------------------------------------------------------*
FORM FILLRESULT2FILE TABLES  TABLEITEM TYPE STANDARD TABLE.
  DATA: lv_string TYPE TZONREF-TSTAMPS.", TZONREF-TSTAMPL".
  GET TIME STAMP FIELD lv_string.
  data:lfilename TYPE STRING.
  data:lext TYPE String.
  SPLIT P_file at '.' into lfilename lext.
  lfilename = lfilename && lv_string && '.txt'.

  CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
*  BIN_FILESIZE                    =
    filename                        = lfilename
    FILETYPE                        =  'DAT' "'ASC'
    APPEND                          = ' '
    WRITE_FIELD_SEPARATOR           = ' '
    HEADER                          = '00'
    TRUNC_TRAILING_BLANKS           = ' '
    WRITE_LF                        = 'X'
    COL_SELECT                      = ' '
    COL_SELECT_MASK                 = ' '
    DAT_MODE                        = ' '
    CONFIRM_OVERWRITE               = ' '
    NO_AUTH_CHECK                   = ' '
    CODEPAGE                        = '4110'
    IGNORE_CERR                     = ABAP_TRUE
    REPLACEMENT                     = '#'
    WRITE_BOM                       = ' '
    TRUNC_TRAILING_BLANKS_EOL       = 'X'
    WK1_N_FORMAT                    = ' '
    WK1_N_SIZE                      = ' '
    WK1_T_FORMAT                    = ' '
    WK1_T_SIZE                      = ' '
*IMPORTING
*  FILELENGTH                      =
  TABLES
    data_tab                        = TABLEITEM
*  FIELDNAMES = GT_FIELDCAT
  EXCEPTIONS
    file_write_error                = 1
    no_batch                        = 2
    gui_refuse_filetransfer         = 3
    invalid_type                    = 4
    no_authority                    = 5
    unknown_error                   = 6
    header_not_allowed              = 7
    separator_not_allowed           = 8
    filesize_not_allowed            = 9
    header_too_long                 = 10
    dp_error_create                 = 11
    dp_error_send                   = 12
    dp_error_write                  = 13
    unknown_dp_error                = 14
    access_denied                   = 15
    dp_out_of_memory                = 16
    disk_full                       = 17
    dp_timeout                      = 18
    file_not_found                  = 19
    dataprovider_exception          = 20
    control_flush_error             = 21
    OTHERS                          = 22
    .
  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.                    "FILLRESULT2FILE

*&---------------------------------------------------------------------*
*&      Form  fill_cell
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_I        text
*      -->P_J        text
*      -->P_VAL      text
*----------------------------------------------------------------------*
FORM FILL_CELL USING    P_I
      P_J
      P_VAL.
  CALL METHOD OF
      EXCEL
      'CELLS' = CELL
    EXPORTING
      #1      = P_I
      #2      = P_J.
  SET PROPERTY OF CELL 'VALUE' = P_VAL.

ENDFORM.                    " FILL_CELL


**&--------------------------------------------------------------------*
**&      FORM  USER_COMMAND
**&--------------------------------------------------------------------*
**       TEXT
**---------------------------------------------------------------------*
**      -->RF_UCOMM   TEXT
**      -->RS_SELFIELDTEXT
**---------------------------------------------------------------------*
FORM USER_COMMAND USING RF_UCOMM    LIKE SY-UCOMM
      RS_SELFIELD TYPE SLIS_SELFIELD.                       "#EC CALLED

  CASE RF_UCOMM.
    WHEN '&IC1'.
      DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
      DATA L_TABIX LIKE SY-TABIX.
      IF RS_SELFIELD-FIELDNAME = 'BELNR'.
        READ TABLE SHEADITAB INDEX RS_SELFIELD-TABINDEX INTO WHEAD.
        IF WHEAD-BELNR IS NOT INITIAL AND WHEAD-BELNR NE SPACE.
          SET PARAMETER ID 'BLN' FIELD WHEAD-BELNR.
          SET PARAMETER ID 'GJR' FIELD sy-datum+0(4).
          SET PARAMETER ID 'BUK' FIELD WHEAD-BUKRS.
          CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
        ENDIF.
      ENDIF.
    WHEN '&SOC'.
*****插入数据
      DESCRIBE TABLE SHEADITAB LINES ll_lines."获取内表行数
      LOOP AT SHEADITAB INTO WHEAD.
        CLEAR SUBGLITEMTAB[].CLEAR SUBVCITEMTAB[].CLEAR SUBTAXITEMTAB[].
        "$. Region 总账
        lst =  WHEAD-GLITEMS - PGLROWST + 1.
        lend = WHEAD-GLITEME - PGLROWST + 1.
        lend = lend  - lst + 1.
*    INSERT LINES OF SITEMITAB[] FROM lst TO lend INTO SUBITEMTAB[].
        DO LEND  TIMES.
          LST = LST + 1.
          READ TABLE SGLITEMITAB INTO GLWITEM INDEX LST.
          APPEND GLWITEM TO SUBGLITEMTAB.
        ENDDO.
        "$. Endregion 总账
        "$. Region 客商
        IF WHEAD-CVITEMS > 0 AND WHEAD-CVITEME > 0.
          LST =  WHEAD-CVITEMS - PCVROWST + 1 .
          LEND = WHEAD-CVITEME - PCVROWST + 1.
          LEND = LEND  - LST + 1.
*    INSERT LINES OF SITEMITAB[] FROM LST TO LEND INTO SUBITEMTAB[].
          DO LEND  TIMES.
            LST = LST + 1.
            READ TABLE SVCITEMITAB INTO VCWITEM INDEX LST.
            APPEND VCWITEM TO SUBVCITEMTAB.
          ENDDO.
        ENDIF.
        "$. Endregion 总账
        "$. Region 税TAX
        IF WHEAD-TAXITEMS > 0 AND WHEAD-TAXITEME > 0.
          LST =  WHEAD-TAXITEMS - PTXROWST + 1 .
          LEND = WHEAD-TAXITEME - PTXROWST + 1.
          LEND = LEND  - LST + 1.
*    INSERT LINES OF SITEMITAB[] FROM LST TO LEND INTO SUBITEMTAB[].

          DO LEND  TIMES.
            LST = LST + 1.
            READ TABLE STAXITEMITAB INTO TAXWITEM INDEX LST.
            APPEND TAXWITEM TO SUBTAXITEMTAB.
          ENDDO.
        ENDIF.
        "$. Endregion 总账

        PERFORM CREATEFIDOC TABLES SUBGLITEMTAB SUBVCITEMTAB SUBTAXITEMTAB USING WHEAD CHANGING WHEAD-BELNR WHEAD-MSGTXT WHEAD-STATUS.
        MODIFY SHEADITAB FROM WHEAD.
        ll_tabix = sy-tabix.
        CONCATENATE '第' ll_tabix '条/,'  ll_lines '条' 'BELNR:' WHEAD-BELNR ' MSG:' WHEAD-MSGTXT  ' 状态:'WHEAD-STATUS  INTO ll_text.
        CONDENSE ll_text."整理格式,去掉多余空格,格式更整齐
        CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'"调用进度条函数,传入百分比和消息
        EXPORTING
          percentage = ll_pecnt
          TEXT       = ll_text.
      ENDLOOP.

      RS_SELFIELD-REFRESH = 'X'.
  ENDCASE.
ENDFORM.                   "USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  CREATESD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ITEM       text
*      -->PHEAD      text
*      -->PVEBLN     text
*      -->PMSG       text
*----------------------------------------------------------------------*
FORM CREATEFIDOC TABLES GLITEM TYPE STANDARD TABLE
  CVITEM TYPE STANDARD TABLE
  TAXITEM TYPE STANDARD TABLE USING
        PHEAD LIKE WHEAD CHANGING PBELNR TYPE BKPF-BELNR
  PMSG TYPE CHAR255 PSTATUS TYPE C.
  DATA: L_EXTNAME TYPE STRING VALUE 'ZFIDOCEXT',
        F_OBJ_TYPE LIKE BAPIACHE09-OBJ_TYPE,
        F_OBJ_KEY LIKE BAPIACHE09-OBJ_KEY,
        F_OBJ_SYS LIKE BAPIACHE09-OBJ_SYS,
        ERRMSG LIKE TABLE OF BAPIRET2 WITH HEADER LINE.

  IF PBELNR IS INITIAL AND PSTATUS NE 'S'.
    CLEAR PSTATUS. CLEAR PMSG.
    DATA:
    DOCHEAD LIKE BAPIACHE09,
    TACCOUNTGL LIKE BAPIACGL09 OCCURS 0 WITH HEADER LINE,
    TACCOUNTRECEIVABLE LIKE BAPIACAR09 OCCURS 0 WITH HEADER LINE,
    TACCOUNTPAYABLE LIKE  BAPIACAP09 OCCURS 0 WITH HEADER LINE,
    TACCOUNTTAX LIKE BAPIACTX09 OCCURS 0 WITH HEADER LINE,
    TCURRENCYAMOUNT LIKE BAPIACCR09 OCCURS 0 WITH HEADER LINE,
    TEXTENSION1 LIKE BAPIACEXTC OCCURS 0 WITH HEADER LINE,
    TRETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,
    TZFIDOCEXT like ZFIDOCEXT OCCURS 0 WITH HEADER LINE.
    DATA: IT_EXTENSION2 TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE.
    DATA: WA_ZEXTEN LIKE ZFIDOCEXT. "ZFIDOCEXT就是刚才SE11创建的那个结构
    DATA: Wshkzg LIKE tbsl-SHKZG.

    "$. Region head
    DOCHEAD-USERNAME = sy-UNAME."凭证中的过账日期
    DOCHEAD-HEADER_TXT = PHEAD-HEADTXT."凭证抬头文本(出库单号)
    DOCHEAD-COMP_CODE = phead-BUKRS."公司代码
    DOCHEAD-DOC_DATE = PHEAD-DOCDATE."凭证日期
    DOCHEAD-DOC_TYPE = PHEAD-DOCTYPE."凭证类型
    DOCHEAD-PSTNG_DATE = PHEAD-PSTDATE."过账日期
    DOCHEAD-TRANS_DATE = sy-datum.
    DOCHEAD-FISC_YEAR = PHEAD-PSTDATE+0(4)."财年
    DOCHEAD-FIS_PERIOD = PHEAD-PSTDATE+4(2)."期间
    DOCHEAD-NEG_POSTNG = PHEAD-NETPST."反记账
    "$. Endregion 客户供应商

    "$. Region 总账/资产
    LOOP  AT GLITEM INTO GLWITEM.
      clear TACCOUNTGL.clear TCURRENCYAMOUNT.clear TZFIDOCEXT.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GLWITEM-ITEMACC
        IMPORTING
          OUTPUT = GLWITEM-ITEMACC.
      TACCOUNTGL-ITEMNO_ACC = GLWITEM-ITEMACC.

      TCURRENCYAMOUNT-AMT_BASE = '100'.
      TCURRENCYAMOUNT-CURR_TYPE = '00'.
      TCURRENCYAMOUNT-ITEMNO_ACC = GLWITEM-ITEMACC.
      TCURRENCYAMOUNT-CURRENCY = GLWITEM-CURRENCY.

      SELECT SINGLE SHKZG  INTO wshkzg FROM tbsl
      WHERE BSCHL  = GLWITEM-BSCHL.

      if wshkzg = 'H'.
        GLWITEM-AMOUNT  = -1 * GLWITEM-AMOUNT.
      endif.
      TCURRENCYAMOUNT-AMT_DOCCUR = GLWITEM-AMOUNT.
      APPEND TCURRENCYAMOUNT.
      TZFIDOCEXT-POSNR = GLWITEM-ITEMACC.
      TZFIDOCEXT-BSCHL = GLWITEM-BSCHL.
      TZFIDOCEXT-RSTGR = GLWITEM-RSTGR.
      APPEND TZFIDOCEXT.

      TACCOUNTGL-GL_ACCOUNT = GLWITEM-GL_ACCOUNT.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = TACCOUNTGL-GL_ACCOUNT
        IMPORTING
          OUTPUT = TACCOUNTGL-GL_ACCOUNT.

      TACCOUNTGL-ITEM_TEXT = GLWITEM-ITEM_TEXT.
      TACCOUNTGL-ALLOC_NMBR = GLWITEM-ALLOC_NMBR.
      TACCOUNTGL-ACCT_TYPE = GLWITEM-ACCT_TYPE.
      TACCOUNTGL-DOC_TYPE = GLWITEM-DOC_TYPE.
      TACCOUNTGL-TAX_CODE = GLWITEM-TAXCODE.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GLWITEM-COSTCENTER
        IMPORTING
          OUTPUT = GLWITEM-COSTCENTER.
      TACCOUNTGL-COSTCENTER = GLWITEM-COSTCENTER.


      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GLWITEM-BUS_AREA
        IMPORTING
          OUTPUT = GLWITEM-BUS_AREA.
      TACCOUNTGL-BUS_AREA = GLWITEM-BUS_AREA.
      TACCOUNTGL-COMP_CODE = phead-BUKRS.

      IF TACCOUNTGL-ACCT_TYPE = 'A'. "资产

        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = GLWITEM-ASSET_NO
          IMPORTING
            OUTPUT = GLWITEM-ASSET_NO.
        TACCOUNTGL-ASSET_NO = GLWITEM-ASSET_NO.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = GLWITEM-SUB_NUMBER
          IMPORTING
            OUTPUT = GLWITEM-SUB_NUMBER.
        TACCOUNTGL-SUB_NUMBER = GLWITEM-SUB_NUMBER.

        SELECT SINGLE T095~KTANSW INTO  TACCOUNTGL-GL_ACCOUNT
          FROM ANLA
          JOIN T095 ON ANLA~KTOGR = T095~KTOGR
          WHERE ANLA~BUKRS = PHEAD-BUKRS AND
                ANLA~ANLN1 = GLWITEM-ASSET_NO AND
                ANLA~ANLN2 = GLWITEM-SUB_NUMBER AND
                T095~KTOPL = 'T001'.

        TACCOUNTGL-CS_TRANS_T = GLWITEM-CS_TRANS_T.
      ENDIF.

      APPEND TACCOUNTGL.

      clear WA_ZEXTEN.
      WA_ZEXTEN-POSNR = GLWITEM-ITEMACC.. "凭证行项目
      WA_ZEXTEN-RSTGR = GLWITEM-RSTGR.
      WA_ZEXTEN-BSCHL = GLWITEM-BSCHL.
      IF GLWITEM-BSCHL  = '70'.
        WA_ZEXTEN-ANBWA = GLWITEM-CS_TRANS_T.
      ENDIF.
      IT_EXTENSION2-STRUCTURE  = L_EXTNAME.
      IT_EXTENSION2-VALUEPART1 = WA_ZEXTEN.
      APPEND IT_EXTENSION2.
    ENDLOOP.
    "$. Endregion 总账/资产

    "$. Region 客户供应商
    LOOP  AT CVITEM INTO VCWITEM.
      clear TACCOUNTPAYABLE.clear TACCOUNTRECEIVABLE .clear TCURRENCYAMOUNT.clear TZFIDOCEXT.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = VCWITEM-ITEMACC
        IMPORTING
          OUTPUT = VCWITEM-ITEMACC.

      TCURRENCYAMOUNT-ITEMNO_ACC = VCWITEM-ITEMACC.
      TCURRENCYAMOUNT-AMT_BASE = '100'.
      TCURRENCYAMOUNT-CURR_TYPE = '00'.
      TCURRENCYAMOUNT-CURRENCY = VCWITEM-CURRENCY.

      SELECT SINGLE SHKZG  INTO wshkzg FROM tbsl
      WHERE BSCHL  = VCWITEM-BSCHL.

      IF wshkzg = 'H'.
        VCWITEM-AMOUNT  = -1 * VCWITEM-AMOUNT.
      ENDIF.

      TCURRENCYAMOUNT-AMT_DOCCUR = VCWITEM-AMOUNT.
      APPEND TCURRENCYAMOUNT.
      TZFIDOCEXT-POSNR = VCWITEM-ITEMACC.
      TZFIDOCEXT-BSCHL = VCWITEM-BSCHL.
      TZFIDOCEXT-RSTGR = VCWITEM-RSTGR.
      APPEND TZFIDOCEXT.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = VCWITEM-KNRVOR
        IMPORTING
          OUTPUT = VCWITEM-KNRVOR.

      IF VCWITEM-DORK = 'D'." 客户
        TACCOUNTRECEIVABLE-ITEMNO_ACC = VCWITEM-ITEMACC.
        TACCOUNTRECEIVABLE-CUSTOMER = VCWITEM-KNRVOR.
        TACCOUNTRECEIVABLE-COMP_CODE = phead-BUKRS.
        TACCOUNTRECEIVABLE-BUS_AREA = VCWITEM-BUS_AREA.
        TACCOUNTRECEIVABLE-SP_GL_IND = VCWITEM-SP_GL_IND.
        TACCOUNTRECEIVABLE-ITEM_TEXT = VCWITEM-ITEM_TEXT.
        TACCOUNTRECEIVABLE-ALLOC_NMBR = VCWITEM-ALLOC_NMBR.
        IF TACCOUNTRECEIVABLE-GL_ACCOUNT IS INITIAL OR TACCOUNTRECEIVABLE-GL_ACCOUNT = SPACE.
          SELECT SINGLE AKONT INTO TACCOUNTRECEIVABLE-GL_ACCOUNT FROM KNB1
            WHERE KUNNR = VCWITEM-KNRVOR AND BUKRS = PHEAD-BUKRS.
          if TACCOUNTRECEIVABLE-SP_GL_IND is not INITIAL and TACCOUNTRECEIVABLE-SP_GL_IND <> space.
            SELECT SINGLE SKONT INTO TACCOUNTRECEIVABLE-GL_ACCOUNT FROM T074
            WHERE KOART = 'D' AND UMSKZ = TACCOUNTRECEIVABLE-SP_GL_IND and HKONT = TACCOUNTRECEIVABLE-GL_ACCOUNT.
          endif.

        ENDIF.
        append TACCOUNTRECEIVABLE.
      ELSEIF VCWITEM-DORK = 'K'." 客户."D" 供应商
        TACCOUNTPAYABLE-ITEMNO_ACC = VCWITEM-ITEMACC.
        TACCOUNTPAYABLE-VENDOR_NO = VCWITEM-KNRVOR.
        TACCOUNTPAYABLE-COMP_CODE = phead-BUKRS.
        TACCOUNTPAYABLE-BUS_AREA = VCWITEM-BUS_AREA.
        TACCOUNTPAYABLE-SP_GL_IND = VCWITEM-SP_GL_IND.
        TACCOUNTPAYABLE-ITEM_TEXT = VCWITEM-ITEM_TEXT.
        TACCOUNTPAYABLE-ALLOC_NMBR = VCWITEM-ALLOC_NMBR.
        IF TACCOUNTPAYABLE-GL_ACCOUNT IS INITIAL OR TACCOUNTPAYABLE-GL_ACCOUNT = SPACE.
          SELECT SINGLE AKONT INTO TACCOUNTPAYABLE-GL_ACCOUNT FROM LFB1
          WHERE LIFNR = VCWITEM-KNRVOR AND BUKRS = PHEAD-BUKRS.
          IF TACCOUNTRECEIVABLE-SP_GL_IND IS NOT INITIAL AND TACCOUNTRECEIVABLE-SP_GL_IND <> space.
            SELECT SINGLE SKONT INTO TACCOUNTPAYABLE-GL_ACCOUNT FROM T074
            WHERE KOART = 'D' AND UMSKZ = TACCOUNTRECEIVABLE-SP_GL_IND AND HKONT = TACCOUNTRECEIVABLE-GL_ACCOUNT.
          ENDIF.

        ENDIF.
        append TACCOUNTPAYABLE.
      ENDIF.

      CLEAR WA_ZEXTEN.
      WA_ZEXTEN-POSNR = VCWITEM-ITEMACC.. "凭证行项目
      WA_ZEXTEN-RSTGR = VCWITEM-RSTGR.
      WA_ZEXTEN-BSCHL = VCWITEM-BSCHL.
      IT_EXTENSION2-STRUCTURE  = L_EXTNAME.
      IT_EXTENSION2-VALUEPART1 = WA_ZEXTEN.
      APPEND IT_EXTENSION2.
    ENDLOOP.

    "$. Endregion 客户供应商
*    data:ptaxflg TYPE C.
*    ptaxflg = '' ."space'.
*    "$. Region 税
*    IF PTAXFLG = 'X'.
    LOOP AT TAXITEM INTO TAXWITEM.
      CLEAR TACCOUNTTAX .CLEAR TCURRENCYAMOUNT.CLEAR TZFIDOCEXT.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = TAXWITEM-ITEMACC
        IMPORTING
          OUTPUT = TAXWITEM-ITEMACC.

      TZFIDOCEXT-POSNR = GLWITEM-ITEMACC.
      TZFIDOCEXT-BSCHL = GLWITEM-BSCHL.
      TZFIDOCEXT-RSTGR = GLWITEM-RSTGR.
      APPEND TZFIDOCEXT.

      DATA: LT_TAX_INFO LIKE TABLE OF RTAX1U15.
      DATA: LS_TAX_INFO LIKE LINE OF LT_TAX_INFO.
      DATA: LWRBTR LIKE BSEG-WRBTR.
      LWRBTR = TAXWITEM-AMOUNT.
      REFRESH LT_TAX_INFO[].
      CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
        EXPORTING
          I_BUKRS = PHEAD-BUKRS
          I_MWSKZ = TAXWITEM-TAXCODE
          I_WAERS = TAXWITEM-CURRENCY
          I_WRBTR = LWRBTR
        TABLES
          T_MWDAT = LT_TAX_INFO.

      READ TABLE LT_TAX_INFO INTO LS_TAX_INFO INDEX 1.
      IF LS_TAX_INFO IS NOT INITIAL.
        TACCOUNTTAX-ACCT_KEY = LS_TAX_INFO-KTOSL.
        TACCOUNTTAX-COND_KEY = LS_TAX_INFO-KSCHL.
        TACCOUNTTAX-GL_ACCOUNT = LS_TAX_INFO-HKONT.
        TACCOUNTTAX-TAX_CODE = TAXWITEM-TAXCODE.
        TACCOUNTTAX-TAXJURCODE = LS_TAX_INFO-TXJCD.
        TACCOUNTTAX-TAXJURCODE_DEEP = LS_TAX_INFO-TXJCD_DEEP.
        TACCOUNTTAX-TAXJURCODE_LEVEL = LS_TAX_INFO-TXJLV.

        TACCOUNTTAX-ITEMNO_ACC = TAXWITEM-ITEMACC.
        APPEND TACCOUNTTAX.
        TCURRENCYAMOUNT-ITEMNO_ACC = TAXWITEM-ITEMACC.
        TCURRENCYAMOUNT-AMT_BASE = '100'.
        TCURRENCYAMOUNT-CURR_TYPE = '00'.
        TCURRENCYAMOUNT-CURRENCY = TAXWITEM-CURRENCY.

        SELECT SINGLE SHKZG  INTO wshkzg FROM tbsl
        WHERE BSCHL  = TAXWITEM-BSCHL.

        IF wshkzg = 'H'.
          TAXWITEM-AMOUNT  = -1 * TAXWITEM-AMOUNT.
          LS_TAX_INFO-WMWST = -1 * LS_TAX_INFO-WMWST.
        ENDIF.

        TCURRENCYAMOUNT-AMT_DOCCUR = TAXWITEM-AMOUNT.
        TCURRENCYAMOUNT-TAX_AMT = LS_TAX_INFO-WMWST.
        APPEND TCURRENCYAMOUNT.
      ENDIF.

      CLEAR WA_ZEXTEN.
      WA_ZEXTEN-POSNR = TAXWITEM-ITEMACC. "凭证行项目
      WA_ZEXTEN-RSTGR = TAXWITEM-RSTGR.
      WA_ZEXTEN-BSCHL = TAXWITEM-BSCHL.
      IT_EXTENSION2-STRUCTURE  = L_EXTNAME.
      IT_EXTENSION2-VALUEPART1 = WA_ZEXTEN.
      APPEND IT_EXTENSION2.
    ENDLOOP.
*    ENDIF.

    "$. Endregion 税

    "$. Region check 不产生会计凭证
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
      EXPORTING
        DOCUMENTHEADER    = Dochead
      TABLES
        ACCOUNTGL         = TACCOUNTGL[]
        ACCOUNTRECEIVABLE = TACCOUNTRECEIVABLE[]
        ACCOUNTPAYABLE    = TACCOUNTPAYABLE[]
        ACCOUNTTAX        = TACCOUNTTAX[]
        CURRENCYAMOUNT    = TCURRENCYAMOUNT[]
        EXTENSION2        = IT_EXTENSION2[]
        return            = ERRMSG[].
    "$. Endregion check
    data:ichk TYPE C.
    loop at ERRMSG where type eq 'E'.
      ichk = 'X'.
    endloop.

    "IF ICHK <> 'X'. "产生会计凭证 直接过帐
    CLEAR ERRMSG[].
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        DOCUMENTHEADER    = DOCHEAD
      IMPORTING
        OBJ_TYPE          = F_OBJ_TYPE    "传出得
        OBJ_KEY           = F_OBJ_KEY
        OBJ_SYS           = F_OBJ_SYS
      TABLES
        ACCOUNTGL         = TACCOUNTGL[]
        ACCOUNTRECEIVABLE = TACCOUNTRECEIVABLE[]
        ACCOUNTPAYABLE    = TACCOUNTPAYABLE[]
        ACCOUNTTAX        = TACCOUNTTAX[]
        CURRENCYAMOUNT    = TCURRENCYAMOUNT[]
        EXTENSION2        = IT_EXTENSION2[]
        RETURN            = ERRMSG[].
    clear ichk.
    LOOP AT ERRMSG WHERE TYPE EQ 'E' or TYPE EQ 'A'.
      ichk = 'X'.
    ENDLOOP.
    IF F_OBJ_KEY IS NOT INITIAL.
      PBELNR = F_OBJ_KEY+0(10).
    ENDIF.
    "ENDIF.

    IF ichk = 'X'.
      DATA:logfile TYPE RLGRAP-FILENAME.
      CONCATENATE  P_FILE  PHEAD-HEADTXT '.log' INTO logfile.

      CALL FUNCTION 'WS_DOWNLOAD'
        EXPORTING
*         BIN_FILESIZE = ' '
          CODEPAGE     = '8400'
          FILENAME     = logfile
          FILETYPE     = 'DAT'
        TABLES
          DATA_TAB     = ERRMSG.

      CALL FUNCTION 'GUI_EXEC'
        EXPORTING
          command   = 'cmd /c'
          PARAMETER = logfile.
      pSTATUS = 'E'.
      PMSG = '请参考' && logfile  && '文件修改后再提交'.
    ENDIF.

    IF ERRMSG-TYPE = 'E' OR ERRMSG-TYPE = 'A'.
      PSTATUS = ERRMSG-TYPE.
      PMSG = PMSG && ERRMSG-MESSAGE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      PSTATUS = 'S'.
      PMSG = '会计凭证创建成功,凭证号:' && PBELNR.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
    ENDIF.
  ENDIF.
ENDFORM.                    "CREATESD

*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWNLOAD_DATA .
  l_filename = 'ZF_02.xlsx'.
  l_muban = 'ZF_02'.
*&---下载模板
  PERFORM frm_get_fullpath CHANGING gv_fullpath gv_path gv_name.
*&---路径为空则退出
  IF gv_fullpath IS INITIAL.
    MESSAGE '用户取消操作' TYPE 'S'.
    RETURN.
  ENDIF.
  PERFORM frm_down USING gv_fullpath.
ENDFORM.                    " DOWNLOAD_DATA


*&---------------------------------------------------------------------*
*&      Form  UPOLOAD_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LT_INPUT   text
*      -->SHEET_NAME text
*----------------------------------------------------------------------*
FORM UPOLOAD_FILE  TABLES LTSTADTBL TYPE STANDARD TABLE USING  SHEET_NAME TYPE ALSMEX_TABLINE-VALUE
                      BEGINCOL TYPE i beginrow TYPE i encol TYPE i endrow TYPE i.
  DATA GT_UPLOAD  LIKE TABLE OF ALSMEX_TABLINE WITH HEADER LINE.

  DATA: LS_I TYPE I.
  FIELD-symbols <F>.

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = PPFILE
      I_BEGIN_COL             = BEGINCOL
      I_BEGIN_ROW             = BEGINROW
      I_END_COL               = ENCOL
      I_END_ROW               = ENDROW
      SHEET_NAME              = SHEET_NAME"指定SHEET名
    TABLES
      INTERN                  = GT_UPLOAD
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.

  IF SY-SUBRC = 0 OR SY-SUBRC = 2.
*--->处理读取出的数据
    SORT GT_UPLOAD BY ROW COL.
    LOOP AT GT_UPLOAD.
      LS_I = GT_UPLOAD-COL.
      ASSIGN COMPONENT LS_I OF STRUCTURE LTSTADTBL TO <F>.
      <F> = GT_UPLOAD-VALUE.
      AT END OF ROW.
        APPEND LTSTADTBL to LTSTADTBL.
        CLEAR:LTSTADTBL.
      ENDAT.
    ENDLOOP.
    free GT_UPLOAD[].
  ELSE.
    WRITE: / 'EXCEL UPLOAD FAILED ', PPFILE , SY-SUBRC.
  ENDIF.
ENDFORM.                    " UPOLOAD_FILE


*&---------------------------------------------------------------------*
*&      Form  GETFILECAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LT_INPUT   text
*      -->SHEET_NAME text
*      -->BEGINCOL   text
*      -->BEGINROW   text
*      -->ENCOL      text
*      -->ENDROW     text
*----------------------------------------------------------------------*
FORM GETFILECAT TABLES ITFIELDCAT TYPE LVC_T_FCAT USING  SHEET_NAME TYPE ALSMEX_TABLINE-VALUE
                      BEGINCOL TYPE i beginrow TYPE i encol TYPE i endrow TYPE i.
  DATA GT_UPLOAD  LIKE TABLE OF ALSMEX_TABLINE WITH HEADER LINE.
  DATA: LS_I TYPE I.
  FIELD-symbols <F>.

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_FILE
      I_BEGIN_COL             = BEGINCOL
      I_BEGIN_ROW             = BEGINROW
      I_END_COL               = ENCOL
      I_END_ROW               = ENDROW
      SHEET_NAME              = SHEET_NAME"指定SHEET名
    TABLES
      INTERN                  = GT_UPLOAD
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  CLEAR IT_FIELDCAT[].
  IF SY-SUBRC = 0.
*--->处理读取出的数据
    SORT GT_UPLOAD BY ROW COL.
    LOOP AT GT_UPLOAD.
      PERFORM SET_FIELDCAT TABLES ITFIELDCAT USING GT_UPLOAD-VALUE     ''      ''       '' '' '' '' '' ''.
    ENDLOOP.

  ELSE.
    WRITE: / 'EXCEL UPLOAD FAILED ', P_FILE, SY-SUBRC.
  ENDIF.
ENdform.                    "GETFILECAT
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FULLPATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GV_FULLPATH  text
*      <--P_GV_PATH  text
*      <--P_GV_NAME  text
*----------------------------------------------------------------------*
FORM frm_get_fullpath   CHANGING pv_fullpath TYPE string
  pv_path     TYPE string
  pv_name     TYPE string.

  DATA: lv_init_path  TYPE string,
        lv_init_fname TYPE string,
        lv_path       TYPE string,
        lv_filename   TYPE string,
        lv_fullpath   TYPE string.

*&---初始名称(输出的文件名称)
*  concatenate 'Material_Doc_' SY-DATUM '.xslx' into L_INIT_FNAME.
  lv_init_fname = l_filename.

* 获取桌面路径
  CALL METHOD cl_gui_frontend_services=>get_desktop_directory
    CHANGING
      desktop_directory    = lv_init_path
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

*&---用户选择名称、路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
*     window_title         = '指定保存文件名'
*     default_extension    = 'DOC'
      default_file_name    = lv_init_fname
*     FILE_FILTER          = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
*     FILE_FILTER          = CL_GUI_FRONTEND_SERVICES=>FILETYPE_WORD
      initial_directory    = lv_init_path
      prompt_on_overwrite  = 'X'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
*     USER_ACTION          =
*     FILE_ENCODING        =
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc = 0.
    pv_fullpath = lv_fullpath.
    pv_path     = lv_path.
  ENDIF.
ENDFORM.                    " FRM_GET_FULLPATH

*--------------------------------------------------------------------*
*       下载文件
*--------------------------------------------------------------------*
FORM frm_down  USING pr_filename.
  DATA: lv_objdata     LIKE wwwdatatab,
        lv_mime        LIKE w3mime,
        lv_destination LIKE rlgrap-filename,
        lv_objnam      TYPE string,
        lv_rc          LIKE sy-subrc,
        lv_errtxt      TYPE string.

  DATA: lv_filename TYPE string,
        lv_result,
        lv_subrc    TYPE sy-subrc.

  DATA: lv_objid TYPE wwwdatatab-objid .


  lv_objid = l_muban.  "上传的模版名称

*&---查找文件是否存在。
  SELECT SINGLE relid objid
  FROM wwwdata
  INTO CORRESPONDING FIELDS OF lv_objdata
  WHERE srtf2    = 0
  AND   relid    = 'MI'
  AND   objid    = lv_objid.

*&---判断模版不存在则报错
  IF sy-subrc NE 0 OR lv_objdata-objid EQ space.
    CONCATENATE '模板文件:' lv_objid '不存在,请用TCODE:SMW0进行加载'
    INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
  ENDIF.

  lv_filename = pr_filename.

  "判断本地地址是否已经存在此文件。
  CALL METHOD cl_gui_frontend_services=>file_exist
    EXPORTING
      file                 = lv_filename
    RECEIVING
      result               = lv_result
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      wrong_parameter      = 3
      not_supported_by_gui = 4
      OTHERS               = 5.
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
      WHEN 2.
      WHEN OTHERS.
    ENDCASE.
  ENDIF.

  IF lv_result EQ 'X'.  "如果存在则删除原始文件,重新覆盖
    CALL METHOD cl_gui_frontend_services=>file_delete
      EXPORTING
        filename             = lv_filename
      CHANGING
        rc                   = lv_subrc
      EXCEPTIONS
        file_delete_failed   = 1
        cntl_error           = 2
        error_no_gui         = 3
        file_not_found       = 4
        access_denied        = 5
        unknown_error        = 6
        not_supported_by_gui = 7
        wrong_parameter      = 8
        OTHERS               = 9.

    IF sy-subrc <> 0.
      CASE sy-subrc.
        WHEN 1.
        WHEN 2.
        WHEN OTHERS.
      ENDCASE.
    ENDIF.

    IF lv_subrc <> 0. "如果删除失败,则报错。
      CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
      INTO lv_errtxt.
      MESSAGE lv_errtxt TYPE 'E'.
    ENDIF.
  ENDIF.

  lv_destination   = pr_filename.

*&---下载模版。
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = lv_objdata
      destination = lv_destination
    IMPORTING
      rc          = lv_rc.
  IF lv_rc NE 0.
    CONCATENATE '模板文件' '下载失败' INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
  ENDIF.
ENDFORM.                    "frm_down


*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->CT_FIELDCAT    text
*      -->UV_FIELDNAME   text
*      -->UV_REF_FIELD   text
*      -->UV_REF_TABLE   text
*      -->UV_EDIT_MASK   text
*      -->UV_TEXT        text
*      -->UV_TEXTS       text
*      -->UV_EMPHASIZE   text
*      -->UV_FIX_COLUMN  text
*      -->UV_HIER_CPOS   text
*----------------------------------------------------------------------*
FORM SET_FIELDCAT  TABLES   CT_FIELDCAT
USING    UV_FIELDNAME
      UV_REF_FIELD
      UV_REF_TABLE
      UV_EDIT_MASK
      UV_TEXT
      UV_TEXTS
      UV_EMPHASIZE
      UV_FIX_COLUMN
      UV_HIER_CPOS.
  DATA: LW_FIELD TYPE LVC_S_FCAT.
  CLEAR: LW_FIELD.
  LW_FIELD-HIER_CPOS = UV_HIER_CPOS.
  LW_FIELD-FIX_COLUMN = UV_FIX_COLUMN.
  LW_FIELD-FIELDNAME = UV_FIELDNAME.
  LW_FIELD-REF_FIELD = UV_REF_FIELD.
  LW_FIELD-REF_TABLE = UV_REF_TABLE.
  LW_FIELD-EDIT_MASK = UV_EDIT_MASK.
  LW_FIELD-EMPHASIZE = UV_EMPHASIZE.
  LW_FIELD-COLTEXT   = UV_TEXT.
  LW_FIELD-SELTEXT   = UV_TEXT.
  LW_FIELD-SCRTEXT_L = UV_TEXT.
  LW_FIELD-SCRTEXT_M = UV_TEXT.
  LW_FIELD-SCRTEXT_S = UV_TEXTS.
  APPEND LW_FIELD TO CT_FIELDCAT.
ENDFORM.                    " F_SET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  DISALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISALV .
  PERFORM BUILD_FIELDCAT USING 'HEADTXT'  '抬头文本' ''.
  PERFORM BUILD_FIELDCAT USING 'BUKRS'  '公司代码' ''.
  PERFORM BUILD_FIELDCAT USING 'DOCDATE'  '过账日期' ''.
  PERFORM BUILD_FIELDCAT USING 'PSTDATE'  '抬头文本' ''.
  PERFORM BUILD_FIELDCAT USING 'DOCTYPE'  '凭证类型' ''.
  PERFORM BUILD_FIELDCAT USING 'NETPST' '反冲' ''.
  PERFORM BUILD_FIELDCAT USING 'GLITEMS' '总账行项目起始行' ''.
  PERFORM BUILD_FIELDCAT USING 'GLITEME' '总账行项目结束行' ''.
  PERFORM BUILD_FIELDCAT USING 'CVITEMS' '客商行项目起始行' ''.
  PERFORM BUILD_FIELDCAT USING 'CVITEME' '客商行项目结束行' ''.
  PERFORM BUILD_FIELDCAT USING 'TAXITEMS' '税行项目起始行' ''.
  PERFORM BUILD_FIELDCAT USING 'TAXITEME' '税行项目结束行' ''.
  PERFORM BUILD_FIELDCAT USING 'BELNR' '会计凭证' 'X'.
  PERFORM BUILD_FIELDCAT USING 'STATUS' '状态' ''.
  PERFORM BUILD_FIELDCAT USING 'MSGTXT' '文本' ''.
*  gs_layout-cwidth_opt = 'X'.
  gs_layout-zebra = 'X'.

  DATA:I_GRID_SETTINGS TYPE LVC_S_GLAY,
        TITLE       TYPE LVC_TITLE,
        IT_EVENTS   TYPE SLIS_T_EVENT,
        IS_LAYOUT   TYPE SLIS_LAYOUT_ALV,
        I_CALLBACK_PROGRAM TYPE SY-REPID.
  I_GRID_SETTINGS-EDT_CLL_CB = 'X'. "更改数据后更新表数据

  PERFORM LAYOUT_INIT USING IS_LAYOUT.
  I_CALLBACK_PROGRAM = SY-REPID.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = I_CALLBACK_PROGRAM
      I_GRID_TITLE             = TITLE
      I_GRID_SETTINGS          = I_GRID_SETTINGS
      IS_LAYOUT                = IS_LAYOUT
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      IT_FIELDCAT              = GT_FIELDCAT
      IT_EVENTS                = IT_EVENTS
    TABLES
      T_OUTTAB                 = SHEADITAB[]
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
ENDFORM.                    " DISALV

*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT USING P_FIELDNAME   TYPE FIELDNAME
      P_REPTEXT  TYPE LVC_QFNAME
      P_NO_ZERO     TYPE XFLAG.
  GS_FIELDCAT-FIELDNAME     = P_FIELDNAME.
  GS_FIELDCAT-REPTEXT_DDIC    = P_REPTEXT.
  GS_FIELDCAT-NO_ZERO   = P_NO_ZERO.
  APPEND GS_FIELDCAT TO GT_FIELDCAT.
  CLEAR: GS_FIELDCAT.
ENDFORM.                    "BUILD_FIELDCAT


" FIELDCAT_INIT
*&---------------------------------------------------------------------*
*&      FORM  LAYOUT_INIT
*&---------------------------------------------------------------------*
*       TEXT  LAYOUT属性设置,双击响应字段设置
*----------------------------------------------------------------------*
*      -->P_IS_LAYOUT  TEXT
*----------------------------------------------------------------------*
FORM LAYOUT_INIT  USING    IS_LAYOUT TYPE SLIS_LAYOUT_ALV.
  IS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
ENDFORM.                    " LAYOUT_INIT

*&--------------------------------------------------------------------- *
*&      FORM  G_STATUS_FORM 调用自定义屏幕
*&---------------------------------------------------------------------
FORM SET_PF_STATUS  USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD' EXCLUDING RT_EXTAB.
ENDFORM.                    "SET_PF_STATUS

客户供应商付款 如果特别总账标记加上过账码可能会不匹配 报 F5761 错误 

增强代码

method IF_EX_ACC_DOCUMENT~CHANGE.
  data: WA_EXTENSION type BAPIPAREX,
        ZEXT_DATA    type ZFIDOCEXT.

  field-symbols: <ACCIT> type ACCIT.
  if C_EXTENSION2[] is not initial.
    loop at C_EXTENSION2 into WA_EXTENSION
    where STRUCTURE = 'ZFIDOCEXT'.
      ZEXT_DATA = WA_EXTENSION-VALUEPART1.
      read table C_ACCIT assigning <ACCIT> with key POSNR = ZEXT_DATA-POSNR.
      if SY-SUBRC = 0.
        <ACCIT>-BSCHL = ZEXT_DATA-BSCHL.
        if <ACCIT>-BSCHL  = '70'.
          <ACCIT>-ANBWA = ZEXT_DATA-ANBWA.
        endif.
        <ACCIT>-RSTGR = ZEXT_DATA-RSTGR.
      endif.
    ENDLOOP.
    " PARK  预制凭证
    READ TABLE C_EXTENSION2 INTO WA_EXTENSION WITH KEY STRUCTURE = 'PARK'.
    IF SY-SUBRC = 0.
      MOVE '2' TO C_ACCHD-STATUS_NEW.
      DELETE C_EXTENSION2 INDEX SY-TABIX.
    ENDIF.
  endif.

endmethod.

那就在客户供应商 哪个页签把 特别总账标记去掉   让系统依据过账码自己生成总账  

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gavin_gxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值