公司间交易开票bapi

REPORT ZFIR025  .
TABLESLIPS,LIKP ,VBRK ,SSCRFIELDS.
TYPE-POOLSSLIS .
INCLUDE <ICON>.
*table
DATABEGIN OF GT_DATA OCCURS 0  ,
      SEL(1)                      ,
      LIGHT LIKE ICON-ID          ,
      FKDAT LIKE VBRK-FKDAT       "出具发票日期
      VBELN LIKE LIKP-VBELN       ,
      POSNR LIKE LIPS-POSNR       ,
      VBELN_BL LIKE VBRP-VBELN    ,
      POSNR_BL LIKE VBRP-POSNR    ,
      VTWEG LIKE LIPS-VTWEG       ,
      SPART LIKE LIPS-SPART       ,
      VKOIV LIKE LIKP-VKOIV       ,
      VTEXT LIKE TVKOT-VTEXT      ,
      KUNIV LIKE LIKP-KUNIV       ,
      NAME1 LIKE KNA1-NAME1       ,
      MATNR LIKE LIPS-MATNR       ,
      MAKTX LIKE MAKT-MAKTX       ,
      LFIMG LIKE LIPS-LFIMG       "交货数量
      VRKME LIKE LIPS-VRKME       "交货单位
      FKDAT_N LIKE VBRK-FKDAT     "设置后的出具发票日期
      VBTYP LIKE LIKP-VBTYP       "凭证类别
      MESSAGE(100)               ,  "错误消息
      E_FLAG(1)                  ,  "错误标记
      S_FLAG(1)                  ,  "成功处理标记
      END OF GT_DATA .
DATAGS_DATA LIKE GT_DATA .
*-已经处理的采购订单
DATAG_SUCESS .
*bdc global data
DATA:   BDCDATA LIKE BDCDATA    OCCURS WITH HEADER LINE.
DATA:   MESSTAB LIKE BDCMSGCOLL OCCURS WITH HEADER LINE.

*ALV 变量
DATAIT_FIELDS_ITEM TYPE LVC_T_FCAT.
DATAGS_LAYOUT_ITEM TYPE LVC_S_LAYO.
DATAGS_VARIANT  LIKE  DISVARIANT .

DATA:
    GT_EVENTS      TYPE SLIS_T_EVENT,
    GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER,
    G_STATUS_SET   TYPE SLIS_FORMNAME VALUE 'PF_STATUS_SET',
    G_USER_COMMAND TYPE SLIS_FORMNAME VALUE 'USER_COMMAND',
    G_TOP_OF_PAGE  TYPE SLIS_FORMNAME VALUE 'TOP_OF_PAGE',
    G_TOP_OF_LIST  TYPE SLIS_FORMNAME VALUE 'TOP_OF_LIST',
    G_END_OF_LIST  TYPE SLIS_FORMNAME VALUE 'END_OF_LIST'.
*BAPI数据
**-header line
DATAGS_HEADER LIKE BAPI2017_GM_HEAD_01 .
*-- item table
DATAGT_ITEM TYPE TABLE OF BAPI2017_GM_ITEM_CREATE   ,
      GS_ITEM LIKE LINE OF GT_ITEM .

*-code
DATAGS_CODE LIKE BAPI2017_GM_CODE .

*-export data
DATAGS_DOCUMENT LIKE BAPI2017_GM_HEAD_RET  ,
      GS_DOCUMENT2 LIKE BAPI2017_GM_HEAD_RET ,
      GS_RETURN2  LIKE BAPIRET2              .
*-return table
DATAGT_MESSAGE LIKE BAPIRET2 OCCURS 0  ,
      GS_MESSAGE LIKE LINE OF GT_MESSAGE .

*其他变量
*--错误标记
DATAG_ERROR(1TYPE ,
      G_MESSAGE(100)    .
*询问标记
DATAGV_ANSWER .
CONSTANTSC_BUDAT_BUTTON(22VALUE '@1U@设置发票日期' .
DATAGV_BUDAT LIKE SY-DATUM ,
      GV_BUDAT_BUTTON(22VALUE C_BUDAT_BUTTON .
*DATA: GT_TVKO LIKE TVKO OCCURS 0 WITH HEADER LINE  .
*====================================================================*
*  选择屏幕                                                           *
*====================================================================*
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS SO_VBELN FOR LIPS-VBELN "交货单号
                 SO_BILLN FOR VBRK-VBELN  MODIF ID BIL"发票号
                 SO_VKOIV FOR LIKP-VKOIV "销售组织
                 SO_BUDAT FOR LIKP-FKDAT MODIF ID DAY  .

SELECTION-SCREEN :SKIP .
PARAMETERSP_R1 RADIOBUTTON GROUP GP1 DEFAULT 'X'
            USER-COMMAND X"开票处理
            P_R2 RADIOBUTTON GROUP GP1 "未过账单据处理

SELECTION-SCREEN END OF BLOCK BLOCK1 .
*====================================================================*
* at selection-screen                                         *
*====================================================================*
AT SELECTION-SCREEN .
  CASE SSCRFIELDS-UCOMM.
    WHEN 'X'.
      IF P_R2 'X'.
        CLEARSO_BUDAT[] ,SO_BUDAT ,
               SO_VBELN[] ,SO_BILLN ,
               SO_VKOIV[] ,SO_VKOIV .
      ELSEIF P_R1 'X'.
        CLEARSO_BUDAT[] ,SO_BUDAT ,
               SO_VBELN[] ,SO_BILLN ,
               SO_VKOIV[] ,SO_VKOIV .
      ENDIF .
  ENDCASE.
*====================================================================*
* at selection-screen output                                         *
*====================================================================*
AT SELECTION-SCREEN OUTPUT .
  LOOP AT SCREEN .
    IF P_R2 'X' .
      IF SCREEN-GROUP1 'BIL'.
        SCREEN-INVISIBLE 0.
      ELSEIF SCREEN-GROUP1 'DAY'.
        SCREEN-INVISIBLE 1.
        SCREEN-INPUT 0.
      ENDIF.
    ELSE.
      IF SCREEN-GROUP1 'BIL'.
        SCREEN-INVISIBLE 1.
        SCREEN-INPUT 0.
      ELSEIF SCREEN-GROUP1 'DAY'.
        SCREEN-INVISIBLE 0.
        SCREEN-INPUT 1.
      ENDIF.
    ENDIF.
    MODIFY   SCREEN .
  ENDLOOP .
*====================================================================*
*  Start-of-selection                                                *
*====================================================================*
START-OF-SELECTION.
  CASE 'X'.
    WHEN P_R1 .
      PERFORM GET_DATA1 .
    WHEN P_R2 .
      PERFORM GET_DATA2 .
  ENDCASE.
*<< add 20130414 增加权限检查
*权限检查
*  SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_TVKO
*    FROM TVKO WHERE VKORG IN SO_VKOIV .
  LOOP AT GT_DATA .
    AUTHORITY-CHECK OBJECT 'V_VBRK_VKO'
             ID 'VKORG' FIELD GT_DATA-VKOIV .
*             ID 'ACTVT' FIELD '__________'.
    IF SY-SUBRC <> 0.
      DELETE GT_DATA .
    ENDIF.
  ENDLOOP .
*>>

  SORT GT_DATA BY VKOIV FKDAT VBELN POSNR .
*====================================================================*
*  end-of-selection                                                  *
*====================================================================*
END-OF-SELECTION.
  IF NOT GT_DATA[] IS INITIAL .
    PERFORM DATA_DISPLAY.
  ELSE.
    MESSAGE  '没有需要处理的数据' TYPE 'S' DISPLAY LIKE 'E' .
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM GET_DATA1 .
*-采购订单那行项目
  DATABEGIN OF LT_EKPO OCCURS ,
        EBELN LIKE EKPO-EBELN      "采购订单那编号
        EBELP LIKE EKPO-EBELP      "采购订单行项目
        ELIKZ LIKE EKPO-ELIKZ      "交货已完成
        END OF LT_EKPO .
*-采购订单物料凭证
  DATABEGIN OF LT_EKBE OCCURS 0  ,
         BELNR LIKE EKBE-BELNR      ,
         GJAHR LIKE EKBE-GJAHR      ,
         BUZEI LIKE EKBE-BUZEI      ,
         EBELN LIKE EKBE-EBELN      ,
         EBELP LIKE EKBE-EBELP      ,
         MATNR LIKE EKBE-MATNR      ,
         CHARG LIKE EKBE-CHARG      ,
         MENGE LIKE EKBE-MENGE      ,
         SHKZG LIKE EKBE-SHKZG      ,
         BWART LIKE EKBE-BWART      ,
         VBELN_ST TYPE VBELN_VL,
         VBELP_ST TYPE POSNR_VL,
        END OF  LT_EKBE .
*-合计
  DATABEGIN OF LT_EKBE_MOD OCCURS 0    ,
         VBELN_ST TYPE POSNR_VL,
         VBELP_ST TYPE POSNR_VL,
         MENGE LIKE EKBE-MENGE            ,
        END OF  LT_EKBE_MOD              .
  DATALV_EBELN LIKE EKKO-EBELN .
  DATALV_LIFNR LIKE LFA1-LIFNR .
  DATALV_WERKS LIKE T001L-WERKS .

  SELECT  A~BELNR A~BUZEI  A~GJAHR A~BUZEI A~BWART
          A~EBELN A~EBELP A~MATNR A~CHARG A~MENGE A~SHKZG
          A~SHKZG
*    A~VBELN_ST  A~VBELP_ST
    INTO CORRESPONDING FIELDS OF TABLE LT_EKBE
    FROM EKBE AS A INNER JOIN EKPO AS B
    ON A~EBELN B~EBELN
    AND A~EBELP B~EBELP
    WHERE  A~BWART IN ('101','102','122','Z19','Z20')
    AND A~VGABE  in ('1','6')
    AND B~PSTYP '0'.
*    AND A~VBELN_ST IN SO_VBELN
*    AND A~VBELN_ST NE SPACE .
  LOOP AT LT_EKBE .
    CLEARLT_EKBE_MOD .
    MOVE-CORRESPONDING LT_EKBE TO  LT_EKBE_MOD .
    CASE LT_EKBE-BWART .
      WHEN '102' OR '122' OR 'Z20'.
        LT_EKBE_MOD-MENGE =  LT_EKBE_MOD-MENGE * -.
    ENDCASE.
    COLLECT LT_EKBE_MOD .
  ENDLOOP.
  SORT LT_EKBE_MOD BY VBELN_ST VBELP_ST .
  IF NOT LT_EKBE[] IS INITIAL .
    SELECT  A~KUNIV A~FKDAT A~VBTYP A~FKDAT AS FKDAT_N B~VBELN B~POSNR
            A~VKOIV B~MATNR B~LFIMG B~VRKME B~VTWEG
            B~SPART  C~NAME1 D~MAKTX
      INTO CORRESPONDING FIELDS OF TABLE GT_DATA
      FROM LIKP AS A INNER JOIN LIPS AS B
      ON A~VBELN B~VBELN
      INNER JOIN KNA1 AS C
      ON A~KUNIV C~KUNNR
      INNER JOIN  VBUP AS E
      ON B~VBELN E~VBELN
      AND B~POSNR E~POSNR
      LEFT OUTER JOIN MAKT AS D
    ON B~MATNR D~MATNR
    AND   D~SPRAS '1'
      FOR ALL ENTRIES IN LT_EKBE
    WHERE B~VBELN LT_EKBE-VBELN_ST
      AND B~POSNR LT_EKBE-VBELP_ST
      AND A~VKOIV IN SO_VKOIV
      AND E~FKIVP IN ('A','B')
      AND A~FKDAT IN SO_BUDAT .
  ENDIF.
  LOOP AT GT_DATA .
    CLEAR:LT_EKBE_MOD .
    READ TABLE LT_EKBE_MOD WITH KEY VBELN_ST GT_DATA-VBELN
                                    VBELP_ST GT_DATA-POSNR
                                    BINARY SEARCH .
    GT_DATA-LFIMG GT_DATA-LFIMG LT_EKBE_MOD-MENGE .
    IF GT_DATA-LFIMG <> .
      DELETE GT_DATA .
    ENDIF.
  ENDLOOP .
  LOOP AT GT_DATA .
    SELECT SINGLE VTEXT INTO GT_DATA-VTEXT
      FROM  TVKOT WHERE VKORG GT_DATA-VKOIV
      AND SPRAS '1'.
    MODIFY GT_DATA .
  ENDLOOP .
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  DATA_PROCESS
*&---------------------------------------------------------------------*
FORM DATA_DISPLAY .
  DATALV_REPID LIKE SY-REPID.
  DATALT_FIELDS TYPE SLIS_T_FIELDCAT_ALV.
  DATAWA_FIELDS TYPE LINE OF SLIS_T_FIELDCAT_ALV.
  DATALS_LAYOUT TYPE SLIS_LAYOUT_ALV.



  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME         SY-CPROG
      I_INTERNAL_TABNAME     'GT_DATA'
      I_CLIENT_NEVER_DISPLAY 'X'
      I_INCLNAME             'ZFIR025'
    CHANGING
      CT_FIELDCAT            LT_FIELDS
    EXCEPTIONS
      INCONSISTENT_INTERFACE 1
      PROGRAM_ERROR          2
      OTHERS                 3.
  IF SY-SUBRC <> 0.

  ENDIF.
  DEFINE  SET_FIELDS_TEXT.
    WA_FIELDS-SELTEXT_L &1.
    WA_FIELDS-SELTEXT_M &1.
    WA_FIELDS-SELTEXT_S &1.
    WA_FIELDS-DDICTXT   'L' .
    WA_FIELDS-REPTEXT_DDIC &1.
    WA_FIELDS-EDIT         &2.
  END-OF-DEFINITION.
  LOOP AT LT_FIELDS INTO WA_FIELDS.

    CASE WA_FIELDS-FIELDNAME.
      WHEN 'SEL'.
        WA_FIELDS-NO_OUT 'X' .
      WHEN 'LIGHT'.
        SET_FIELDS_TEXT '信号灯' ''.
        WA_FIELDS-ICON 'X'       .
      WHEN 'EBELN'.
        SET_FIELDS_TEXT '交货单号       .' ''.
*      WHEN 'EBELP'.
*        SET_FIELDS_TEXT '交货行项目'  ''.
      WHEN 'VBELN_BL'.
        SET_FIELDS_TEXT '发票号         .' ''.
*      WHEN 'POSNR_BL'.
*        SET_FIELDS_TEXT '发票行项目'    ''.
      WHEN 'FKDAT'.
        SET_FIELDS_TEXT '默认出具发票日期.' ''.
      WHEN 'VKOIV'.
        SET_FIELDS_TEXT '销售组织'    ''.
      WHEN 'VTWEG' OR 'SPART'.
        WA_FIELDS-NO_OUT 'X' .
      WHEN 'KUNIV'.
        SET_FIELDS_TEXT '公司间客户'    ''.
      WHEN 'NAME1'.
        SET_FIELDS_TEXT '客户名称'    ''.
      WHEN 'MATNR'.
        SET_FIELDS_TEXT '商品编号' ''.
      WHEN 'MAKTX'.
        SET_FIELDS_TEXT '商品描述' ''.
      WHEN 'LFIMG'.
        SET_FIELDS_TEXT '交货数量' ''.
      WHEN 'VRKME'.
        SET_FIELDS_TEXT '交货单位' ''.
      WHEN 'MESSAGE'.
        SET_FIELDS_TEXT '消息                          .' ''  .
      WHEN 'E_FLAG'.
        WA_FIELDS-NO_OUT 'X' .
      WHEN 'S_FLAG'.
        WA_FIELDS-NO_OUT 'X' .
    ENDCASE .
    MODIFY LT_FIELDS FROM WA_FIELDS.
  ENDLOOP.
  LV_REPID SY-REPID .
  PERFORM EVENTTAB_BUILD USING GT_EVENTS[].
  PERFORM COMMENT_BUILD USING GT_LIST_TOP_OF_PAGE[].
  LS_LAYOUT-BOX_FIELDNAME 'SEL'.
  LS_LAYOUT-COLWIDTH_OPTIMIZE 'X'.
  LS_LAYOUT-ZEBRA 'X' .

  DATALS_GRIDSETTINGS TYPE LVC_S_GLAY .
*  LS_GRIDSETTINGS-EDT_CLL_CB = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       LV_REPID
      I_CALLBACK_PF_STATUS_SET 'SET_PF'
      I_CALLBACK_USER_COMMAND  'USER_COM'
*     I_GRID_TITLE             = F_TITLE
      IS_LAYOUT                LS_LAYOUT
      IT_FIELDCAT              LT_FIELDS
      IT_EVENTS                GT_EVENTS[]
      IS_VARIANT               GS_VARIANT
      I_GRID_SETTINGS          LS_GRIDSETTINGS
    TABLES
      T_OUTTAB                 GT_DATA.
ENDFORM.                    " DATA_PROCESS
*&---------------------------------------------------------------------*
*&      Form  EVENTTAB_BUILD
*&---------------------------------------------------------------------*
FORM EVENTTAB_BUILD  USING RT_EVENTS TYPE SLIS_T_EVENT.
*"REGISTRATION OF EVENTS TO HAPPEN DURING LIST DISPLAY
  DATALS_EVENT TYPE SLIS_ALV_EVENT.
*

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE 0
    IMPORTING
      ET_EVENTS   RT_EVENTS.
  READ TABLE RT_EVENTS WITH KEY NAME SLIS_EV_TOP_OF_PAGE
                           INTO LS_EVENT.
  IF SY-SUBRC 0.
    MOVE G_TOP_OF_PAGE TO LS_EVENT-FORM.
    APPEND LS_EVENT TO RT_EVENTS.
  ENDIF.

ENDFORM.                    " EVENTTAB_BUILD
*&---------------------------------------------------------------------*
*&      FORM  TOP_OF_PAGE
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM TOP_OF_PAGE.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
*     I_LOGO             = 'ENJOYSAP_LOGO'
      IT_LIST_COMMENTARY GT_LIST_TOP_OF_PAGE.
ENDFORM.                    "TOP_OF_PAGE
"
*&---------------------------------------------------------------------*
*&      Form  COMMENT_BUILD
*&---------------------------------------------------------------------*
FORM COMMENT_BUILD  USING    LT_TOP_OF_PAGE TYPE
                                        SLIS_T_LISTHEADER .
  DATALV_DATA(11.
  DATALV_DATA1(8).
  DATALS_LINE TYPE SLIS_LISTHEADER.
  CLEAR LS_LINE.
  LS_LINE-TYP  'H'.
  LS_LINE-KEY  ''.
  CASE 'X'.
    WHEN P_R1 .
      LS_LINE-INFO '公司间交易开票--生成销售发票'.
    WHEN P_R2 .
      LS_LINE-INFO '公司间交易开票--发票重新过账'.
  ENDCASE.
  APPEND LS_LINE TO LT_TOP_OF_PAGE.
  CLEAR LS_LINE.
*  LS_LINE-TYP  = 'S'.
*  LS_LINE-KEY  = ''.
*  LV_DATA1 = GV_BUDAT.
*  WRITE LV_DATA1 TO LV_DATA USING EDIT MASK '____年__月__日' .
*  IF NOT GV_BUDAT IS INITIAL .
*    CONCATENATE '※过账日期:'LV_DATA '※' INTO LS_LINE-INFO .
*  ELSE.
*    LS_LINE-INFO = '※过账日期: 凭证默认的过账日期' .
*  ENDIF.
*  APPEND LS_LINE TO LT_TOP_OF_PAGE.
ENDFORM.                    " COMMENT_BUILD


*&---------------------------------------------------------------------*
*&      FORM  USER_COM
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->R_UCOMM      TEXT
*      -->RS_SELFIELD  TEXT
*----------------------------------------------------------------------*
FORM USER_COM USING R_UCOMM LIKE SY-UCOMM
                  RS_SELFIELD TYPE SLIS_SELFIELD.

  DATAL_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATALV_VAIID(1.
  DATALV_DATA1(8.
  DATALV_DATE(11.
  DATALV_TEXTLINE2 TYPE STRING .
  LV_DATA1 GV_BUDAT .
  WRITE LV_DATA1 TO LV_DATE USING EDIT MASK '____年__月__日' .
  IF NOT GV_BUDAT IS INITIAL .
    CONCATENATE '设置的过账日期为:' LV_DATE  INTO LV_TEXTLINE2 .
  ELSE.
    LV_TEXTLINE2 '过账日期为:凭证默认的过账日期' .
  ENDIF.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID L_GRID.
  CALL METHOD L_GRID->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID LV_VAIID.
  CASE R_UCOMM.
    WHEN '&PROC'.
    WHEN 'SAVE'.
*bapi 处理
      CASE 'X'.
        WHEN P_R1 .
          CLEARGV_ANSWER .
          CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
            EXPORTING
              TEXTLINE1      '生成发票前请确认过账日期!'
              TEXTLINE2      LV_TEXTLINE2
              TITEL          '继续处理?'
              CANCEL_DISPLAY ' '
            IMPORTING
              ANSWER         GV_ANSWER.
          IF     GV_ANSWER EQ 'J'.
            PERFORM CREATE_BILLING .
          ELSE.
            MESSAGE '处理被取消' TYPE 'S' DISPLAY LIKE 'E' .
            EXIT .
          ENDIF.
        WHEN P_R2 .
      ENDCASE.
      RS_SELFIELD-REFRESH 'X' .
    WHEN 'RELEASE'.
      IF P_R2 'X' .
        CLEARGV_ANSWER .
        CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
          EXPORTING
            TEXTLINE1      '发票重新过账前请确认过账日期!'
            TEXTLINE2      LV_TEXTLINE2
            TITEL          '继续处理?'
            CANCEL_DISPLAY ' '
          IMPORTING
            ANSWER         GV_ANSWER.
        IF     GV_ANSWER EQ 'J'.
          PERFORM BILLING_RELEASE .
        ELSE.
          MESSAGE '处理被取消' TYPE 'S' DISPLAY LIKE 'E' .
          EXIT .
        ENDIF.
      ENDIF.
      RS_SELFIELD-REFRESH 'X' .
    WHEN 'DATE'.

      CALL SCREEN 0200 STARTING AT 20 15
                       ENDING   AT 40 .
      IF NOT GV_BUDAT IS INITIAL .
        LV_DATA1 GV_BUDAT .
        WRITE LV_DATA1 TO LV_DATE USING EDIT MASK '____年__月__日' .
        CONCATENATE '@1U@当前发票日期:' LV_DATE INTO GV_BUDAT_BUTTON .
        LOOP AT GT_DATA .
          GT_DATA-FKDAT_N GV_BUDAT .
          MODIFY  GT_DATA .
        ENDLOOP.
      ELSE.
        GV_BUDAT_BUTTON  C_BUDAT_BUTTON .
        LOOP AT GT_DATA .
          GT_DATA-FKDAT_N GT_DATA-FKDAT .
          MODIFY GT_DATA .
        ENDLOOP.
      ENDIF.
      RS_SELFIELD-REFRESH 'X' .
    WHEN 'GROUP'.
    WHEN '&DATA_SAVE'.
    WHEN 'DELE'.
    WHEN '&F03' OR '&F15' OR '&F12'.
    WHEN '&IC1'.
      IF RS_SELFIELD-FIELDNAME 'VBELN' .
        CLEARGT_DATA .
        READ TABLE GT_DATA INDEX RS_SELFIELD-TABINDEX .
        IF NOT  GT_DATA-VBELN IS INITIAL .
          SET PARAMETER ID 'VL' FIELD GT_DATA-VBELN .
          CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN .
        ENDIF.
      ENDIF.
      IF RS_SELFIELD-FIELDNAME 'VBELN_BL' .
        CLEARGT_DATA .
        READ TABLE GT_DATA INDEX RS_SELFIELD-TABINDEX .
        IF NOT  GT_DATA-VBELN_BL IS INITIAL .
          SET PARAMETER ID 'VF' FIELD GT_DATA-VBELN_BL .
          CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN .
        ENDIF.
      ENDIF.

  ENDCASE.
ENDFORM.                    "USER_COM

*&---------------------------------------------------------------------*
*&      FORM  SET_PF
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->EXTAB      TEXT
*----------------------------------------------------------------------*
FORM SET_PF USING  EXTAB TYPE SLIS_T_EXTAB.
  CASE 'X' .
    WHEN P_R1 .
      SET PF-STATUS 'LIST' EXCLUDING EXTAB .
    WHEN P_R2 .
      SET PF-STATUS 'LIST25' EXCLUDING EXTAB .
  ENDCASE .
ENDFORM.                    "SET_PF
*&---------------------------------------------------------------------*
*&      Form  GOOD_RECEIVE
*&---------------------------------------------------------------------*
FORM CREATE_BILLING.
  DATALV_ERROR TYPE .
  DATALT_BILLINGDATAIN LIKE  BAPIVBRK OCCURS WITH HEADER LINE .
  DATALT_RETURN LIKE BAPIRET1 OCCURS WITH HEADER LINE .
  DATALT_SUCCESS  LIKE  BAPIVBRKSUCCESS OCCURS WITH HEADER LINE.
  DATALT_ERRORS LIKE BAPIVBRKERRORS OCCURS WITH HEADER LINE .
  DATALT_ZTFI025 LIKE ZTFI025 OCCURS WITH HEADER LINE .
  DATABEGIN OF  LT_DATA OCCURS ,
         VBELN LIKE LIKP-VBELN        ,
         POSNR LIKE LIPS-POSNR        ,
         VBTYP LIKE LIKP-VBTYP        ,
        END OF LT_DATA .
  DATALS_DATA LIKE LT_DATA .
  CLEARLT_DATA[] .
  LOOP AT GT_DATA WHERE SEL 'X' AND S_FLAG ''.
    CLEARLT_DATA .
    MOVE-CORRESPONDING GT_DATA TO LT_DATA .
    APPEND LT_DATA .
  ENDLOOP .
  SORT LT_DATA .
  IF LT_DATA[] IS INITIAL .
    MESSAGE '请至少选择一条处理没有处理的数据!' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT .
  ENDIF.
  LOOP AT GT_DATA WHERE SEL 'X' AND S_FLAG 'X'.
  ENDLOOP .
  IF SY-SUBRC .
    MESSAGE '不要选择已经处理过的数据!' TYPE 'S' DISPLAY LIKE 'E' .
    EXIT .
  ENDIF.

  CLEARLT_BILLINGDATAIN[] ,LT_ZTFI025[] .
  LOOP AT LT_DATA .
    LS_DATA LT_DATA.
    CLEARLT_BILLINGDATAIN .
    LT_BILLINGDATAIN-REF_DOC  LS_DATA-VBELN .
    LT_BILLINGDATAIN-REF_ITEM LS_DATA-POSNR .
    IF NOT GV_BUDAT IS INITIAL .
      LT_BILLINGDATAIN-BILL_DATE GV_BUDAT .
    ENDIF.
    IF LT_DATA-VBTYP 'T' .
      LT_BILLINGDATAIN-ORDBILLTYP 'IG'.
    ELSE.
      LT_BILLINGDATAIN-ORDBILLTYP 'IV'.
    ENDIF.
    LT_BILLINGDATAIN-REF_DOC_CA 'J'.
    APPEND LT_BILLINGDATAIN .
*    LT_BILLINGDATAIN-SALESORG = GT_DATA-VKOIV.
*    LT_BILLINGDATAIN-DISTR_CHAN = GT_DATA-VTWEG .
*    LT_BILLINGDATAIN-DIVISION   = GT_DATA-SPART.
    AT END OF VBELN .

*      CALL FUNCTION 'BAPI_BILLINGDOC_CREATEFROMDATA'
      CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
*        EXPORTING
*         CREATORDATAIN   =
*          TESTRUN         = 'X'
*          POSTING         = 'X'
        TABLES
*         BILLING_DATA_IN = LT_BILLINGDATAIN[]
          BILLINGDATAIN   LT_BILLINGDATAIN[]
*         CONDITIONDATAIN =
*         CCARDDATAIN     =
*         TEXTDATAIN      =
          ERRORS          LT_ERRORS[]
          RETURN          LT_RETURN[]
          SUCCESS         LT_SUCCESS.
      IF NOT  LT_SUCCESS[] IS INITIAL  .
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT 'X'.
        CLEAR:LT_RETURN ,LV_ERROR .
        READ TABLE LT_RETURN WITH KEY TYPE 'E' .
        IF SY-SUBRC .
          LV_ERROR 'X' .
        ENDIF.
        LOOP AT LT_SUCCESS .
          CLEARGT_DATA .
          GT_DATA-LIGHT '@5B@' .
          GT_DATA-S_FLAG 'X' .
          GT_DATA-VBELN_BL LT_SUCCESS-BILL_DOC .
          GT_DATA-POSNR_BL LT_SUCCESS-BILL_DOC_ITEM .
          IF LV_ERROR 'X'.
            GT_DATA-LIGHT '@5D@' .
            CONCATENATE '发票已生成,没有生成财务凭证:'
            LT_RETURN-MESSAGE INTO  GT_DATA-MESSAGE.

            LOOP AT GT_DATA INTO GS_DATA
              WHERE  SEL 'X'  AND VBELN LT_SUCCESS-REF_DOC
                                AND POSNR LT_SUCCESS-REF_DOC_ITEM.
              CLEARLT_ZTFI025 .
              MOVE-CORRESPONDING GS_DATA TO  LT_ZTFI025 .
*--设置发票日期
              LT_ZTFI025-FKDAT    GS_DATA-FKDAT_N .
*--
              LT_ZTFI025-VBELN_BL LT_SUCCESS-BILL_DOC .
              LT_ZTFI025-POSNR_BL LT_SUCCESS-BILL_DOC_ITEM .
              LT_ZTFI025-MESSAGE   GT_DATA-MESSAGE.
              LT_ZTFI025-FLAG_S '' .
              APPEND LT_ZTFI025 .
            ENDLOOP .
            IF NOT LT_ZTFI025[] IS INITIAL .
              MODIFY ZTFI025 FROM TABLE LT_ZTFI025 .
            ENDIF.

          ELSE.
            GT_DATA-MESSAGE =   '发票成功生成' .
          ENDIF.
          MODIFY GT_DATA TRANSPORTING LIGHT S_FLAG VBELN_BL
                                      POSNR_BL MESSAGE
                            WHERE SEL 'X'
                              AND VBELN LT_SUCCESS-REF_DOC
                              AND POSNR LT_SUCCESS-REF_DOC_ITEM.


        ENDLOOP.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT  LT_ERRORS .
          CLEARGT_DATA .
          GT_DATA-LIGHT '@5C@' .
          GT_DATA-MESSAGE  LT_ERRORS-MESSAGE .
          MODIFY GT_DATA TRANSPORTING LIGHT MESSAGE
                              WHERE SEL 'X'
                                AND VBELN LT_ERRORS-REF_DOC
                                AND POSNR LT_ERRORS-REF_DOC_ITEM.
        ENDLOOP.
        CLEAR:LT_RETURN .
        READ TABLE LT_RETURN WITH KEY TYPE 'E' .
        LOOP AT GT_DATA WHERE
          SEL 'X' AND  LIGHT '' AND VBELN LS_DATA-VBELN  .
          GT_DATA-LIGHT '@5C@' .
          GT_DATA-MESSAGE  LT_RETURN-MESSAGE .
          MODIFY GT_DATA .
        ENDLOOP .
      ENDIF.
      CLEARLT_BILLINGDATAIN[] ,LT_ERRORS[] ,LT_SUCCESS[] ,LT_RETURN[].
    ENDAT .
  ENDLOOP .

ENDFORM.                    " GOOD_RECEIVE
*&---------------------------------------------------------------------*
*&      Form  GET_DATA2
*&---------------------------------------------------------------------*
FORM GET_DATA2 .
  DATABEGIN OF LT_VBRK OCCURS ,
        VBELN LIKE VBRK-VBELN ,
        RFBSK LIKE VBRK-RFBSK ,
        FKSTO LIKE VBRK-FKSTO ,
        END OF LT_VBRK .
  SELECT INTO CORRESPONDING FIELDS OF TABLE GT_DATA
    FROM ZTFI025
    WHERE VBELN IN SO_VBELN
     AND  VKOIV IN SO_VKOIV
     AND VBELN_BL IN SO_BILLN
     AND  FLAG_S '' .
  IF NOT  GT_DATA[] IS INITIAL .
    SELECT VBELN RFBSK FKSTO INTO CORRESPONDING FIELDS OF TABLE LT_VBRK
     FROM VBRK FOR ALL ENTRIES IN  GT_DATA
      WHERE VBELN GT_DATA-VBELN_BL .

    SORT LT_VBRK BY VBELN .
    LOOP AT GT_DATA .
      CLEARLT_VBRK .
      READ TABLE LT_VBRK WITH KEY
      VBELN GT_DATA-VBELN_BL BINARY SEARCH.
*-已经过账,或者发票被取消时,不再显示
      IF LT_VBRK-RFBSK 'C' OR  LT_VBRK-FKSTO 'X'.
        DELETE GT_DATA .
        CONTINUE .
      ENDIF.
      GT_DATA-FKDAT_N GT_DATA-FKDAT .
    ENDLOOP .
  ENDIF.


ENDFORM.                    " GET_DATA2
*&---------------------------------------------------------------------*
*&      Form  BILLING_RELEASE
*&---------------------------------------------------------------------*
FORM BILLING_RELEASE .
*--bdc data define
  DATA:  LS_OPTION LIKE CTU_PARAMS.
  DATALV_CNT TYPE .
  DATALV_MSGID  LIKE SY-MSGID,
         LV_MSGNR  LIKE SY-MSGNO ,
         E_MESSAGE(100TYPE .

  DATALV_BILLINGDOCUMENT LIKE BAPIVBRKSUCCESS-BILL_DOC ,
         LS_RETURN LIKE BAPIRETURN1 .

  DATABEGIN OF LT_BILLING OCCURS ,
        VBELN_BL LIKE ZTFI025-VBELN_BL ,
        END OF  LT_BILLING .


  LOOP AT GT_DATA WHERE SEL 'X' AND S_FLAG  ''.
    IF NOT GT_DATA-VBELN_BL IS INITIAL .
      MOVE-CORRESPONDING GT_DATA TO LT_BILLING .
      APPEND LT_BILLING .
    ENDIF.
  ENDLOOP .
  SORT LT_BILLING .
  DELETE ADJACENT DUPLICATES FROM LT_BILLING COMPARING ALL FIELDS .
  IF LT_BILLING[] IS INITIAL .
    MESSAGE '请至少选择一条没有处理成功的数据' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT .
  ENDIF.

*********************BDC 处理
  CLEARBDCDATA[].
  CLEAR LS_OPTION.
  LS_OPTION-DEFSIZE  'X'.
  LS_OPTION-RACOMMIT 'X'.
  LS_OPTION-DISMODE  'N'.
  LS_OPTION-UPDMODE  'S'.
  DATA:LV_DATA_BL(10.
  CLEARLV_DATA_BL .
  WRITEGV_BUDAT TO LV_DATA_BL   .
  LOOP AT LT_BILLING .
    CLEARBDCDATA[] ,MESSTAB[] .
    PERFORM BDC_DYNPRO USING  :
           'SAPMV60A'        '0101'                'X',
           'BDC_OKCODE'      '=UEBP'               ' ',
           'VBRK-VBELN'      LT_BILLING-VBELN_BL   ' '"发票号
    IF NOT GV_BUDAT IS INITIAL .
      PERFORM BDC_DYNPRO USING  :
             'SAPMV60A'        '0104'                'X',
             'BDC_OKCODE'      '=KFDE'               ' '.
      PERFORM BDC_DYNPRO USING  :
             'SAPMV60A'        '6001'                'X',
             'VBRK-FKDAT'      LV_DATA_BL            ' ',
             'BDC_OKCODE'      '=UEBP'               ' '.
      PERFORM BDC_DYNPRO USING  :
             'SAPMV60A'        '0104'                'X',
             'BDC_OKCODE'      '=FKFR'               ' '.
    ELSE.
      PERFORM BDC_DYNPRO USING  :
             'SAPMV60A'        '0104'                'X',
             'BDC_OKCODE'      '=FKFR'               ' '.
    ENDIF.
    CALL TRANSACTION 'VF02' USING           BDCDATA
                             OPTIONS   FROM  LS_OPTION
                             MESSAGES  INTO  MESSTAB.


    CLEAR LV_CNT.
    DESCRIBE TABLE MESSTAB LINES LV_CNT.
    READ TABLE MESSTAB INDEX LV_CNT.

* 错误处理
    CLEARLV_MSGID LV_MSGNR .
    LV_MSGID 'VF' .
    LV_MSGNR  '311'.
    CLEARE_MESSAGE .
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               MESSTAB-MSGID
        MSGNR               MESSTAB-MSGNR
        MSGV1               MESSTAB-MSGV1
        MSGV2               MESSTAB-MSGV2
        MSGV3               MESSTAB-MSGV3
        MSGV4               MESSTAB-MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT E_MESSAGE.
*错误时
    IF MESSTAB-MSGID NE LV_MSGID OR MESSTAB-MSGNR NE LV_MSGNR.
      CLEARGT_DATA .
      GT_DATA-MESSAGE E_MESSAGE .
      GT_DATA-LIGHT '@5C@'.
      MODIFY GT_DATA TRANSPORTING MESSAGE LIGHT
      WHERE VBELN_BL LT_BILLING-VBELN_BL .
*成功时
    ELSE.
      CLEARGT_DATA .

      UPDATE ZTFI025 SET FLAG_S 'X'
          WHERE VBELN_BL LT_BILLING-VBELN_BL .
      CLEARGT_DATA .
      GT_DATA-MESSAGE =  E_MESSAGE .
      GT_DATA-LIGHT '@5B@'.
      GT_DATA-S_FLAG  'X' .
      MODIFY GT_DATA TRANSPORTING MESSAGE LIGHT S_FLAG
      WHERE VBELN_BL LT_BILLING-VBELN_BL .
    ENDIF.
  ENDLOOP .
ENDFORM.                    " BILLING_RELEASE
*&---------------------------------------------------------------------*
*&      Form  BDC_DYNPRO
*&---------------------------------------------------------------------*
FORM BDC_DYNPRO  USING  PROGRAM DYNPRO P_MODE .
  CLEAR BDCDATA.
  IF P_MODE 'X'.
    BDCDATA-PROGRAM  PROGRAM.
    BDCDATA-DYNPRO   DYNPRO.
    BDCDATA-DYNBEGIN 'X'.
  ELSE.
    BDCDATA-FNAM PROGRAM .
    BDCDATA-FVAL DYNPRO.
  ENDIF.
  APPEND BDCDATA.
ENDFORM.                    " BDC_DYNPRO
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0200 INPUT.
  CASE SY-UCOMM .
    WHEN 'OK' .
      IF NOT GV_BUDAT IS INITIAL .
        MESSAGE '发票日期被设置!'TYPE 'S' DISPLAY LIKE 'S' .
      ELSE.
        MESSAGE '发票日期被重置为默认日期!'TYPE 'S' DISPLAY LIKE 'S' .
      ENDIF.
      LEAVE TO SCREEN  .
    WHEN 'CANC'.
      MESSAGE '发票日期设置取消!'TYPE 'S' DISPLAY LIKE 'S' .
      LEAVE TO SCREEN  .
  ENDCASE .
ENDMODULE.                 " USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0200 OUTPUT.
  SET PF-STATUS '0200'.
*  SET TITLEBAR 'xxx'.

ENDMODULE.                 " STATUS_0200  OUTPUT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值