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