供应商索赔(金税数据)导入并创建凭证(ALV长篇备忘三)

情境/背景:供应商三包索赔款项源起QMS质量系统,联动金税系统完成发票开具,最终在SAP系统中创建完成财务凭证。该流程为手工操作,费时费力且效率低下容易出错。

目标/任务:把QMS供应商三包索赔业务搬上线,同SAP FI顾问梳理功能说明书,担当SAP中开发落地任务。

总结:SAP作为企业信息化核心系统,可以承载很多的业务流程,我们也具备自己开发功能的能力。

 

*&---------------------------------------------------------------------*
*& Report ZTEST61
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST61.



TABLES: ZFIQM_COLLECT,sscrfields.



TYPES:
  BEGIN OF ty_excel,


    BILLNO    TYPE ZFIQM_COLLECT-BILLNO ,
    LIFNR     TYPE ZFIQM_COLLECT-LIFNR ,
    VAT_NET   TYPE ZFIQM_COLLECT-VAT_NET,
    VAT_TAX   TYPE ZFIQM_COLLECT-VAT_TAX,
    VAT_CRDAT TYPE ZFIQM_COLLECT-VAT_CRDAT,
    VAT_TYP   TYPE ZFIQM_COLLECT-VAT_TYP,
    STCEG     TYPE ZFIQM_COLLECT-STCEG ,
    VAT_CODE  TYPE ZFIQM_COLLECT-VAT_CODE,

    ICON_LIGHT(4) TYPE C,
    STATUS TYPE C,
    message(100) TYPE C,


  END   OF ty_excel.

  DATA gt_excel TYPE TABLE OF ty_excel.



  DATA GT_ZFIJS001 LIKE TABLE OF ZFIJS001.
  DATA GS_ZFIJS001 LIKE ZFIJS001.

  DATA gt_ZFIQM_COLLECT LIKE TABLE OF ZFIQM_COLLECT.
  DATA gs_ZFIQM_COLLECT LIKE  ZFIQM_COLLECT.





DATA:gs_functxt   TYPE smp_dyntxt.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001 .
PARAMETERS: p_putin RADIOBUTTON GROUP rg1 DEFAULT 'X' USER-COMMAND uc01,
            p_cx RADIOBUTTON GROUP rg1.

SELECTION-SCREEN END OF BLOCK b1.



SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
    PARAMETER P_PATH1 LIKE RLGRAP-FILENAME MODIF ID M02.
SELECTION-SCREEN END OF BLOCK b2.


SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
SELECT-OPTIONS:s_VAT_CO      FOR ZFIQM_COLLECT-VAT_CODE MODIF ID M03,
               s_LIFNR      FOR ZFIQM_COLLECT-LIFNR MODIF ID M03, "供应商
               s_BILLNO      FOR ZFIQM_COLLECT-BILLNO MODIF ID M03.

SELECTION-SCREEN END OF BLOCK b3.


SELECTION-SCREEN: FUNCTION KEY 1.


INITIALIZATION.
  CLEAR gs_functxt.
  gs_functxt-text = '供应商索赔汇总(金税数据)导入模板'.
  gs_functxt-icon_id = icon_export.
  gs_functxt-icon_text = '供应商索赔汇总(金税数据)导入模板'.
  gs_functxt-quickinfo = '供应商索赔汇总(金税数据)导入模板'.
  sscrfields-functxt_01 = gs_functxt.






AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_select_screen.


AT SELECTION-SCREEN.

CASE sscrfields-ucomm.

    WHEN 'FC01'.
      PERFORM frm_download_template_a1.

ENDCASE.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path1.
   PERFORM frm_sel_file CHANGING p_path1.






START-OF-SELECTION.

IF p_putin = 'X'. "导入

   PERFORM frm_excel_import.
   PERFORM frm_table_save.

ELSEIF p_cx = 'X'. "查询、并产生FI凭证

  PERFORM frm_display_cx.

ENDIF.
















"===========导入子函数如下===========

FORM FRM_EXCEL_IMPORT .

     DATA CL_EX TYPE REF TO CX_ROOT.
  CHECK P_PATH1 IS NOT INITIAL.
  TRY .
      CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
        EXPORTING
          FILENAME                = P_PATH1
          I_BEGIN_COL             = 1
          I_BEGIN_ROW             = 3
          I_END_COL               = 8
          I_END_ROW               = 5000
*         SHEET_NAME              =
        TABLES
          INTERN                  = gt_excel
        EXCEPTIONS
          INCONSISTENT_PARAMETERS = 1
          UPLOAD_OLE              = 2
          OTHERS                  = 3.

    CATCH CX_ROOT INTO CL_EX.
      MESSAGE  CL_EX->GET_TEXT( ) TYPE 'E'.
  ENDTRY.



ENDFORM.







FORM FRM_TABLE_SAVE .


 "DATA ls_ZFIMQ type ZFIQM.
 "DATA lt_ZFIMQ TYPE TABLE OF ZFIQM.

 LOOP AT GT_excel ASSIGNING FIELD-SYMBOL(<gs180>).




    IF <gs180>-BILLNO is INITIAL.

      <gs180>-STATUS = 'E'.
      <gs180>-MESSAGE = '金税发票号不能为空!'.
      <gs180>-ICON_LIGHT = icon_red_light.

    ENDIF.


 ENDLOOP.




 DATA: LT_FIELDCAT        TYPE SLIS_T_FIELDCAT_ALV,
        LS_FIELDCAT        TYPE SLIS_FIELDCAT_ALV,
        WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
        WS_LAYOUT          TYPE SLIS_LAYOUT_ALV,
        WS_SORTFIELDS_TAB  TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
        WS_EVENTS          TYPE SLIS_T_EVENT.
  DATA: lv_pos TYPE I VALUE 0.
  DATA: TITLE TYPE LVC_TITLE.
  DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.


  DEFINE macro_fieldcat.
    lv_pos = lv_pos + 1.
    ls_fieldcat-col_pos       =  lv_pos.
    ls_fieldcat-tabname       = 'GT_excel'.
    ls_fieldcat-fieldname     = &1.
    ls_fieldcat-seltext_l     = &2.
    ls_fieldcat-inttype       = &3.
    ls_fieldcat-intlen        = &4.
    append ls_fieldcat to lt_fieldcat .
    clear ls_fieldcat.
  END-OF-DEFINITION.

  macro_fieldcat:



    'BILLNO'    '金税发票号' '' '',
    'LIFNR'     '供应商编码' '' '',
    'VAT_NET'   '不含税金额' '' '',
    'VAT_TAX'   '税额' '' '',
    'VAT_CRDAT' '开票日期' '' '',
    'VAT_TYP'   '发票性质' '' '',
    'STCEG'     '客户增值税号' '' '',
    'VAT_CODE'  '发票代码' '' '',


    'ICON_LIGHT' '图标' '' '',
    'STATUS' '状态' '' '',
    'message' '消息描述' '' ''.


  WS_LAYOUT-ZEBRA             = 'X'.
  WS_LAYOUT-GET_SELINFOS      = 'X'.
  WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  WS_LAYOUT-DETAIL_POPUP      = 'X'.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_CALLBACK_PROGRAM       = SY-REPID
        I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET'
        I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
        IS_LAYOUT                = WS_LAYOUT
        IT_FIELDCAT              = LT_FIELDCAT
        IT_SPECIAL_GROUPS        = WS_FIELDGROUPS_TAB[]
        IT_SORT                  = WS_SORTFIELDS_TAB[]
        IT_EVENTS                = WS_EVENTS[]
        I_GRID_TITLE             = TITLE
        I_DEFAULT                = 'X'
        I_SAVE                   = 'A'
      TABLES
        T_OUTTAB           = GT_excel
      EXCEPTIONS
        PROGRAM_ERROR      = 1
        OTHERS             = 2.





ENDFORM.



FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
  CLEAR: PT_EXTAB[].
  SET PF-STATUS 'ZS100'.
ENDFORM.


FORM FRM_USER_COMMAND  USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.

  CASE R_UCOMM.
    WHEN '&GO'.

      PERFORM FRM_PROCESS.
      rs_selfield-refresh = 'X'.

    WHEN OTHERS.
  ENDCASE.

ENDFORM.





"----------汇总数据保存---------------

FORM FRM_PROCESS .






  LOOP AT GT_excel ASSIGNING FIELD-SYMBOL(<gs300>) WHERE STATUS <> 'E'.



     "这里用了select,因为金税号可能重复(用户误导数据),第一条创建到数据库后,如果第二天又是这个号,需要马上读数据库。
     SELECT SINGLE * FROM ZFIQM_COLLECT WHERE BILLNO = @<gs300>-BILLNO INTO @DATA(tmp).


    IF sy-subrc = 0. "原来有ID,就修改


        UPDATE ZFIQM_COLLECT
        SET
        LIFNR        = <gs300>-LIFNR
        VAT_NET      = <gs300>-VAT_NET
        VAT_TAX      = <gs300>-VAT_TAX
        VAT_CRDAT    = <gs300>-VAT_CRDAT
        VAT_TYP      = <gs300>-VAT_TYP
        STCEG        = <gs300>-STCEG
        VAT_CODE     = <gs300>-VAT_CODE

        ZAENAME     = SY-UNAME
        ZAEDATE     = SY-DATUM
        ZAETIME     = SY-UZEIT
        WHERE BILLNO = <gs300>-BILLNO.

        COMMIT WORK AND WAIT.

        <gs300>-STATUS      = 'S'.
        <gs300>-ICON_LIGHT  = icon_green_light.
        <gs300>-MESSAGE     = '数据修改成功'.

        "这里可以用代码把修改前的数据放到历史表

    ELSE. "没有ID,直接保存



      MOVE-CORRESPONDING <gs300> to gs_ZFIQM_COLLECT.

      gs_ZFIQM_COLLECT-Z_REC_NO = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
      gs_ZFIQM_COLLECT-ZAENAME = SY-UNAME.
      gs_ZFIQM_COLLECT-ZAEDATE = SY-DATUM.
      gs_ZFIQM_COLLECT-ZAETIME = SY-UZEIT.

      INSERT  ZFIQM_COLLECT FROM gs_ZFIQM_COLLECT.
      COMMIT WORK AND WAIT.

      <gs300>-STATUS = 'S'.
      <gs300>-ICON_LIGHT  = icon_green_light .
      <gs300>-MESSAGE     = '新建数据完成'  .


    ENDIF.


  ENDLOOP.




ENDFORM.





"-----------------------------------
"-----------------------------------
"-----------------------------------
"-----查询、产生SAP财务凭证-----------


FORM FRM_DISPLAY_CX .


  "取明细表
  DATA DB_ZFIQM TYPE SORTED TABLE OF ZFIQM WITH NON-UNIQUE KEY BILLNO.
  SELECT * INTO TABLE DB_ZFIQM FROM ZFIQM.


  "这里需要看到 COLLECT 表和 JSFI 两张表
  DATA DB_ZFIJS001 TYPE SORTED TABLE OF ZFIJS001 WITH NON-UNIQUE KEY BILLNO.
  SELECT * INTO TABLE DB_ZFIJS001 FROM ZFIJS001.



  SELECT *
    FROM ZFIQM_COLLECT
    WHERE VAT_CODE IN @s_VAT_CO
    AND LIFNR IN @s_LIFNR
    AND BILLNO IN @s_BILLNO
    INTO TABLE @gt_ZFIQM_COLLECT.


  LOOP AT gt_ZFIQM_COLLECT INTO gs_ZFIQM_COLLECT.

    MOVE-CORRESPONDING gs_ZFIQM_COLLECT TO gs_ZFIJS001.


     "SAP中创建FI凭证的前提:1、金税号必须在明细表中
     READ TABLE DB_ZFIQM WITH  KEY  BILLNO = gs_ZFIJS001-BILLNO INTO DATA(dbgs_zfiqm).

        IF sy-subrc <> 0.

        gs_ZFIJS001-STATUS = 'E'.
        gs_ZFIJS001-ICON_LIGHT = icon_red_light.
        gs_ZFIJS001-MESSAGE = '索赔明细表中没有金税号,不能产生FI凭证'.


      ENDIF.

    "SAP中创建FI凭证的前提:2、金税号没有产生过SAP的财务凭证,这里把FI凭证读出来,后面判断
     READ TABLE DB_ZFIJS001 WITH  KEY  BILLNO = gs_ZFIJS001-BILLNO INTO DATA(gs_line).

      IF sy-subrc = 0.

        gs_ZFIJS001-belnr = gs_line-belnr.
        gs_ZFIJS001-FINAME = gs_line-FINAME.
        gs_ZFIJS001-FIDATE = gs_line-FIDATE.
        gs_ZFIJS001-FITIME = gs_line-FITIME.

        gs_ZFIJS001-STATUS = 'E'.
        gs_ZFIJS001-ICON_LIGHT = icon_yellow_light.
        gs_ZFIJS001-MESSAGE = 'FI凭证已经产生'.

      ENDIF.

    APPEND gs_ZFIJS001 TO gt_ZFIJS001.
    CLEAR gs_ZFIJS001.

  ENDLOOP.





 DATA: LT_FIELDCAT        TYPE SLIS_T_FIELDCAT_ALV,
        LS_FIELDCAT        TYPE SLIS_FIELDCAT_ALV,
        WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
        WS_LAYOUT          TYPE SLIS_LAYOUT_ALV,
        WS_SORTFIELDS_TAB  TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
        WS_EVENTS          TYPE SLIS_T_EVENT.
  DATA: lv_pos TYPE I VALUE 0.
  DATA: TITLE TYPE LVC_TITLE.
  DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.


  DEFINE macro_fieldcat.
    lv_pos = lv_pos + 1.
    ls_fieldcat-col_pos       =  lv_pos.
    ls_fieldcat-tabname       = 'gt_ZFIJS001'.
    ls_fieldcat-fieldname     = &1.
    ls_fieldcat-seltext_l     = &2.
    ls_fieldcat-inttype       = &3.
    ls_fieldcat-intlen        = &4.
    append ls_fieldcat to lt_fieldcat .
    clear ls_fieldcat.
  END-OF-DEFINITION.

  macro_fieldcat:





    'LIFNR' '供应商' '' '',
    'BILLNO' '金税发票' '' '',
    'VAT_NET' '不含税金额' '' '',
    'VAT_TAX' '税额' '' '',
    'VAT_CRDAT' '开票日期' '' '',
    'VAT_TYP' '发票性质' '' '',
    'STCEG' '客户增值税号' '' '',
    'VAT_CODE' '发票代码' '' '',


    'ZAENAME' '更新人' '' '',
    'ZAEDATE' '更新日期' '' '',
    'ZAETIME' '更新时间' '' '',
    'ICON_LIGHT' '灯' '' '',
    'STATUS'  '状态' '' '',
    'MESSAGE'  '消息' '' '',

    'BELNR' 'SAP会计凭证' '' '',
    'FINAME' 'SAP更新人' '' '',
    'FIDATE' 'SAP更新日期' '' '',
    'FITIME' 'SAP更新时间' '' '',
    'FIICON_LIGHT' '灯' '' '',
    'FISTATUS' 'SAP状态' '' '',
    'FIMESSAGE' 'SAP消息' '' ''.




  WS_LAYOUT-BOX_FIELDNAME     = 'SEL'.
  WS_LAYOUT-ZEBRA             = 'X'.
  WS_LAYOUT-GET_SELINFOS      = 'X'.
  WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  WS_LAYOUT-DETAIL_POPUP      = 'X'.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_CALLBACK_PROGRAM = SY-REPID
        I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET_Z200'
        I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND_Z200'
        IS_LAYOUT          = WS_LAYOUT
        IT_FIELDCAT        = LT_FIELDCAT
        IT_SPECIAL_GROUPS  = WS_FIELDGROUPS_TAB[]
        IT_SORT            = WS_SORTFIELDS_TAB[]
        IT_EVENTS          = WS_EVENTS[]
        I_GRID_TITLE       = TITLE
        I_DEFAULT          = 'X'
        I_SAVE             = 'A'
      TABLES
        T_OUTTAB           = gt_ZFIJS001
      EXCEPTIONS
        PROGRAM_ERROR      = 1
        OTHERS             = 2.





ENDFORM.



FORM ALV_STATUS_SET_Z200 USING PT_EXTAB TYPE SLIS_T_EXTAB.
  CLEAR: PT_EXTAB[].
  SET PF-STATUS 'Z200'.
ENDFORM.


FORM FRM_USER_COMMAND_Z200  USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.

  CASE R_UCOMM.
    WHEN '&GO200'.

      PERFORM FRM_PROCESS_Z200.
      rs_selfield-refresh = 'X'.

    WHEN OTHERS.
  ENDCASE.

ENDFORM.





FORM FRM_PROCESS_Z200 .




  LOOP AT gt_ZFIJS001 ASSIGNING FIELD-SYMBOL(<gs500>) WHERE STATUS <> 'E' AND SEL = 'X' AND BELNR IS INITIAL.

  "创建FI凭证,CALL BAPI


          DATA: ls_header         TYPE bapiache09,                      " header
                  ls_gl_account     TYPE bapiacgl09,
                  ls_receivable     TYPE bapiacar09,
                  ls_currency       TYPE bapiaccr09,
                  ls_extension      TYPE bapiparex,
                  ls_cust_extension TYPE zsfiex006_extension,
                  ls_return         TYPE bapiret2,
                  ls_ap             TYPE BAPIACAP09.

            DATA:lt_gl_account     TYPE STANDARD TABLE OF bapiacgl09,
                 lt_receivable     TYPE STANDARD TABLE OF bapiacar09,
                 lt_currency       TYPE STANDARD TABLE OF bapiaccr09,
                 lt_extension      TYPE STANDARD TABLE OF bapiparex,       " Extension
                 lt_cust_extension TYPE STANDARD TABLE OF zsfiex006_extension,   " Coding Block Fields
                 lt_return         TYPE STANDARD TABLE OF bapiret2,
                 lt_ap             TYPE STANDARD TABLE OF BAPIACAP09.

            DATA:ls_document TYPE bapiache09.



            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = <gs500>-LIFNR
            IMPORTING
              output = <gs500>-LIFNR.




          "-----凭证头------------

          ls_header-doc_type = 'SA'.
          ls_header-username = sy-uname .
          ls_header-comp_code = 1000.
          ls_header-doc_date = <gs500>-VAT_CRDAT.
          ls_header-pstng_date = <gs500>-VAT_CRDAT.
          ls_header-fisc_year = <gs500>-VAT_CRDAT+0(4).
          ls_header-fis_period = <gs500>-VAT_CRDAT+4(2).
          ls_header-HEADER_TXT = '供应商索赔入账'.

          "----------供应商应付---------------

          ls_ap-ITEMNO_ACC = '1'.
          ls_ap-VENDOR_NO = <gs500>-LIFNR.
          ls_ap-PROFIT_CTR = '0000001000'. "利润中心
          ls_ap-BUS_AREA = '0001'."业务范围
          APPEND ls_ap TO lt_ap.


          "----------总账---------------------

          ls_gl_account-ITEMNO_ACC = '2'.
          ls_gl_account-ACCT_TYPE = 'S'.
          ls_gl_account-GL_ACCOUNT = '6051080000'.
          ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
          ls_gl_account-BUS_AREA = '0001'."业务范围
          ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
          APPEND ls_gl_account TO lt_gl_account. "总账
          clear ls_gl_account.



          ls_gl_account-ITEMNO_ACC = '3'.
          ls_gl_account-ACCT_TYPE = 'S'.
          ls_gl_account-GL_ACCOUNT = '2221010503'.
          ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
          ls_gl_account-BUS_AREA = '0001'."业务范围
          ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
          APPEND ls_gl_account TO lt_gl_account. "总账
          clear ls_gl_account.


          ls_gl_account-ITEMNO_ACC = '4'.
          ls_gl_account-ACCT_TYPE = 'S'.
          ls_gl_account-GL_ACCOUNT = '6402080000'.
          ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
          ls_gl_account-BUS_AREA = '0001'."业务范围
          ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
          APPEND ls_gl_account TO lt_gl_account. "总账
          clear ls_gl_account.


          ls_gl_account-ITEMNO_ACC = '5'.
          ls_gl_account-ACCT_TYPE = 'S'.
          ls_gl_account-GL_ACCOUNT = '6609120100'.
          ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
          ls_gl_account-BUS_AREA = '0001'."业务范围
          ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
          ls_gl_account-COSTCENTER = '1000S01001'.

          APPEND ls_gl_account TO lt_gl_account. "总账
          clear ls_gl_account.


          "----------金额----------------------

          ls_currency-ITEMNO_ACC = '1'.
          ls_currency-CURRENCY = 'CNY'.
          ls_currency-AMT_DOCCUR = <gs500>-VAT_NET + <gs500>-VAT_TAX. "含税金额
     "     IF  <gs500>-VAT_TYP EQ '红'. ls_currency-AMT_DOCCUR     = -1 * ls_currency-AMT_DOCCUR.  ENDIF.
          APPEND ls_currency TO lt_currency.
          clear ls_currency.

          ls_currency-ITEMNO_ACC = '2'.
          ls_currency-CURRENCY = 'CNY'.
          ls_currency-AMT_DOCCUR = -1 * <gs500>-VAT_NET. "不含税金额
      "    IF  <gs500>-VAT_TYP EQ '蓝'. ls_currency-AMT_DOCCUR     = -1 * ls_currency-AMT_DOCCUR.  ENDIF.
          APPEND ls_currency TO lt_currency.
          clear ls_currency.

          ls_currency-ITEMNO_ACC = '3'.
          ls_currency-CURRENCY = 'CNY'.
          ls_currency-AMT_DOCCUR = -1 * <gs500>-VAT_TAX. "税额
      "    IF  <gs500>-VAT_TYP EQ '蓝'. ls_currency-AMT_DOCCUR     = -1 * ls_currency-AMT_DOCCUR.  ENDIF.
          APPEND ls_currency TO lt_currency.
          clear ls_currency.


          ls_currency-ITEMNO_ACC = '4'.
          ls_currency-CURRENCY = 'CNY'.
          ls_currency-AMT_DOCCUR = <gs500>-VAT_NET. "不含税金额
     "     IF  <gs500>-VAT_TYP EQ '红'. ls_currency-AMT_DOCCUR     = -1 * ls_currency-AMT_DOCCUR.  ENDIF.
          APPEND ls_currency TO lt_currency.
          clear ls_currency.


          ls_currency-ITEMNO_ACC = '5'.
          ls_currency-CURRENCY = 'CNY'.
          ls_currency-AMT_DOCCUR = -1 * <gs500>-VAT_NET. "不含税金额
     "     IF  <gs500>-VAT_TYP EQ '蓝'. ls_currency-AMT_DOCCUR     = -1 * ls_currency-AMT_DOCCUR.  ENDIF.
          APPEND ls_currency TO lt_currency.
          clear ls_currency.


          "----------记账码-----------------

          ls_cust_extension-posnr     = '1'.
          IF  <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL     = '21'.  ENDIF.
          IF  <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL     = '31'.  ENDIF.
          ls_extension-structure = 'ZSFIEX006_EXTENSION'.
          ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
          APPEND ls_extension TO lt_extension.
          clear ls_extension.

          ls_cust_extension-posnr     = '2'.
          IF  <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL     = '50'.  ENDIF.
          IF  <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL     = '40'.  ENDIF.
          ls_cust_extension-ZZ_KUNNR = <gs500>-LIFNR.
          ls_extension-structure = 'ZSFIEX006_EXTENSION'.
          ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
          APPEND ls_extension TO lt_extension.
          clear ls_extension.

          ls_cust_extension-posnr     = '3'.
          IF  <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL     = '50'.  ENDIF.
          IF  <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL     = '40'.  ENDIF.
          ls_extension-structure = 'ZSFIEX006_EXTENSION'.
          ls_extension-valuepart1 = ls_cust_extension.   clear ls_cust_extension.
          APPEND ls_extension TO lt_extension.
          clear ls_extension.

          ls_cust_extension-posnr     = '4'.
          IF  <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL     = '40'.  ENDIF.
          IF  <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL     = '50'.  ENDIF.
          ls_cust_extension-ZZ_KUNNR = <gs500>-LIFNR.
          ls_extension-structure = 'ZSFIEX006_EXTENSION'.
          ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
          APPEND ls_extension TO lt_extension.
          clear ls_extension.


          ls_cust_extension-posnr     = '5'.
          IF  <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL     = '50'.  ENDIF.
          IF  <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL     = '40'.  ENDIF.
          ls_extension-structure = 'ZSFIEX006_EXTENSION'.
          ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
          APPEND ls_extension TO lt_extension.
          clear ls_extension.




          CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
            EXPORTING
              documentheader         = ls_header
           IMPORTING
             OBJ_KEY                 = ls_document-obj_key
            tables
             ACCOUNTGL               = lt_gl_account
             ACCOUNTRECEIVABLE       = lt_receivable
             ACCOUNTPAYABLE          = lt_ap
             currencyamount          = lt_currency
             return                  = lt_return
             EXTENSION2              = lt_extension .



            READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.

              IF sy-subrc NE 0 .
                CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                  EXPORTING
                    wait = 'X'.


                   <gs500>-Z_REC_NO = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
                   <gs500>-BELNR = ls_document-obj_key+0(10).
                   <gs500>-FINAME = SY-UNAME.
                   <gs500>-FIDATE = SY-DATUM.
                   <gs500>-FITIME = SY-UZEIT.


                    INSERT  ZFIJS001 FROM <gs500>.
                    COMMIT WORK AND WAIT.

                    <gs500>-FISTATUS = 'S'.
                    <gs500>-FIICON_LIGHT  = icon_green_light .
                    <gs500>-FIMESSAGE     = 'FI凭证创建成功!'.




              ELSE.

                DATA s_msg(250) TYPE c .

                LOOP AT lt_return INTO ls_return WHERE type = 'E'.

                    CONCATENATE  ls_return-message  s_msg INTO s_msg.

                ENDLOOP.

               <gs500>-FISTATUS = 'E'.
               <gs500>-FIICON_LIGHT  = icon_red_light .
               <gs500>-FIMESSAGE = s_msg.

              ENDIF.







ENDLOOP.


ENDFORM.

























"选择屏幕切换4个功能的函数
FORM frm_select_screen .

  CASE 'X'.

    WHEN  p_putin.
          LOOP AT SCREEN.
            IF screen-group1 = 'M02'. screen-active = 1.  MODIFY SCREEN. ENDIF.
            IF screen-group1 = 'M03'. screen-active = 0.  MODIFY SCREEN.  ENDIF.

            ENDLOOP.

    WHEN  p_cx.
      LOOP AT SCREEN.
        IF screen-group1 = 'M02'. screen-active = 0.  MODIFY SCREEN. ENDIF.
        IF screen-group1 = 'M03'. screen-active = 1.  MODIFY SCREEN.  ENDIF.

      ENDLOOP.



  ENDCASE.
ENDFORM.








FORM frm_download_template_a1 .
  DATA: lv_objname      TYPE text40, "object
        lv_def_filename TYPE string,
        lv_filename     TYPE string,
        lv_fullpath     TYPE string,
        lv_path         TYPE string,
        lv_len          TYPE i,
        lv_rc           TYPE char01,
        lv_msg          TYPE string.

  CLEAR:lv_def_filename,lv_objname.
  lv_objname = 'ZFIR0061'.
  lv_def_filename = '供应商索赔汇总(金税数据)导入模板.xlsx'.

  CLEAR:lv_filename,lv_path,lv_fullpath.
  lv_rc = '1'.
  PERFORM frm_open_save_dialog USING lv_def_filename
                               CHANGING lv_filename
                                        lv_path
                                        lv_fullpath
                                        lv_rc.
  IF lv_rc = '0'.
    lv_len = 0.
    CALL METHOD cl_abap_list_utilities=>dynamic_output_length
      EXPORTING
        field = lv_fullpath
      RECEIVING
        len   = lv_len.
    IF lv_len = 0.
      MESSAGE '文件路径长度为0!' TYPE 'S' DISPLAY LIKE 'E'.
    ELSEIF lv_len > 128.
      MESSAGE '文件路径长度过长!' TYPE 'S' DISPLAY LIKE 'E'.
    ELSE.
      "get file from smw0 and download it to local
      lv_rc = 'X'.
      CLEAR lv_msg.
      PERFORM frm_down_template USING lv_objname
                                      lv_fullpath
                             CHANGING lv_rc
                                      lv_msg.
      IF lv_rc EQ ''.
        MESSAGE '模板下载完成!' TYPE 'S'.
      ELSE.
        IF lv_msg IS NOT INITIAL.
          MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
        ENDIF.
      ENDIF.
    ENDIF.
  ELSEIF lv_rc = '1'.
    MESSAGE '下载模板出错.' TYPE 'S' DISPLAY LIKE 'E'.
  ELSEIF lv_rc = '9'.
    MESSAGE '用户取消操作.' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.








FORM frm_open_save_dialog  USING uv_def_filename TYPE string
                           CHANGING cv_filename TYPE string
                                    cv_path TYPE string
                                    cv_fullpath TYPE string
                                    cv_rc TYPE c.
  DATA: lv_filter      TYPE string,
        lv_filename    TYPE string,
        lv_path        TYPE string,
        lv_fullpath    TYPE string,
        lv_user_action TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = 'Save as'
      default_extension    = 'XLSX' "Set detault to XLS when opening a dialog
      default_file_name    = uv_def_filename
      file_filter          = cl_gui_frontend_services=>filetype_excel
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
      user_action          = lv_user_action
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    cv_rc = '1'.
  ELSE.
    IF lv_user_action = cl_gui_frontend_services=>action_ok.
      cv_filename = lv_filename.
      cv_path = lv_path.
      cv_fullpath = lv_fullpath.
      cv_rc = '0'.
    ELSEIF lv_user_action = cl_gui_frontend_services=>action_cancel.
      cv_rc = '9'.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_OPEN_SAVE_DIALOG





FORM frm_down_template USING uv_objname TYPE text40
                             uv_fullpath TYPE string
                    CHANGING cv_rc  TYPE char01
                             cv_msg TYPE string.

  DATA: lv_objname TYPE w3objid, "WWWDATATAB-OBJID, "object
        lv_dest    TYPE localfile,
        ls_objdata TYPE wwwdatatab,
        lv_strmsg  TYPE string,
        lv_rc      LIKE sy-subrc.

  CLEAR: lv_dest.
  IF uv_fullpath IS INITIAL.
    cv_msg = 'The path length is 0'.
    cv_rc = 'X'.
    EXIT.
  ELSE.
    lv_dest = uv_fullpath.
  ENDIF.

  CLEAR: lv_objname.
  IF uv_objname IS INITIAL.
    cv_msg = 'Object name is empty'.
    cv_rc = 'X'.
    EXIT.
  ELSE.
    lv_objname = uv_objname.
  ENDIF.

  CLEAR: ls_objdata.
  SELECT SINGLE relid objid
    FROM wwwdata
    INTO CORRESPONDING FIELDS OF ls_objdata
    WHERE srtf2 = 0
      AND relid = 'MI'
      AND objid = lv_objname.
  IF sy-subrc = 0 AND ls_objdata-objid <> space.
    CONDENSE lv_dest.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = ls_objdata
        destination = lv_dest
      IMPORTING
        rc          = lv_rc.
    IF lv_rc <> 0.
      CLEAR lv_strmsg.
      CONCATENATE 'Failed to download the Object:' lv_objname
        INTO lv_strmsg.
      cv_msg = lv_strmsg.
      cv_rc = 'X'.
    ELSE.
      "success
      cv_rc = ''.
      cv_msg = ''.
    ENDIF.
  ELSE.
    CLEAR lv_strmsg.
    CONCATENATE 'The Object:' lv_objname 'is not exist.'
      INTO lv_strmsg.
    cv_msg = lv_strmsg.
    cv_rc = 'X'.
  ENDIF.
ENDFORM.                    " FRM_DOWN_TEMPLATE







*&---------------------------------------------------------------------*
*&      Form  FRM_SEL_FILE
*&---------------------------------------------------------------------*
*       text 选择文件
*----------------------------------------------------------------------*
FORM frm_sel_file CHANGING po_path.
  DATA:
    lt_filetable    TYPE   filetable,
    ls_filetable    TYPE   file_table,
    lv_rc           TYPE   sy-subrc,
    lv_filename     TYPE   string,
    lv_initial_path TYPE   string VALUE 'C:\'.

  CLEAR lv_filename.
  lv_filename = po_path.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      default_filename        = lv_filename
      initial_directory       = lv_initial_path
    CHANGING
      file_table              = lt_filetable
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4.

  IF sy-subrc NE 0 OR lv_rc LT 0.
    MESSAGE   '上传文件选择失败' TYPE 'E' ."上传文件选择失败
  ELSE.
    IF lv_rc = 1.
      READ TABLE lt_filetable INTO ls_filetable INDEX 1.
      po_path = ls_filetable-filename.
    ELSE.
      EXIT.
    ENDIF.
  ENDIF.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

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

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

打赏作者

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

抵扣说明:

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

余额充值