总账科目往来批量导入程序

REPORT ZRFICO100 NO STANDARD PAGE HEADING MESSAGE-ID ZFI_01.
TYPE-POOLS: SLIS,ICON.
TABLES: SSCRFIELDS,LAGP.
TYPES: BEGIN OF TY_UP,
         ZCODE  TYPE STRING, " 识别码
         BLART  TYPE STRING, " 凭证类型
         BUKRS  TYPE STRING, " 公司代码
         BLDAT  TYPE STRING, " 凭证日期
         BUDAT  TYPE STRING, " 过账日期
         MONAT  TYPE STRING, " 过账期间
         XBLNR  TYPE STRING, " 参照
         WAERS  TYPE STRING, " 货币
         KURSF  TYPE STRING, " 汇率
         WWERT  TYPE STRING, " 换算日期
         BKTXT  TYPE STRING, " 抬头文本
         NUMPG  TYPE STRING, " 页数
         BSCHL  TYPE STRING, " 记账码
         KUNNR  TYPE STRING, " 客户
         LIFNR  TYPE STRING, " 供应商
         HKONT  TYPE STRING, " 总账科目
         UMSKZ  TYPE STRING, "特别总账标识
         WRBTR  TYPE STRING,  "业务货币金额
         GSBER  TYPE STRING, " 业务范围
         PRCTR  TYPE STRING, " 利润中心
         KOSTL  TYPE STRING, " 成本中心
         PROJK  TYPE STRING, "WBS元素(工作号)
         AUFNR  TYPE STRING, " 内部订单
         ZUONR  TYPE STRING, " 分配
         SGTXT  TYPE STRING, "文本
         ZFBDT  TYPE STRING, " 到期日
         ZTERM  TYPE STRING, " 付款条件
         KIDNO  TYPE STRING, " 付款参考
         ZLSCH  TYPE STRING, " 付款方式
         UZAWE  TYPE STRING, " 付款方式补充
         XNEGP  TYPE STRING, " 反记账
         RSTGR  TYPE STRING, " 原因代码
         XREF1  TYPE STRING, " 参考码1
         XREF2  TYPE STRING, " 参考码2
         XREF3  TYPE STRING, " 参考码3
         MWSKZ  TYPE STRING, " 税码
         DMBTR  TYPE STRING, " 本位币金额
*         waers1 TYPE string, " 本位币币码
         DMBE2  TYPE STRING, " 集团货币金额
         HWAE2  TYPE STRING, " 集团货币币码
         MENGE  TYPE STRING, " 数量
         MEINS  TYPE STRING, " 单位
         KNDNR  TYPE STRING, "客户编码
         ARTNR  TYPE STRING, "物料编码
         FKART  TYPE STRING, "开票类型
         KAUFN  TYPE STRING, "销售订单
         KDPOS  TYPE STRING, "订单行
         AUFNR1 TYPE STRING, "生产或内部订单
         SKOST  TYPE STRING, "成本中心
         VKORG  TYPE STRING, "销售组织
         VTWEG  TYPE STRING, "分销渠道
         SPART  TYPE STRING, "产品组
         PRCTR1 TYPE STRING, "利润中心
         BZIRK  TYPE STRING, "销售地区
         AUART  TYPE STRING, "销售凭证类型
         KONDM  TYPE STRING, "物料定价组
         KTGRD  TYPE STRING, "物料科目分组
         KTGRM  TYPE STRING, "客户科目分组
         MVGR1  TYPE STRING, "物料组1
         MVGR2  TYPE STRING, "物料组2
         MVGR3  TYPE STRING, "物料组3
         MVGR4  TYPE STRING, "物料组4
         MVGR5  TYPE STRING, "物料组5
         WW002  TYPE STRING, "合同
       END OF TY_UP.
TYPES: BEGIN OF TY_ALV,
         BOX    TYPE  CHAR1,    "选择
         ICON   TYPE  CHAR4,    "状态
         MSG    TYPE  STRING,   "状态描述
         GRP    TYPE I,         " 用于分组
         GJAHR  TYPE BKPF-GJAHR,  "凭证年度
         BELNR  TYPE BKPF-BELNR,  "会计凭证号
         SHKZG  TYPE BSEG-SHKZG,
         KOART  TYPE TBSL-KOART,
         WAERK  TYPE T001-WAERS,
         ROW    TYPE I,
         ZCODE  TYPE CHAR3, " 识别码
         BLART  TYPE BKPF-BLART, " 凭证类型
         BUKRS  TYPE BKPF-BUKRS, " 公司代码
         BLDAT  TYPE BKPF-BLDAT, " 凭证日期
         BUDAT  TYPE BKPF-BUDAT, " 过账日期
         MONAT  TYPE BKPF-MONAT, " 过账期间
         XBLNR  TYPE BKPF-XBLNR, " 参照
         WAERS  TYPE BKPF-WAERS, " 货币
         KURSF  TYPE BKPF-KURSF, " 汇率
         WWERT  TYPE BKPF-WWERT, " 换算日期
         BKTXT  TYPE BKPF-BKTXT, " 抬头文本
         NUMPG  TYPE BKPF-NUMPG, " 页数
         BSCHL  TYPE BSEG-BSCHL, " 记账码
         KUNNR  TYPE BSEG-KUNNR, " 客户
         LIFNR  TYPE BSEG-LIFNR, " 供应商
         HKONT  TYPE BSEG-HKONT, " 总账科目
         UMSKZ  TYPE BSEG-UMSKZ, "特别总账标识
         WRBTR  TYPE BSEG-WRBTR,  "业务货币金额
         GSBER  TYPE BSEG-GSBER, " 业务范围
         PRCTR  TYPE BSEG-PRCTR, " 利润中心
         KOSTL  TYPE BSEG-KOSTL, " 成本中心
         PROJK  TYPE BSEG-PROJK, "WBS元素(工作号)
         AUFNR  TYPE BSEG-AUFNR, " 内部订单
         ZUONR  TYPE BSEG-ZUONR, " 分配
         SGTXT  TYPE BSEG-SGTXT, "文本
         ZFBDT  TYPE BSEG-ZFBDT, " 到期日
         ZTERM  TYPE BSEG-ZTERM, " 付款条件
         KIDNO  TYPE BSEG-KIDNO, " 付款参考
         ZLSCH  TYPE BSEG-ZLSCH, " 付款方式
         UZAWE  TYPE BSEG-UZAWE, " 付款方式补充
         XNEGP  TYPE BSEG-XNEGP, " 反记账
         RSTGR  TYPE BSEG-RSTGR, " 原因代码
         XREF1  TYPE BSEG-XREF1, " 参考码1
         XREF2  TYPE BSEG-XREF2, " 参考码2
         XREF3  TYPE BSEG-XREF3, " 参考码3
         MWSKZ  TYPE BSEG-MWSKZ, " 税码
         DMBTR  TYPE BSEG-DMBTR, " 本位币金额
*         waers1 TYPE bseg-waers, " 本位币币码
         DMBE2  TYPE BSEG-DMBE2, " 集团货币金额
         HWAE2  TYPE BKPF-HWAE2, " 集团货币币码
         MENGE  TYPE BSEG-MENGE, " 数量
         MEINS  TYPE BSEG-MEINS, " 单位
         KNDNR  TYPE STRING, "客户编码
         ARTNR  TYPE STRING, "物料编码
         FKART  TYPE STRING, "开票类型
         KAUFN  TYPE STRING, "销售订单
         KDPOS  TYPE STRING, "订单行
         AUFNR1 TYPE STRING, "生产或内部订单
         SKOST  TYPE STRING, "成本中心
         VKORG  TYPE STRING, "销售组织
         VTWEG  TYPE STRING, "分销渠道
         SPART  TYPE STRING, "产品组
         PRCTR1 TYPE STRING, "利润中心
         BZIRK  TYPE STRING, "销售地区
         AUART  TYPE STRING, "销售凭证类型
         KONDM  TYPE STRING, "物料定价组
         KTGRD  TYPE STRING, "物料科目分组
         KTGRM  TYPE STRING, "客户科目分组
         MVGR1  TYPE STRING, "物料组1
         MVGR2  TYPE STRING, "物料组2
         MVGR3  TYPE STRING, "物料组3
         MVGR4  TYPE STRING, "物料组4
         MVGR5  TYPE STRING, "物料组5
         WW002  TYPE STRING, "合同
       END OF TY_ALV.
CONSTANTS:GC_BUT(20)           VALUE '下载模板'.
CONSTANTS:C_ICON_W             VALUE '@5D@'             TYPE ICON-ID .
CONSTANTS:C_ICON_S             VALUE '@5B@'             TYPE ICON-ID .
CONSTANTS:C_ICON_E             VALUE '@5C@'             TYPE ICON-ID .
CONSTANTS:C_ICON_I             VALUE '@BZ@'             TYPE ICON-ID .
CONSTANTS C_LINE_TOP           VALUE 1                  TYPE I.
CONSTANTS C_X                  VALUE 'X'.
DATA: GS_ALV TYPE TY_ALV,
      GT_ALV TYPE TABLE OF TY_ALV.
DATA: GT_FIELDCAT TYPE LVC_T_FCAT,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GS_LAYOUT   TYPE LVC_S_LAYO.
TYPES: BEGIN OF TY_STR,
         STR1(2500) TYPE C,
       END OF TY_STR.
DATA: GT_STR TYPE STANDARD TABLE OF TY_STR,
      GS_STR TYPE TY_STR.
INCLUDE OLE2INCL.
DATA: GS_EXCEL   TYPE OLE2_OBJECT,
      GS_WBOOK   TYPE OLE2_OBJECT,
      GS_SHEET   TYPE OLE2_OBJECT,
      GS_CELL    TYPE OLE2_OBJECT,
      GS_CELL1   TYPE OLE2_OBJECT,
      GS_CELL2   TYPE OLE2_OBJECT,
      GS_CELLS   TYPE OLE2_OBJECT,
      GS_ROW     TYPE OLE2_OBJECT,
      GS_RANGE   TYPE OLE2_OBJECT,
      GS_BORDERS TYPE OLE2_OBJECT,
      GS_FONT    TYPE OLE2_OBJECT,
      GV_EXCEL_E TYPE  C. "excel 打开错误
SELECTION-SCREEN BEGIN OF BLOCK BL01 WITH FRAME TITLE TEXT-T01.
  PARAMETERS PA_FILE TYPE RLGRAP-FILENAME .
SELECTION-SCREEN END OF BLOCK BL01 .
SELECTION-SCREEN BEGIN OF BLOCK BL02 WITH FRAME TITLE TEXT-T02.
  SELECTION-SCREEN: PUSHBUTTON 2(10) P_BUT USER-COMMAND CLI1.
SELECTION-SCREEN END OF BLOCK BL02 .
INITIALIZATION.
  P_BUT = GC_BUT.
AT SELECTION-SCREEN.
  IF SSCRFIELDS-UCOMM EQ 'CLI1'.
    PERFORM SUB_DOWNLOAD_EXCELTEMPLATE.
  ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR PA_FILE.
  PERFORM GET_PC_FILENAME USING PA_FILE.
START-OF-SELECTION.
  PERFORM SUB_UPLOAD_DATA.
  PERFORM SUB_OUTPUT_ALV.
*&---------------------------------------------------------------------*
*&      Form  sub_download_exceltemplate
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_DOWNLOAD_EXCELTEMPLATE.
  DATA: LV_FILE  TYPE SAPB-SAPPFAD.
  PERFORM SUB_OPEN_SAVE_DIALOG CHANGING LV_FILE.
  CHECK LV_FILE IS NOT INITIAL.
  PERFORM SUB_DOWNLOAD_EXCEL_FROMSERVER USING 'ZFIR_001' LV_FILE.
ENDFORM.                    " sub_download_exceltemplate
*&---------------------------------------------------------------------*
*&      Form  open_save_dialog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_L_FILE  text
*----------------------------------------------------------------------*
FORM SUB_OPEN_SAVE_DIALOG CHANGING P_FILE TYPE SAPB-SAPPFAD.
  DATA: L_SAVEPATH TYPE RLGRAP-FILENAME.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      DEF_PATH         = L_SAVEPATH
      MASK             = ',Excel Files,*.xlsx,Xls,*.xls.'
      MODE             = 'S'
      TITLE            = TEXT-F01
    IMPORTING
      FILENAME         = L_SAVEPATH
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
  IF SY-SUBRC NE 0.
    RETURN.
  ENDIF.
  P_FILE = L_SAVEPATH.
  IF P_FILE CS '.XLS'.
  ELSE.
    CONCATENATE P_FILE '.xlsx' INTO P_FILE.
    CONDENSE P_FILE NO-GAPS.
  ENDIF.
  IF P_FILE CS '\.XLSX' OR P_FILE CS '\.XLS' .
    MESSAGE E001(00) WITH '请输入下载EXCEL模板的名称'.
  ENDIF.
ENDFORM.                    " open_save_dialog
*&---------------------------------------------------------------------*
*&      Form  sub_download_excel_fromserver
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0201   text
*      -->P_L_FILE  text
*----------------------------------------------------------------------*
FORM SUB_DOWNLOAD_EXCEL_FROMSERVER USING  P_OBJID LIKE WWWDATATAB-OBJID
      P_DEST LIKE SAPB-SAPPFAD.
  DATA: LO_OBJDATA     LIKE WWWDATATAB,
        LO_MIME        LIKE W3MIME,
        LS_DESTINATION LIKE RLGRAP-FILENAME,
        LS_OBJNAM      TYPE STRING,
        LI_RC          LIKE SY-SUBRC,
        LS_ERRTXT      TYPE STRING.
  SELECT SINGLE RELID OBJID FROM WWWDATA
  INTO CORRESPONDING FIELDS OF LO_OBJDATA
  WHERE SRTF2    = 0
  AND RELID    = 'MI'
  AND OBJID    = P_OBJID.
  IF SY-SUBRC NE 0 OR LO_OBJDATA-OBJID EQ SPACE.
    CONCATENATE '模板文件:' LS_OBJNAM
    '不存在,请用TCODE:SMW0进行加载' INTO LS_ERRTXT.
    MESSAGE E000(00) WITH LS_ERRTXT.
  ENDIF.
  LS_DESTINATION   = P_DEST.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LO_OBJDATA
      DESTINATION = LS_DESTINATION
    IMPORTING
      RC          = LI_RC.
  IF LI_RC NE 0.
    CONCATENATE '模板文件:' LS_OBJNAM '下载失败' INTO LS_ERRTXT.
    MESSAGE E000(00) WITH LS_ERRTXT.
  ENDIF.
ENDFORM.                    " sub_download_excel_fromserver
*&---------------------------------------------------------------------*
*&      Form  sub_upload_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_UPLOAD_DATA.
  CLEAR:GT_ALV ,
  GS_ALV .
  DATA: LT_OUT TYPE TABLE OF TY_UP,
        LS_OUT TYPE TY_UP.
  DATA: LV_MSG  TYPE STRING,
        LV_FILE TYPE STRING,
        LV_LINE TYPE INT4.
  LV_FILE = PA_FILE.
  PERFORM UP_FILE USING LV_FILE LV_MSG
  CHANGING LT_OUT[].
  IF LV_MSG IS NOT INITIAL.
    MESSAGE  LV_MSG  TYPE 'S' DISPLAY LIKE 'E' .
    LEAVE LIST-PROCESSING.
  ENDIF.
  DESCRIBE TABLE LT_OUT LINES LV_LINE.
  IF LV_LINE LE 1.
    MESSAGE  '没有获取到'  TYPE 'S' DISPLAY LIKE 'E' .
    LEAVE LIST-PROCESSING.
  ENDIF.
  LOOP AT LT_OUT INTO LS_OUT.
    IF SY-TABIX LE C_LINE_TOP.
      CONTINUE.
    ENDIF.
    MOVE-CORRESPONDING LS_OUT TO GS_ALV.
    GS_ALV-ROW = SY-TABIX.
    APPEND GS_ALV TO GT_ALV.
    CLEAR GS_ALV.
  ENDLOOP.
ENDFORM.                    " sub_upload_data
*&---------------------------------------------------------------------*
*  &      Form  sub_check_data
*&---------------------------------------------------------------------*
*         text
*----------------------------------------------------------------------*
*    -->  p1        text
*    <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_CHECK_DATA.
  DATA LV_TABIX TYPE SY-INDEX.
  DATA LV_MSG   TYPE BAPI_MSG.
  DATA LV_ERROR TYPE FLAG.
  DATA: LV_POSID TYPE PRPS-POSID.
  DATA: LV_DATATYPE TYPE DD01V-DATATYPE.
  DATA: LS_TBSL  TYPE TBSL,
        LV_GRP   TYPE I,
        LV_NUMPG TYPE BKPF-NUMPG.
  DATA: LS_HEADER TYPE BAPIACHE09,
        LS_KNA1   TYPE BAPIACPA09,
        LV_WAERS  TYPE T001-WAERS, "凭证币别
        LV_KURSR  TYPE CHAR20.     "汇率
  LOOP AT GT_ALV INTO DATA(LS_ALV) WHERE BOX = 'X' GROUP BY ( KEY1 = LS_ALV-ZCODE ).
    LOOP AT GT_ALV INTO GS_ALV WHERE ZCODE = LS_ALV-ZCODE.
      TRANSLATE GS_ALV-BLART TO UPPER CASE."凭证类型
      TRANSLATE GS_ALV-XNEGP TO UPPER CASE."反记帐
      TRANSLATE GS_ALV-MWSKZ TO UPPER CASE."税码
      TRANSLATE GS_ALV-WAERS TO UPPER CASE."货币单位
      LV_GRP = LV_GRP + 1.
* 权限检查
      AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
      ID 'BUKRS' FIELD GS_ALV-BUKRS
      ID 'ACTVT' FIELD '03'.
      IF SY-SUBRC NE 0.
        CLEAR: LV_MSG.
        CONCATENATE '您没有公司代码:' GS_ALV-BUKRS '的操作权限!' INTO LV_MSG.
        PERFORM SUB_ADD_MSG USING
        LV_MSG SPACE CHANGING GS_ALV-MSG.
        LV_ERROR = C_X.
      ENDIF.
      SELECT SINGLE * INTO LS_TBSL FROM TBSL WHERE BSCHL = GS_ALV-BSCHL.
      IF SY-SUBRC <> 0.
        CLEAR: LV_ERROR,LV_MSG.
        CONCATENATE '记账码' GS_ALV-BSCHL '不存在' INTO LV_MSG.
        LV_ERROR = C_X.
        PERFORM SUB_ADD_MSG USING
        LV_MSG SPACE CHANGING GS_ALV-MSG.
      ELSE.
        GS_ALV-SHKZG = LS_TBSL-SHKZG. " 借方/贷方标识
        GS_ALV-KOART = LS_TBSL-KOART. " 科目类型
      ENDIF.
      GS_ALV-GRP = LV_GRP.
      IF GS_ALV-MSG IS NOT INITIAL.
        GS_ALV-ICON = C_ICON_E.
      ENDIF.
      MODIFY GT_ALV FROM GS_ALV.
      CLEAR: GS_ALV,
      LV_ERROR,
      LV_MSG.
      PERFORM SUB_INPUT00 CHANGING GS_ALV-KOSTL.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    " sub_check_data
*&---------------------------------------------------------------------*
*&      Form  sub_output_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_OUTPUT_ALV.
  DATA LV_REPID LIKE SY-REPID .
  LV_REPID = SY-REPID.
  PERFORM SUB_BUILD_FIELDCAT.
  PERFORM SUB_SET_LAYOUT.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = LV_REPID
      I_CALLBACK_PF_STATUS_SET = 'SUB_SET_PF_STATUS'
      I_CALLBACK_USER_COMMAND  = 'SUB_F_COMMAND'
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = GT_ALV
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.                    " sub_output_alv
*&---------------------------------------------------------------------*
*&      Form  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   excluding button table
*----------------------------------------------------------------------*
FORM SUB_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD'.
ENDFORM.                    "SET_PF_STATUS
*---------------------------------------------------------------------*
*       FORM f_command                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  I_UCOMM                                                       *
*  -->  IS_SELFIELD                                                   *
*---------------------------------------------------------------------*
FORM SUB_F_COMMAND USING I_UCOMM LIKE SY-UCOMM IS_SELFIELD TYPE SLIS_SELFIELD.
  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
  CASE I_UCOMM.
    WHEN 'TEST'.
      PERFORM SUB_CHECK_DATA.
      PERFORM ACC_CHECK .
    WHEN 'EXECUTE'.
      PERFORM SUB_CHECK_DATA.
      PERFORM SUB_CREATE_FB01 .
    WHEN 'ALL'.
      PERFORM SUB_SELECT_LINES USING 'X'.
    WHEN 'QALL'.
      PERFORM SUB_SELECT_LINES USING SPACE.
  ENDCASE.
  IS_SELFIELD-REFRESH    = 'X'.
  IS_SELFIELD-COL_STABLE = 'X'.
  IS_SELFIELD-ROW_STABLE = 'X'.
ENDFORM.                    "F_COMMAND
*&---------------------------------------------------------------------*
*&      Form  sub_build_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_BUILD_FIELDCAT.
  DEFINE MCR_FILL_FIELDCAT.
    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname = &1 .
    SPLIT &2 AT '-' INTO gs_fieldcat-ref_table gs_fieldcat-ref_field.
    gs_fieldcat-coltext = &3.
    gs_fieldcat-col_opt = 'A'.
    gs_fieldcat-outputlen = 30 .
    APPEND gs_fieldcat TO gt_fieldcat.
  END-OF-DEFINITION.
  MCR_FILL_FIELDCAT:
  'BOX'             ''    '选择',
  'ICON'            ''    '状态' ,
  'MSG'             ''    '状态描述' ,
  'ZCODE'           ''    '凭证识别号',
  'BLART'           ''    '凭证类型',
  'BUKRS'           ''    '公司代码',
  'BLDAT'           ''    '凭证日期',
  'BUDAT'           ''    '过账日期',
  'MONAT'           ''    '过账期间',
  'XBLNR'           ''    '参照',
  'WAERS'           ''    '货币',
  'KURSF'           ''    '汇率',
  'WWERT'           ''    '换算日期',
  'BKTXT'           ''    '抬头文本',
  'NUMPG'           ''    '页数',
  'BSCHL'           ''    '记账码',
  'KUNNR'           ''    '客户编码',
  'LIFNR'           ''    '供应商编码',
  'HKONT'           ''    '总账科目',
  'UMSKZ'           ''    '特别总账标识',
  'WRBTR'           ''    '业务货币金额',
  'GSBER'           ''    '业务范围',
  'PRCTR'           ''    '利润中心',
  'KOSTL'           ''    '成本中心',
  'PROJK'           ''    'WBS 元素(工作号)',
  'AUFNR'           ''    '内部订单',
  'ZUONR'           ''    '分配',
  'SGTXT'           ''    '文本',
  'ZFBDT'           ''    '到期日',
  'ZTERM'           ''    '付款条件',
  'KIDNO'           ''    '付款参考',
  'ZLSCH'           ''    '付款方式',
  'UZAWE'           ''    '付款方式补充',
  'XNEGP'           ''    '反记账',
  'RSTGR'           ''    '原因代码',
  'XREF1'           ''    '参考码1',
  'XREF2'           ''    '参考码2',
  'XREF3'           ''    '参考码3',
  'MWSKZ'           ''    '税码',
  'DMBTR'           ''    '本位币金额',
  'DMBE2'           ''    '集团货币金额',
  'HWAE2'           ''    '集团货币货币码',
  'MENGE'           ''    '数量',
  'MEINS'           ''    '单位',
  'KNDNR'           ''    '客户编码',
  'ARTNR'           ''    '物料编码',
  'FKART'           ''    '开票类型',
  'KAUFN'           ''    '销售订单',
  'KDPOS'           ''    '订单行',
  'AUFNR1'           ''    '生产或内部订单',
  'SKOST'           ''    '成本中心',
  'VKORG'           ''    '销售组织',
  'VTWEG'           ''    '分销渠道',
  'SPART'           ''    '产品组',
  'PRCTR1'           ''    '利润中心',
  'BZIRK'           ''    '销售地区',
  'AUART'           ''    '销售凭证类型',
  'KONDM'           ''    '物料定价组',
  'KTGRD'           ''    '物料科目分组',
  'KTGRM'           ''    '客户科目分组',
  'MVGR1'           ''    '物料组1',
  'MVGR2'           ''    '物料组2',
  'MVGR3'           ''    '物料组3',
  'MVGR4'           ''    '物料组4',
  'MVGR5'           ''    '物料组5',
  'WW002'           ''    '合同'.
  FIELD-SYMBOLS <LINE> TYPE LVC_S_FCAT.
  LOOP AT GT_FIELDCAT ASSIGNING <LINE>.
    <LINE>-COL_POS = SY-TABIX.
    <LINE>-OUTPUTLEN = '30'.
    <LINE>-TABNAME = 'GT_ALV'.
    CASE <LINE>-FIELDNAME.
      WHEN 'BOX'.
        <LINE>-EDIT = 'X'.
        <LINE>-CHECKBOX = 'X'.
*      WHEN 'MAKTX'.
*        <line>-outputlen = '40'.
    ENDCASE.
  ENDLOOP.
ENDFORM.                    " sub_build_fieldcat
*&---------------------------------------------------------------------*
*&      Form  sub_set_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_SET_LAYOUT.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
*  gs_layout-NO_ROWMARK = 'X'.
ENDFORM.                    " sub_set_layout
*&---------------------------------------------------------------------*
*&      Form  sub_select_lines
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0682   text
*----------------------------------------------------------------------*
FORM SUB_SELECT_LINES USING P_SEL.
  IF P_SEL = 'X'.
    READ TABLE GT_ALV INTO GS_ALV WITH KEY BOX = SPACE
    ICON = SPACE.
    GS_ALV-BOX = 'X'.
    MODIFY GT_ALV FROM GS_ALV TRANSPORTING BOX ICON WHERE BOX EQ SPACE
    AND ICON EQ SPACE.
  ELSEIF P_SEL = SPACE.
    READ TABLE GT_ALV INTO GS_ALV WITH KEY BOX = 'X'.
    GS_ALV-BOX = SPACE.
    MODIFY GT_ALV FROM GS_ALV TRANSPORTING BOX WHERE BOX EQ 'X'.
  ENDIF.
ENDFORM.                    " sub_select_lines
*&---------------------------------------------------------------------*
*&      Form  get_pc_filename
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_pa_file  text
*----------------------------------------------------------------------*
FORM GET_PC_FILENAME USING    P_PA_FILE.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      DEF_FILENAME     = ' '
      DEF_PATH         = ' '
*     mask             = ',Excel Files,*,xlsx,*.xlsX.'
*     mask             = ',TXT,*.TXT,Excel(2003),*.Xls,Excel,*.xlsx,All,*.*.'
      MASK             = ',*.Xls,*.xlsx,TXT,*.TXT,All,*.*.'
      MODE             = 'O'
      TITLE            = ' '
    IMPORTING
      FILENAME         = PA_FILE
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
ENDFORM.                    " get_pc_filename
*&---------------------------------------------------------------------*
*&      Form  up_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->file  ev_msg
*----------------------------------------------------------------------*
FORM UP_FILE USING FILE TYPE STRING
      EV_MSG TYPE STRING
CHANGING ITAB TYPE STANDARD TABLE .
  REFRESH:ITAB.
  DATA: LV_I        TYPE I,
        LV_STR1(50),
        LV_STR2(50).
  DATA: LS_ITAB TYPE TY_UP.
  IF FILE IS INITIAL.
    EV_MSG = '请输入文件名'.
    RETURN.
  ENDIF.
  "__" 检查文件类型
  LV_I = STRLEN( FILE ).
  CHECK LV_I GE 4.
  SUBTRACT 4 FROM LV_I.
  SPLIT FILE+LV_I AT '.' INTO LV_STR1 LV_STR2.
  IF LV_STR2 IS INITIAL.
    LV_STR2 = LV_STR1.
  ENDIF.
  CONDENSE LV_STR2.
  TRANSLATE LV_STR2 TO UPPER CASE.
  CASE LV_STR2.
    WHEN 'TXT'.
      DATA: LV_FILENAME TYPE STRING.
      LV_FILENAME = FILE.
      CALL FUNCTION 'GUI_UPLOAD'
        EXPORTING
          FILENAME                = LV_FILENAME
*         FILETYPE                = 'ASC'
          FILETYPE                = 'DAT'
        TABLES
          DATA_TAB                = ITAB
*   CHANGING
*         ISSCANPERFORMED         = ' '
        EXCEPTIONS
          FILE_OPEN_ERROR         = 1
          FILE_READ_ERROR         = 2
          NO_BATCH                = 3
          GUI_REFUSE_FILETRANSFER = 4
          INVALID_TYPE            = 5
          NO_AUTHORITY            = 6
          UNKNOWN_ERROR           = 7
          BAD_DATA_FORMAT         = 8
          HEADER_NOT_ALLOWED      = 9
          SEPARATOR_NOT_ALLOWED   = 10
          HEADER_TOO_LONG         = 11
          UNKNOWN_DP_ERROR        = 12
          ACCESS_DENIED           = 13
          DP_OUT_OF_MEMORY        = 14
          DISK_FULL               = 15
          DP_TIMEOUT              = 16
          OTHERS                  = 17.
    WHEN 'XLS' OR 'XLSX'.
      DATA: LS_TEXT TYPE TRUXS_T_TEXT_DATA.
      DATA: LV_PATH TYPE RLGRAP-FILENAME.
      DATA: LT_EXCEL TYPE KCDE_CELLS OCCURS 0 WITH HEADER LINE.
      FIELD-SYMBOLS: <FS>.
*     路径转换大写
      TRANSLATE FILE TO UPPER CASE.
      LV_PATH = FILE.
      CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
        EXPORTING
          FILENAME    = LV_PATH
          I_BEGIN_COL = 1
          I_BEGIN_ROW = 4
          I_END_COL   = 63
          I_END_ROW   = 60000
        TABLES
          INTERN      = LT_EXCEL
*       EXCEPTIONS
*         INCONSISTENT_PARAMETERS       = 1
*         UPLOAD_OLE  = 2
*         OTHERS      = 3
        .
      IF SY-SUBRC <> 0.
* Implement suitable error handling here
      ENDIF.
      IF LT_EXCEL[] IS INITIAL .
        EXIT.
      ELSE.
        SORT LT_EXCEL BY ROW COL.
        LOOP AT LT_EXCEL.
          ON CHANGE OF LT_EXCEL-ROW.
            IF SY-TABIX <> 1.
              APPEND LS_ITAB TO ITAB.
              CLEAR LS_ITAB.
            ENDIF.
          ENDON.
          ASSIGN COMPONENT LT_EXCEL-COL OF STRUCTURE LS_ITAB TO <FS>.
          <FS> = LT_EXCEL-VALUE.
        ENDLOOP.
        APPEND LS_ITAB TO ITAB.
        CLEAR LS_ITAB.
      ENDIF.
      IF ITAB[] IS INITIAL.
        MESSAGE S000 WITH '导入模板的文件数据是空的!' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    WHEN OTHERS.
      EV_MSG = '输入文件不支持导入'.
      RETURN.
  ENDCASE.
ENDFORM.
*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO CHANGING BDCDATA TYPE STANDARD TABLE .
  DATA: BDCDATA1 TYPE BDCDATA.
  CLEAR BDCDATA1.
  BDCDATA1-PROGRAM  = PROGRAM.
  BDCDATA1-DYNPRO   = DYNPRO.
  BDCDATA1-DYNBEGIN = 'X'.
  APPEND BDCDATA1 TO BDCDATA.
ENDFORM.                    "BDC_DYNPRO
*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL CHANGING BDCDATA TYPE STANDARD TABLE.
  DATA: BDCDATA1 TYPE BDCDATA.
  CLEAR BDCDATA1.
  BDCDATA1-FNAM = FNAM.
  BDCDATA1-FVAL = FVAL.
  APPEND BDCDATA1 TO BDCDATA.
ENDFORM.                    "BDC_FIELD
FORM SUB_DATE_CHECK USING PV_DATE PV_TEXT CHANGING PC_ERR PC_MSG.
  DATA: LV_I    TYPE I,
        LV_MSG  TYPE STRING,
        LV_DATE TYPE SYDATUM.
  CHECK PV_DATE IS NOT INITIAL.
  REPLACE ALL OCCURRENCES OF '-' IN PV_DATE WITH ''.
  REPLACE ALL OCCURRENCES OF '.' IN PV_DATE WITH ''.
  REPLACE ALL OCCURRENCES OF '/' IN PV_DATE WITH ''.
  LV_I = STRLEN( PV_DATE ).
  IF LV_I NE 8.
    CONCATENATE PV_TEXT '日期格式不正确' INTO LV_MSG.
    PERFORM SUB_ADD_MSG USING LV_MSG  SPACE CHANGING PC_MSG.
    PC_ERR = C_X.
    RETURN.
  ENDIF.
  LV_DATE = PV_DATE.
  CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
    EXPORTING
      DATE                      = LV_DATE
    EXCEPTIONS
      PLAUSIBILITY_CHECK_FAILED = 1
      OTHERS                    = 2.
  IF SY-SUBRC <> 0.
    CONCATENATE PV_TEXT '日期格式不正确' INTO LV_MSG.
    PERFORM SUB_ADD_MSG USING LV_MSG  SPACE CHANGING PC_MSG.
    PC_ERR = C_X.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ADD_MSG
*&---------------------------------------------------------------------*
*       text 拼凑信息
*----------------------------------------------------------------------*
*      -->PA_TXT     text
*      -->PA_SEP     text
*      -->PC_MSG     text
*----------------------------------------------------------------------*
FORM SUB_ADD_MSG
USING    PA_TXT PA_SEP
CHANGING PC_MSG.
  DATA LV_MSG  TYPE STRING.
  DATA LV_TXT  TYPE STRING.
  LV_MSG = PC_MSG .
  LV_TXT = PA_TXT .
  CONDENSE LV_MSG NO-GAPS.
  CONDENSE LV_TXT NO-GAPS.
  CHECK NOT LV_TXT IS INITIAL.
  IF LV_MSG IS INITIAL.
    LV_MSG = LV_TXT.
  ELSE.
    CONCATENATE LV_MSG LV_TXT INTO LV_MSG SEPARATED BY PA_SEP.
  ENDIF.
  PC_MSG = LV_MSG.
ENDFORM. " add_des
FORM SUB_INPUT CHANGING PC_FIELD.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      INPUT  = PC_FIELD
    IMPORTING
      OUTPUT = PC_FIELD.
ENDFORM.
FORM SUB_OPEN_EXCEL.
  DATA: L_SHTNAME(40) TYPE C VALUE 'SAP财务凭证手工批量创建模板'.
  PERFORM SUB_CREATEEXCELAPPLICATION.
  PERFORM SUB_OPENEXCELFILE USING PA_FILE.
  PERFORM SUB_SETEXCELAPPVISIBLE.
  PERFORM SUB_ACTIVEEXCELSHEET USING L_SHTNAME.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CREATEEXCELAPPLICATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SUB_CREATEEXCELAPPLICATION.
  CREATE OBJECT GS_EXCEL 'EXCEL.APPLICATION'.
  PERFORM SUB_ERROR_HANDLE.
ENDFORM.                    "CreateExcelApplication
*&---------------------------------------------------------------------*
*&      Form  OPENEXCELFILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FILENAME   text
*----------------------------------------------------------------------*
FORM SUB_OPENEXCELFILE USING FILENAME LIKE RLGRAP-FILENAME.
  CALL METHOD OF GS_EXCEL 'Workbooks' = GS_WBOOK.
  PERFORM SUB_ERROR_HANDLE.
  CALL METHOD OF GS_WBOOK 'Open'
    EXPORTING
      #1 = FILENAME.
  PERFORM SUB_ERROR_HANDLE.
ENDFORM.                    "openexcelfile
*&---------------------------------------------------------------------*
*&      Form  setexcelappvisible
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SUB_SETEXCELAPPVISIBLE.
  SET PROPERTY OF GS_EXCEL 'Visible' = 1 .
  PERFORM SUB_ERROR_HANDLE.
ENDFORM.                    "setexcelappVisible
*&---------------------------------------------------------------------*
*&      Form  activeexcelsheet
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->SHEETNAME  text
*----------------------------------------------------------------------*
FORM SUB_ACTIVEEXCELSHEET USING SHEETNAME.
  CALL METHOD OF GS_EXCEL 'worksheets' = GS_SHEET
  EXPORTING
    #1 = SHEETNAME.
  CALL METHOD OF GS_SHEET 'activate'.
  PERFORM SUB_ERROR_HANDLE.
ENDFORM.                    "openexcelfile
*&---------------------------------------------------------------------*
*&      Form  ERROR_HANDLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SUB_ERROR_HANDLE.
  DATA: LV_MES TYPE STRING.
  IF SY-SUBRC <> 0.
    GV_EXCEL_E = C_X.
    LV_MES = SY-SUBRC.
    CONCATENATE 'Fehler bei OLE-Automation:' LV_MES INTO LV_MES.
    MESSAGE S001(00) WITH LV_MES DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.                    "error_handle
FORM SUB_SHOW_PERCENT_15 USING PA_MESSAGE TYPE C
      PA_PERCENT TYPE I.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      PERCENTAGE = PA_PERCENT
      TEXT       = PA_MESSAGE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SUB_XLS_PASTE_ITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->WORKSHEET  text
*      -->ROW        text
*      -->COL        text
*      -->ITAB       text
*----------------------------------------------------------------------*
FORM SUB_XLS_PASTE_ITAB USING PA_WORKSHEET TYPE OLE2_OBJECT
      PA_ROW       TYPE I
      PA_COL       TYPE I
      PT_ITAB      TYPE ANY TABLE.
  DATA: LV_RC   TYPE I,
        LV_CELL TYPE OLE2_OBJECT.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT
    IMPORTING
      DATA                 = PT_ITAB
    CHANGING
      RC                   = LV_RC
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.
  CALL METHOD OF
  PA_WORKSHEET
  'CELLS' = LV_CELL
  EXPORTING
    #1 = PA_ROW
    #2 = PA_COL.
  IF LV_CELL IS INITIAL.
    EXIT.
  ENDIF.
  CALL METHOD OF
    LV_CELL
    'SELECT'.
  CALL METHOD OF
    PA_WORKSHEET
    'PASTE'.
  CALL METHOD OF
    LV_CELL
    'SELECT'.
ENDFORM.                    "XLS_PASTE_ITAB
*&---------------------------------------------------------------------*
*&      Form  EXISTEXCELAPPLICATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SUB_EXISTEXCELAPPLICATION.
****保存文件****
  GET PROPERTY OF GS_EXCEL 'ActiveSheet' = GS_SHEET. "获取活动SHEET
  FREE OBJECT GS_SHEET.
  FREE OBJECT GS_WBOOK.
  GET PROPERTY OF GS_EXCEL 'ActiveWorkbook' = GS_WBOOK.
  CALL METHOD OF GS_WBOOK 'SAVE'.
****释放对象****
  FREE OBJECT GS_CELL.
  FREE OBJECT GS_SHEET.
  FREE OBJECT GS_WBOOK.
  FREE OBJECT GS_EXCEL.
ENDFORM.                    "ExistExcelApplication
FORM SUB_CREATE_FB01 .
  DATA: LS_DOCUMENTHEADER    TYPE BAPIACHE09,
        LS_ACCOUNTGL         TYPE BAPIACGL09,
        LT_ACCOUNTGL         TYPE STANDARD TABLE OF BAPIACGL09,
        LS_RETURN            TYPE BAPIRET2,
        LT_RETURN            TYPE STANDARD TABLE OF BAPIRET2,
        LS_ACCOUNTRECEIVABLE TYPE BAPIACAR09,
        LT_ACCOUNTRECEIVABLE TYPE STANDARD TABLE OF BAPIACAR09,
        LS_CURRENCYAMOUNT    TYPE BAPIACCR09,
        LT_CURRENCYAMOUNT    TYPE STANDARD TABLE OF BAPIACCR09,
        LS_ACCOUNTPAYABLE    TYPE  BAPIACAP09,
        LT_ACCOUNTPAYABLE    TYPE STANDARD TABLE OF  BAPIACAP09,
        LS_EXTENSION2        TYPE  BAPIPAREX,
        LT_EXTENSION2        TYPE STANDARD TABLE OF BAPIPAREX.
  DATA LV_ITEMNO_ACC TYPE POSNR_ACC .
  DATA: LV_MSG     TYPE BAPI_MSG,
        LV_MESSAGE TYPE BAPI_MSG.
  DATA LV_WAERS2 TYPE T001-WAERS. "公司本位币
  DATA:T_TAX_INFO    LIKE TABLE OF RTAX1U15,
       WA_TAX_INFO   LIKE          RTAX1U15,
       LT_ACCOUNTTAX LIKE TABLE OF BAPIACTX09,
       LS_ACCOUNTTAX LIKE BAPIACTX09,
       I_WRBTR       LIKE          BSEG-WRBTR.
  DATA: LS_ZFI_BADI_001 TYPE ZFI_BADI_001.
  FIELD-SYMBOLS: <L_ALV> TYPE TY_ALV.
  FIELD-SYMBOLS: <LS_ALV> TYPE TY_ALV.
  LOOP AT GT_ALV ASSIGNING <L_ALV> WHERE BOX = 'X' GROUP BY ( KEY1 = <L_ALV>-ZCODE ).
    REFRESH: LT_ACCOUNTGL,LT_RETURN,LT_ACCOUNTRECEIVABLE,LT_CURRENCYAMOUNT,
             LT_ACCOUNTPAYABLE,T_TAX_INFO,LT_ACCOUNTTAX,LT_EXTENSION2.
    CLEAR: LS_DOCUMENTHEADER,LS_ACCOUNTGL,LS_RETURN,LS_ACCOUNTRECEIVABLE,
           LS_CURRENCYAMOUNT,LS_ACCOUNTPAYABLE,LS_EXTENSION2,LS_ACCOUNTTAX,
           WA_TAX_INFO,LS_ZFI_BADI_001.
*   抬头参数
    LS_DOCUMENTHEADER-DOC_TYPE = <L_ALV>-BLART.  " 凭证类型
    LS_DOCUMENTHEADER-COMP_CODE = <L_ALV>-BUKRS. " 公司代码
    LS_DOCUMENTHEADER-DOC_DATE = <L_ALV>-BLDAT. " 凭证日期
    LS_DOCUMENTHEADER-PSTNG_DATE = <L_ALV>-BUDAT. " 过账日期
    LS_DOCUMENTHEADER-FIS_PERIOD = <L_ALV>-MONAT. " 过账期间
    LS_DOCUMENTHEADER-REF_DOC_NO = <L_ALV>-XBLNR. " 参照
    LS_DOCUMENTHEADER-TRANS_DATE = <L_ALV>-WWERT. " 换算日期
    LS_DOCUMENTHEADER-HEADER_TXT = <L_ALV>-BKTXT. " 抬头文本
    LS_DOCUMENTHEADER-USERNAME   = SY-UNAME.
    LS_DOCUMENTHEADER-FISC_YEAR  = <L_ALV>-BUDAT+0(4). "年度
    LS_DOCUMENTHEADER-FIS_PERIOD = <L_ALV>-BUDAT+4(2). " 期间
    SELECT SINGLE WAERS INTO LV_WAERS2
    FROM T001 WHERE BUKRS EQ LS_DOCUMENTHEADER-COMP_CODE.
    LOOP AT GT_ALV INTO DATA(LS_ALV) WHERE ZCODE = <L_ALV>-ZCODE .
     CLEAR LS_ZFI_BADI_001.
*   行项目号
      LV_ITEMNO_ACC = SY-TABIX.
      CASE LS_ALV-KOART.
        WHEN 'D'."客户
          "添加前导零
          LS_ALV-KUNNR = |{ LS_ALV-KUNNR ALPHA = IN }|.
          LS_ACCOUNTRECEIVABLE-ITEMNO_ACC  = LV_ITEMNO_ACC. "行项目号
          LS_ACCOUNTRECEIVABLE-CUSTOMER = LS_ALV-KUNNR.  "客户编码
          LS_ACCOUNTRECEIVABLE-GL_ACCOUNT = LS_ALV-HKONT. "总账科目
          LS_ACCOUNTRECEIVABLE-SP_GL_IND  = LS_ALV-UMSKZ. "特别总账标识
          LS_ACCOUNTRECEIVABLE-COMP_CODE = <L_ALV>-BUKRS.      "公司代码
          LS_ACCOUNTRECEIVABLE-BUS_AREA   = LS_ALV-GSBER. "业务范围
          LS_ACCOUNTRECEIVABLE-PROFIT_CTR = LS_ALV-PRCTR. "利润中心
          LS_ACCOUNTRECEIVABLE-ITEM_TEXT  = LS_ALV-SGTXT. "文本
          LS_ACCOUNTRECEIVABLE-BLINE_DATE = LS_ALV-ZFBDT. "到期日
          LS_ACCOUNTRECEIVABLE-ALLOC_NMBR = LS_ALV-ZUONR. " 分配号
          LS_ACCOUNTRECEIVABLE-PMNTTRMS   = LS_ALV-ZTERM. "付款条件
          LS_ACCOUNTRECEIVABLE-PAYMT_REF  = LS_ALV-KIDNO. "付款参考
          LS_ACCOUNTRECEIVABLE-PYMT_METH = LS_ALV-ZLSCH. "付款方式
          LS_ACCOUNTRECEIVABLE-PMTMTHSUPL = LS_ALV-UZAWE. "付款方式补充
          LS_ACCOUNTRECEIVABLE-REF_KEY_1 = LS_ALV-XREF1.  "参考码1
          LS_ACCOUNTRECEIVABLE-REF_KEY_2 = LS_ALV-XREF2.  "参考码2
          LS_ACCOUNTRECEIVABLE-REF_KEY_3 = LS_ALV-XREF3.  "参考码3
          LS_ACCOUNTRECEIVABLE-TAX_CODE  = LS_ALV-MWSKZ. "税码
          APPEND LS_ACCOUNTRECEIVABLE TO LT_ACCOUNTRECEIVABLE.
          CLEAR LS_ACCOUNTRECEIVABLE.
        WHEN 'K'."供应商
          LS_ALV-LIFNR = |{ LS_ALV-LIFNR ALPHA = IN }|.
          LS_ACCOUNTPAYABLE-ITEMNO_ACC  = LV_ITEMNO_ACC. "行项目号
          LS_ACCOUNTPAYABLE-VENDOR_NO = LS_ALV-LIFNR. "供应商编码
          LS_ACCOUNTPAYABLE-GL_ACCOUNT = LS_ALV-HKONT. "总账科目
          LS_ACCOUNTPAYABLE-SP_GL_IND  = LS_ALV-UMSKZ. "特别总账标识
          LS_ACCOUNTPAYABLE-COMP_CODE = <L_ALV>-BUKRS.      "公司代码
          LS_ACCOUNTPAYABLE-BUS_AREA   = LS_ALV-GSBER. "业务范围
          LS_ACCOUNTPAYABLE-PROFIT_CTR = LS_ALV-PRCTR. "利润中心
          LS_ACCOUNTPAYABLE-ITEM_TEXT  = LS_ALV-SGTXT. "文本
          LS_ACCOUNTPAYABLE-BLINE_DATE = LS_ALV-ZFBDT. "到期日
          LS_ACCOUNTPAYABLE-ALLOC_NMBR = LS_ALV-ZUONR. " 分配号
          LS_ACCOUNTPAYABLE-PMNTTRMS   = LS_ALV-ZTERM. "付款条件
          LS_ACCOUNTPAYABLE-PAYMT_REF  = LS_ALV-KIDNO. "付款参考
          LS_ACCOUNTPAYABLE-PYMT_METH = LS_ALV-ZLSCH. "付款方式
          LS_ACCOUNTPAYABLE-PMTMTHSUPL = LS_ALV-UZAWE. "付款方式补充
          LS_ACCOUNTPAYABLE-REF_KEY_1 = LS_ALV-XREF1.  "参考码1
          LS_ACCOUNTPAYABLE-REF_KEY_2 = LS_ALV-XREF2.  "参考码2
          LS_ACCOUNTPAYABLE-REF_KEY_3 = LS_ALV-XREF3.  "参考码3
          LS_ACCOUNTPAYABLE-TAX_CODE  = LS_ALV-MWSKZ. "税码
          APPEND LS_ACCOUNTPAYABLE TO LT_ACCOUNTPAYABLE.
          CLEAR LS_ACCOUNTPAYABLE.
        WHEN 'S'."总账科目
          LS_ACCOUNTGL-ITEMNO_ACC  = LV_ITEMNO_ACC. "行项目号
          LS_ACCOUNTGL-GL_ACCOUNT = LS_ALV-HKONT. "总账科目
          LS_ACCOUNTGL-BUS_AREA   = LS_ALV-GSBER. "业务范围
          LS_ACCOUNTGL-PROFIT_CTR = LS_ALV-PRCTR. "利润中心
          LS_ACCOUNTGL-ITEM_TEXT  = LS_ALV-SGTXT. "文本
          LS_ACCOUNTGL-REF_KEY_1 = LS_ALV-XREF1.  "参考码1
          LS_ACCOUNTGL-REF_KEY_2 = LS_ALV-XREF2.  "参考码2
          LS_ACCOUNTGL-REF_KEY_3 = LS_ALV-XREF3.  "参考码3
          LS_ACCOUNTGL-TAX_CODE  = LS_ALV-MWSKZ. "税码
          LS_ACCOUNTGL-COSTCENTER = LS_ALV-KOSTL. "成本中心
          IF LS_ALV-PROJK IS NOT INITIAL.
            LS_ACCOUNTGL-WBS_ELEMENT = LS_ALV-PROJK. "WBS 元素(工作号)
          ENDIF.
          LS_ACCOUNTGL-ORDERID = LS_ALV-AUFNR."内部订单
          LS_ACCOUNTGL-QUANTITY = LS_ALV-MENGE. "数量
          LS_ACCOUNTGL-BASE_UOM = LS_ALV-MEINS. "单位
          APPEND LS_ACCOUNTGL TO LT_ACCOUNTGL.
          CLEAR LS_ACCOUNTGL.
        WHEN OTHERS.
      ENDCASE.
      LS_CURRENCYAMOUNT-ITEMNO_ACC  = LV_ITEMNO_ACC.
      LS_CURRENCYAMOUNT-CURRENCY    = LS_ALV-WAERS. " 货币
      LS_CURRENCYAMOUNT-AMT_DOCCUR  = LS_ALV-WRBTR.
      IF LS_ALV-SHKZG = 'H'.
        LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
      ENDIF.
      IF GS_ALV-KURSF IS NOT INITIAL.
        LS_CURRENCYAMOUNT-EXCH_RATE   = LS_ALV-KURSF." 汇率
      ENDIF.
      APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
      CLEAR LS_CURRENCYAMOUNT.
      IF LS_ALV-WAERS NE LV_WAERS2 AND LS_ALV-DMBTR IS NOT INITIAL.
        "本位币
        LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
        LS_CURRENCYAMOUNT-CURR_TYPE  = '10'.
        LS_CURRENCYAMOUNT-CURRENCY   = LV_WAERS2.
        LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ALV-DMBTR.
        IF LS_ALV-SHKZG = 'H'.
          LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
        ENDIF.
        APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
        CLEAR LS_CURRENCYAMOUNT.
      ENDIF.
      "税额计算
      IF LS_ALV-MWSKZ IS NOT INITIAL.
        LV_ITEMNO_ACC = LV_ITEMNO_ACC + 1.
        LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
        LS_CURRENCYAMOUNT-CURRENCY   = LS_ALV-WAERS.          " 货币码
        LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ALV-DMBTR.      " 税额
        LS_CURRENCYAMOUNT-AMT_BASE   = LS_ALV-WRBTR.      " 凭证货币金额
        IF LS_ALV-SHKZG = 'H'.
          LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
          LS_CURRENCYAMOUNT-AMT_BASE   = 0 - LS_CURRENCYAMOUNT-AMT_BASE.
        ENDIF.
        IF LS_ALV-KURSF IS NOT INITIAL.
          LS_CURRENCYAMOUNT-EXCH_RATE = LS_ALV-KURSF.         " 汇率
        ENDIF.
        APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
        CLEAR LS_CURRENCYAMOUNT.
        IF LS_ALV-WAERS NE LV_WAERS2 AND LS_ALV-WRBTR IS NOT INITIAL.
          "税额本位币.
          LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
          LS_CURRENCYAMOUNT-CURR_TYPE  = '10'.              " 货币类型
          LS_CURRENCYAMOUNT-CURRENCY   = LS_ALV-WAERS.         " 货币码
          LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ALV-WRBTR.     " 税额(本位币)
          LS_CURRENCYAMOUNT-AMT_BASE   = LS_ALV-DMBTR.
          IF LS_ALV-SHKZG = 'H'.
            LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
            LS_CURRENCYAMOUNT-AMT_BASE   = 0 - LS_CURRENCYAMOUNT-AMT_BASE.
          ENDIF.
          APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
          CLEAR LS_CURRENCYAMOUNT.
        ENDIF.
        CLEAR: T_TAX_INFO,I_WRBTR.
        I_WRBTR  = LS_ALV-WRBTR .
        CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
          EXPORTING
            I_BUKRS = LS_DOCUMENTHEADER-COMP_CODE     "公司代码
            I_MWSKZ = LS_ALV-MWSKZ            "税码
            I_WAERS = LS_ALV-WAERS            "币种
            I_WRBTR = I_WRBTR                 "金额
          TABLES
            T_MWDAT = T_TAX_INFO
          EXCEPTIONS
            OTHERS  = 4.
        IF SY-SUBRC <> 0.
        ENDIF.
        READ TABLE T_TAX_INFO INTO WA_TAX_INFO INDEX 1.
        CLEAR LS_ACCOUNTTAX.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = WA_TAX_INFO-HKONT
          IMPORTING
            OUTPUT = LS_ACCOUNTTAX-GL_ACCOUNT.             " 总账科目
        LS_ACCOUNTTAX-ITEMNO_ACC       = LV_ITEMNO_ACC.
        LS_ACCOUNTTAX-COND_KEY         = WA_TAX_INFO-KSCHL." 条件类型   MWVS
        LS_ACCOUNTTAX-ACCT_KEY         = WA_TAX_INFO-KTOSL." 事务关键字 VST
        LS_ACCOUNTTAX-TAX_CODE         = LS_ALV-MWSKZ.     " 税码       J1
        LS_ACCOUNTTAX-TAX_RATE         = WA_TAX_INFO-MSATZ." 税率      170.000
        APPEND LS_ACCOUNTTAX TO LT_ACCOUNTTAX.
        CLEAR:LS_ACCOUNTTAX.
      ENDIF.
      IF LS_ALV-BSCHL IS NOT INITIAL OR LS_ALV-XNEGP IS NOT INITIAL
        OR LS_ALV-RSTGR IS NOT INITIAL OR LS_ALV-NUMPG IS NOT INITIAL.
        LS_EXTENSION2-STRUCTURE = 'ZFI_BADI_001'.
        LS_ZFI_BADI_001-POSNR = LV_ITEMNO_ACC.
        LS_ZFI_BADI_001-BSCHL = LS_ALV-BSCHL. "记账码
        LS_ZFI_BADI_001-XNEGP = LS_ALV-XNEGP. "反记账
        LS_ZFI_BADI_001-RSTGR = LS_ALV-RSTGR. "原因代码
        LS_ZFI_BADI_001-NUMPG = LS_ALV-NUMPG. "页数
        LS_EXTENSION2-VALUEPART1 = LS_ZFI_BADI_001.
        APPEND LS_EXTENSION2 TO  LT_EXTENSION2.
        CLEAR  LS_EXTENSION2.
      ENDIF.
    ENDLOOP.
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' "创建会计凭证
      EXPORTING
        DOCUMENTHEADER    = LS_DOCUMENTHEADER
*       CUSTOMERCPD       =
*       CONTRACTHEADER    =
      TABLES
        ACCOUNTGL         = LT_ACCOUNTGL
        ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
        ACCOUNTPAYABLE    = LT_ACCOUNTPAYABLE
*       ACCOUNTTAX        =
        CURRENCYAMOUNT    = LT_CURRENCYAMOUNT
*       CRITERIA          =
*       VALUEFIELD        =
*       EXTENSION1        =
        RETURN            = LT_RETURN
*       PAYMENTCARD       =
*       CONTRACTITEM      =
        EXTENSION2        = LT_EXTENSION2
*       REALESTATE        =
*       ACCOUNTWT         =
      .
    LOOP AT GT_ALV ASSIGNING <LS_ALV> WHERE ZCODE = <L_ALV>-ZCODE.
      READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.
      IF SY-SUBRC = 0.
        IF <LS_ALV>-KUNNR IS NOT INITIAL.
          READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E' PARAMETER = 'ACCOUNTRECEIVABLE'.
          IF SY-SUBRC = 0.
            <LS_ALV>-ICON = C_ICON_E.
            <LS_ALV>-MSG = LS_RETURN-MESSAGE.
          ENDIF.
        ELSEIF <LS_ALV>-LIFNR IS NOT INITIAL .
          READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E' PARAMETER = 'ACCOUNTPAYABLE'.
          IF SY-SUBRC = 0.
            <LS_ALV>-ICON = C_ICON_E.
            <LS_ALV>-MSG = LS_RETURN-MESSAGE.
          ENDIF.
        ELSE.
          READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E' PARAMETER = 'ACCOUNTGL'.
          IF SY-SUBRC = 0.
            <LS_ALV>-ICON = C_ICON_E.
            <LS_ALV>-MSG = LS_RETURN-MESSAGE.
          ENDIF.
        ENDIF.
        IF <L_ALV>-ICON IS INITIAL.
          LOOP AT LT_RETURN INTO LS_RETURN.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                MSGID               = LS_RETURN-ID
                MSGNR               = LS_RETURN-NUMBER
                MSGV1               = LS_RETURN-MESSAGE_V1
                MSGV2               = LS_RETURN-MESSAGE_V2
                MSGV3               = LS_RETURN-MESSAGE_V3
                MSGV4               = LS_RETURN-MESSAGE_V4
              IMPORTING
                MESSAGE_TEXT_OUTPUT = LV_MSG.
            CONCATENATE LV_MESSAGE LV_MSG INTO LV_MESSAGE.
          ENDLOOP.
          <LS_ALV>-ICON = C_ICON_E.
          <LS_ALV>-MSG = LV_MESSAGE.
          CLEAR :LV_MSG,LS_RETURN,LV_MESSAGE.
        ENDIF.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ELSE.
        READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'S'.
        IF SY-SUBRC = 0.
          <LS_ALV>-ICON = C_ICON_S.
          <LS_ALV>-MSG = '会计凭证' && LS_RETURN-MESSAGE_V2 && '导入成功'.
        ENDIF.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
      ENDIF.
      CLEAR :LS_RETURN.
    ENDLOOP.
  ENDLOOP.
ENDFORM.
FORM SUB_INPUT00 CHANGING PV_FIELD.
  CHECK PV_FIELD IS NOT INITIAL.
  PERFORM SUB_INPUT CHANGING PV_FIELD.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ACC_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM ACC_CHECK .
  DATA: LS_DOCUMENTHEADER    TYPE BAPIACHE09,
        LS_ACCOUNTGL         TYPE BAPIACGL09,
        LT_ACCOUNTGL         TYPE STANDARD TABLE OF BAPIACGL09,
        LS_RETURN            TYPE BAPIRET2,
        LT_RETURN            TYPE STANDARD TABLE OF BAPIRET2,
        LS_ACCOUNTRECEIVABLE TYPE BAPIACAR09,
        LT_ACCOUNTRECEIVABLE TYPE STANDARD TABLE OF BAPIACAR09,
        LS_CURRENCYAMOUNT    TYPE BAPIACCR09,
        LT_CURRENCYAMOUNT    TYPE STANDARD TABLE OF BAPIACCR09,
        LS_ACCOUNTPAYABLE    TYPE  BAPIACAP09,
        LT_ACCOUNTPAYABLE    TYPE STANDARD TABLE OF  BAPIACAP09,
        LS_EXTENSION2        TYPE  BAPIPAREX,
        LT_EXTENSION2        TYPE STANDARD TABLE OF BAPIPAREX.
  DATA LV_ITEMNO_ACC TYPE POSNR_ACC .
  DATA: LV_MSG     TYPE BAPI_MSG,
        LV_MESSAGE TYPE BAPI_MSG.
  DATA LV_WAERS2 TYPE T001-WAERS. "公司本位币
  DATA:T_TAX_INFO    LIKE TABLE OF RTAX1U15,
       WA_TAX_INFO   LIKE          RTAX1U15,
       LT_ACCOUNTTAX LIKE TABLE OF BAPIACTX09,
       LS_ACCOUNTTAX LIKE BAPIACTX09,
       I_WRBTR       LIKE          BSEG-WRBTR.
  DATA: LS_ZFI_BADI_001 TYPE ZFI_BADI_001.
  FIELD-SYMBOLS: <L_ALV> TYPE TY_ALV.
  LOOP AT GT_ALV INTO GS_ALV WHERE BOX = 'X' GROUP BY ( KEY1 = GS_ALV-ZCODE ).
*   抬头参数
    LS_DOCUMENTHEADER-DOC_TYPE = GS_ALV-BLART.  " 凭证类型
    LS_DOCUMENTHEADER-COMP_CODE = GS_ALV-BUKRS. " 公司代码
    LS_DOCUMENTHEADER-DOC_DATE = GS_ALV-BLDAT. " 凭证日期
    LS_DOCUMENTHEADER-PSTNG_DATE = GS_ALV-BUDAT. " 过账日期
    LS_DOCUMENTHEADER-FIS_PERIOD = GS_ALV-MONAT. " 过账期间
    LS_DOCUMENTHEADER-REF_DOC_NO = GS_ALV-XBLNR. " 参照
    LS_DOCUMENTHEADER-TRANS_DATE = GS_ALV-WWERT. " 换算日期
    LS_DOCUMENTHEADER-HEADER_TXT = GS_ALV-BKTXT. " 抬头文本
    LS_DOCUMENTHEADER-USERNAME   = SY-UNAME.
    LS_DOCUMENTHEADER-FISC_YEAR  = GS_ALV-BUDAT+0(4). "年度
    LS_DOCUMENTHEADER-FIS_PERIOD = GS_ALV-BUDAT+4(2). " 期间
    SELECT SINGLE WAERS INTO LV_WAERS2
    FROM T001 WHERE BUKRS EQ LS_DOCUMENTHEADER-COMP_CODE.
    LOOP AT GT_ALV INTO DATA(LS_ALV) WHERE ZCODE = GS_ALV-ZCODE.
      CLEAR LS_ZFI_BADI_001.
*   行项目号
      LV_ITEMNO_ACC = SY-TABIX.
      CASE LS_ALV-KOART.
        WHEN 'D'."客户
          "添加前导零
          LS_ALV-KUNNR = |{ LS_ALV-KUNNR ALPHA = IN }|.
          LS_ACCOUNTRECEIVABLE-ITEMNO_ACC  = LV_ITEMNO_ACC. "行项目号
          LS_ACCOUNTRECEIVABLE-CUSTOMER = LS_ALV-KUNNR.  "客户编码
          LS_ACCOUNTRECEIVABLE-GL_ACCOUNT = LS_ALV-HKONT. "总账科目
          LS_ACCOUNTRECEIVABLE-SP_GL_IND  = LS_ALV-UMSKZ. "特别总账标识
          LS_ACCOUNTRECEIVABLE-COMP_CODE = GS_ALV-BUKRS.      "公司代码
          LS_ACCOUNTRECEIVABLE-BUS_AREA   = LS_ALV-GSBER. "业务范围
          LS_ACCOUNTRECEIVABLE-PROFIT_CTR = LS_ALV-PRCTR. "利润中心
          LS_ACCOUNTRECEIVABLE-ITEM_TEXT  = LS_ALV-SGTXT. "文本
          LS_ACCOUNTRECEIVABLE-BLINE_DATE = LS_ALV-ZFBDT. "到期日
          LS_ACCOUNTRECEIVABLE-ALLOC_NMBR = LS_ALV-ZUONR. " 分配号
          LS_ACCOUNTRECEIVABLE-PMNTTRMS   = LS_ALV-ZTERM. "付款条件
          LS_ACCOUNTRECEIVABLE-PAYMT_REF  = LS_ALV-KIDNO. "付款参考
          LS_ACCOUNTRECEIVABLE-PYMT_METH = LS_ALV-ZLSCH. "付款方式
          LS_ACCOUNTRECEIVABLE-PMTMTHSUPL = LS_ALV-UZAWE. "付款方式补充
          LS_ACCOUNTRECEIVABLE-REF_KEY_1 = LS_ALV-XREF1.  "参考码1
          LS_ACCOUNTRECEIVABLE-REF_KEY_2 = LS_ALV-XREF2.  "参考码2
          LS_ACCOUNTRECEIVABLE-REF_KEY_3 = LS_ALV-XREF3.  "参考码3
          LS_ACCOUNTRECEIVABLE-TAX_CODE  = LS_ALV-MWSKZ. "税码
          APPEND LS_ACCOUNTRECEIVABLE TO LT_ACCOUNTRECEIVABLE.
          CLEAR LS_ACCOUNTRECEIVABLE.
        WHEN 'K'."供应商
          LS_ALV-LIFNR = |{ LS_ALV-LIFNR ALPHA = IN }|.
          LS_ACCOUNTPAYABLE-ITEMNO_ACC  = LV_ITEMNO_ACC. "行项目号
          LS_ACCOUNTPAYABLE-VENDOR_NO = LS_ALV-LIFNR. "供应商编码
          LS_ACCOUNTPAYABLE-GL_ACCOUNT = LS_ALV-HKONT. "总账科目
          LS_ACCOUNTPAYABLE-SP_GL_IND  = LS_ALV-UMSKZ. "特别总账标识
          LS_ACCOUNTPAYABLE-COMP_CODE = GS_ALV-BUKRS.      "公司代码
          LS_ACCOUNTPAYABLE-BUS_AREA   = LS_ALV-GSBER. "业务范围
          LS_ACCOUNTPAYABLE-PROFIT_CTR = LS_ALV-PRCTR. "利润中心
          LS_ACCOUNTPAYABLE-ITEM_TEXT  = LS_ALV-SGTXT. "文本
          LS_ACCOUNTPAYABLE-BLINE_DATE = LS_ALV-ZFBDT. "到期日
          LS_ACCOUNTPAYABLE-ALLOC_NMBR = LS_ALV-ZUONR. " 分配号
          LS_ACCOUNTPAYABLE-PMNTTRMS   = LS_ALV-ZTERM. "付款条件
          LS_ACCOUNTPAYABLE-PAYMT_REF  = LS_ALV-KIDNO. "付款参考
          LS_ACCOUNTPAYABLE-PYMT_METH = LS_ALV-ZLSCH. "付款方式
          LS_ACCOUNTPAYABLE-PMTMTHSUPL = LS_ALV-UZAWE. "付款方式补充
          LS_ACCOUNTPAYABLE-REF_KEY_1 = LS_ALV-XREF1.  "参考码1
          LS_ACCOUNTPAYABLE-REF_KEY_2 = LS_ALV-XREF2.  "参考码2
          LS_ACCOUNTPAYABLE-REF_KEY_3 = LS_ALV-XREF3.  "参考码3
          LS_ACCOUNTPAYABLE-TAX_CODE  = LS_ALV-MWSKZ. "税码
          APPEND LS_ACCOUNTPAYABLE TO LT_ACCOUNTPAYABLE.
          CLEAR LS_ACCOUNTPAYABLE.
        WHEN 'S'."总账科目
          LS_ACCOUNTGL-ITEMNO_ACC  = LV_ITEMNO_ACC. "行项目号
          LS_ACCOUNTGL-GL_ACCOUNT = LS_ALV-HKONT. "总账科目
          LS_ACCOUNTGL-BUS_AREA   = LS_ALV-GSBER. "业务范围
          LS_ACCOUNTGL-PROFIT_CTR = LS_ALV-PRCTR. "利润中心
          LS_ACCOUNTGL-ITEM_TEXT  = LS_ALV-SGTXT. "文本
          LS_ACCOUNTGL-REF_KEY_1 = LS_ALV-XREF1.  "参考码1
          LS_ACCOUNTGL-REF_KEY_2 = LS_ALV-XREF2.  "参考码2
          LS_ACCOUNTGL-REF_KEY_3 = LS_ALV-XREF3.  "参考码3
          LS_ACCOUNTGL-TAX_CODE  = LS_ALV-MWSKZ. "税码
          LS_ACCOUNTGL-COSTCENTER = LS_ALV-KOSTL. "成本中心
          IF LS_ALV-PROJK IS NOT INITIAL.
            LS_ACCOUNTGL-WBS_ELEMENT = LS_ALV-PROJK. "WBS 元素(工作号)
          ENDIF.
          LS_ACCOUNTGL-ORDERID = LS_ALV-AUFNR."内部订单
          LS_ACCOUNTGL-QUANTITY = LS_ALV-MENGE. "数量
          LS_ACCOUNTGL-BASE_UOM = LS_ALV-MEINS. "单位
          APPEND LS_ACCOUNTGL TO LT_ACCOUNTGL.
          CLEAR LS_ACCOUNTGL.
        WHEN OTHERS.
      ENDCASE.
      LS_CURRENCYAMOUNT-ITEMNO_ACC  = LV_ITEMNO_ACC.
      LS_CURRENCYAMOUNT-CURRENCY    = LS_ALV-WAERS. " 货币
      LS_CURRENCYAMOUNT-AMT_DOCCUR  = LS_ALV-WRBTR.
      IF LS_ALV-SHKZG = 'H'.
        LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
      ENDIF.
      IF GS_ALV-KURSF IS NOT INITIAL.
        LS_CURRENCYAMOUNT-EXCH_RATE   = LS_ALV-KURSF." 汇率
      ENDIF.
      APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
      CLEAR LS_CURRENCYAMOUNT.
      IF LS_ALV-WAERS NE LV_WAERS2 AND LS_ALV-DMBTR IS NOT INITIAL.
        "本位币
        LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
        LS_CURRENCYAMOUNT-CURR_TYPE  = '10'.
        LS_CURRENCYAMOUNT-CURRENCY   = LV_WAERS2.
        LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ALV-DMBTR.
        IF LS_ALV-SHKZG = 'H'.
          LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
        ENDIF.
        APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
        CLEAR LS_CURRENCYAMOUNT.
      ENDIF.
      "税额计算
      IF LS_ALV-MWSKZ IS NOT INITIAL.
        LV_ITEMNO_ACC = LV_ITEMNO_ACC + 1.
        LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
        LS_CURRENCYAMOUNT-CURRENCY   = LS_ALV-WAERS.          " 货币码
        LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ALV-DMBTR.      " 税额
        LS_CURRENCYAMOUNT-AMT_BASE   = LS_ALV-WRBTR.      " 凭证货币金额
        IF LS_ALV-SHKZG = 'H'.
          LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
          LS_CURRENCYAMOUNT-AMT_BASE   = 0 - LS_CURRENCYAMOUNT-AMT_BASE.
        ENDIF.
        IF LS_ALV-KURSF IS NOT INITIAL.
          LS_CURRENCYAMOUNT-EXCH_RATE = LS_ALV-KURSF.         " 汇率
        ENDIF.
        APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
        CLEAR LS_CURRENCYAMOUNT.
        IF LS_ALV-WAERS NE LV_WAERS2 AND LS_ALV-WRBTR IS NOT INITIAL.
          "税额本位币.
          LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
          LS_CURRENCYAMOUNT-CURR_TYPE  = '10'.              " 货币类型
          LS_CURRENCYAMOUNT-CURRENCY   = LS_ALV-WAERS.         " 货币码
          LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ALV-WRBTR.     " 税额(本位币)
          LS_CURRENCYAMOUNT-AMT_BASE   = LS_ALV-DMBTR.
          IF LS_ALV-SHKZG = 'H'.
            LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - LS_CURRENCYAMOUNT-AMT_DOCCUR.
            LS_CURRENCYAMOUNT-AMT_BASE   = 0 - LS_CURRENCYAMOUNT-AMT_BASE.
          ENDIF.
          APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
          CLEAR LS_CURRENCYAMOUNT.
        ENDIF.
        CLEAR: T_TAX_INFO,I_WRBTR.
        I_WRBTR  = LS_ALV-WRBTR .
        CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
          EXPORTING
            I_BUKRS = LS_DOCUMENTHEADER-COMP_CODE     "公司代码
            I_MWSKZ = LS_ALV-MWSKZ            "税码
            I_WAERS = LS_ALV-WAERS            "币种
            I_WRBTR = I_WRBTR                 "金额
          TABLES
            T_MWDAT = T_TAX_INFO
          EXCEPTIONS
            OTHERS  = 4.
        IF SY-SUBRC <> 0.
        ENDIF.
        READ TABLE T_TAX_INFO INTO WA_TAX_INFO INDEX 1.
        CLEAR LS_ACCOUNTTAX.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = WA_TAX_INFO-HKONT
          IMPORTING
            OUTPUT = LS_ACCOUNTTAX-GL_ACCOUNT.             " 总账科目
        LS_ACCOUNTTAX-ITEMNO_ACC       = LV_ITEMNO_ACC.
        LS_ACCOUNTTAX-COND_KEY         = WA_TAX_INFO-KSCHL." 条件类型   MWVS
        LS_ACCOUNTTAX-ACCT_KEY         = WA_TAX_INFO-KTOSL." 事务关键字 VST
        LS_ACCOUNTTAX-TAX_CODE         = LS_ALV-MWSKZ.     " 税码       J1
        LS_ACCOUNTTAX-TAX_RATE         = WA_TAX_INFO-MSATZ." 税率      170.000
        APPEND LS_ACCOUNTTAX TO LT_ACCOUNTTAX.
        CLEAR:LS_ACCOUNTTAX.
      ENDIF.
      IF LS_ALV-BSCHL IS NOT INITIAL OR LS_ALV-XNEGP IS NOT INITIAL
        OR LS_ALV-RSTGR IS NOT INITIAL OR LS_ALV-NUMPG IS NOT INITIAL.
        LS_EXTENSION2-STRUCTURE = 'ZFI_BADI_001'.
        LS_ZFI_BADI_001-POSNR = LV_ITEMNO_ACC.
        LS_ZFI_BADI_001-BSCHL = LS_ALV-BSCHL. "记账码
        LS_ZFI_BADI_001-XNEGP = LS_ALV-XNEGP. "反记账
        LS_ZFI_BADI_001-RSTGR = LS_ALV-RSTGR. "原因代码
        LS_ZFI_BADI_001-NUMPG = LS_ALV-NUMPG. "页数
        LS_EXTENSION2-VALUEPART1 = LS_ZFI_BADI_001.
        APPEND LS_EXTENSION2 TO  LT_EXTENSION2.
        CLEAR  LS_EXTENSION2.
      ENDIF.
    ENDLOOP.
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      DOCUMENTHEADER    = LS_DOCUMENTHEADER
*     CUSTOMERCPD       =
*     CONTRACTHEADER    =
    TABLES
      ACCOUNTGL         = LT_ACCOUNTGL
      ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
      ACCOUNTPAYABLE    = LT_ACCOUNTPAYABLE
*     ACCOUNTTAX        =
      CURRENCYAMOUNT    = LT_CURRENCYAMOUNT
*     CRITERIA          =
*     VALUEFIELD        =
*     EXTENSION1        =
      RETURN            = LT_RETURN
*     PAYMENTCARD       =
*     CONTRACTITEM      =
      EXTENSION2        = LT_EXTENSION2
*     REALESTATE        =
*     ACCOUNTWT         =
    .
    LOOP AT GT_ALV ASSIGNING <L_ALV> WHERE ZCODE = GS_ALV-ZCODE.
      READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.
      IF SY-SUBRC = 0.
        IF <L_ALV>-KUNNR IS NOT INITIAL.
          READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E' PARAMETER = 'ACCOUNTRECEIVABLE'.
          IF SY-SUBRC = 0.
            <L_ALV>-ICON = C_ICON_E.
            <L_ALV>-MSG = LS_RETURN-MESSAGE.
          ENDIF.
        ELSEIF <L_ALV>-LIFNR IS NOT INITIAL .
          READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E' PARAMETER = 'ACCOUNTPAYABLE'.
          IF SY-SUBRC = 0.
            <L_ALV>-ICON = C_ICON_E.
            <L_ALV>-MSG = LS_RETURN-MESSAGE.
          ENDIF.
        ELSE.
          READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E' PARAMETER = 'ACCOUNTGL'.
          IF SY-SUBRC = 0.
            <L_ALV>-ICON = C_ICON_E.
            <L_ALV>-MSG = LS_RETURN-MESSAGE.
          ENDIF.
        ENDIF.
        IF <L_ALV>-ICON IS INITIAL.
          LOOP AT LT_RETURN INTO LS_RETURN.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                MSGID               = LS_RETURN-ID
                MSGNR               = LS_RETURN-NUMBER
                MSGV1               = LS_RETURN-MESSAGE_V1
                MSGV2               = LS_RETURN-MESSAGE_V2
                MSGV3               = LS_RETURN-MESSAGE_V3
                MSGV4               = LS_RETURN-MESSAGE_V4
              IMPORTING
                MESSAGE_TEXT_OUTPUT = LV_MSG.
            CONCATENATE LV_MESSAGE LV_MSG INTO LV_MESSAGE.
          ENDLOOP.
          <L_ALV>-ICON = C_ICON_E.
          <L_ALV>-MSG = LV_MESSAGE.
          CLEAR :LV_MSG,LS_RETURN,LV_MESSAGE.
        ENDIF.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ELSE.
        READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'S'.
*                                             number = '614'.
        IF SY-SUBRC = 0.
          <L_ALV>-ICON = C_ICON_S.
        ENDIF.
      ENDIF.
      CLEAR :LS_RETURN.
    ENDLOOP.
  ENDLOOP.
ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值