功能:由销售订单产生交货单

REPORT  ZSDA11S2.
*&---------------------------------------------------------------------*
*& 使用核心函数 BAPI_DELIVERYPROCESSING_EXEC 版本虽老,但功能齐全,支持采购订单,销售订单及合并创建
*&
*&---------------------------------------------------------------------*
*&自动交货 商用 一次性客户加入商用
*&自动交货 商用 扣板交货加入商用
*&---------------------------------------------------------------------*
*&2015.12.22 增加 18 整单自动交货

*&2017.02.27 分开工厂
*&---------------------------------------------------------------------*
TABLES : ZVBAP,TVKO,T001.
PARAMETERS: P_FORCE  TYPE C AS CHECKBOX .
PARAMETERS: P_DATU  TYPE INT1 DEFAULT 2.
PARAMETERS: P_WERKS  TYPE WERKS_D DEFAULT '6000' .
SELECT-OPTIONS: S_VSTEL  FOR ZVBAP-VSTEL,
                S_VBELN FOR ZVBAP-VBELN,
                S_KUNNR FOR ZVBAP-KUNNR,
                S_VTWEG FOR ZVBAP-VTWEG.
*3.产生交货单
*4.查看是否产生成功
*5.不成功就停止
*0 计算是否是计算时间
DATA:
   C_PRUEFLOS  LIKE QALS-PRUEFLOS.
CONCATENATE 'SY' SY-DATUM  INTO C_PRUEFLOS.
DATA: X(10),M(10), L_MESSAGE(300).
CALL FUNCTION 'ENQUEUE_EQQALS1'
EXPORTING
    PRUEFLOS     = C_PRUEFLOS
EXCEPTIONS
    FOREIGN_LOCK = 1.
IF NOT SY-SUBRC IS INITIAL.
  L_MESSAGE = '正在进行计算操作,ZSDA11S '.
CONCATENATE L_MESSAGE '退出!' INTO L_MESSAGE.
WRITE L_MESSAGE .
RETURN.
ENDIF.
DATA: S(1).
CLEAR S.
DATA: LINE LIKE ZSDA19.
IF SY-BATCH = 'X' ."后台执行
  S = 'A'.
SELECT * INTO LINE
FROM ZSDA19
WHERE DAT1 = SY-DATUM
AND FLAG = 'SO'.
*  AND VSTEL = P_VSTEL.
IF SY-UZEIT < LINE-ETIM AND  SY-UZEIT >= LINE-STIM.
      S = 'X'.
EXIT.
ENDIF.
ENDSELECT.
ENDIF.
IF S = 'A' AND P_FORCE IS INITIAL. "没有工作日历
WRITE '没有工作日历'.
RETURN.
ENDIF.
*1. 取要操作的订单
*DATA: ITVBAP LIKE ZVBAP OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF ITVBAP OCCURS 0.
INCLUDE STRUCTURE ZVBAP  .
DATA:   SOBKZ TYPE SOBKZ.
DATA: PS_PSP_PNR TYPE PS_PSP_PNR.
DATA: MAABC TYPE MAABC.
DATA: ERDAT TYPE ERDAT.
DATA: END OF ITVBAP.
DATA: CDATE LIKE SY-DATUM.
IF P_DATU IS INITIAL.
  P_DATU = 100.
ENDIF.
IF SY-BATCH = 'X'.
  P_DATU = 100.
ENDIF.
CDATE = SY-DATUM + P_DATU.
DATA:
BEGIN OF WHERE_ITAB OCCURS 0,
TEXT(320),
END OF WHERE_ITAB .
PERFORM GETWHERE.
DATA: STR TYPE STRING.
CLEAR STR.
* CONCATENATE STR ' *    A~VBELN  ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    A~VBELP  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~MATNR ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~LGORT ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    VTWEG  ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    ETDAT  ' INTO STR SEPARATED BY SPACE .
*  CONCATENATE STR '  *    B~LFSTA AS BESTK  ' INTO STR SEPARATED BY SPACE  .
CONCATENATE STR '     A~ZMENG ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    LFIMG  ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    FDATE  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~VBELN ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~VBELP ' INTO STR SEPARATED BY SPACE .
*  CONCATENATE STR '      MATNR  ' INTO STR SEPARATED BY SPACE  .
CONCATENATE STR '     A~KUNNR ' INTO STR SEPARATED BY SPACE .
*  CONCATENATE STR '      LGORT  ' INTO STR SEPARATED BY SPACE  .
CONCATENATE STR '     VTWEG ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     ETDAT ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     B~LFSTA AS BESTK  ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    BESTK  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~ZMENG ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    LFIMG  ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    KZWI1 "这个值要重新计算  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~KZWI2 ' INTO STR SEPARATED BY SPACE .
* CONCATENATE STR ' *    KZWI3  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     INT1  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     INT2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     DAT1  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     DAT2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     UPDKZ ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     P~ABGRU ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     AUART ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     P~VSTEL ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~NETWR ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     NETWR2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     XDATE ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     XTIME ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     EUDAT ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     XDATE2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     XTIME2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     QDATE ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     KDATE ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     EUDAT ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     SDATE ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     XDATE2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     XTIME2  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     FDATE ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     FRZE  ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     FRDAT ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     FRTIM ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     VKORG ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~WERKS ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     P~SOBKZ ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     P~PS_PSP_PNR ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~BM2 ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     D~MAABC ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     P~ERDAT ' INTO STR SEPARATED BY SPACE .
CONCATENATE STR '     A~MANDT ' INTO STR SEPARATED BY SPACE .
SELECT (STR)
APPENDING CORRESPONDING FIELDS OF TABLE   ITVBAP
FROM ZVBAP AS A
JOIN VBAP AS P ON A~VBELN = P~VBELN AND A~VBELP = P~POSNR
JOIN VBUP  AS B ON A~VBELN = B~VBELN AND A~VBELP = B~POSNR
JOIN KNA1 AS C ON A~KUNNR = C~KUNNR
JOIN MARC AS D ON A~MATNR = D~MATNR AND D~WERKS = '6000'
WHERE BESTK <> 'C'
*AND  B~LFSTA <> 'C'
AND P~ABGRU = ''
AND UPDKZ <> 'D'
AND A~WERKS = P_WERKS
AND ( (     P~VSTEL IN S_VSTEL
AND A~VBELN IN S_VBELN
AND A~KUNNR IN S_KUNNR
AND VTWEG IN  S_VTWEG
AND ZZPRCTR = '0000006003'
)
OR ( KTOKD = 'Z007' AND A~KUNNR IN S_KUNNR )
*  OR   AUART IN ('ZOR9','KN')
)
AND (WHERE_ITAB)
.
*SELECT (STR)
*APPENDING CORRESPONDING FIELDS OF TABLE   ITVBAP
*FROM ZVBAP AS A
*JOIN VBAP AS P ON A~VBELN = P~VBELN AND A~VBELP = P~POSNR
*JOIN VBUP  AS B ON A~VBELN = B~VBELN AND A~VBELP = B~POSNR
*JOIN ZSDA35 AS Z ON Z~MATNR = A~MATNR AND Z~LGORT = A~LGORT
*WHERE BESTK <> 'C'
*AND P~ABGRU = ''
*AND UPDKZ <> 'D'
*AND A~WERKS = P_WERKS
*AND A~VBELN IN S_VBELN.
DATA: BEGIN OF ITM OCCURS 0,
        MATNR TYPE MATNR,
        LGORT TYPE LGORT_D,
        PSPNR TYPE PS_PSP_PNR,
        LABST TYPE LABST,
        WERKS TYPE WERKS_D,
END OF ITM.
DATA: BEGIN OF  ITXH OCCURS 0,
        KUNNR TYPE KUNNR,
        KKBER TYPE KKBER,
        KNKLI TYPE KNKLI,
        KLIMK TYPE KLIMK,
        SKFOR TYPE SKFOR,
        OFAKW TYPE SKFOR,
        OLIKW TYPE  SKFOR,
        VKORG TYPE VKORG,
END OF ITXH.
DATA: LS_LIKP LIKE LIKP.
DATA: LT_LIPS LIKE LIPS OCCURS 0 WITH HEADER LINE.
DATA: ZLOG LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA: LP LIKE SY-SUBRC.
LOOP AT ITVBAP.
CLEAR LS_LIKP.
  LS_LIKP-VKORG = ITVBAP-VKORG.
  LS_LIKP-VBELN = ITVBAP-VBELN.
  LS_LIKP-ERDAT = SY-DATUM.
  LS_LIKP-KUNIV = ITVBAP-VKORG.
  LS_LIKP-KUNIV+2(2) = '00'.
PERFORM F_ADD_ZERO USING LS_LIKP-KUNIV.
  LT_LIPS-VBELN = ITVBAP-VBELN.
  LT_LIPS-MATNR = ITVBAP-MATNR.
  LT_LIPS-WERKS = ITVBAP-WERKS.
  LT_LIPS-LFIMG = 1.
APPEND LT_LIPS.
CALL FUNCTION 'ZRFC_CHECK_ZPB2'
EXPORTING
*     IP_VBELN =
      LIKP     = LS_LIKP
IMPORTING
      EX_SUBRC = LP
TABLES
      LIPS     = LT_LIPS
      ET_LOG   = ZLOG.
IF  LP > 0.
READ TABLE ZLOG INDEX 1.
WRITE:/ ZLOG-MESSAGE.
DELETE ITVBAP.
CONTINUE.
ENDIF.
  ITXH-VKORG = ITVBAP-VKORG.
SELECT SINGLE * FROM TVKO WHERE VKORG = ITVBAP-VKORG.
SELECT SINGLE * FROM T001 WHERE BUKRS = TVKO-BUKRS.
  ITXH-KUNNR = ITVBAP-KUNNR.
  ITXH-KKBER = T001-KKBER.
COLLECT ITXH.
ENDLOOP.
**以下交货开始
DELETE ITVBAP WHERE BESTK = 'C'. "删除交完货的
DELETE ITVBAP WHERE FRZE <> ''.
DATA:  BEGIN OF ITAB OCCURS 0,
         VBELN TYPE VBELN,
         VSTEL TYPE VSTEL,
END OF ITAB.
**--处理18渠道
SORT ITVBAP.
LOOP AT ITVBAP WHERE VTWEG = '18'.
  ITAB-VBELN = ITVBAP-VBELN.
  ITAB-VSTEL = ITVBAP-VSTEL.
COLLECT ITAB.
ENDLOOP.
PERFORM GETDN18.
DELETE ITVBAP WHERE VTWEG = '18'.
DATA SSP LIKE ITXH-KLIMK.
SORT ITXH.
LOOP AT ITXH.
SELECT SINGLE KLIMK SKFOR KNKLI
INTO (ITXH-KLIMK,ITXH-SKFOR,ITXH-KNKLI)
FROM KNKK
WHERE KUNNR = ITXH-KUNNR
AND KKBER = ITXH-KKBER.
IF ITXH-KNKLI <> ITXH-KUNNR.
SELECT SINGLE KLIMK SKFOR KNKLI
INTO (ITXH-KLIMK,ITXH-SKFOR,ITXH-KNKLI)
FROM KNKK
WHERE KUNNR = ITXH-KNKLI
AND KKBER =  ITXH-KKBER.
ENDIF.
SELECT SINGLE OFAKW OLIKW
INTO (ITXH-OFAKW,ITXH-OLIKW)
FROM S067
WHERE KNKLI = ITXH-KUNNR
AND KKBER = ITXH-KKBER.
IF ITXH-KUNNR = '0010009569'.
    ITXH-KLIMK = 10009569.
ENDIF.
MODIFY ITXH.
CLEAR SSP.
  SSP = ITXH-KLIMK - ITXH-SKFOR. "超款
IF  SSP <= 0.
DELETE ITXH.
DELETE ITVBAP WHERE KUNNR = ITXH-KUNNR AND VKORG = ITXH-VKORG. "删除超款
DATA INFO_3(200).
CONCATENATE
            ITXH-KUNNR '~'
'删除超款'
INTO INFO_3.
WRITE:/ INFO_3.
ENDIF.
CLEAR ITXH.
ENDLOOP.
PERFORM GETNOMATNR.
************按交货序列号排序
LOOP AT ITVBAP.
  ITM-MATNR = ITVBAP-MATNR.
  ITM-LGORT = ITVBAP-LGORT.
  ITM-PSPNR = ITVBAP-PS_PSP_PNR.
  ITM-WERKS = ITVBAP-WERKS.
COLLECT ITM.
ENDLOOP.
SORT ITM.
LOOP AT ITM. "库存
DATA: L LIKE MARD-LABST,
        K LIKE MARD-KLABS.
IF  ITM-PSPNR IS INITIAL.
SELECT  SUM( LABST ) SUM( KLABS ) INTO (L,K) FROM MARD
WHERE WERKS = ITM-WERKS
AND MATNR = ITM-MATNR
AND LGORT = ITM-LGORT.
ELSE.
SELECT  SUM( PRLAB ) SUM( PRSPE ) INTO (L,K) FROM MSPR
WHERE WERKS = ITM-WERKS
AND MATNR = ITM-MATNR
AND LGORT = ITM-LGORT
AND PSPNR = ITM-PSPNR.
ENDIF.
  ITM-LABST = L + K.
IF ITM-LABST > 0.
MODIFY ITM.
ELSE. "删除无库存
DELETE ITVBAP WHERE MATNR = ITM-MATNR AND LGORT = ITM-LGORT
AND WERKS = ITM-WERKS
AND PS_PSP_PNR = ITM-PSPNR.
DATA INFO_2(200).
CONCATENATE
            ITM-MATNR '~'
            ITM-LGORT '~'
            ITM-PSPNR '~'
'无库存可用'
INTO INFO_2.
WRITE:/ INFO_2.
ENDIF.
ENDLOOP.
DATA: P_LFIMG LIKE ITVBAP-ZMENG.
DATA: V_ST  LIKE VBAP-KWMENG,
      TOTAL LIKE VBAP-KWMENG.
DATA INFO_1(200).
SORT ITVBAP BY BM2.
LOOP AT ITVBAP.
CLEAR INFO_1(200).
CONCATENATE
          ITVBAP-VBELN '~'
          ITVBAP-VBELP '~'
'START......'
INTO INFO_1.
WRITE:/ INFO_1.
CLEAR: V_ST,P_LFIMG.
SELECT  RFMNG   INTO V_ST
FROM VBFA
WHERE     VBELV = ITVBAP-VBELN
AND POSNV = ITVBAP-VBELP
AND VBTYP_N = 'J'.
    P_LFIMG   = P_LFIMG +  V_ST . "创建数量
CLEAR V_ST.
ENDSELECT.
  P_LFIMG = ITVBAP-ZMENG - P_LFIMG.
IF P_LFIMG <= 0.
CLEAR INFO_1(200).
CONCATENATE
            ITVBAP-VBELN '~'
            ITVBAP-VBELP '~'
'无交货数量'
INTO INFO_1.
WRITE:/ INFO_1.
ENDIF.
CHECK P_LFIMG > 0. "有交货数量
*  ***增加可用库存判断
READ TABLE ITM WITH KEY MATNR = ITVBAP-MATNR
                          LGORT = ITVBAP-LGORT
                          WERKS = ITVBAP-WERKS
                          PSPNR = ITVBAP-PS_PSP_PNR.
IF SY-SUBRC = 0.
*取占用
CLEAR TOTAL.
SELECT SINGLE SUM( OMENG ) INTO  TOTAL
FROM VBBE
WHERE WERKS = P_WERKS
AND VBTYP = 'J'
AND MATNR = ITVBAP-MATNR
AND LGORT = ITVBAP-LGORT
AND WERKS = ITVBAP-WERKS
AND PSPEL = ITM-PSPNR
GROUP BY WERKS MATNR LGORT.
CLEAR V_ST.
    V_ST = ITM-LABST - TOTAL.
IF V_ST  > 0.
IF V_ST < P_LFIMG.
        P_LFIMG = V_ST.
ENDIF.
PERFORM GENDN USING ITVBAP-VBELN ITVBAP-VBELP P_LFIMG.
ELSE.
DELETE ITVBAP WHERE MATNR = ITM-MATNR AND LGORT = ITM-LGORT
AND WERKS = ITM-WERKS
AND PS_PSP_PNR = ITM-PSPNR.
CLEAR INFO_1.
CONCATENATE
            ITVBAP-VBELN  '~'
            ITVBAP-VBELP '~'
              ITM-MATNR '~'
              ITM-LGORT '~'
              ITM-PSPNR '~'
'无可用库存'
INTO INFO_1.
WRITE:/ INFO_1.
ENDIF.
ENDIF.
ENDLOOP.
COMMIT WORK AND WAIT.
*&---------------------------------------------------------------------*
*&      Form  GENDN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_VBELN    text
*      -->P_VBELP    text
*      -->P_LFIMG    text
*      -->P_DNNO     text
*----------------------------------------------------------------------*
FORM GENDN USING P_VBELN P_VBELP P_LFIMG.
**----
*Internal Tables
**----
*Table to Hold Delivery Request
DATA: BEGIN OF TBL_REQUEST OCCURS 0.
INCLUDE STRUCTURE BAPIDELICIOUSREQUEST.
DATA: END OF TBL_REQUEST.
*Table to hold Line Items Created
DATA: BEGIN OF TBL_ITEMS OCCURS 0.
INCLUDE STRUCTURE BAPIDELICIOUSCREATEDITEMS.
DATA: END OF TBL_ITEMS.
*Table to hold BAPI Return Messages
DATA: BEGIN OF TBL_RETURN OCCURS 0.
INCLUDE STRUCTURE BAPIRET2.
DATA: END OF TBL_RETURN.
**----
*Structures
**----
DATA: ST_VBAK LIKE VBAK OCCURS 0 WITH HEADER LINE,
        ST_VBAP LIKE VBAP OCCURS 0 WITH HEADER LINE.
SELECT  VBELN KUNNR VKORG VTWEG SPART BSTDK
INTO CORRESPONDING FIELDS OF TABLE ST_VBAK
FROM VBAK
WHERE VBELN = P_VBELN.
CHECK SY-SUBRC EQ 0.
SELECT  VBELN POSNR WERKS VRKME     MEINS MATNR
INTO CORRESPONDING FIELDS OF TABLE ST_VBAP
FROM VBAP
WHERE VBELN = P_VBELN AND POSNR =  P_VBELP .
SORT ST_VBAK.
SORT ST_VBAP.
LOOP AT ST_VBAK.
LOOP AT ST_VBAP WHERE VBELN = ST_VBAK-VBELN.
      TBL_REQUEST-DOCUMENT_NUMB             = ST_VBAP-VBELN.
      TBL_REQUEST-DOCUMENT_ITEM             = ST_VBAP-POSNR.
      TBL_REQUEST-SHIP_TO                   = ST_VBAK-KUNNR.
      TBL_REQUEST-SOLD_TO                   = ST_VBAK-KUNNR.
      TBL_REQUEST-SALES_ORGANISATION        = ST_VBAK-VKORG.
      TBL_REQUEST-DISTRIBUTION_CHANNEL      = ST_VBAK-VTWEG.
      TBL_REQUEST-DIVISION                  = ST_VBAK-SPART.
      TBL_REQUEST-PLANT                     = ST_VBAP-WERKS.
      TBL_REQUEST-QUANTITY_SALES_UOM = P_LFIMG.
      TBL_REQUEST-SALES_UNIT                = ST_VBAP-VRKME.
      TBL_REQUEST-BASE_UOM                  = ST_VBAP-MEINS.
      TBL_REQUEST-MATERIAL                  = ST_VBAP-MATNR.
      TBL_REQUEST-DELIVERY_DATE             = ST_VBAK-BSTDK.
      TBL_REQUEST-DELIVERY_TIME             = SY-UZEIT.
      TBL_REQUEST-TRANSP_PLAN_DATE          = ST_VBAK-BSTDK.
      TBL_REQUEST-LOADING_DATE              = ST_VBAK-BSTDK.
      TBL_REQUEST-GOODS_ISSUE_DATE          = ST_VBAK-BSTDK.
      TBL_REQUEST-EXTDELV_NO                = ST_VBAP-VBELN.
      TBL_REQUEST-DOCUMENT_TYPE             = 'A'. "Delivery
      TBL_REQUEST-DOCUMENT_TYPE_PREDECESSOR = 'A'. "Sales Ord
      TBL_REQUEST-DOCUMENT_TYPE_DELIVERY    = 'LF'.
APPEND TBL_REQUEST.
ENDLOOP.
ENDLOOP.
CALL FUNCTION 'BAPI_DELIVERYPROCESSING_EXEC'
TABLES
      REQUEST      = TBL_REQUEST
      CREATEDITEMS = TBL_ITEMS
RETURN       = TBL_RETURN.
DATA: SINFO(200).
SORT TBL_RETURN.
LOOP AT TBL_RETURN.
CONCATENATE
            ST_VBAP-VBELN '~'
            ST_VBAP-POSNR '~'
            TBL_RETURN-TYPE '~'
            TBL_RETURN-ID '~'
            TBL_RETURN-NUMBER '~'
            TBL_RETURN-MESSAGE
INTO SINFO.
WRITE:/ SINFO.
ENDLOOP.
DATA: P_DNNO TYPE VBELN.
CLEAR P_DNNO.
IF TBL_ITEMS[] IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
READ TABLE TBL_ITEMS INDEX 1 .
IF SY-SUBRC = 0.
      P_DNNO = TBL_ITEMS-DOCUMENT_NUMB.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
WRITE:/ P_VBELN,P_VBELP,P_DNNO.
ENDIF.
IF   P_DNNO IS NOT INITIAL.
IF ITVBAP-VTWEG = '18'.
ELSE.
UPDATE LIKP SET ANZPK = ITVBAP-VTWEG  WHERE VBELN = P_DNNO.
COMMIT WORK.
ENDIF.
DATA SDATE LIKE VBAP-KANNR.
CLEAR SDATE.
SELECT SINGLE KANNR INTO SDATE FROM VBAP WHERE VBELN = ITVBAP-VBELN AND POSNR = ITVBAP-VBELP.
IF SDATE IS INITIAL.
MOVE SY-DATUM TO SDATE.
UPDATE VBAP SET KANNR = SDATE WHERE  VBELN = ITVBAP-VBELN AND POSNR = ITVBAP-VBELP.
ENDIF.
IF ITVBAP-FDATE IS INITIAL.
MOVE SY-DATUM TO SDATE.
UPDATE ZVBAP SET FDATE = SDATE WHERE  VBELN = ITVBAP-VBELN AND VBELP = ITVBAP-VBELP.
UPDATE ZVBAPH SET FDATE = SDATE WHERE  VBELN = ITVBAP-VBELN AND VBELP = ITVBAP-VBELP.
ENDIF.
ENDIF.
*  LOOP AT TBL_RETURN.
*    WRITE:/ TBL_RETURN-NUMBER,
*            TBL_RETURN-MESSAGE,
*            TBL_RETURN-MESSAGE_V1,
*            TBL_RETURN-MESSAGE_V2,
*            TBL_RETURN-MESSAGE_V3            .
*  ENDLOOP.
ENDFORM.                    "GENDN
*&---------------------------------------------------------------------*
*&      Form  GET_VBELN-LIKP
*&---------------------------------------------------------------------*
*       由SO-> DN
*----------------------------------------------------------------------*
*      -->V_ETDAT    text
*----------------------------------------------------------------------*
FORM GET_VBELN-LIKP USING V_VBELN V_VBELP.
DATA :
    APK              TYPE CHAR50,
    MATERIALDOCUMENT LIKE LIKP-VBELN,
    S_SUBRC          TYPE SY-SUBRC,
    ET_LOG           LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
IF ITVBAP-VTWEG = '18'.
CLEAR APK.
ELSE.
MOVE ITVBAP-VTWEG TO APK.
ENDIF.
CLEAR: MATERIALDOCUMENT.
CALL FUNCTION 'ZRFC_CRM_VL01N'
EXPORTING
      IN_VBELN = ITVBAP-VBELN
      IN_ANZPK = APK
      IN_VSTEL = ITVBAP-VSTEL
      IN_POSNR = ITVBAP-VBELP
      IN_MAXNR = ITVBAP-VBELP
IMPORTING
      EP_SUBRC = S_SUBRC
      OU_VBELN = MATERIALDOCUMENT
TABLES
      ET_LOG   = ET_LOG.
IF   MATERIALDOCUMENT <> ''.
WRITE /.
WRITE : ITVBAP-VBELN,ITVBAP-VBELP,MATERIALDOCUMENT.
ENDIF.
IF   MATERIALDOCUMENT <> '' AND V_VBELP IS NOT INITIAL .
DATA SDATE LIKE VBAP-KANNR.
CLEAR SDATE.
SELECT SINGLE KANNR INTO SDATE FROM VBAP WHERE VBELN = ITVBAP-VBELN AND POSNR = ITVBAP-VBELP.
IF SDATE IS INITIAL.
MOVE SY-DATUM TO SDATE.
UPDATE VBAP SET KANNR = SDATE WHERE  VBELN = ITVBAP-VBELN AND POSNR = ITVBAP-VBELP.
ENDIF.
IF ITVBAP-FDATE IS INITIAL.
MOVE SY-DATUM TO SDATE.
UPDATE ZVBAP SET FDATE = SDATE WHERE  VBELN = ITVBAP-VBELN AND VBELP = ITVBAP-VBELP.
UPDATE ZVBAPH SET FDATE = SDATE WHERE  VBELN = ITVBAP-VBELN AND VBELP = ITVBAP-VBELP.
ENDIF.
SORT ET_LOG.
LOOP AT ET_LOG.
WRITE /: ITVBAP-VBELN,ET_LOG-MESSAGE.
ENDLOOP.
ENDIF.
ENDFORM.                    "GET_VBELN-LIKP
*&---------------------------------------------------------------------*
*&      Form  GETWHERE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GETWHERE.
DATA: KWLST LIKE ZSDA18 OCCURS 0 WITH HEADER LINE. "删除不参与计算的物料
  WHERE_ITAB-TEXT = '  A~MANDT = ''800'' '.
APPEND WHERE_ITAB.
*  WRITE / WHERE_ITAB.
SELECT * INTO KWLST FROM ZSDA18.
*    IF KWLST-KUNNR IS NOT INITIAL.
*      DATA: V_K TYPE KUNNR.
*      CLEAR V_K.
*      SELECT SINGLE KUNNR INTO V_K FROM KNA1 WHERE KUNNR = KWLST-KUNNR AND  ZZPRCTR = '0000006003'.
*      CHECK V_K IS INITIAL.
*    ENDIF.
CLEAR: WHERE_ITAB.
    WHERE_ITAB-TEXT = ' AND NOT  ( A~MANDT = ''800'' '.
IF KWLST-KUNNR IS NOT INITIAL.
CONCATENATE WHERE_ITAB-TEXT  ' and a~KUNNR  = ''' KWLST-KUNNR ''''  INTO WHERE_ITAB-TEXT.
ENDIF.
IF KWLST-LGORT IS NOT INITIAL .
CONCATENATE  WHERE_ITAB-TEXT  ' and a~LGORT  =  '''  KWLST-LGORT '''' INTO WHERE_ITAB-TEXT.
ENDIF.
IF KWLST-MATNR IS NOT INITIAL .
CONCATENATE WHERE_ITAB-TEXT  ' and A~MATNR  = ''' KWLST-MATNR '''' INTO WHERE_ITAB-TEXT.
ENDIF.
IF KWLST-VTWEG IS NOT INITIAL .
CONCATENATE WHERE_ITAB-TEXT  ' and a~VTWEG  = ''' KWLST-VTWEG '''' INTO WHERE_ITAB-TEXT.
ENDIF.
CONCATENATE WHERE_ITAB-TEXT  ' ) ' INTO WHERE_ITAB-TEXT.
WRITE / WHERE_ITAB.
APPEND WHERE_ITAB.
ENDSELECT.
ENDFORM.                    "getWhere
*&---------------------------------------------------------------------*
*&      Form  GetNoMatnr
*&---------------------------------------------------------------------*
*       删除不计算的物料条件 客户 物料 库位
*----------------------------------------------------------------------*
FORM GETNOMATNR.
DELETE ITVBAP WHERE   LGORT  = '6014'. "删除永不交货的库位
DELETE ITVBAP WHERE   VTWEG  = '18'. "18渠道永不交货
ENDFORM.                    "GetNoMatnr
*&---------------------------------------------------------------------*
*&      Form  GETDN18
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GETDN18 .
DATA :
    MATERIALDOCUMENT LIKE LIKP-VBELN,
    S_SUBRC          TYPE SY-SUBRC.
SORT ITAB.
LOOP AT ITAB.
CLEAR MATERIALDOCUMENT.
DATA:
      V_ANZPK   TYPE CHAR50,
      V_POSNR   TYPE CHAR50,
      V_MAXNR   TYPE CHAR50,
      V_BOLNR   LIKE LIKP-BOLNR,
      MSG(1000),
      ET_LOG    LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
CLEAR: V_ANZPK,V_POSNR.
*    MOVE '18' TO V_ANZPK.
MOVE '1' TO V_POSNR.
MOVE '9999' TO V_MAXNR.
*    IF ITAB-VTWEG = '18'.
*      CLEAR V_ANZPK.
*      V_MAXNR = '9999'.
*    ENDIF.
CLEAR: ET_LOG,ET_LOG[].
CALL FUNCTION 'ZRFC_CRM_VL01N'
EXPORTING
        IN_VBELN = ITAB-VBELN
        IN_ANZPK = V_ANZPK
        IN_VSTEL = ITAB-VSTEL
        IN_POSNR = V_POSNR
        IN_MAXNR = V_MAXNR
IMPORTING
        EP_SUBRC = S_SUBRC
        OU_VBELN = MATERIALDOCUMENT
TABLES
        ET_LOG   = ET_LOG.
IF   MATERIALDOCUMENT <> ''.
WRITE : ITAB-VBELN,MATERIALDOCUMENT.
ELSE.
SORT ET_LOG.
LOOP AT ET_LOG.
CONCATENATE ITAB-VBELN
                ET_LOG-TYPE
                ET_LOG-ID
                ET_LOG-NUMBER
                ET_LOG-MESSAGE
INTO MSG.
WRITE / : MSG.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDFORM.                    "GetDN
INCLUDE ZRPT_FUN.

上一篇:UVa 12590 - Guards II (组合数学+容斥)


下一篇:concatenate of numpy