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 0 WITH HEADER LINE .
DATA : MESSTAB LIKE BDCMSGCOLL OCCURS 0 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 C ,
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 1 .
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 0 ,
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 * ( - 1 ) .
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 <> 0 .
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 5 .
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 C .
DATA : LT_BILLINGDATAIN LIKE BAPIVBRK OCCURS 0 WITH HEADER LINE .
DATA : LT_RETURN LIKE BAPIRET1 OCCURS 0 WITH HEADER LINE .
DATA : LT_SUCCESS LIKE BAPIVBRKSUCCESS OCCURS 0 WITH HEADER LINE .
DATA : LT_ERRORS LIKE BAPIVBRKERRORS OCCURS 0 WITH HEADER LINE .
DATA : LT_ZTFI025 LIKE ZTFI025 OCCURS 0 WITH HEADER LINE .
DATA : BEGIN OF LT_DATA OCCURS 0 ,
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 = 0 .
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 = 0 .
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 0 ,
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 I .
DATA : LV_MSGID LIKE SY -MSGID ,
LV_MSGNR LIKE SY -MSGNO ,
E_MESSAGE ( 100 ) TYPE C .
DATA : LV_BILLINGDOCUMENT LIKE BAPIVBRKSUCCESS -BILL_DOC ,
LS_RETURN LIKE BAPIRETURN1 .
DATA : BEGIN OF LT_BILLING OCCURS 0 ,
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 0 .
WHEN 'CANC' .
MESSAGE '发票日期设置取消!' TYPE 'S' DISPLAY LIKE 'S' .
LEAVE TO SCREEN 0 .
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
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 0 WITH HEADER LINE .
DATA : MESSTAB LIKE BDCMSGCOLL OCCURS 0 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 C ,
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 1 .
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 0 ,
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 * ( - 1 ) .
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 <> 0 .
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 5 .
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 C .
DATA : LT_BILLINGDATAIN LIKE BAPIVBRK OCCURS 0 WITH HEADER LINE .
DATA : LT_RETURN LIKE BAPIRET1 OCCURS 0 WITH HEADER LINE .
DATA : LT_SUCCESS LIKE BAPIVBRKSUCCESS OCCURS 0 WITH HEADER LINE .
DATA : LT_ERRORS LIKE BAPIVBRKERRORS OCCURS 0 WITH HEADER LINE .
DATA : LT_ZTFI025 LIKE ZTFI025 OCCURS 0 WITH HEADER LINE .
DATA : BEGIN OF LT_DATA OCCURS 0 ,
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 = 0 .
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 = 0 .
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 0 ,
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 I .
DATA : LV_MSGID LIKE SY -MSGID ,
LV_MSGNR LIKE SY -MSGNO ,
E_MESSAGE ( 100 ) TYPE C .
DATA : LV_BILLINGDOCUMENT LIKE BAPIVBRKSUCCESS -BILL_DOC ,
LS_RETURN LIKE BAPIRETURN1 .
DATA : BEGIN OF LT_BILLING OCCURS 0 ,
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 0 .
WHEN 'CANC' .
MESSAGE '发票日期设置取消!' TYPE 'S' DISPLAY LIKE 'S' .
LEAVE TO SCREEN 0 .
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