*----------------------------------------------------------------------*
* Program name : ZSD_BDC_ORDERITEM_NEW Date written: 07-11-10 *
* Author's name: HouZhiYu Last update : *
* Program title: 销售订单行项目批量导入 *
*----------------------------------------------------------------------*
REPORT ZSD_BDC_ORDERITEM.
TABLES: VBAK,"销售凭证:抬头数据
VBAP,"销售凭证:项目数据
VBEP,"销售凭证:细目数据
TVAP,"销售凭证:项目类别
KONV."条件(事务数据)
*****************************************************************
* INTERNAL TABLES
*****************************************************************
DATA: BEGIN OF L_VBAK OCCURS 0,
VBELN LIKE VBAP-VBELN, "订单号
POSNR LIKE VBAP-POSNR, "项目号
MATNR LIKE RV45A-MABNR, "物料编号
KWMENG(15) TYPE C, "数量
KDMAT LIKE VBAP-KDMAT, "客户物料编号
PSTYV LIKE VBAP-PSTYV, "项目类型
UEPOS LIKE VBAP-UEPOS, "上层项
PR01_KBETR(11) TYPE C, "PR01价格
PR01_KOEIN(5) TYPE C, "PR01币种
ETDAT LIKE RV45A-ETDAT, "首次日期
PS_PSP_PNR(24) TYPE C,"WBS元素
PN00_KBETR(11) TYPE C, "PN00价格
PN00_KOEIN(5) TYPE C, "PN00币种
* PN002_KBETR(5) TYPE C, "PN00价格
* PN002_KOEIN LIKE RV45A-KOEIN, "PN00币种
ZP01_KBETR(11) TYPE C, "ZP01价格
ZP01_KOEIN(5) TYPE C, "ZP01币种
ZP21_KBETR(11) TYPE C, "ZP21价格
ZP21_KOEIN(5) TYPE C, "ZP21币种
ZP03_KBETR(11) TYPE C, "ZP03价格
ZP03_KOEIN(5) TYPE C, "ZP03币种
ZP23_KBETR(11) TYPE C, "ZP23价格
ZP23_KOEIN(5) TYPE C, "ZP23币种
ZP05_KBETR(11) TYPE C, "ZP05价格
ZP05_KOEIN(5) TYPE C, "ZP05币种
ZP25_KBETR(11) TYPE C, "ZP25价格
ZP25_KOEIN(5) TYPE C, "ZP25币种
ZP08_KBETR(11) TYPE C, "ZP08价格
ZP08_KOEIN(5) TYPE C, "ZP08币种
ZP28_KBETR(11) TYPE C, "ZP28价格
ZP28_KOEIN(5) TYPE C, "ZP28币种
ZP09_KBETR(11) TYPE C, "ZP09价格
ZP09_KOEIN(5) TYPE C, "ZP09币种
ZP29_KBETR(11) TYPE C, "ZP29价格
ZP29_KOEIN(5) TYPE C, "ZP29币种
ZP11_KBETR(11) TYPE C, "ZP11价格
ZP11_KOEIN(5) TYPE C, "ZP11币种
ZP31_KBETR(11) TYPE C, "ZP31价格
ZP31_KOEIN(5) TYPE C, "ZP31币种
ZTERM LIKE VBKD-ZTERM,"付款方式
S_PARTNER LIKE SDPARTNERLIST-PARTNER,"送达方
JUMING(50) TYPE C, "局名
IHREZ LIKE VBKD-IHREZ,"售达方中您的参考
POSEX LIKE VBAP-POSEX,"售达方中采购订单项目
IHREZ_E LIKE VBKD-IHREZ_E,"送达方中您的参考
END OF L_VBAK.
*---bdc专用-------------------------
DATA:T_BDC LIKE STANDARD TABLE OF BDCDATA INITIAL SIZE 0
WITH HEADER LINE. "STANDARD BDC TABLE
DATA: BEGIN OF MESSTAB OCCURS 0."输出消息号
INCLUDE STRUCTURE BDCMSGCOLL.
DATA: END OF MESSTAB.
REFRESH T_BDC.
DATA: MODE TYPE C.
*-------输出错误信息内表--------------------------
DATA: BEGIN OF ITAB_MESSTAB OCCURS 0.
INCLUDE STRUCTURE L_VBAK.
DATA: FLAG(10)."错误标记
DATA: MESSAGE(100)."信息
DATA: END OF ITAB_MESSTAB.
*--------------------------------------------
DATA: IT_UPLOAD LIKE L_VBAK OCCURS 0 WITH HEADER LINE.
DATA: IT_UPLOAD_SO LIKE L_VBAK OCCURS 0 WITH HEADER LINE.
DATA: P_VBELN LIKE VBAK-VBELN.
DATA L_NAME LIKE THEAD-TDNAME.
RANGES: R_PSTYV FOR VBAP-PSTYV.
DATA: SUM TYPE I.
*----------alv所需变量定义----------------------------------------------
TYPE-POOLS: SLIS.
DATA:
V_REPID LIKE SY-REPID,
I_PERIOD TYPE STRING.
DATA:
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
"ALV 字段
V_ALV_LAYOUT TYPE SLIS_LAYOUT_ALV. "ALV 样式
DATA GIT_LISTHEADER TYPE SLIS_T_LISTHEADER.
DATA GIT_EVENTS TYPE SLIS_T_EVENT.
*****************************************************************
* SELECTION-SCREEN
*****************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R1 TYPE C
RADIOBUTTON GROUP MOD.
SELECTION-SCREEN COMMENT 3(20) TEXT-005 FOR FIELD R1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R2 TYPE C
RADIOBUTTON GROUP MOD.
SELECTION-SCREEN COMMENT 3(20) TEXT-006 FOR FIELD R2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R3 TYPE C
RADIOBUTTON GROUP MOD DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(20) TEXT-007 FOR FIELD R3.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BLOCK1.
*&-------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&-------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM GET_FILENAME USING P_FILE.
*&-------------------------------------------------------------------*
* START-OF-SELECTION
*&-------------------------------------------------------------------*
START-OF-SELECTION.
IF R1 = 'X'.
MODE = 'A'.
ENDIF.
START-OF-SELECTION.
IF R2 = 'X'.
MODE = 'E'.
ENDIF.
START-OF-SELECTION.
IF R3 = 'X'.
MODE = 'N'.
ENDIF.
PERFORM MAIN.
*&---------------------------------------------------------------------*
*& Form main
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM MAIN.
PERFORM UPOLOAD_FILE.
SORT IT_UPLOAD_SO BY VBELN.
SORT IT_UPLOAD BY VBELN.
LOOP AT IT_UPLOAD_SO.
*--检查订单是否存在--------------------------
P_VBELN = IT_UPLOAD_SO-VBELN.
*-------------在P_VBELN前面补零-----
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = P_VBELN
IMPORTING
OUTPUT = P_VBELN.
CLEAR VBAK.
SELECT SINGLE VBELN FROM VBAK
INTO VBAK-VBELN
WHERE VBELN = P_VBELN.
IF SY-SUBRC <> 0.
MOVE-CORRESPONDING IT_UPLOAD_SO TO ITAB_MESSTAB.
ITAB_MESSTAB-FLAG = '失败'."错误标记
ITAB_MESSTAB-MESSAGE = '该订单没有被创建,无法更新ITEM!!'."信息
APPEND ITAB_MESSTAB.
DELETE IT_UPLOAD WHERE VBELN = IT_UPLOAD_SO-VBELN.
DELETE IT_UPLOAD_SO WHERE VBELN = IT_UPLOAD_SO-VBELN.
CONTINUE.
ENDIF.
*-----将外部数据赋值给要执行BDC的内表-------
LOOP AT IT_UPLOAD WHERE VBELN = IT_UPLOAD_SO-VBELN.
MOVE-CORRESPONDING IT_UPLOAD TO L_VBAK.
APPEND L_VBAK.
ENDLOOP.
*----判断当前表头合作伙伴个数-----------------
SELECT COUNT( DISTINCT PARVW ) FROM VBPA
INTO SUM
WHERE VBELN = P_VBELN
AND POSNR = '000000'.
*--数据检查如果没有问题则执行BDC------------------
PERFORM CHECK_INPUT.
CLEAR: L_VBAK[],IT_UPLOAD,L_VBAK,P_VBELN,
SUM.
ENDLOOP.
*---输出日志信息-----------
PERFORM OUTPUT_LOG.
ENDFORM. " main
*&---------------------------------------------------------------------*
*& Form check_input
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_INPUT.
SORT L_VBAK BY VBELN POSNR.
LOOP AT L_VBAK.
*---数据检查-------
*以下数据为必填项,如果为空则报系统错误---------
*订单行项目/物料/数量/项目类型/首次日期/送达方/送达方中您的参考
IF L_VBAK-POSNR = ''."订单行项目
MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
ITAB_MESSTAB-FLAG = '失败'."错误标记
ITAB_MESSTAB-MESSAGE = '订单行项目不能为空'."信息
APPEND ITAB_MESSTAB.
DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
AND POSNR = L_VBAK-POSNR.
CONTINUE.
ENDIF.
IF L_VBAK-MATNR = ''."物料
MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
ITAB_MESSTAB-FLAG = '失败'."错误标记
ITAB_MESSTAB-MESSAGE = '物料不能为空'."信息
APPEND ITAB_MESSTAB.
DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
AND POSNR = L_VBAK-POSNR.
CONTINUE.
ENDIF.
IF L_VBAK-KWMENG = ''."数量
MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
ITAB_MESSTAB-FLAG = '失败'."错误标记
ITAB_MESSTAB-MESSAGE = '数量不能为空'."信息
APPEND ITAB_MESSTAB.
DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
AND POSNR = L_VBAK-POSNR.
CONTINUE.
ENDIF.
IF L_VBAK-PSTYV = ''."项目类型
MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
ITAB_MESSTAB-FLAG = '失败'."错误标记
ITAB_MESSTAB-MESSAGE = '项目类型不能为空'."信息
APPEND ITAB_MESSTAB.
DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
AND POSNR = L_VBAK-POSNR.
CONTINUE.
ENDIF.
IF L_VBAK-ETDAT = ''."首次日期
MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
ITAB_MESSTAB-FLAG = '失败'."错误标记
ITAB_MESSTAB-MESSAGE = '首次日期不能为空'."信息
APPEND ITAB_MESSTAB.
DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
AND POSNR = L_VBAK-POSNR.
CONTINUE.
ENDIF.
* IF L_VBAK-IHREZ_E = ''."送达方中您的参考
* MOVE-CORRESPONDING L_VBAK TO ITAB_MESSTAB.
* ITAB_MESSTAB-FLAG = '失败'."错误标记
* ITAB_MESSTAB-MESSAGE = '送达方中您的参考不能为空'."信息
* APPEND ITAB_MESSTAB.
* DELETE L_VBAK WHERE VBELN = L_VBAK-VBELN
* AND POSNR = L_VBAK-POSNR.
* CONTINUE.
* ENDIF.
*&数量 ,价格处理。
CONDENSE L_VBAK-KWMENG NO-GAPS.
CONDENSE L_VBAK-PR01_KBETR NO-GAPS.
CONDENSE L_VBAK-PN00_KBETR NO-GAPS.
* CONDENSE L_VBAK-PN002_KBETR NO-GAPS.
CONDENSE L_VBAK-ZP01_KBETR NO-GAPS. "ZP01价格
CONDENSE L_VBAK-ZP21_KBETR NO-GAPS. "ZP21价格
CONDENSE L_VBAK-ZP03_KBETR NO-GAPS. "ZP03价格
CONDENSE L_VBAK-ZP23_KBETR NO-GAPS. "ZP23价格
CONDENSE L_VBAK-ZP05_KBETR NO-GAPS. "ZP05价格
CONDENSE L_VBAK-ZP25_KBETR NO-GAPS. "ZP25价格
CONDENSE L_VBAK-ZP08_KBETR NO-GAPS. "ZP08价格
CONDENSE L_VBAK-ZP28_KBETR NO-GAPS. "ZP28价格
CONDENSE L_VBAK-ZP09_KBETR NO-GAPS. "ZP09价格
CONDENSE L_VBAK-ZP29_KBETR NO-GAPS. "ZP29价格
C