ABAP SO创建接口(开发笔记)
FUNCTION ZOA_SD_SO_CREATE.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IM_HEAD) TYPE ZTS_SO_CREATE_HEAD
*" EXPORTING
*" VALUE(RS_TAB_OUT) TYPE ZTS_SO_CREATE_RETURN
*" TABLES
*" PT_ITEM STRUCTURE ZTS_SO_CREATE_ITEM OPTIONAL
*" IT_TAB_OUT STRUCTURE ZTS_SO_CREATE_RETURN OPTIONAL
*"----------------------------------------------------------------------
***********************************************************************************************************************
* Date written: 2018.04.20
* Author's name: Nathan *
*---------------------------------------------------------------------------------------------------------------------*
* Change History *
*---------------------------------------------------------------------------------------------------------------------*
*Date |Programmer |Request No | Description *
*---------------------------------------------------------------------------------------------------------------------*
TABLES: VBAK,VBAP,VBKD,VBPA,VBEP,KONV,SSCRFIELDS.
DATA LV_KALVG LIKE TVAK-KALVG.
DATA TAB_T683S LIKE T683S OCCURS 0 WITH HEADER LINE.
DATA LINE_T683V LIKE T683V.
DATA ZZ_X.
DATA IM_GHFS TYPE C .
DATA : L_NUM(4) TYPE N.
DATA : L_NUM_T(4) TYPE N.
DATA : IT_TAB LIKE ZTS_SO_CREATE_ITEM OCCURS 0 WITH HEADER LINE.
* ************ 调BAPI执行.
DATA: ORDER_HEADER_IN LIKE BAPISDHD1. "通讯字段: 销售和分销凭证抬头
DATA: ORDER_HEADER_INX LIKE BAPISDHD1X. "销售和分销凭证抬头的复选框字段
DATA: RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA: ORDER_ITEMS_IN LIKE BAPISDITM OCCURS 0 WITH HEADER LINE. "通讯字段: 销售和分销凭证项目
DATA: ORDER_ITEMS_INX LIKE BAPISDITMX OCCURS 0 WITH HEADER LINE. "通讯字段: 销售和分销凭证项目
DATA: ORDER_SCHEDULES_IN LIKE BAPISCHDL OCCURS 0 WITH HEADER LINE. "维护 SD 凭证计划行的通讯字段
DATA: ORDER_SCHEDULES_INX LIKE BAPISCHDLX OCCURS 0 WITH HEADER LINE. "维护销售凭证计划行的复选框清单
DATA: ORDER_PARTNERS LIKE BAPIPARNR OCCURS 0 WITH HEADER LINE. "通讯字段: SD单据合作伙伴
DATA: SALESDOCUMENT LIKE BAPIVBELN-VBELN.
DATA: ORDER_CONDITIONS_IN TYPE BAPICOND OCCURS 0 WITH HEADER LINE, "维护订单条件的通讯字段
ORDER_CONDITIONS_INX TYPE BAPICONDX OCCURS 0 WITH HEADER LINE,
ORDER_TEXT LIKE BAPISDTEXT OCCURS 0 WITH HEADER LINE.
DATA WA_SWITCH LIKE BAPISDLS.
DATA: LWA_BAPE_VBAP TYPE BAPE_VBAP. "BAPI Interface for Customer Enhancements to Table VBAP
DATA: LWA_BAPE_VBAPX TYPE BAPE_VBAPX. "BAPI Checkbox for Customer Enhancments to Table VBAP
DATA: LWA_BAPE_VBAK TYPE BAPE_VBAK.
DATA: LWA_BAPE_VBAKX TYPE BAPE_VBAKX.
DATA: M_IT_EXTENSIONIN TYPE TABLE OF BAPIPAREX WITH HEADER LINE.
DATA: LWA_EXTENSIONIN TYPE BAPIPAREX. "Customer Enhancement for VBAK, VBAP, VBEP
DATA:OS_FLAG TYPE C .
OS_FLAG = 'X'.
EXPORT OS_FLAG = OS_FLAG TO MEMORY ID 'YN_MEID01'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = IM_HEAD-VBELN
IMPORTING
OUTPUT = IM_HEAD-VBELN.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = IM_HEAD-KUNNR
IMPORTING
OUTPUT = IM_HEAD-KUNNR.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = IM_HEAD-KUNWE
IMPORTING
OUTPUT = IM_HEAD-KUNWE.
DATA O_TYPE TYPE BAPI_MTYPE .
DATA O_MSG TYPE BAPI_MSG .
DATA I_DATA TYPE TABLE OF ZSD_CRE_DATA WITH HEADER LINE.
CLEAR I_DATA[] .
LOOP AT PT_ITEM.
I_DATA-MATNR = PT_ITEM-MATNR .
I_DATA-WERKS = PT_ITEM-DWERK .
I_DATA-KBETR = PT_ITEM-NETPR1 .
I_DATA-WAERS = PT_ITEM-WAERS.
APPEND I_DATA.
CLEAR PT_ITEM .
CLEAR I_DATA .
ENDLOOP.
CALL FUNCTION 'ZSD_CRE_CHECK'
EXPORTING
* I_BDBM =
I_AUART = IM_HEAD-AUART
I_KUNNR = IM_HEAD-KUNNR
I_VKORG = IM_HEAD-VKORG
I_VTWEG = IM_HEAD-VTWEG
IMPORTING
O_TYPE = O_TYPE
O_MSG = O_MSG
TABLES
I_DATA = I_DATA[].
IF O_TYPE = 'E'.
RS_TAB_OUT-LX = O_TYPE.
RS_TAB_OUT-MESS = O_MSG.
ELSE .
IF O_TYPE = 'I'.
PT_ITEM-ABGRU = 'Z9'. "拒绝原因
ENDIF.
"" 单据类型
CLEAR :VBAK-VBTYP,LV_KALVG,LINE_T683V,TAB_T683S,TAB_T683S[].
SELECT SINGLE VBTYP KALVG INTO (VBAK-VBTYP,LV_KALVG) FROM TVAK
WHERE AUART = IM_HEAD-AUART. "销售凭证类型
* IF vbak-vbtyp = 'H'." 标准订单
DATA GS_VBAK TYPE VBAK .
SELECT SINGLE VKORG VTWEG SPART VBELN KUNNR INTO CORRESPONDING FIELDS OF IM_HEAD FROM VBAK
WHERE VBELN = IM_HEAD-VBELN .
* ENDIF .
** 设定销售订单抬头数##
ORDER_HEADER_IN-DOC_TYPE = IM_HEAD-AUART. "销售凭证类型
ORDER_HEADER_IN-SALES_ORG = IM_HEAD-VKORG. "销售组织
ORDER_HEADER_IN-DISTR_CHAN = IM_HEAD-VTWEG. "分销渠道
ORDER_HEADER_IN-DIVISION = IM_HEAD-SPART. "产品组
* order_header_in-sales_off = vbak-vkbur. "Sales Office
* order_header_in-sales_grp = vbak-vkgrp. "Sales Group
ORDER_HEADER_IN-ORD_REASON = IM_HEAD-AUGRU. "订单原因(业务交易原因)
IF IM_HEAD-VBELN IS NOT INITIAL.
* order_header_in-ref_doc = im_head-vbeln. "参考单据的单据编号
* order_header_in-refdoc_cat_long = 'C'. "参考单据的单据编号
ENDIF.
*ORD_REASON 1 类型 AUGRU
ORDER_HEADER_IN-PURCH_NO_C = IM_HEAD-BSTKD. "采购订单编号
* IF vbak-vbtyp <> 'H'." 标准订单
* order_header_in-ref_doc = im_head-vbeln. "参考单据的单据编号
* ENDIF .
IF IM_HEAD-BSTDK IS NOT INITIAL.
ORDER_HEADER_IN-PURCH_DATE = IM_HEAD-BSTDK. "采购订单日期
ELSE .
ORDER_HEADER_IN-PURCH_DATE = SY-DATUM .
ENDIF.
IF IM_HEAD-KETDAT IS NOT INITIAL.
ORDER_HEADER_IN-REQ_DATE_H = IM_HEAD-KETDAT. "请求交货日期
ELSE .
ORDER_HEADER_IN-REQ_DATE_H = SY-DATUM .
ENDIF.
* order_header_in-price_date = im_head-prsdt. "定价日期
* order_header_in-doc_date = vbak-audat. "单据日期
IF IM_HEAD-BZTXT IS NOT INITIAL.
CONCATENATE '%'IM_HEAD-BZTXT'%' INTO IM_HEAD-BZTXT.
CONDENSE IM_HEAD-BZTXT NO-GAPS.
SELECT SINGLE BZIRK INTO IM_HEAD-BZIRK FROM T171T
WHERE BZTXT LIKE IM_HEAD-BZTXT.
IF IM_HEAD-BZIRK IS NOT INITIAL.
ORDER_HEADER_IN-SALES_DIST = IM_HEAD-BZIRK. "销售工程师
ENDIF.
ENDIF.
SELECT SINGLE WAERS INTO ORDER_HEADER_IN-CURRENCY FROM KNVV
WHERE KUNNR = IM_HEAD-KUNNR "客户
AND VKORG = IM_HEAD-VKORG "销售组织
AND VTWEG = IM_HEAD-VTWEG "分销渠道
AND SPART = IM_HEAD-SPART. "生产线
* order_header_in-currency = 'CNY'."vbak-waerk. "凭证货币
* order_header_in-ordcomb_in = vbkd-kzazu. "订单组合标识
* order_header_in-ship_cond = vbak-vsbed. "装运条件
* order_header_in-incoterms1 = vbkd-inco1. "国际贸易条款 (部分1)
* order_header_in-incoterms2 = vbkd-inco2. "国际贸易条款 (部分2)
* order_header_in-pmnttrms = vbkd-zterm. "付款条件.
* order_header_in-bill_date = vbkd-fkdat. "出具发票日期
* order_header_in-ord_reason = vbak-augru. "订单原因
* 抬头文本
* order_text-itm_number = space.
* order_text-text_id = '0001'.
* order_text-langu = sy-langu.
* order_text-format_col = '*'.
* order_text-text_line = im_head-head_text.
* APPEND order_text.
* order_header_inx-updateflag = 'I'.
ORDER_HEADER_INX-DOC_TYPE = 'X'.
ORDER_HEADER_INX-SALES_ORG = 'X'.
ORDER_HEADER_INX-DISTR_CHAN = 'X'.
ORDER_HEADER_INX-DIVISION = 'X'.
* order_header_inx-sales_off = 'X'.
* order_header_inx-sales_grp = 'X'.
ORDER_HEADER_INX-PURCH_NO_C = 'X'.
ORDER_HEADER_INX-PURCH_DATE = 'X'.
ORDER_HEADER_INX-REQ_DATE_H = 'X'.
ORDER_HEADER_INX-PRICE_DATE = 'X'.
ORDER_HEADER_INX-ORD_REASON = 'X'.
* order_header_inx-doc_date = 'X'.
IF ORDER_HEADER_IN-SALES_DIST IS NOT INITIAL.
ORDER_HEADER_INX-SALES_DIST = 'X'.
ENDIF.
IF IM_HEAD-VBELN IS NOT INITIAL.
* order_header_inx-ref_doc = 'X'. "参考单据的单据编号
* order_header_inx-refdoc_cat_long = 'X'. "参考单据的单据编号
* order_header_inx-sd_doc_cat = 'X'. "参考单据的单据编号
* order_header_inx-ref_doc_l = 'X'. "参考单据的单据编号
ENDIF.
* IF vbak-vbtyp <> 'H'." 标准订单
* order_header_inx-currency = 'X'.
** order_header_inx-ref_doc = 'X'. "参考单据的单据编号
* ENDIF .
* order_header_inx-ordcomb_in = 'X'.
* order_header_inx-ship_cond = 'X'.
* order_header_inx-incoterms1 = 'X'.
* order_header_inx-incoterms2 = 'X'.
* order_header_inx-pmnttrms = 'X'.
* order_header_inx-bill_date = 'X'.
* order_header_inx-ord_reason = 'X'.
"Get Header Party Function
IF IM_HEAD-KUNNR <> ''.
ORDER_PARTNERS-PARTN_ROLE = 'AG'. "售达方
ORDER_PARTNERS-PARTN_NUMB = IM_HEAD-KUNNR.
APPEND ORDER_PARTNERS.
CLEAR ORDER_PARTNERS.
ENDIF.
IF IM_HEAD-KUNWE <> ''.
ORDER_PARTNERS-PARTN_ROLE = 'WE'. "送達方
ORDER_PARTNERS-PARTN_NUMB = IM_HEAD-KUNWE.
APPEND ORDER_PARTNERS.
CLEAR ORDER_PARTNERS.
ENDIF.
"""
"" 取订单定价过程
SELECT SINGLE * INTO LINE_T683V FROM T683V
WHERE VKORG = IM_HEAD-VKORG "销售组织
AND VTWEG = IM_HEAD-VTWEG "分销渠道
AND SPART = IM_HEAD-SPART "生产线
AND KALVG = LV_KALVG
AND KALKS = '1'.
SELECT * INTO TABLE TAB_T683S FROM T683S
WHERE KALSM = LINE_T683V-KALSM.
***************************add by chenj 20170315 批导添加自定义增强字段 S****************************
"Fill item level self-defined fields
* extension BAPE_VBAP
* CLEAR: lwa_bape_vbak,lwa_bape_vbakx.
*
* lwa_bape_vbak-zlgort = im_head-zlgort."客户姓名
* "checkboxes
* lwa_bape_vbakx-zlgort = 'X'."客户姓名
*
* MOVE 'BAPE_VBAK' TO lwa_extensionin-structure.
* CALL METHOD cl_abap_container_utilities=>fill_container_c
* EXPORTING
* im_value = lwa_bape_vbak
* IMPORTING
* ex_container = lwa_extensionin-valuepart1.
* APPEND lwa_extensionin TO m_it_extensionin.
* CLEAR lwa_extensionin.
*
*
* MOVE 'BAPE_VBAKX' TO lwa_extensionin-structure.
* MOVE lwa_bape_vbakx TO lwa_extensionin-valuepart1.
* APPEND lwa_extensionin TO m_it_extensionin.
* CLEAR lwa_extensionin.
***************************add by chenj 20170315 批导添加自定义增强字段 E****************************
** 设定销售订单行项目
CLEAR L_NUM.
CLEAR L_NUM_T.
LOOP AT PT_ITEM.
L_NUM_T = L_NUM_T + 100.
IF PT_ITEM-POSNR IS INITIAL.
PT_ITEM-POSNR = L_NUM_T .
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = PT_ITEM-MATNR
IMPORTING
OUTPUT = PT_ITEM-MATNR.
ORDER_ITEMS_IN-ITM_NUMBER = PT_ITEM-POSNR. "销售凭证项目
ORDER_ITEMS_IN-ITEM_CATEG = VBAP-PSTYV. "销售凭证项目类别
ORDER_ITEMS_IN-MATERIAL_LONG = PT_ITEM-MATNR. "物料编号
ORDER_ITEMS_IN-TARGET_QTY = PT_ITEM-KWMENG. "目标数量(采用销售单位)
* order_items_in-short_text = pt_item-arktx. "销售订单项目短文本
IF PT_ITEM-VRKME IS INITIAL.
SELECT SINGLE MEINS INTO PT_ITEM-VRKME FROM MARA
WHERE MATNR = PT_ITEM-MATNR .
ENDIF.
ORDER_ITEMS_IN-TARGET_QU = PT_ITEM-VRKME. "目标数量计量单位
* order_items_in-sales_unit = pt_item-vrkme. "销售单位
IF IM_HEAD-VBELN IS NOT INITIAL.
ORDER_ITEMS_IN-REF_DOC = IM_HEAD-VBELN. "参考单据的单据编号
ORDER_ITEMS_IN-REF_DOC_IT = PT_ITEM-REF_DOC_IT. "参考单据的单据编号
ENDIF.
* order_items_in-purch_no_c = vbkd-bstkd . "Item - purchase order number
* order_items_in-purch_date = vbkd-bstdk . "采购日期
* order_items_in-po_method = vbkd-bsark. "采购类型
* order_items_in-po_itm_no = vbap-posex. "采购订单项目.
* order_items_in-ref_1 = vbkd-ihrez. "参##
* IF PT_ITEM-kdmat IS NOT INITIAL.
* order_items_in-cust_mat35 = PT_ITEM-kdmat. "客户物料##
* ELSE.
SELECT SINGLE KDMAT INTO ORDER_ITEMS_IN-CUST_MAT35 FROM KNMT
WHERE MATNR = PT_ITEM-MATNR
AND VKORG = PT_ITEM-VKORG
AND VTWEG = PT_ITEM-VTWEG
AND KUNNR = PT_ITEM-KUNNR.
* ENDIF.
* order_items_in-price_date = vbkd-prsdt. "Pricing date
* order_items_in-po_dat_s = vbkd-bstdk_e. "ship-to party PO date
* order_items_in-purch_no_s = vbkd-bstkd_e. "purchase order numbe
* order_items_in-po_meth_s = vbkd-bsark_e. "采购类型
* order_items_in-poitm_no_s = vbkd-posex_e. "采购订单项目.
* order_items_in-ref_1_s = vbkd-ihrez_e. "参##
* order_items_in-sales_dist = vbkd-bzirk. "销售地##
IF PT_ITEM-DWERK IS NOT INITIAL.
ORDER_ITEMS_IN-PLANT = PT_ITEM-DWERK. "工厂
ELSE.
SELECT SINGLE DWERK INTO ORDER_ITEMS_IN-PLANT FROM MVKE
WHERE MATNR = PT_ITEM-MATNR
AND VKORG = PT_ITEM-VKORG
AND VTWEG = PT_ITEM-VTWEG.
ENDIF.
* order_items_in-store_loc = vbap-lgort. "库位
* order_items_in-ship_point = vbap-vstel. "Shipping Point
* order_items_in-ship_type = vbkd-vsart. "Shipping Type
* order_items_in-max_pl_dlv = vbap-antlf. "Max.Part.Deliv.
* order_items_in-ordcomp_in = vbkd-kzazu. "Order Combination Indicator
* order_items_in-reqmts_typ = PT_ITEM-bedae. "需求类##
IF PT_ITEM-ABGRU IS NOT INITIAL.
ORDER_ITEMS_IN-REASON_REJ = PT_ITEM-ABGRU. "拒绝原因
ENDIF.
ORDER_TEXT-ITM_NUMBER = PT_ITEM-POSNR.
ORDER_TEXT-TEXT_ID = '0001'.
ORDER_TEXT-LANGU = SY-LANGU.
ORDER_TEXT-TEXT_LINE = PT_ITEM-TEXT_LINE.
APPEND ORDER_TEXT.
CLEAR ORDER_TEXT.
APPEND ORDER_ITEMS_IN.
CLEAR ORDER_ITEMS_IN.
* order_items_inx-updateflag = 'I'.
ORDER_ITEMS_INX-ITM_NUMBER = PT_ITEM-POSNR.
ORDER_ITEMS_INX-ITEM_CATEG = 'X'.
ORDER_ITEMS_INX-MATERIAL_LONG = 'X'.
ORDER_ITEMS_INX-TARGET_QTY = 'X'. "目标数量(采用销售单位)
ORDER_ITEMS_INX-TARGET_QU = 'X'. "目标数量计量单位
* order_items_inx-short_text = 'X'. "销售订单项目短文本
* order_items_inx-sales_unit = 'X'. "销售单位
* order_items_inx-purch_no_c = 'X'.
* order_items_inx-purch_date = 'X'.
* order_items_inx-po_method = 'X'.
* order_items_inx-po_itm_no = 'X'.
* order_items_inx-ref_1 = 'X'.
ORDER_ITEMS_INX-CUST_MAT35 = 'X'.
* order_items_inx-price_date = 'X'.
* order_items_inx-po_dat_s = 'X'.
* order_items_inx-purch_no_s = 'X'.
* order_items_inx-po_meth_s = 'X'.
* order_items_inx-poitm_no_s = 'X'.
* order_items_inx-ref_1_s = 'X'.
* order_items_inx-sales_dist = 'X'.
ORDER_ITEMS_INX-PLANT = 'X'.
IF IM_HEAD-VBELN IS NOT INITIAL.
ORDER_ITEMS_INX-REF_DOC = 'X'. "参考单据的单据编号
ORDER_ITEMS_INX-REF_DOC_IT = 'X'. "参考单据的单据编号
ENDIF.
* order_items_inx-store_loc = 'X'.
* order_items_inx-ship_point = 'X'.
* order_items_inx-ship_type = 'X'.
* order_items_inx-max_pl_dlv = 'X'.
* order_items_inx-ordcomp_in = 'X'.
IF PT_ITEM-ABGRU IS NOT INITIAL.
ORDER_ITEMS_INX-REASON_REJ = 'X'.
ENDIF.
*
ORDER_ITEMS_INX-REQMTS_TYP = 'X'.
APPEND ORDER_ITEMS_INX.
CLEAR ORDER_ITEMS_INX.
***************************add by chenj 20170315 批导添加自定义增强字段 S****************************
"Fill item level self-defined fields
* extension BAPE_VBAP
* CLEAR: lwa_bape_vbap,lwa_bape_vbapx.
*
* lwa_bape_vbap-posnr = pt_item-posnr."行项目
* lwa_bape_vbap-zlifnr = pt_item-zlifnr."供应商或债权人的帐号
*
* lwa_bape_vbapx-posnr = pt_item-posnr."行项目
* lwa_bape_vbapx-zlifnr = 'X'."电商客户快递单号
*
* MOVE 'BAPE_VBAP' TO lwa_extensionin-structure.
* CALL METHOD cl_abap_container_utilities=>fill_container_c
* EXPORTING
* im_value = lwa_bape_vbap
* IMPORTING
* ex_container = lwa_extensionin-valuepart1.
* APPEND lwa_extensionin TO m_it_extensionin.
* CLEAR lwa_extensionin.
*
* MOVE 'BAPE_VBAPX' TO lwa_extensionin-structure.
* MOVE lwa_bape_vbapx TO lwa_extensionin-valuepart1.
* APPEND lwa_extensionin TO m_it_extensionin.
* CLEAR lwa_extensionin.
***************************add by chenj 20170315 批导添加自定义增强字段 E****************************
*** 交货计划
"Get Schedule line
ORDER_SCHEDULES_IN-ITM_NUMBER = PT_ITEM-POSNR. "销售订单行项目号
* order_schedules_in-sched_line = '0001'.
ORDER_SCHEDULES_IN-REQ_QTY = PT_ITEM-KWMENG. "销售订单数量
ORDER_SCHEDULES_IN-REQ_DATE = IM_HEAD-KETDAT . "计划行日期
APPEND ORDER_SCHEDULES_IN.
CLEAR ORDER_SCHEDULES_IN.
* CLEAR order_schedules_inx.
* order_schedules_inx-itm_number = pt_item-posnr. "销售订单行项目号
** order_schedules_inx-sched_line = '0001'.
** order_schedules_inx-updateflag = 'I'.
* order_schedules_inx-req_qty = 'X'. "销售订单数量
* order_schedules_inx-req_date = 'X'. "计划行日期
* APPEND order_schedules_inx.
"Get Condition Data
""" 价格
IF PT_ITEM-WAERS = '' .
PT_ITEM-WAERS = ORDER_HEADER_IN-CURRENCY.
ENDIF.
IF PT_ITEM-NETPR1 IS NOT INITIAL."ZR01
* order_conditions_in-itm_number = pt_item-posnr. "Condition item number
** order_conditions_in-cond_st_no = konv-stunr. "步骤
* order_conditions_in-cond_count = '01'. "计数##
* order_conditions_in-cond_type = 'ZR01'. "Condition type
* order_conditions_in-cond_value = pt_item-netpr1. "Amount
* order_conditions_in-currency = pt_item-waers. "Currency
* order_conditions_in-cond_updat = 'X'. "Per
** order_conditions_in-cond_p_unt = PT_ITEM-kpein. "Per
** order_conditions_in-cond_unit = konv-kmein. "UOM
* APPEND order_conditions_in.
* CLEAR order_conditions_in.
* order_conditions_inx-updateflag = 'U'.
* order_conditions_inx-itm_number = pt_item-posnr.
** order_conditions_inx-cond_st_no = konv-stunr.
* order_conditions_inx-cond_count = '01'.
* order_conditions_inx-cond_type = 'ZR01'. "konv-kschl.
* order_conditions_inx-cond_value = 'X'.
* order_conditions_inx-currency = 'X'.
* order_conditions_inx-cond_p_unt = 'X'.
** order_conditions_inx-req_date = 'X' .
** order_conditions_inx-cond_unit = 'X'.
* APPEND order_conditions_inx.
* CLEAR order_conditions_inx.
ELSE.
**** ZR02價格取值
DATA PRICE TYPE P DECIMALS 4.
DATA WAERK LIKE VBAP-WAERK.
DATA KPEIN LIKE KOMV-KPEIN.
CLEAR : PRICE,WAERK,KPEIN.
SELECT SINGLE KBETR KONWA AS WAERS KPEIN INTO (PRICE,WAERK,KPEIN)
FROM KONP
INNER JOIN A305 ON KONP~KNUMH = A305~KNUMH
WHERE A305~KAPPL = 'V' AND A305~KSCHL = 'ZR01' AND A305~VKORG = PT_ITEM-VKORG AND A305~VTWEG = PT_ITEM-VTWEG AND
A305~MATNR = PT_ITEM-MATNR AND A305~DATAB <= SY-DATUM AND A305~DATBI >= SY-DATUM AND A305~KUNNR = PT_ITEM-KUNNR. "现在取跟客户有关的价格,如没有则取物料价格
IF SY-SUBRC <> 0.
CLEAR : PRICE,WAERK,KPEIN.
SELECT SINGLE KBETR KONWA AS WAERS KPEIN INTO (PRICE,WAERK,KPEIN)
FROM KONP
INNER JOIN A304 ON KONP~KNUMH = A304~KNUMH
WHERE A304~KAPPL = 'V' AND A304~KSCHL = 'ZR01' AND A304~VKORG = PT_ITEM-VKORG AND A304~VTWEG = PT_ITEM-VTWEG AND
A304~MATNR = PT_ITEM-MATNR AND A304~DATAB <= SY-DATUM AND A304~DATBI >= SY-DATUM .
ENDIF.
IF PRICE IS NOT INITIAL.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
ORDER_CONDITIONS_IN-COND_TYPE = 'ZR01'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PRICE. "Amount
ORDER_CONDITIONS_IN-CURRENCY = WAERK. "Currency
ORDER_CONDITIONS_IN-COND_P_UNT = KPEIN. "Per
ORDER_CONDITIONS_IN-COND_UPDAT = 'X'. "Per
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
* order_conditions_inx-updateflag = 'I'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
ORDER_CONDITIONS_INX-COND_TYPE = 'ZR01'. " konv-kschl.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
ORDER_CONDITIONS_INX-COND_P_UNT = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
ENDIF.
*******************ZR02******************************************
IF PT_ITEM-NETPR2 NE 0.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
ORDER_CONDITIONS_IN-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_IN-COND_TYPE = 'ZR02'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PT_ITEM-NETPR2. "Amount
ORDER_CONDITIONS_IN-CURRENCY = PT_ITEM-WAERS. "Currency
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
* order_conditions_inx-updateflag = 'U'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
ORDER_CONDITIONS_INX-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_INX-COND_TYPE = 'ZR02'. " konv-kschl.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
*******************ZR04********************************************
IF PT_ITEM-NETPR3 IS NOT INITIAL.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
* order_conditions_in-cond_st_no = konv-stunr. "步骤
ORDER_CONDITIONS_IN-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_IN-COND_TYPE = 'ZR04'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PT_ITEM-NETPR3. "Amount
ORDER_CONDITIONS_IN-CURRENCY = PT_ITEM-WAERS. "Currency
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
* order_conditions_inx-updateflag = 'U'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
* order_conditions_inx-cond_st_no = konv-stunr.
ORDER_CONDITIONS_INX-COND_COUNT = '01'.
ORDER_CONDITIONS_INX-COND_TYPE = 'ZR04'. " konv-kschl.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
ORDER_CONDITIONS_INX-COND_P_UNT = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
******************************ZR06*******************************************
IF PT_ITEM-NETPR4 IS NOT INITIAL.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
* order_conditions_in-cond_st_no = konv-stunr. "步骤
ORDER_CONDITIONS_IN-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_IN-COND_TYPE = 'ZR06'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PT_ITEM-NETPR4. "Amount
ORDER_CONDITIONS_IN-CURRENCY = PT_ITEM-WAERS. "Currency
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
* order_conditions_inx-updateflag = 'U'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
* order_conditions_inx-cond_st_no = konv-stunr.
ORDER_CONDITIONS_INX-COND_COUNT = '01'.
ORDER_CONDITIONS_INX-COND_TYPE = 'ZR06'.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
ORDER_CONDITIONS_INX-COND_P_UNT = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
******************************ZP08*******************************************
IF PT_ITEM-NETPR5 IS NOT INITIAL.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
* order_conditions_in-cond_st_no = konv-stunr. "步骤
ORDER_CONDITIONS_IN-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_IN-COND_TYPE = 'ZR08'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PT_ITEM-NETPR5. "Amount
ORDER_CONDITIONS_IN-CURRENCY = PT_ITEM-WAERS. "Currency
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
* order_conditions_inx-updateflag = 'U'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
* order_conditions_inx-cond_st_no = konv-stunr.
ORDER_CONDITIONS_INX-COND_COUNT = '01'.
ORDER_CONDITIONS_INX-COND_TYPE = 'ZR08'.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
ORDER_CONDITIONS_INX-COND_P_UNT = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
******************************ZR09PS******************************************
IF PT_ITEM-NETPR6 IS NOT INITIAL.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
* order_conditions_in-cond_st_no = konv-stunr. "步骤
ORDER_CONDITIONS_IN-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_IN-COND_TYPE = 'ZR09PS'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PT_ITEM-NETPR6. "Amount
ORDER_CONDITIONS_IN-CURRENCY = PT_ITEM-WAERS. "Currency
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
* order_conditions_inx-updateflag = 'U'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
* order_conditions_inx-cond_st_no = konv-stunr.
ORDER_CONDITIONS_INX-COND_COUNT = '01'.
ORDER_CONDITIONS_INX-COND_TYPE = 'ZR09PS'.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
ORDER_CONDITIONS_INX-COND_P_UNT = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
******************************ZFXF******************************************
IF PT_ITEM-NETPR7 IS NOT INITIAL.
ORDER_CONDITIONS_IN-ITM_NUMBER = PT_ITEM-POSNR. "Condition item number
* order_conditions_in-cond_st_no = konv-stunr. "步骤
ORDER_CONDITIONS_IN-COND_COUNT = '01'. "计数##
ORDER_CONDITIONS_IN-COND_TYPE = 'ZFXF'. "Condition type
ORDER_CONDITIONS_IN-COND_VALUE = PT_ITEM-NETPR7. "Amount
ORDER_CONDITIONS_IN-CURRENCY = PT_ITEM-WAERS. "Currency
APPEND ORDER_CONDITIONS_IN.
CLEAR ORDER_CONDITIONS_IN.
ORDER_CONDITIONS_INX-UPDATEFLAG = 'U'.
ORDER_CONDITIONS_INX-ITM_NUMBER = PT_ITEM-POSNR.
* order_conditions_inx-cond_st_no = konv-stunr.
ORDER_CONDITIONS_INX-COND_COUNT = '01'.
ORDER_CONDITIONS_INX-COND_TYPE = 'ZFXF'.
ORDER_CONDITIONS_INX-COND_VALUE = 'X'.
ORDER_CONDITIONS_INX-CURRENCY = 'X'.
ORDER_CONDITIONS_INX-COND_P_UNT = 'X'.
APPEND ORDER_CONDITIONS_INX.
CLEAR ORDER_CONDITIONS_INX.
ENDIF.
MODIFY PT_ITEM TRANSPORTING POSNR .
ENDLOOP.
CALL FUNCTION 'CUXC_INIT'.
WA_SWITCH-PRICING = 'G' .
* IF im_ghfs = ''."内部给号
IF VBAK-VBTYP <> 'H'." 标准订单
*SD_SALESDOCUMENT_CREATE
*BAPI_SALESORDER_CREATEFROMDAT2
CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
EXPORTING
* salesdocumentin = im_head-vbeln
SALES_HEADER_IN = ORDER_HEADER_IN
SALES_HEADER_INX = ORDER_HEADER_INX
* logic_switch = wa_switch
IMPORTING
SALESDOCUMENT_EX = SALESDOCUMENT "生成销售订单后产生的销售订单号
TABLES
RETURN = RETURN
SALES_ITEMS_IN = ORDER_ITEMS_IN
SALES_ITEMS_INX = ORDER_ITEMS_INX
SALES_SCHEDULES_IN = ORDER_SCHEDULES_IN
SALES_SCHEDULES_INX = ORDER_SCHEDULES_INX
SALES_PARTNERS = ORDER_PARTNERS
SALES_CONDITIONS_IN = ORDER_CONDITIONS_IN
SALES_CONDITIONS_INX = ORDER_CONDITIONS_INX
SALES_TEXT = ORDER_TEXT
* extensionin = m_it_extensionin "add by chenj 20170315
EXCEPTIONS
OTHERS = 1.
ELSE. "退货订##
CALL FUNCTION 'BAPI_CUSTOMERRETURN_CREATE'
EXPORTING
* salesdocumentin = im_head-vbeln
RETURN_HEADER_IN = ORDER_HEADER_IN
RETURN_HEADER_INX = ORDER_HEADER_INX
* logic_switch = wa_switch
IMPORTING
SALESDOCUMENT = SALESDOCUMENT "生成销售订单后产生的销售订单号
TABLES
RETURN = RETURN
RETURN_ITEMS_IN = ORDER_ITEMS_IN
RETURN_ITEMS_INX = ORDER_ITEMS_INX
RETURN_SCHEDULES_IN = ORDER_SCHEDULES_IN
RETURN_SCHEDULES_INX = ORDER_SCHEDULES_INX
RETURN_PARTNERS = ORDER_PARTNERS
RETURN_CONDITIONS_IN = ORDER_CONDITIONS_IN
RETURN_TEXT = ORDER_TEXT
* extensionin = m_it_extensionin "add by chenj 20170315
EXCEPTIONS
OTHERS = 1.
ENDIF.
*
* ELSE."外部给号
*
* IF vbak-vbtyp <> 'H'." 标准订单
*
* CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
* EXPORTING
* salesdocumentin = im_head-vbeln
* order_header_in = order_header_in
* order_header_inx = order_header_inx
** logic_switch = wa_switch
* IMPORTING
* salesdocument = salesdocument "生成销售订单后产生的销售订单号
* TABLES
* return = return
* order_items_in = order_items_in
* order_items_inx = order_items_inx
* order_schedules_in = order_schedules_in
* order_schedules_inx = order_schedules_inx
* order_partners = order_partners
* order_conditions_in = order_conditions_in
* order_conditions_inx = order_conditions_inx
* order_text = order_text
** extensionin = m_it_extensionin "add by chenj 20170315
* EXCEPTIONS
* OTHERS = 1.
*
* ELSE. "退货订##
*
* CALL FUNCTION 'BAPI_CUSTOMERRETURN_CREATE'
* EXPORTING
* salesdocumentin = im_head-vbeln
* return_header_in = order_header_in
* return_header_inx = order_header_inx
** logic_switch = wa_switch
* IMPORTING
* salesdocument = salesdocument "生成销售订单后产生的销售订单号
* TABLES
* return = return
* return_items_in = order_items_in
* return_items_inx = order_items_inx
* return_schedules_in = order_schedules_in
* return_schedules_inx = order_schedules_inx
* return_partners = order_partners
* return_conditions_in = order_conditions_in
* return_text = order_text
** extensionin = m_it_extensionin "add by chenj 20170315
* EXCEPTIONS
* OTHERS = 1.
*
* ENDIF.
*
* ENDIF.
READ TABLE RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC = 0.
CLEAR SALESDOCUMENT.
ENDIF.
CLEAR RS_TAB_OUT.
IF SALESDOCUMENT IS NOT INITIAL.
IF IM_HEAD-VBELN IS INITIAL.
IM_HEAD-VBELN = SALESDOCUMENT .
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
***************************add 批导添加自定义增强字段 S****************************
DATA GT_VBFA TYPE TABLE OF VBFA .
DATA GS_VBFA TYPE VBFA .
CLEAR GT_VBFA[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_VBFA[] FROM VBFA
WHERE VBELN = SALESDOCUMENT .
LOOP AT GT_VBFA[] INTO GS_VBFA.
UPDATE VBFA SET VBTYP_V = 'C' WHERE RUUID = GS_VBFA-RUUID .
ENDLOOP.
UPDATE VBAK SET ZHTBM = IM_HEAD-ZHTBM "抬头字段
ZHTRQ = IM_HEAD-ZHTRQ
ZLGORT = IM_HEAD-ZLGORT
* zz_address = im_head-zz_address
* zz_shopname = im_head-zz_shopname
* zz_remarks = im_head-zz_remarks
* zz_department = im_head-zz_department
* zz_numbers = im_head-zz_numbers
WHERE VBELN = SALESDOCUMENT.
LOOP AT PT_ITEM. "行项目字段
IF O_TYPE = 'I'.
UPDATE VBAP SET ZLIFNR = PT_ITEM-ZLIFNR ABGRU = 'Z9'
WHERE VBELN = SALESDOCUMENT
AND POSNR = PT_ITEM-POSNR
AND MATNR = PT_ITEM-MATNR.
ELSE .
UPDATE VBAP SET ZLIFNR = PT_ITEM-ZLIFNR
WHERE VBELN = SALESDOCUMENT
AND POSNR = PT_ITEM-POSNR
AND MATNR = PT_ITEM-MATNR.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
***************************add by chenj 20170315 批导添加自定义增强字段 E****************************
RS_TAB_OUT-VBELN = SALESDOCUMENT.
RS_TAB_OUT-AUART = IM_HEAD-AUART.
RS_TAB_OUT-VKORG = IM_HEAD-VKORG.
RS_TAB_OUT-VTWEG = IM_HEAD-VTWEG.
RS_TAB_OUT-SPART = IM_HEAD-SPART.
RS_TAB_OUT-LX = 'S'.
RS_TAB_OUT-MESS = '成功'.
DATA I_WHILE TYPE CHAR10 .
CLEAR I_WHILE .
* WHILE I_WHILE < 700000.
* ADD 1 TO I_WHILE .
* ENDWHILE.
*-----------------------------------------------------------------------三单处理
""" 取关联公司交易的訂單配置-SO=>PO=>SO
DATA RFCDEST(32).
DATA ZTSD004 LIKE ZTSD004 .
DATA GT_VBAP TYPE TABLE OF VBAP.
DATA GS_VBAP TYPE VBAP.
DATA VBAK TYPE VBAK.
RANGES R_LIFNR FOR VBAP-ZLIFNR.
DATA G_FLAG. "满足条件标识
""" 如果配置表里沒有,则不执行
CLEAR GT_VBAP[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_VBAP FROM VBAP
WHERE VBELN = RS_TAB_OUT-VBELN .
REFRESH R_LIFNR.CLEAR R_LIFNR.
LOOP AT GT_VBAP INTO GS_VBAP.
IF GS_VBAP-ZLIFNR IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GS_VBAP-ZLIFNR
IMPORTING
OUTPUT = GS_VBAP-ZLIFNR.
R_LIFNR-SIGN = 'I'.
R_LIFNR-OPTION = 'EQ'.
R_LIFNR-LOW = GS_VBAP-ZLIFNR.
COLLECT R_LIFNR.
CLEAR R_LIFNR.
ENDIF.
ENDLOOP.
IF R_LIFNR[] IS NOT INITIAL.
CLEAR VBAK .
SELECT SINGLE * INTO VBAK FROM VBAK
WHERE VBELN = RS_TAB_OUT-VBELN .
CLEAR ZTSD004.
SELECT SINGLE * INTO ZTSD004 FROM ZTSD004 WHERE VKORG = VBAK-VKORG AND VTWEG = VBAK-VTWEG AND SPART = VBAK-SPART AND AUART = VBAK-AUART AND LIFNR IN R_LIFNR.
IF SY-SUBRC = 0.
G_FLAG = 'X'.
ENDIF.
ENDIF.
IF G_FLAG = 'X'.
CONCATENATE 'CALL_TO_CLIENT_' SY-MANDT INTO RFCDEST.
""" 创建 PO
CALL FUNCTION 'ZRFC_PO_CREATE' DESTINATION RFCDEST STARTING NEW TASK 'Z01'
EXPORTING
P_VBELN = VBAK-VBELN
P_LIFNR = ZTSD004-LIFNR
P_Z = ''.
""" 创建SO
CALL FUNCTION 'ZRFC_SO_CREATE' DESTINATION RFCDEST STARTING NEW TASK 'Z02'
EXPORTING
P_VBELN = VBAK-VBELN
P_Z = ''.
* MESSAGE s398(00) WITH vbak-vkorg '对供应商' ztsd004-lifnr '的工厂采购单及销售单后台程序启动成功'.
ENDIF.
*-----------------------------------------------------------------------三单处理
*-----------------------------------------------------------------------退货单价格修改处理流程
IF VBAK-VBTYP = 'H'." 退货订单
CALL FUNCTION 'ZOA_SD_SO_CHANGE_H'
EXPORTING
I_SALESDOCUMENT = SALESDOCUMENT
TABLES
PT_ITEM = PT_ITEM[].
ENDIF.
*-----------------------------------------------------------------------退货单价格修改处理流程
ELSE.
DATA: LV_FLAG TYPE C .
CLEAR LV_FLAG.
CLEAR IT_TAB_OUT.
LOOP AT RETURN WHERE TYPE = 'E'.
IF LV_FLAG IS INITIAL.
RS_TAB_OUT-VBELN = IM_HEAD-VBELN.
RS_TAB_OUT-AUART = IM_HEAD-AUART.
RS_TAB_OUT-VKORG = IM_HEAD-VKORG.
RS_TAB_OUT-VTWEG = IM_HEAD-VTWEG.
RS_TAB_OUT-SPART = IM_HEAD-SPART.
RS_TAB_OUT-LX = RETURN-TYPE.
* rs_tab_out-mess = return-message.
LV_FLAG = 'X' .
ENDIF.
IT_TAB_OUT-VBELN = IM_HEAD-VBELN.
IT_TAB_OUT-AUART = IM_HEAD-AUART.
IT_TAB_OUT-VKORG = IM_HEAD-VKORG.
IT_TAB_OUT-VTWEG = IM_HEAD-VTWEG.
IT_TAB_OUT-SPART = IM_HEAD-SPART.
IT_TAB_OUT-LX = RETURN-TYPE.
IT_TAB_OUT-MESS = RETURN-MESSAGE.
CONCATENATE RS_TAB_OUT-MESS ';'RETURN-MESSAGE INTO RS_TAB_OUT-MESS .
APPEND IT_TAB_OUT.
ENDLOOP.
ENDIF.
IF O_MSG IS NOT INITIAL.
CONCATENATE RS_TAB_OUT-MESS O_MSG INTO RS_TAB_OUT-MESS .
ENDIF.
ENDIF.
FREE MEMORY ID 'YN_MEID01'.
ENDFUNCTION.