二维码

[BAPI] VA02修改销售订单BAPI_SALESORDER_CHANGE

Twilight发表于 2018-09-19 16:07Twilight 最后回复于 2018-09-19 16:07 [复制链接] 4244 0

程序代码:
  1. FUNCTION zsdfm001_update.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口
  4. *"  IMPORTING
  5. *"     VALUE(I_HEADER) TYPE  ZSDS106 OPTIONAL
  6. *"  EXPORTING
  7. *"     VALUE(E_MESSAGE) TYPE  ZOTS001
  8. *"     VALUE(E_STONR) TYPE  J_STONR
  9. *"  TABLES
  10. *"      T_VBPA STRUCTURE  ZSDS109 OPTIONAL
  11. *"      T_ITEM STRUCTURE  ZSDS107 OPTIONAL
  12. *"      T_KONV STRUCTURE  ZSDS108 OPTIONAL
  13. *"      T_KONVT STRUCTURE  ZSDS108 OPTIONAL
  14. *"----------------------------------------------------------------------
  15.   DATA : gwa_bapisdh1  TYPE bapisdh1 . "抬头
  16.   DATA : gwa_bapisdh1x TYPE bapisdh1x. "抬头 确认

  17.   DATA : gwa_partnerchanges TYPE bapiparnrc .         "合作伙伴更改
  18.   DATA : git_partnerchanges TYPE TABLE OF bapiparnrc .

  19.   DATA : gwa_bapisditm  TYPE bapisditm .   "行项目
  20.   DATA : git_bapisditm  TYPE TABLE OF bapisditm.

  21.   DATA : gwa_bapisditmx TYPE bapisditmx .   "行项目 确认
  22.   DATA : git_bapisditmx TYPE TABLE OF bapisditmx .

  23.   DATA : gwa_bapischdl TYPE bapischdl .     "计划行
  24.   DATA : git_bapischdl TYPE TABLE OF bapischdl .      "计划行

  25.   DATA : gwa_bapischdlx TYPE bapischdlx .   "计划行
  26.   DATA : git_bapischdlx TYPE TABLE OF bapischdlx .    "计划行

  27.   DATA : gwa_bapicond TYPE bapicond .       "价格
  28.   DATA : git_bapicond TYPE TABLE OF bapicond .

  29.   DATA : gwa_bapicondx TYPE bapicondx .
  30.   DATA : git_bapicondx TYPE TABLE OF bapicondx .

  31.   DATA : git_order_text TYPE TABLE OF bapisdtext ."长文本

  32.   DATA : gwa_bapiret2 TYPE bapiret2 .
  33.   DATA : git_bapiret2 TYPE TABLE OF bapiret2 .

  34.   DATA:ls_item  TYPE zsds107.
  35.   DATA:ls_konv  TYPE zsds108.
  36.   DATA:lv_stonr TYPE j_stonr.
  37.   DATA:lv_objnr TYPE jsto-objnr.

  38.   CHECK i_header-vbeln IS NOT INITIAL.
  39.   PERFORM frm_inputsap_data CHANGING i_header-vbeln.

  40. *-->抬头
  41.   gwa_bapisdh1-purch_no_c = i_header-bstkd ."采购订单编号
  42.   CONCATENATE i_header-date+0(4) i_header-date+5(2) i_header-date+8(2) INTO gwa_bapisdh1-purch_date ."采购订单日期
  43.   gwa_bapisdh1-pmnttrms   = i_header-zterm ."付款条件
  44.   gwa_bapisdh1-ord_reason = i_header-augru ."订单原因
  45.   gwa_bapisdh1-costcenter = i_header-kostl ."成本中心
  46.   gwa_bapisdh1-mn_invoice = i_header-mrnkz ."人工发票维护
  47.   gwa_bapisdh1-collect_no = i_header-submi ."汇总数
  48.   gwa_bapisdh1-po_meth_s  = i_header-bsark_e ."采购订单类型
  49.   gwa_bapisdh1-purch_no_s = i_header-bstkd_e .
  50.   gwa_bapisdh1-po_supplem = i_header-bstzd .
  51.   gwa_bapisdh1-sales_grp  = i_header-vkgrp ."销售组
  52.   gwa_bapisdh1-sales_off  = i_header-vkbur ."销售办公室
  53.   gwa_bapisdh1-cust_group = i_header-kdgrp ."客户组
  54.   gwa_bapisdh1-cust_grp1  = i_header-kvgr1 ."客户组1
  55.   gwa_bapisdh1-name       = i_header-name ."来源单号
  56.   gwa_bapisdh1-ship_type  = i_header-vsart .
  57.   gwa_bapisdh1-ref_1_s    =  i_header-ihrez_e .
  58.   gwa_bapisdh1-ref_1      = i_header-ihrez ."您的参考

  59.   CLEAR gwa_bapisdh1x .
  60.   gwa_bapisdh1x-updateflag = 'U'."更新标识
  61.   gwa_bapisdh1x-purch_no_c = 'X' ."采购订单编号
  62.   gwa_bapisdh1-compl_dlv   = i_header-compl_dlv ."全部交货
  63.   gwa_bapisdh1x-compl_dlv  = 'X' ."全部交货
  64.   gwa_bapisdh1x-pmnttrms   = 'X' ."付款条件
  65.   gwa_bapisdh1x-ord_reason = 'X' ."订单原因
  66.   gwa_bapisdh1x-purch_no_s = 'X' .
  67.   gwa_bapisdh1x-po_meth_s  = 'X' ."采购订单类型
  68.   gwa_bapisdh1x-po_supplem = 'X' ."采购单编号补充
  69.   gwa_bapisdh1x-sales_grp  = 'X' ."销售组
  70.   gwa_bapisdh1x-sales_off  = 'X' ."销售办公室
  71.   gwa_bapisdh1x-ship_type  = 'X' .
  72.   gwa_bapisdh1x-cust_group = 'X' ."客户组
  73.   gwa_bapisdh1x-cust_grp1  = 'X' ."客户组1
  74.   gwa_bapisdh1-ref_1_s     = 'X' .
  75.   gwa_bapisdh1x-ref_1      = 'X' ."您的参考
  76.   gwa_bapisdh1x-mn_invoice = 'X' .
  77.   gwa_bapisdh1x-collect_no = 'X' .

  78.   IF i_header-date IS NOT INITIAL .
  79.     gwa_bapisdh1x-purch_date = 'X' ."采购订单日期
  80.   ENDIF .
  81.   IF gwa_bapisdh1-name IS NOT INITIAL .
  82.     gwa_bapisdh1x-name = 'X' .
  83.   ENDIF .
  84.   IF gwa_bapisdh1-costcenter IS NOT INITIAL .
  85.     gwa_bapisdh1x-costcenter = 'X' .
  86.   ENDIF .

  87. *-->合作伙伴
  88.   LOOP AT t_vbpa WHERE parvw = 'V3'.  "only V3 can be changed
  89.     CLEAR:gwa_partnerchanges.
  90.     PERFORM frm_inputsap_data CHANGING t_vbpa-vbeln.
  91.     gwa_partnerchanges-document   = t_vbpa-vbeln .
  92.     gwa_partnerchanges-itm_number = '000000'.
  93.     gwa_partnerchanges-updateflag = t_vbpa-mark .
  94.     gwa_partnerchanges-partn_role = t_vbpa-parvw .
  95.     SELECT SINGLE pernr INTO gwa_partnerchanges-p_numb_old FROM vbpa WHERE vbeln = t_vbpa-vbeln AND posnr = '000000' AND parvw = 'V3'.
  96.     gwa_partnerchanges-p_numb_new = t_vbpa-kunn2 .
  97.     APPEND gwa_partnerchanges TO git_partnerchanges .
  98.   ENDLOOP.

  99. *-->抬头长文本
  100.   IF i_header-head1 IS NOT INITIAL.
  101.     PERFORM frm_order_text TABLES git_order_text USING 'Z001' i_header-vbeln space i_header-head1.
  102.   ENDIF.
  103.   IF i_header-head2 IS NOT INITIAL.
  104.     PERFORM frm_order_text TABLES git_order_text USING 'Z002' i_header-vbeln space i_header-head2.
  105.   ENDIF.

  106. *-->行项目
  107.   DELETE t_item WHERE pstyv = 'ZTTN'.
  108.   LOOP AT t_item INTO ls_item.
  109.     PERFORM frm_inputsap_data CHANGING ls_item-vbeln.
  110.     PERFORM frm_chang_in      CHANGING ls_item-matnr .
  111.     PERFORM frm_inputsap_data CHANGING ls_item-posnr.
  112.     PERFORM frm_inputsap_data CHANGING ls_item-posnv.
  113.     PERFORM frm_inputsap_data CHANGING ls_item-uepos.
  114.     PERFORM frm_input_unit    CHANGING ls_item-vrkme. "销售单位

  115.     CLEAR gwa_bapisditm .
  116.     gwa_bapisditm-itm_number = ls_item-posnr ."行项目号
  117.     gwa_bapisditm-material   = ls_item-matnr ."物料编码
  118. *    gwa_bapisditm-target_qty = ls_item-kwmeng."数量
  119.     gwa_bapisditm-cust_mat35 = ls_item-kdmat ."客户物料号
  120.     gwa_bapisditm-hg_lv_item = ls_item-uepos ."上层项目
  121.     gwa_bapisditm-reason_rej = ls_item-abgru ."拒绝原因

  122.     IF ls_item-werks IS NOT INITIAL .         "工厂
  123.       gwa_bapisditm-plant = ls_item-werks .
  124.     ELSE .
  125.       gwa_bapisditm-plant = i_header-werks .
  126.     ENDIF .
  127.     IF ls_item-lgort IS NOT INITIAL.
  128.       gwa_bapisditm-store_loc  = ls_item-lgort ."库位
  129.     ENDIF.
  130.     IF ls_item-pstyv IS NOT INITIAL.
  131.       gwa_bapisditm-item_categ = ls_item-pstyv ."项目类别
  132.     ENDIF.
  133.     IF ls_item-vrkme IS NOT INITIAL.
  134.       gwa_bapisditm-sales_unit = ls_item-vrkme .
  135.     ENDIF .
  136.     APPEND gwa_bapisditm TO git_bapisditm .


  137.     CLEAR gwa_bapisditmx .
  138.     gwa_bapisditmx-itm_number = ls_item-posnr . "行项目号
  139.     gwa_bapisditmx-updateflag = ls_item-mark  .
  140.     gwa_bapisditmx-material   = 'X' .           "物料编码
  141.     gwa_bapisditmx-cust_mat35 = 'X' .           "客户物料号
  142.     gwa_bapisditmx-reason_rej = 'X' .           "拒绝原因
  143.     IF ls_item-uepos IS NOT INITIAL.
  144.       gwa_bapisditmx-hg_lv_item = 'X' .           "上层项目
  145.     ENDIF.
  146.     IF gwa_bapisditm-plant IS NOT INITIAL.      "工厂
  147.       gwa_bapisditmx-plant      = 'X' .
  148.     ENDIF.
  149.     IF gwa_bapisditm-store_loc IS NOT INITIAL . "库位
  150.       gwa_bapisditmx-store_loc = 'X' .
  151.     ENDIF  .
  152.     IF  gwa_bapisditm-item_categ IS NOT INITIAL .  "项目类别
  153.       gwa_bapisditmx-item_categ = 'X' .
  154.     ENDIF .
  155.     IF ls_item-vrkme IS NOT INITIAL .
  156.       gwa_bapisditmx-sales_unit = 'X' .
  157.     ENDIF .
  158.     APPEND gwa_bapisditmx TO git_bapisditmx .

  159. **-->计划行.
  160.     gwa_bapischdl-itm_number = ls_item-posnr .
  161.     gwa_bapischdl-sched_line = 1 .
  162.     IF ls_item-date IS NOT INITIAL .
  163.       CONCATENATE ls_item-date+0(4) ls_item-date+5(2) ls_item-date+8(2) INTO gwa_bapischdl-req_date .
  164.     ELSEIF gwa_bapisdh1-purch_date IS NOT INITIAL .
  165.       gwa_bapischdl-req_date =  gwa_bapisdh1-purch_date .
  166.     ELSE.
  167.       gwa_bapischdl-req_date =  sy-datum  .
  168.     ENDIF .
  169.     gwa_bapischdl-req_qty = ls_item-kwmeng .
  170.     APPEND gwa_bapischdl TO git_bapischdl .

  171.     CLEAR gwa_bapischdlx .
  172.     gwa_bapischdlx-itm_number = ls_item-posnr .          "行项目号
  173.     gwa_bapischdlx-sched_line = 1 .
  174.     gwa_bapischdlx-updateflag = ls_item-mark .           " U,D,I
  175.     gwa_bapischdlx-req_date   = 'X' .                    "首个交货日期(计划行)
  176.     gwa_bapischdlx-req_qty    = 'X' .                    "数量
  177.     APPEND gwa_bapischdlx TO git_bapischdlx .

  178. *-->行项目长文本
  179.     IF ls_item-beiz1 IS NOT INITIAL.
  180.       PERFORM frm_order_text TABLES git_order_text USING 'Z001' ls_item-vbeln ls_item-posnr ls_item-beiz1.
  181.     ENDIF.
  182.   ENDLOOP.

  183. *-->定价
  184.   DATA:lv_knumv TYPE vbak-knumv,
  185.        lv_first TYPE char1,
  186.        lv_cond_st_no TYPE bapicond-cond_st_no.
  187.   DATA:BEGIN OF lt_konv OCCURS 0,
  188.         knumv TYPE konv-knumv,
  189.         kposn TYPE konv-kposn,
  190.         stunr TYPE konv-stunr,
  191.         zaehk TYPE konv-zaehk,
  192.         kschl TYPE konv-kschl,
  193.       END OF lt_konv.

  194.   IF t_konvt[] IS NOT INITIAL .
  195.     READ TABLE t_konv TRANSPORTING NO FIELDS WITH KEY kschl = 'ZZ01' .
  196.     IF sy-subrc = 0 .
  197.       DELETE  t_konvt WHERE kschl = 'ZZ01' .
  198.     ENDIF .
  199.   ENDIF .
  200.   APPEND LINES OF t_konvt TO t_konv .
  201.   DELETE t_konv WHERE kschl = 'ZA00' .  "ZA00 国内销售折扣  自动计算出来 不需要传入
  202. *  DELETE t_konv WHERE mark = 'U' AND kbetr IS INITIAL.  "价格为零不需要更新

  203.   SELECT SINGLE knumv INTO lv_knumv FROM vbak WHERE vbeln = i_header-vbeln.
  204.   IF sy-subrc = 0.
  205.     SELECT knumv
  206.            kposn
  207.            stunr
  208.            zaehk
  209.            kschl
  210.       INTO TABLE lt_konv
  211.       FROM konv
  212.       WHERE knumv = lv_knumv.
  213.     SORT lt_konv BY knumv        kposn        stunr        zaehk.
  214.   ENDIF.

  215.   LOOP AT t_konv INTO ls_konv .
  216.     PERFORM frm_inputsap_data CHANGING ls_konv-posnr.

  217.     READ TABLE lt_konv WITH KEY kposn = ls_konv-posnr kschl = ls_konv-kschl .
  218.     IF sy-subrc = 0.
  219.       CASE ls_konv-mark.
  220.         WHEN 'U'.
  221.           gwa_bapicond-itm_number = lt_konv-kposn . "行项目号
  222.           gwa_bapicond-cond_st_no = lt_konv-stunr . "步骤编号
  223.           gwa_bapicond-cond_count = lt_konv-zaehk . "条件计数器
  224.           gwa_bapicond-cond_type  = lt_konv-kschl . "定价条件
  225.           gwa_bapicond-cond_value = ls_konv-kbetr / 10.
  226.           APPEND gwa_bapicond  TO git_bapicond.

  227.           gwa_bapicondx-itm_number = ls_konv-posnr . "行项目号
  228.           gwa_bapicondx-cond_st_no = lt_konv-stunr . "步骤编号
  229.           gwa_bapicondx-cond_count = lt_konv-zaehk . "条件计数器
  230.           gwa_bapicondx-cond_type  = lt_konv-kschl . "定价条件
  231.           gwa_bapicondx-updateflag = ls_konv-mark .  "I \U \D
  232.           gwa_bapicondx-cond_value = 'X'.
  233.           APPEND gwa_bapicondx TO git_bapicondx.
  234.         WHEN 'D'.
  235.           gwa_bapicond-itm_number = lt_konv-kposn . "行项目号
  236.           gwa_bapicond-cond_st_no = lt_konv-stunr . "步骤编号
  237.           gwa_bapicond-cond_count = lt_konv-zaehk . "条件计数器
  238.           gwa_bapicond-cond_type  = lt_konv-kschl . "定价条件
  239.           APPEND gwa_bapicond  TO git_bapicond.

  240.           gwa_bapicondx-itm_number = ls_konv-posnr . "行项目号
  241.           gwa_bapicondx-cond_st_no = lt_konv-stunr . "步骤编号
  242.           gwa_bapicondx-cond_count = lt_konv-zaehk . "条件计数器
  243.           gwa_bapicondx-cond_type  = lt_konv-kschl . "定价条件
  244.           gwa_bapicondx-updateflag = ls_konv-mark .  "I \U \D
  245.           APPEND gwa_bapicondx TO git_bapicondx.
  246.       ENDCASE.
  247.     ELSEIF ls_konv-mark = 'I'.
  248.       SELECT SINGLE stunr INTO lv_cond_st_no FROM t683s WHERE kvewe = 'A' AND kappl = 'V' AND kalsm = 'ZSG001' AND kschl = ls_konv-kschl.

  249.       CLEAR:gwa_bapicond,gwa_bapicondx.
  250.       gwa_bapicond-itm_number = ls_konv-posnr . "行项目号
  251.       gwa_bapicond-cond_st_no = lv_cond_st_no . "步骤编号
  252.       gwa_bapicond-cond_count = '01' .          "条件计数器
  253.       gwa_bapicond-cond_type  = ls_konv-kschl . "定价条件
  254.       gwa_bapicond-cond_value = ls_konv-kbetr / 10.
  255.       APPEND gwa_bapicond  TO git_bapicond.

  256.       gwa_bapicondx-itm_number = ls_konv-posnr. "行项目号
  257.       gwa_bapicondx-cond_st_no = lv_cond_st_no ."步骤编号
  258.       gwa_bapicondx-cond_count = '01'.          "条件计数器
  259.       gwa_bapicondx-cond_type  = ls_konv-kschl. "定价条件
  260.       gwa_bapicondx-updateflag = 'U'.  "I \U \D
  261.       gwa_bapicondx-cond_value = 'X'.
  262.       APPEND gwa_bapicondx TO git_bapicondx.
  263.     ENDIF.

  264.   ENDLOOP .

  265. *更改计划行类别增强
  266.   lv_stonr = i_header-stonr.
  267.   EXPORT lv_stonr TO MEMORY ID 'ABAP_STONR'.  "10/20/30/40/50

  268.   CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
  269.     EXPORTING
  270.       salesdocument    = i_header-vbeln
  271.       order_header_in  = gwa_bapisdh1
  272.       order_header_inx = gwa_bapisdh1x
  273.     TABLES
  274.       return           = git_bapiret2
  275.       order_item_in    = git_bapisditm
  276.       order_item_inx   = git_bapisditmx
  277.       partnerchanges   = git_partnerchanges
  278.       schedule_lines   = git_bapischdl
  279.       schedule_linesx  = git_bapischdlx
  280.       conditions_in    = git_bapicond
  281.       conditions_inx   = git_bapicondx
  282.       order_text       = git_order_text.

  283.   LOOP AT git_bapiret2 INTO gwa_bapiret2 WHERE type CA 'AEX'.
  284.     IF e_message-message IS INITIAL.
  285.       e_message-message = gwa_bapiret2-message.
  286.     ELSE.
  287.       e_message-message = e_message-message && '/' && gwa_bapiret2-message.
  288.     ENDIF.
  289.   ENDLOOP.
  290.   IF sy-subrc = 0.
  291.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .

  292.     e_message-type  = 'E'.
  293.   ELSE.
  294.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  295.       EXPORTING
  296.         wait = 'X'.

  297.     e_message-type    = 'S'.
  298.     e_message-message = '订单修改成功'.

  299. *获取审核后的状态
  300.     CONCATENATE 'VB' i_header-vbeln '000000' INTO lv_objnr .
  301.     CALL FUNCTION 'STATUS_READ'
  302.       EXPORTING
  303.         client           = sy-mandt
  304.         objnr            = lv_objnr
  305.       IMPORTING
  306.         stonr            = e_stonr
  307.       EXCEPTIONS
  308.         object_not_found = 1
  309.         OTHERS           = 2.

  310.   ENDIF.

  311. ENDFUNCTION.
复制代码
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表