使用 BAPI 建立含 BOM 的銷售訂單,重點在於先使用 BAPI_SALESORDER_SIMULATE 算出所有的 item no, 另外就是呼叫 BAPI_SALESORDER_CREATEFROMDAT2 時要使用 Exporting 參數 int_number_assignment = 'X'
BAPI Define:
DATA: gw_si_header LIKE bapisdhead, gw_si_return LIKE bapireturn, gt_si_items_in LIKE bapiitemin OCCURS 0 WITH HEADER LINE, gt_si_items_out LIKE bapiitemex OCCURS 0 WITH HEADER LINE, gt_si_schedules_ex LIKE bapisdhedu OCCURS 0 WITH HEADER LINE, gt_si_condition_ex LIKE bapicond OCCURS 0 WITH HEADER LINE, gt_si_partners LIKE bapipartnr OCCURS 0 WITH HEADER LINE. DATA: gw_so_header LIKE bapisdhd1, gw_so_headerx LIKE bapisdhd1x, gv_so_doc_num TYPE bapivbeln-vbeln, gt_so_return2 TYPE bapiret2, gt_so_partners TYPE bapiparnr OCCURS 0 WITH HEADER LINE, gt_so_items_in TYPE bapisditm OCCURS 0 WITH HEADER LINE, gt_so_items_inx TYPE bapisditmx OCCURS 0 WITH HEADER LINE, gt_so_schedules_in TYPE bapischdl OCCURS 0 WITH HEADER LINE, gt_so_schedules_inx TYPE bapischdlx OCCURS 0 WITH HEADER LINE, gt_so_return1 TYPE bapiret2 OCCURS 0 WITH HEADER LINE, gt_so_conditions_in TYPE bapicond OCCURS 0 WITH HEADER LINE, gt_so_conditions_inx TYPE bapicondx OCCURS 0 WITH HEADER LINE.
GT_ITAB contents so data:
LOOP AT gt_itab WHERE value = 'X' AND rfstk = 'A'. lv_count1 = lv_count1 + 1. MOVE gt_itab TO lw_itab. AT NEW pos_no. * Customer CLEAR: gt_so_partners, gt_so_partners[], gt_si_partners, gt_si_partners[]. gt_so_partners-partn_role = 'AG'. gt_so_partners-partn_numb = lw_itab-store_no. gt_si_partners-partn_role = 'AG'. gt_si_partners-partn_numb = lw_itab-store_no. APPEND: gt_so_partners, gt_si_partners. gt_so_partners-partn_role = 'WE'. gt_si_partners-partn_role = 'WE'. APPEND: gt_so_partners, gt_si_partners. * Header CLEAR: gw_so_header, gt_so_items_in[], gt_so_schedules_in[], gt_so_conditions_in[], gt_so_conditions_inx[], gw_si_header, gw_si_return, gt_si_items_in[]. gw_so_header-doc_type = lw_itab-fodtype. gw_so_header-sales_org = '1000'. gw_so_header-distr_chan = lw_itab-cha_no. gw_so_header-division = lw_itab-sal_no. gw_so_header-purch_no_c = lw_itab-pos_no. REPLACE ALL OCCURRENCES OF '/' IN lw_itab-pos_date WITH ''. gw_so_header-purch_date = lw_itab-pos_date. IF lw_itab-fodtype+3(1) EQ 'U' OR lw_itab-fodtype+3(1) EQ 'V'. gw_so_header-ord_reason = lw_itab-bktype. ENDIF. MOVE-CORRESPONDING gw_so_header TO gw_si_header. ENDAT. * Items *------------------- CLEAR: gt_so_items_in, gt_so_schedules_in, gt_si_items_in, gt_so_schedules_inx. gt_so_items_in-itm_number = lw_itab-item_no. gt_so_items_in-po_itm_no = lw_itab-item_no. gt_so_items_in-material = lw_itab-plu_no. gt_so_items_in-target_qty = lw_itab-pos_qty. IF lw_itab-fodtype+3(1) NE 'S'. gt_so_items_in-batch = lw_itab-charg. ENDIF. gt_so_items_in-plant = lw_itab-wh_no. gt_so_items_in-ship_point = lw_itab-bk_no. MOVE-CORRESPONDING gt_so_items_in TO gt_si_items_in. APPEND: gt_so_items_in, gt_si_items_in. * Prices IF lw_itab-fodtype+3(1) = 'T'. " consign gt_so_conditions_in-itm_number = lw_itab-item_no. gt_so_conditions_in-cond_type = 'PR01'. gt_so_conditions_in-cond_value = lw_itab-pos_prc. gt_so_conditions_in-currency = 'TWD'. APPEND gt_so_conditions_in. gt_so_conditions_inx-itm_number = lw_itab-item_no. gt_so_conditions_inx-cond_type = 'PR01'. gt_so_conditions_inx-updateflag = 'I'. gt_so_conditions_inx-cond_value = 'X'. gt_so_conditions_inx-currency = 'X'. APPEND gt_so_conditions_inx. ENDIF. * Scheduling *------------------- gt_so_schedules_in-itm_number = lw_itab-item_no. gt_so_schedules_in-req_qty = lw_itab-pos_qty. APPEND gt_so_schedules_in. * Creating SO *------------------- AT END OF pos_no. * CLEAR: gt_si_items_out, gt_si_schedules_ex, gv_so_doc_num. REFRESH: gt_si_items_out, gt_si_schedules_ex. IF lw_itab-fodtype+3(1) EQ 'U'. CALL FUNCTION 'BAPI_CUSTOMERRETURN_CREATE' EXPORTING return_header_in = gw_so_header int_number_assignment = 'X' IMPORTING salesdocument = gv_so_doc_num TABLES return = gt_so_return1 return_items_in = gt_so_items_in return_partners = gt_so_partners return_schedules_in = gt_so_schedules_in. ELSE. CALL FUNCTION 'BAPI_SALESORDER_SIMULATE' EXPORTING order_header_in = gw_si_header IMPORTING return = gw_si_return TABLES order_items_in = gt_si_items_in order_partners = gt_si_partners order_schedule_in = gt_so_schedules_in order_items_out = gt_si_items_out order_schedule_ex = gt_si_schedules_ex order_condition_ex = gt_si_condition_ex. * IF gw_si_return-type = 'E'. gt_itab-rfstk = 'B'. gt_itab-rmark = gw_si_return-message. MODIFY gt_itab TRANSPORTING rfstk rmark WHERE pos_no = lw_itab-pos_no. ELSE. REFRESH: gt_so_items_in, gt_so_schedules_in, gt_so_items_inx, gt_so_schedules_inx. LOOP AT gt_si_items_out. IF gt_si_items_out-po_itm_no <> ''. * update items MOVE-CORRESPONDING gt_si_items_out TO gt_so_items_in. gt_so_items_inx-itm_number = gt_so_items_in-itm_number. APPEND: gt_so_items_in, gt_so_items_inx. * update conditions LOOP AT gt_so_conditions_in WHERE itm_number = gt_si_items_out-po_itm_no. gt_so_conditions_in-itm_number = gt_so_items_in-itm_number. MODIFY gt_so_conditions_in. ENDLOOP. LOOP AT gt_so_conditions_inx WHERE itm_number = gt_si_items_out-po_itm_no. gt_so_conditions_inx-itm_number = gt_so_items_in-itm_number. MODIFY gt_so_conditions_inx. ENDLOOP. ENDIF. * Schedules READ TABLE gt_si_schedules_ex WITH KEY itm_number = gt_si_items_out-itm_number. MOVE-CORRESPONDING gt_si_schedules_ex TO gt_so_schedules_in. gt_so_schedules_inx-itm_number = gt_si_schedules_ex-itm_number. gt_so_schedules_inx-req_qty = 'X'. APPEND: gt_so_schedules_in, gt_so_schedules_inx. ENDLOOP. * CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2' EXPORTING order_header_in = gw_so_header int_number_assignment = 'X' IMPORTING salesdocument = gv_so_doc_num TABLES return = gt_so_return1 order_items_in = gt_so_items_in order_partners = gt_so_partners order_schedules_in = gt_so_schedules_in order_conditions_in = gt_so_conditions_in order_conditions_inx = gt_so_conditions_inx. ENDIF. ENDIF. ENDAT. ENDLOOP.
沒有留言:
張貼留言