公司间交易开票bapi

REPORT ZFIR025   .
TABLES LIPS ,LIKP  ,VBRK  ,SSCRFIELDS .
TYPE-POOLS SLIS  .
INCLUDE <ICON> .
*table
DATA BEGIN  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  .
DATA GS_DATA  LIKE GT_DATA  .
*-已经处理的采购订单
DATA G_SUCESS  .
*bdc global data
DATA :   BDCDATA  LIKE BDCDATA     OCCURS  WITH  HEADER  LINE .
DATA :   MESSTAB  LIKE BDCMSGCOLL  OCCURS  WITH  HEADER  LINE .

*ALV 变量
DATA IT_FIELDS_ITEM  TYPE LVC_T_FCAT .
DATA GS_LAYOUT_ITEM  TYPE LVC_S_LAYO .
DATA GS_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
DATA GS_HEADER  LIKE BAPI2017_GM_HEAD_01  .
*-- item table
DATA GT_ITEM  TYPE  TABLE  OF BAPI2017_GM_ITEM_CREATE    ,
      GS_ITEM  LIKE  LINE  OF GT_ITEM  .

*-code
DATA GS_CODE  LIKE BAPI2017_GM_CODE  .

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

*其他变量
*--错误标记
DATA G_ERROR ( 1 TYPE  ,
      G_MESSAGE ( 100 )     .
*询问标记
DATA GV_ANSWER  .
CONSTANTS C_BUDAT_BUTTON ( 22 VALUE  '@1U@设置发票日期'  .
DATA GV_BUDAT  LIKE SY -DATUM  ,
      GV_BUDAT_BUTTON ( 22 VALUE 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  .
PARAMETERS P_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' .
         CLEAR SO_BUDAT[]  ,SO_BUDAT  ,
               SO_VBELN[]  ,SO_BILLN  ,
               SO_VKOIV[]  ,SO_VKOIV  .
       ELSEIF P_R1  'X' .
         CLEAR SO_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  .
*-采购订单那行项目
   DATA BEGIN  OF LT_EKPO  OCCURS  ,
        EBELN  LIKE EKPO -EBELN       "采购订单那编号
        EBELP  LIKE EKPO -EBELP       "采购订单行项目
        ELIKZ  LIKE EKPO -ELIKZ       "交货已完成
         END  OF LT_EKPO  .
*-采购订单物料凭证
   DATA BEGIN  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  .
*-合计
   DATA BEGIN  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               .
   DATA LV_EBELN  LIKE EKKO -EBELN  .
   DATA LV_LIFNR  LIKE LFA1 -LIFNR  .
   DATA LV_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  .
     CLEAR LT_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  .
   DATA LV_REPID  LIKE SY -REPID .
   DATA LT_FIELDS  TYPE SLIS_T_FIELDCAT_ALV .
   DATA WA_FIELDS  TYPE  LINE  OF SLIS_T_FIELDCAT_ALV .
   DATA LS_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'  .

   DATA LS_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
   DATA LS_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  .
   DATA LV_DATA ( 11 .
   DATA LV_DATA1 ( 8 ) .
   DATA LS_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 .

   DATA L_GRID  TYPE  REF  TO CL_GUI_ALV_GRID .
   DATA LV_VAIID ( 1 .
   DATA LV_DATA1 ( 8 .
   DATA LV_DATE ( 11 .
   DATA LV_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  .
           CLEAR GV_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'  .
         CLEAR GV_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'  .
         CLEAR GT_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'  .
         CLEAR GT_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 .
   DATA LV_ERROR  TYPE  .
   DATA LT_BILLINGDATAIN  LIKE  BAPIVBRK  OCCURS  WITH  HEADER  LINE  .
   DATA LT_RETURN  LIKE BAPIRET1  OCCURS  WITH  HEADER  LINE  .
   DATA LT_SUCCESS   LIKE  BAPIVBRKSUCCESS  OCCURS  WITH  HEADER  LINE .
   DATA LT_ERRORS  LIKE BAPIVBRKERRORS  OCCURS  WITH  HEADER  LINE  .
   DATA LT_ZTFI025  LIKE ZTFI025  OCCURS  WITH  HEADER  LINE  .
   DATA BEGIN  OF  LT_DATA  OCCURS  ,
         VBELN  LIKE LIKP -VBELN         ,
         POSNR  LIKE LIPS -POSNR         ,
         VBTYP  LIKE LIKP -VBTYP         ,
         END  OF LT_DATA  .
   DATA LS_DATA  LIKE LT_DATA  .
   CLEAR LT_DATA[]  .
   LOOP  AT GT_DATA  WHERE SEL  'X'  AND S_FLAG  '' .
     CLEAR LT_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 .

   CLEAR LT_BILLINGDATAIN[]  ,LT_ZTFI025[]  .
   LOOP  AT LT_DATA  .
    LS_DATA  LT_DATA .
     CLEAR LT_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  .
           CLEAR GT_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 .
               CLEAR LT_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  .
           CLEAR GT_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 .
       CLEAR LT_BILLINGDATAIN[]  ,LT_ERRORS[]  ,LT_SUCCESS[]  ,LT_RETURN[] .
     ENDAT  .
   ENDLOOP  .

ENDFORM .                     " GOOD_RECEIVE
*&---------------------------------------------------------------------*
*&      Form  GET_DATA2
*&---------------------------------------------------------------------*
FORM GET_DATA2  .
   DATA BEGIN  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  .
       CLEAR LT_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 .
   DATA LV_CNT  TYPE  .
   DATA LV_MSGID   LIKE SY -MSGID ,
         LV_MSGNR   LIKE SY -MSGNO  ,
         E_MESSAGE ( 100 TYPE  .

   DATA LV_BILLINGDOCUMENT  LIKE BAPIVBRKSUCCESS -BILL_DOC  ,
         LS_RETURN  LIKE BAPIRETURN1  .

   DATA BEGIN  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 处理
   CLEAR BDCDATA[] .
   CLEAR LS_OPTION .
  LS_OPTION -DEFSIZE   'X' .
  LS_OPTION -RACOMMIT  'X' .
  LS_OPTION -DISMODE   'N' .
  LS_OPTION -UPDMODE   'S' .
   DATA :LV_DATA_BL ( 10 .
   CLEAR LV_DATA_BL  .
   WRITE GV_BUDAT  TO LV_DATA_BL    .
   LOOP  AT LT_BILLING  .
     CLEAR BDCDATA[]  ,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 .

* 错误处理
     CLEAR LV_MSGID  LV_MSGNR  .
    LV_MSGID  'VF'  .
    LV_MSGNR   '311' .
     CLEAR E_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 .
       CLEAR GT_DATA  .
      GT_DATA - MESSAGE  E_MESSAGE  .
      GT_DATA -LIGHT  '@5C@' .
       MODIFY GT_DATA  TRANSPORTING  MESSAGE LIGHT
       WHERE VBELN_BL  LT_BILLING -VBELN_BL  .
*成功时
     ELSE .
       CLEAR GT_DATA  .

       UPDATE ZTFI025  SET FLAG_S  'X'
           WHERE VBELN_BL  LT_BILLING -VBELN_BL  .
       CLEAR GT_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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值