CREATE SO BY PO

FUNCTION ZXCSD_CREATE_SO_BY_PO.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_EBELN) TYPE  EKKO-EBELN OPTIONAL
*"     VALUE(IV_STAMP) TYPE  TIMESTAMPL OPTIONAL
*"  EXPORTING
*"     VALUE(OV_VBELN) TYPE  VBAK-VBELN
*"     VALUE(OV_MSG_TYP) TYPE  BAPI_MTYPE
*"     VALUE(OV_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------

  "break jiatai_lcx.
***用于异步检查是否已经更新完毕
  DATA:LV_COUNT TYPE I.
  CLEAR LV_COUNT.
  LV_COUNT 0.


  DO 10 TIMES.

    WAIT UP TO 1 SECONDS.

    SELECT SINGLE * INTO @DATA(WA_EKKO)
      FROM EKKO
      WHERE EBELN = @IV_EBELN.

    SELECT SINGLE *
      INTO  @DATA(LS_ZSDLJT007)
       FROM ZLJSDT007
      WHERE EBELN = @IV_EBELN
        AND STAMP = @IV_STAMP
     .

    IF WA_EKKO-EBELN IS NOT INITIAL AND LS_ZSDLJT007-EBELN = IV_EBELN AND LS_ZSDLJT007-STAMP = IV_STAMP.

      EXIT.

    ENDIF.


    LV_COUNT = LV_COUNT + 1.
  ENDDO.
****等待10秒检查数据是否已经进入数据库。如果没有进入则无意义 结束创建过程
  IF LV_COUNT EQ 10.

    RETURN.

  ENDIF.




  SELECT SINGLE BSTKD INTO @DATA(LV_BSTKD)
  FROM VBKD
    WHERE BSTKD = @IV_EBELN.

***检查SO是否创建   存在就更改 否则就创建

  IF SY-SUBRC EQ 0.

    PERFORM FRM_CHANGE_SO USING IV_EBELN
                                                        CHANGING OV_VBELN
                                                          OV_MSG_TYP
                                                          OV_MSG.

  ELSE.

    PERFORM FRM_CREATE_SO USING IV_EBELN
                                                     CHANGING OV_VBELN
                                                          OV_MSG_TYP
                                                          OV_MSG..

  ENDIF.

  DATA:LT_ZLJSDT007 TYPE STANDARD TABLE OF ZLJSDT007 .
  DATA:LS_ZLJSDT007 TYPE ZLJSDT007.

  REFRESH LT_ZLJSDT007.
  CLEAR LS_ZLJSDT007.

  LS_ZLJSDT007-EBELN = IV_EBELN.
  LS_ZLJSDT007-STAMP = IV_STAMP.
  LS_ZLJSDT007-MSG_TYPE = OV_MSG_TYP.
  LS_ZLJSDT007-MESSAGE =  OV_MSG.

  APPEND LS_ZLJSDT007 TO LT_ZLJSDT007.
  MODIFY ZLJSDT007 FROM TABLE LT_ZLJSDT007.


  IF OV_MSG_TYP 'S'.
    UPDATE ZLJSDT007  SET MSG_TYPE 'S'
                                          MESSAGE  ''
    WHERE EBELN = IV_EBELN
       AND STAMP <= IV_STAMP.


  ENDIF.


ENDFUNCTION.

FORM FRM_CHANGE_SO USING IV_EBELN TYPE EKKO-EBELN
                                             CHANGING OV_VBELN TYPE VBAK-VBELN
                                                                  OV_MSG_TYP TYPE BAPI_MTYPE
                                                                  OV_MSG TYPE BAPI_MSG.

  DATA:
    LS_H_INX            TYPE BAPISDH1X,
    LT_ITEM_IN          TYPE STANDARD TABLE OF BAPISDITM,
    LS_ITEM_IN          TYPE BAPISDITM,
    LT_ITEM_INX         TYPE STANDARD TABLE OF BAPISDITMX,
    LS_ITEM_INX         TYPE BAPISDITMX,
    LS_COND_IN          TYPE BAPICOND,
    LT_COND_IN          TYPE STANDARD TABLE OF BAPICOND,
    LS_COND_INX         TYPE BAPICONDX,
    LT_COND_INX         TYPE STANDARD TABLE OF BAPICONDX,

    ORDER_SCHEDULES_IN  LIKE BAPISCHDL  OCCURS WITH HEADER LINE,   "计划行
    ORDER_SCHEDULES_INX LIKE BAPISCHDLX OCCURS WITH HEADER LINE,
    LT_RETURN           TYPE STANDARD TABLE OF BAPIRET2.

  DATA:LV_SUS   TYPE C.
  DATA:LV-VBELN TYPE VBAK-VBELN.

  SELECT * INTO TABLE @DATA(LT_ZXCSD008)
    FROM ZLJSDT008.

  SELECT * INTO TABLE @DATA(LT_EKET)
    FROM EKET
    WHERE EBELN = @IV_EBELN.


  SELECT * INTO TABLE @DATA(LT_EKPO)
    FROM EKPO
    WHERE EBELN = @IV_EBELN.

  SELECT * INTO TABLE @DATA(LT_EKKO)
    FROM EKKO
    WHERE EBELN = @IV_EBELN.
  READ TABLE LT_EKKO INTO DATA(LS_EKKOINDEX 1.
  IF SY-SUBRC EQ .
    READ TABLE LT_ZXCSD008 INTO DATA(LS_ZLJSDT008WITH KEY BUKRS = LS_EKKO-BUKRS  LIFNR = LS_EKKO-LIFNR.
  ENDIF.

  DATA(LV_COUNTLINES( LT_EKPO ).
  SELECT * INTO TABLE @DATA(LT_VBKD)
    FROM VBKD
    WHERE BSTKD = @IV_EBELN.

****价格条件号
  SELECT SINGLE KNUMV
    FROM EKKO
    INTO @DATA(LV_KNUMV)
  WHERE EBELN = @IV_EBELN.

  DATA(LV_WHERE= | KSCHL 'ZP00'|.
****信息记录
  TRY .
      SELECT *
        FROM PRCD_ELEMENTS
      WHERE KNUMV = @LV_KNUMV
         AND (LV_WHERE)
      INTO TABLE @DATA(LT_PRCD_ELEMENTS).

    CATCH CX_ROOT INTO DATA(LO_ERROR).
      DATA(LV_MSG= LO_ERROR->GET_TEXT).
  ENDTRY.



  DATA(LV_COUNT1LINES( LT_VBKD ).

  READ TABLE LT_VBKD INTO DATA(LS_VBKDINDEX 1.
  IF SY-SUBRC EQ 0.

    SELECT * INTO TABLE @DATA(LT_VBAP)
      FROM VBAP
      WHERE VBELN = @LS_VBKD-VBELN.

  ENDIF.

  LOOP AT LT_EKPO INTO DATA(LS_EKPO).

    DATA:LV_POSNR TYPE VBAP-POSNR.

    LV_POSNR = LS_EKPO-EBELP.

    CLEAR:
       LS_H_INX,
       LS_ITEM_IN ,
       LS_ITEM_INX ,
       LS_COND_IN ,
       LS_COND_INX.
    REFRESH:
LT_ITEM_IN    ,
LT_ITEM_INX    ,
LT_COND_IN      ,
LT_COND_INX      ,
ORDER_SCHEDULES_IN,
ORDER_SCHEDULES_INX,
LT_RETURN           .





    READ TABLE  LT_VBAP INTO DATA(LS_VBAP)  WITH KEY POSNR = LV_POSNR.
    IF SY-SUBRC EQ 0.
      DATA(LV_VBELNA= LS_VBAP-VBELN.

      DATA(LV_FLAG'U'.
      DATA(LV_FLAG1'I'.
      IF LS_EKPO-LOEKZ 'L' AND LS_VBAP-ABGRU IS INITIAL .
        LS_ITEM_IN-REASON_REJ 'Z1'.
        LS_ITEM_INX-REASON_REJ 'X'.
      ELSE.

        DATA(LV_MARK'X'.  "不再需要处理

        CLEAR LV_MARK.

      ENDIF.

      LS_ITEM_IN-ITM_NUMBER = LV_POSNR.
      LS_ITEM_IN-TARGET_QTY = LS_EKPO-MENGE.

*     物料      LS_ITEM_IN
-MATERIAL  = LS_EKPO-MATNR.      LS_ITEM_INX
-MATERIAL  'X'.
*     工厂      LS_ITEM_IN
-PLANT  = LS_ZLJSDT008-WERKS.      LS_ITEM_INX
-PLANT  'X'.
*     库存地点      LS_ITEM_IN
-STORE_LOC  = LS_ZLJSDT008-LGORT."'EFW1'."LS_EKPO1-lgort.      LS_ITEM_INX
-STORE_LOC  'X'.
*     单位      LS_ITEM_IN
-SALES_UNIT  = LS_EKPO-MEINS.      LS_ITEM_INX
-SALES_UNIT  'X'.
**     采购订单单位      LS_ITEM_IN
-PURCH_NO_C  = LS_EKPO-EBELN.      LS_ITEM_INX
-PURCH_NO_C  'X'.
*     采购订单单位      LS_ITEM_IN
-PO_ITM_NO  = LS_EKPO-EBELP.      LS_ITEM_INX
-PO_ITM_NO  'X'.      

APPEND LS_ITEM_IN TO LT_ITEM_IN.      LS_ITEM_INX

-ITM_NUMBER = LS_VBAP-POSNR.      LS_ITEM_INX
-UPDATEFLAG = LV_FLAG.      LS_ITEM_INX
-TARGET_QTY 'X'.      
APPEND LS_ITEM_INX TO LT_ITEM_INX.      


READ TABLE LT_EKET INTO DATA(LS_EKETWITH KEY EBELN = LS_EKPO-EBELN  EBELP = LS_EKPO-EBELP.      
IF SY-SUBRC EQ 0.        BREAK JIATAI_LCX

.        ORDER_SCHEDULES_IN

-REQ_DATE = LS_EKET-EINDT.        ORDER_SCHEDULES_INX
-REQ_DATE 'X'.      

ENDIF.      ORDER_SCHEDULES_IN

-ITM_NUMBER = LV_POSNR .      ORDER_SCHEDULES_IN
-SCHED_LINE 1.      ORDER_SCHEDULES_IN
-REQ_QTY = LS_EKPO-MENGE.      
APPEND ORDER_SCHEDULES_IN.      ORDER_SCHEDULES_INX





-UPDATEFLAG = LV_FLAG.      ORDER_SCHEDULES_INX
-ITM_NUMBER = LV_POSNR .      ORDER_SCHEDULES_INX
-SCHED_LINE 1.      ORDER_SCHEDULES_INX
-REQ_QTY    'X'.      
APPEND ORDER_SCHEDULES_INX.      


READ TABLE LT_PRCD_ELEMENTS INTO DATA(LS_PRICE)                                                    
WITH KEY KPOSN = LS_VBAP-POSNR.      
IF SY-SUBRC 0.        LS_COND_IN
-ITM_NUMBER = LV_POSNR.        LS_COND_IN
-COND_VALUE = LS_EKPO-NETPR."LS_PRICE-KBETR.        LS_COND_IN
-COND_TYPE  'ZP00'.
*     ls_cond_in-cond_type  = 'ZPR0'.        LS_COND_IN
-CURRENCY   'CNY'.        LS_COND_IN
-COND_P_UNT = LS_EKPO-PEINH.        
"LS_COND_IN-COND_UNIT = LS_PRICE-KMEIN.        
APPEND LS_COND_IN TO LT_COND_IN.        LS_COND_INX

-ITM_NUMBER = LV_POSNR.        LS_COND_INX
-COND_TYPE  = ABAP_TRUE.        LS_COND_INX
-COND_VALUE = ABAP_TRUE.        LS_COND_INX
-CURRENCY   = ABAP_TRUE.        LS_COND_INX
-UPDATEFLAG = LV_FLAG.        LS_COND_INX
-COND_P_UNT  = ABAP_TRUE.        LS_COND_INX
-COND_UNIT     = ABAP_TRUE.        
APPEND LS_COND_INX TO LT_COND_INX.      
ENDIF.      LS_H_INX

-UPDATEFLAG 'U'.      

IF LV_MARK  IS INITIAL.        
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'          
EXPORTING            SALESDOCUMENT    
= LV_VBELNA            ORDER_HEADER_INX 
= LS_H_INX          
TABLES            
RETURN           = LT_RETURN            ORDER_ITEM_IN    
= LT_ITEM_IN            ORDER_ITEM_INX   
= LT_ITEM_INX            SCHEDULE_LINES   
= ORDER_SCHEDULES_IN            SCHEDULE_LINESX  
= ORDER_SCHEDULES_INX            CONDITIONS_IN    
= LT_COND_IN            CONDITIONS_INX   
= LT_COND_INX.        


"break jiatai_lcx.        
LOOP AT LT_RETURN INTO DATA(LS_RETURNWHERE TYPE CA 'AEX'.          
EXIT.        
ENDLOOP.        
IF SY-SUBRC 0.          
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.          OV_MSG_TYP 
'E'.          OV_MSG 
'销售订单修改失败' .        
ELSE.          
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'            
EXPORTING              
WAIT 'X'.          OV_MSG_TYP 
'S'.          
CONCATENATE  LV_VBELNA  '销售订单修改成功 '   INTO OV_MSG  .        
ENDIF.      
ENDIF.    
ELSE."匹配不上的就是新增数据      

CLEAR:         LS_H_INX
,         LS_ITEM_IN 
,         LS_ITEM_INX 
,         LS_COND_IN 
,         LS_COND_INX
.      
REFRESH:  LT_ITEM_IN    
,  LT_ITEM_INX    
,  LT_COND_IN      
,  LT_COND_INX      
,  ORDER_SCHEDULES_IN
,  ORDER_SCHEDULES_INX
,  LT_RETURN           
.      LV_FLAG 


'I'.      
IF LS_EKPO-LOEKZ 'X'.        LS_ITEM_IN

-REASON_REJ 'Z01'.        LS_ITEM_INX
-REASON_REJ 'X'.      
ELSE.      


ENDIF.

*     明细      LS_ITEM_IN
-ITM_NUMBER  = LS_EKPO-EBELP.      LS_ITEM_INX
-ITM_NUMBER  = LS_EKPO-EBELP.

*     物料      LS_ITEM_IN
-MATERIAL  = LS_EKPO-MATNR.      LS_ITEM_INX
-MATERIAL  'X'.
*     工厂      LS_ITEM_IN
-PLANT  = LS_ZLJSDT008-WERKS.      LS_ITEM_INX
-PLANT  'X'.
*     库存地点      LS_ITEM_IN
-STORE_LOC  = LS_ZLJSDT008-LGORT.      LS_ITEM_INX
-STORE_LOC  'X'.
*     单位      LS_ITEM_IN
-SALES_UNIT  = LS_EKPO-MEINS.      LS_ITEM_INX
-SALES_UNIT  'X'.
**     采购订单单位      LS_ITEM_IN
-PURCH_NO_C  = LS_EKPO-EBELN.      LS_ITEM_INX
-PURCH_NO_C  'X'.
*     采购订单单位      LS_ITEM_IN
-PO_ITM_NO  = LS_EKPO-EBELP.      LS_ITEM_INX
-PO_ITM_NO  'X'.      LS_ITEM_IN


-ITEM_CATEG = LS_ZLJSDT008-PSTYV"销售凭证行项目类型      LS_ITEM_INX
-ITEM_CATEG 'X'.      LS_ITEM_INX

-UPDATEFLAG = LV_FLAG.      LS_ITEM_IN

-TARGET_QTY = LS_EKPO-MENGE.      LS_ITEM_INX
-TARGET_QTY 'X'.      

APPEND LS_ITEM_IN TO LT_ITEM_IN.      
APPEND LS_ITEM_INX TO LT_ITEM_INX.      ORDER_SCHEDULES_IN

-ITM_NUMBER = LS_EKPO-EBELP.      ORDER_SCHEDULES_INX
-ITM_NUMBER = LS_EKPO-EBELP.

*     数量      ORDER_SCHEDULES_IN
-REQ_QTY = LS_EKPO-MENGE.      ORDER_SCHEDULES_INX
-REQ_QTY 'X'.      ORDER_SCHEDULES_INX
-UPDATEFLAG = LV_FLAG1 .      

READ TABLE LT_EKET INTO LS_EKET WITH KEY EBELN = LS_EKPO-EBELN  EBELP = LS_EKPO-EBELP.      
IF SY-SUBRC EQ 0.        BREAK JIATAI_LCX
.        ORDER_SCHEDULES_IN

-REQ_DATE = LS_EKET-EINDT.        ORDER_SCHEDULES_INX
-REQ_DATE 'X'.      

ENDIF.      


APPEND ORDER_SCHEDULES_IN .      
CLEAR  ORDER_SCHEDULES_IN.      
APPEND ORDER_SCHEDULES_INX .      
CLEAR  ORDER_SCHEDULES_INX.      



READ TABLE LT_PRCD_ELEMENTS INTO DATA(LS_PRCD_ELEMENTS)                                   
WITH KEY KPOSN = LS_EKPO-EBELP.      
IF SY-SUBRC 0.        LS_COND_IN
-ITM_NUMBER = LS_EKPO-EBELP.        LS_COND_IN
-COND_VALUE = LS_EKPO-NETPR.""LS_PRCD_ELEMENTS-KBETR.        
"LS_COND_IN-COND_TYPE  = LS_PRCD_ELEMENTS-KSCHL.        LS_COND_IN
-COND_TYPE  'ZP00'.        LS_COND_IN
-CURRENCY   'CNY'.        LS_COND_IN
-COND_P_UNT = LS_EKPO-PEINH.""LS_PRCD_ELEMENTS-KPEIN.        
"LS_COND_IN-COND_UNIT = LS_PRCD_ELEMENTS-KMEIN.        
APPEND LS_COND_IN TO LT_COND_IN.        
CLEAR LS_COND_IN.        LS_COND_INX

-ITM_NUMBER = LS_EKPO-EBELP.        LS_COND_INX
-COND_VALUE = ABAP_TRUE.        LS_COND_INX
-COND_TYPE  = ABAP_TRUE.        LS_COND_INX
-CURRENCY   = ABAP_TRUE.        LS_COND_INX
-UPDATEFLAG = LV_FLAG.        LS_COND_INX
-COND_P_UNT  = ABAP_TRUE.        LS_COND_INX
-COND_UNIT     = ABAP_TRUE.        

APPEND LS_COND_INX TO LT_COND_INX.        
CLEAR LS_COND_INX.      
ENDIF.      LS_H_INX

-UPDATEFLAG 'U'.      

CALL FUNCTION 'BAPI_SALESORDER_CHANGE'        
EXPORTING          SALESDOCUMENT    
= LV_VBELNA          ORDER_HEADER_INX 
= LS_H_INX        
TABLES          
RETURN           = LT_RETURN          ORDER_ITEM_IN    
= LT_ITEM_IN          ORDER_ITEM_INX   
= LT_ITEM_INX          SCHEDULE_LINES   
= ORDER_SCHEDULES_IN          SCHEDULE_LINESX  
= ORDER_SCHEDULES_INX          CONDITIONS_IN    
= LT_COND_IN          CONDITIONS_INX   
= LT_COND_INX.      


"break jiatai_lcx.      
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE CA 'AEX'.        
EXIT.      
ENDLOOP.      
IF SY-SUBRC 0.        
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.        OV_MSG_TYP 
'E'.        
" OV_MSG = '销售订单修改失败' .        
LOOP AT LT_RETURN INTO DATA(LS_RETUWHERE TYPE NE 'S'.          

CONCATENATE OV_MSG LS_RETU-MESSAGE INTO OV_MSG.        

ENDLOOP.      
ELSE.        
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'          
EXPORTING            
WAIT 'X'.        OV_MSG_TYP 
'S'.        
CONCATENATE  LV_VBELNA  '销售订单修改成功 '   INTO OV_MSG  .      
ENDIF.    

ENDIF.  




ENDLOOP.




ENDFORM.


FORM FRM_CREATE_SO  USING IV_EBELN TYPE EKKO-EBELN                                           
CHANGING OV_VBELN TYPE VBAK-VBELN                                                                  OV_MSG_TYP 
TYPE BAPI_MTYPE                                                                  OV_MSG 
TYPE BAPI_MSG  
.  
DATA:LV_VBELN         TYPE BAPIVBELN-VBELN,       LS_HEADER_IN     
TYPE BAPISDHD1,       LS_HEADER_INX    
TYPE BAPISDHD1X,       LT_ITEMS_IN      
TYPE TABLE OF BAPISDITM  WITH HEADER LINE,       LT_ITEMS_INX     
TYPE TABLE OF BAPISDITMX WITH HEADER LINE,       LT_SCHEDULES_IN  
LIKE TABLE OF BAPISCHDL  WITH HEADER LINE,       LT_SCHEDULES_INX 
LIKE TABLE OF BAPISCHDLX WITH HEADER LINE,       LT_CONDITION_IN  
LIKE TABLE OF BAPICOND   WITH HEADER LINE,   "定价条件       LT_CONDITION_INX 
LIKE TABLE OF BAPICONDX  WITH HEADER LINE,       LT_PARTNERS      
TYPE TABLE OF BAPIPARNR  WITH HEADER LINE,       LT_RETURN        
TYPE TABLE OF BAPIRET2   WITH HEADER LINE.  
FIELD-SYMBOLS:    <FS_HEADER_IN>     
LIKE BAPISDHD1,    <FS_HEADER_INX>    
LIKE BAPISDHD1X,    <FS_ITEMS_IN>      
LIKE BAPISDITM,    <FS_ITEMS_INX>     
LIKE BAPISDITMX,    <FS_SCHEDULES_IN>  
LIKE BAPISCHDL,    <FS_SCHEDULES_INX> 
LIKE BAPISCHDLX.  

FIELD-SYMBOLS:<FS_GET>,                <FS_SET>
,                <FS_SETX>
.  
DATA:LW_POSNR     TYPE POSNR_VA.  
DATA:LV_FIELDNAME TYPE CHAR50.  
DATA:LV_VALUENAME TYPE CHAR50.  
DATA:LV_WHERE     TYPE STRING.  
DATA:LV_ERROR     TYPE C.  
DATA:LV_SUS       TYPE C.  

SELECT * INTO TABLE @DATA(LT_EKET)    
FROM EKET    
WHERE EBELN = @IV_EBELN.  


SELECT SINGLE *    
FROM EKKO    
INTO @DATA(LS_EKKO)  
WHERE EBELN = @IV_EBELN    
.  

SELECT SINGLE RETPO INTO @DATA(LV_RETPO)    
FROM EKPO    
WHERE EBELN = @IV_EBELN        
AND RETPO 'X'.  




DATA(LV_LIFNR= LS_EKKO-LIFNR.  LV_LIFNR 
= |{ LV_LIFNR ALPHA IN }|.

*   获取采购单据转销售单配置表  
SELECT *    
FROM ZLJSDT006  
INTO TABLE @DATA(LT_ZLJSDT006)  
WHERE BUKRS = @LS_EKKO-BUKRS    
AND LIFNR = @LV_LIFNR    
AND BSART =  @LS_EKKO-BSART    
AND RETPO = @LV_RETPO       
.  

IF  LT_ZLJSDT006 IS NOT  INITIAL.    
SHIFT LV_LIFNR LEFT DELETING LEADING '0'.

*     获取采购单据转销售单配置表    
SELECT *      
FROM ZLJSDT006    
INTO TABLE @LT_ZLJSDT006    
WHERE BUKRS = @LS_EKKO-BUKRS      
AND LIFNR = @LV_LIFNR      
AND BSART =  @LS_EKKO-BSART      
AND RETPO = @LV_RETPO      
.    
IF SY-SUBRC <> OR LT_ZLJSDT006 IS INITIAL.      OV_MSG_TYP 
'E'.      OV_MSG 
'配置数据未读取到'.    
ENDIF.    


IF LV_ERROR IS INITIAL.      

SELECT SINGLE KNUMV        
FROM EKKO        
INTO @DATA(LV_KNUMV)      
WHERE EBELN = @LS_EKKO-EBELN.      LV_WHERE 

= | KSCHL 'ZP00'|.      

TRY .          
SELECT *            
FROM PRCD_ELEMENTS          
WHERE KNUMV = @LV_KNUMV             
AND (LV_WHERE)          
INTO TABLE @DATA(LT_PRCD_ELEMENTS).        

CATCH CX_ROOT INTO DATA(LO_ERROR).          
DATA(LV_MSG= LO_ERROR->GET_TEXT).      
ENDTRY.      

SELECT * INTO TABLE @DATA(LT_ZXCSD008)        
FROM ZLJSDT008.      

READ TABLE LT_ZXCSD008 INTO DATA(LS_ZLJSDT008WITH KEY BUKRS = LS_EKKO-BUKRS  LIFNR = LS_EKKO-LIFNR RETPO = LV_RETPO.      LS_HEADER_IN

-BILL_DATE   = SY-DATUM.           " 出具发票索引和打印的出具发票日期      LS_HEADER_IN
-DOC_DATE    = SY-DATUM.           " 凭证日期      LS_HEADER_IN
-DOC_TYPE    = LS_ZLJSDT008-AUART.     " 销售凭证类型   ”固定    ASSIGN LS_HEADER_IN TO <FS_HEADER_IN>.      LS_HEADER_IN
-SALES_ORG   = LS_ZLJSDT008-VKORG.     " 销售机构    ASSIGN LS_HEADER_INX TO <FS_HEADER_INX>.      LS_HEADER_IN
-DISTR_CHAN  = LS_ZLJSDT008-VTWEG.     " 分销渠道      LS_HEADER_IN
-DIVISION    = LS_ZLJSDT008-SPART.     " 产品组      LS_HEADER_IN
-PURCH_NO_C  = LS_EKKO-EBELN.   " 客户参考      LS_HEADER_INX

-BILL_DATE   'X'.               " 出具发票索引和打印的出具发票日期      LS_HEADER_INX
-DOC_DATE    'X'.               " 凭证日期      LT_PARTNERS-PARTN_ROLE = 'AG'.      LS_HEADER_INX
-DOC_TYPE    'X'.               " 销售凭证类型   ”固定      LT_PARTNERS-PARTN_NUMB = <FS_GET>.      LS_HEADER_INX
-SALES_ORG   'X'.               " 销售机构      APPEND LT_PARTNERS.      LS_HEADER_INX
-DISTR_CHAN  'X'.               " 分销渠道      LS_HEADER_INX
-DIVISION    'X'.               " 产品组      LT_PARTNERS-PARTN_ROLE = 'WE'.      LS_HEADER_INX
-PURCH_NO_C  'X'.               " 客户参考      LT_PARTNERS-PARTN_NUMB = <FS_GET>.      LT_PARTNERS

-PARTN_ROLE 'AG'.      LT_PARTNERS
-PARTN_NUMB = LS_ZLJSDT008-KUNAG.      
APPEND LT_PARTNERS.      LT_PARTNERS
-PARTN_ROLE 'WE'.      LT_PARTNERS
-PARTN_NUMB = LS_ZLJSDT008-KUNWE.      
APPEND LT_PARTNERS.      

SELECT *        
INTO TABLE @DATA(LT_EKPO)        
FROM EKPO        
WHERE EBELN = @IV_EBELN.      

LOOP AT LT_EKPO INTO DATA(LS_DATA).        
CLEAR:LT_ITEMS_IN,              LT_ITEMS_INX
,              LT_SCHEDULES_IN
,              LT_SCHEDULES_INX
.


*     明细        LT_ITEMS_IN
-ITM_NUMBER  = LS_DATA-EBELP.        LT_ITEMS_INX
-ITM_NUMBER  = LS_DATA-EBELP.

*     物料        LT_ITEMS_IN
-MATERIAL  = LS_DATA-MATNR.        LT_ITEMS_INX
-MATERIAL  'X'.
*     工厂        LT_ITEMS_IN
-PLANT  = LS_ZLJSDT008-WERKS.        LT_ITEMS_INX
-PLANT  'X'.
*     库存地点        LT_ITEMS_IN
-STORE_LOC  = LS_ZLJSDT008-LGORT.        LT_ITEMS_INX
-STORE_LOC  'X'.
*     单位        LT_ITEMS_IN
-SALES_UNIT  = LS_DATA-MEINS.        LT_ITEMS_INX
-SALES_UNIT  'X'.
*     采购订单单位        LT_ITEMS_IN
-PURCH_NO_C  = LS_DATA-EBELN.        LT_ITEMS_INX
-PURCH_NO_C  'X'.
*     采购订单单位        LT_ITEMS_IN
-PO_ITM_NO  = LS_DATA-EBELP.        LT_ITEMS_INX
-PO_ITM_NO  'X'.        LT_ITEMS_IN


-ITEM_CATEG = LS_ZLJSDT008-PSTYV"销售凭证行项目类型        LT_ITEMS_INX
-ITEM_CATEG 'X'.        

APPEND LT_ITEMS_IN.        
APPEND LT_ITEMS_INX.        LT_SCHEDULES_IN

-ITM_NUMBER = LS_DATA-EBELP.        LT_SCHEDULES_INX
-ITM_NUMBER = LS_DATA-EBELP.

*     数量        LT_SCHEDULES_IN
-REQ_QTY = LS_DATA-MENGE.        LT_SCHEDULES_INX
-REQ_QTY 'X'.        

READ TABLE LT_EKET INTO DATA(LS_EKETWITH KEY EBELN = LS_DATA-EBELN  EBELP = LS_DATA-EBELP.        
IF SY-SUBRC EQ 0.          BREAK JIATAI_LCX
.          LT_SCHEDULES_IN

-REQ_DATE = LS_EKET-EINDT.          LT_SCHEDULES_INX
-REQ_DATE 'X'.        

ENDIF.        


APPEND LT_SCHEDULES_IN TO LT_SCHEDULES_IN.        
CLEAR  LT_SCHEDULES_IN.        
APPEND LT_SCHEDULES_INX TO LT_SCHEDULES_INX.        
CLEAR  LT_SCHEDULES_INX.        



READ TABLE LT_PRCD_ELEMENTS INTO DATA(LS_PRCD_ELEMENTS)                                     
WITH KEY KPOSN = LS_DATA-EBELP.        
IF SY-SUBRC 0.          LT_CONDITION_IN
-ITM_NUMBER = LS_DATA-EBELP.          LT_CONDITION_IN
-COND_VALUE = LS_DATA-NETPR."LS_PRCD_ELEMENTS-KBETR.          LT_CONDITION_IN
-COND_TYPE  = LS_PRCD_ELEMENTS-KSCHL.          LT_CONDITION_IN
-COND_TYPE  'ZP00'.          LT_CONDITION_IN
-CURRENCY   'CNY'.          LT_CONDITION_IN
-COND_P_UNT = LS_DATA-PEINH."LS_PRCD_ELEMENTS-KPEIN.          LT_CONDITION_IN

-COND_UNIT = LS_PRCD_ELEMENTS-KMEIN.          
APPEND LT_CONDITION_IN.          
CLEAR LT_CONDITION_IN.          LT_CONDITION_INX

-ITM_NUMBER = LS_DATA-EBELP.          LT_CONDITION_INX
-COND_VALUE = ABAP_TRUE.          LT_CONDITION_INX
-COND_TYPE  = ABAP_TRUE.          LT_CONDITION_INX
-CURRENCY   = ABAP_TRUE.          
APPEND LT_CONDITION_INX.          
CLEAR LT_CONDITION_INX.        
ENDIF.      

ENDLOOP.      

CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'        
EXPORTING          SALES_HEADER_IN      
= LS_HEADER_IN          SALES_HEADER_INX     
= LS_HEADER_INX        
IMPORTING          SALESDOCUMENT_EX     
= LV_VBELN        
TABLES          
RETURN               = LT_RETURN          SALES_ITEMS_IN       
= LT_ITEMS_IN          SALES_ITEMS_INX      
= LT_ITEMS_INX          SALES_PARTNERS       
= LT_PARTNERS          SALES_SCHEDULES_IN   
= LT_SCHEDULES_IN          SALES_SCHEDULES_INX  
= LT_SCHEDULES_INX          SALES_CONDITIONS_IN  
= LT_CONDITION_IN          SALES_CONDITIONS_INX 
= LT_CONDITION_INX.      

"   BREAK-POINT .      

IF LV_VBELN IS NOT INITIAL.        
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'          
EXPORTING            
WAIT 'X'.        OV_MSG_TYP 
'S'.        
CONCATENATE LV_VBELN '创建成功' INTO OV_MSG.      
ELSE.        
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.        OV_MSG_TYP 
'E'.        
" OV_MSG = 'SO创建失败'.        
LOOP AT LT_RETURN INTO DATA(LS_RETUWHERE TYPE NE 'S'.          

CONCATENATE OV_MSG LS_RETU-MESSAGE INTO OV_MSG.        

ENDLOOP.      
ENDIF.    
ENDIF.  
ENDIF.

ENDFORM.
posted @   我肉山  阅读(113)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示