SAP 物料订单创建、下达、报工、收货与投料(ABAP代码)
對主體訂單下的某一類物料通過MRP控制者的判斷,可以對此類物料進行自動創建生產訂單,自動下達,報工、收貨,最后對主體訂單投料。
1、新增加一個MRP控制者:泵送鋼管類物料的MRP控制者必須設置為168.
2、根據輸入條件讀取主體訂單(剔除CLSD、TECO、DLT)的OBOM清單,挑取MRP控制者為鋼管(168)膠管(170)(泵送鋼管訂單、泵送膠管訂單)下達鋼管、膠管的生產訂單(訂單類型為PP51)。
3、程序在下達鋼管、膠管的生產訂單時候,要判斷物料的MRP類型是否是ND,若是ND的話,程序報錯,則提示需要將該物料改為PD。計劃員手動修正MRP參數。
?4、下達生產訂單時,按物料編碼將數量匯總下達鋼管、膠管訂單,基本完成日期取當天。
?5、訂單下達后(REL狀態)模擬CO15報完工。
6、訂單報完工后模擬MB31收貨(移動類型為101,庫存地點取MRP2視圖生產倉儲地)。
7、入庫后模擬MB1A(移動類型為261,庫存地點取MRP2視圖的生產倉儲地)對預留投料到對應的主體生產訂單。
8、可選擇部分MRP控制者未168的物料下生產訂單
9、在下了生產訂單后,如果OBOM中增加了物料的數量,則對差異數量下單
REPORT? ZR_MM_GLDDCL.
TABLES: AFKO,RESB,MARC,MAKT,ZGLDDCL.
DATA: BEGIN OF GT_RESB OCCURS 0,
??? AUFNR LIKE RESB-AUFNR,
??? WERKS LIKE RESB-WERKS,
??? RSNUM LIKE RESB-RSNUM,
??? RSPOS LIKE RESB-RSPOS,
??? MATNR LIKE RESB-MATNR,
??? MEINS LIKE RESB-MEINS,
??? BDMNG LIKE RESB-BDMNG,
??? ENMNG LIKE RESB-ENMNG,
END OF GT_RESB.
DATA: BEGIN OF ITAB_SHOW OCCURS 0,
??? CHKID(1),
??? WERKS LIKE RESB-WERKS,
??? MATNR LIKE RESB-MATNR,
??? MAKTX LIKE MAKT-MAKTX,? "物料描述
??? MEINS LIKE RESB-MEINS,? "基本單位
??? XLOEK LIKE RESB-XLOEK,? "刪除標識
??? BDMNG LIKE RESB-BDMNG,? "需求數量
??? ENMNG LIKE RESB-ENMNG,? "提取數量
??? RGEKZ LIKE RESB-RGEKZ,? "反沖
??? DISPO LIKE MARC-DISPO,? "MRP控制者
??? DISMM LIKE MARC-DISMM,? "MRP類型
??? LGPRO LIKE MARC-LGPRO,? "生產倉儲地
??? SCDDH LIKE RESB-AUFNR,? "生成的生產訂單號
??? YCXX1(100),???????????? "PD,ND異常判斷
??? YCXX2(100),???????????? "訂單創建
??? YCXX3(100),???????????? "下達
??? YCXX4(100),???????????? "報工
??? YCXX5(100),???????????? "收貨
END OF ITAB_SHOW.
DATA: BEGIN OF GT_DDTL OCCURS 0,
??? AUFNR LIKE RESB-AUFNR,
??? WERKS LIKE RESB-WERKS,
??? RSNUM LIKE RESB-RSNUM,
??? RSPOS LIKE RESB-RSPOS,
??? MATNR LIKE RESB-MATNR,
??? MEINS LIKE RESB-MEINS,
??? BDMNG LIKE RESB-BDMNG,
??? ENMNG LIKE RESB-ENMNG,
??? LGPRO LIKE MARC-LGPRO,
??? YCXX1(100),
END OF GT_DDTL.
DATA: BEGIN OF GT_AFKO OCCURS 0,
??? RSNUM LIKE RESB-RSNUM,
??? AUFNR LIKE AFKO-AUFNR,
END OF GT_AFKO.
DATA: BEGIN OF GT_MARC OCCURS 0,
??? MATNR LIKE MARC-MATNR,
??? DISPO LIKE MARC-DISPO,
??? DISMM LIKE MARC-DISMM,
??? LGPRO LIKE MARC-LGPRO,
??? WERKS LIKE MARC-WERKS,
END OF GT_MARC.
DATA: BEGIN OF GT_MAKT OCCURS 0,
??? MATNR LIKE MAKT-MATNR,
??? MAKTX LIKE MAKT-MAKTX,
END OF GT_MAKT.
DATA: BEGIN OF BDCDATA OCCURS 0.
??????? INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDCDATA.
DATA: BDCMESS LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: BDC_MODE(1).
DATA: P_MODE? LIKE CTU_PARAMS-DISMODE VALUE 'N'.
DATA: IN_ZGLDDCL LIKE ZGLDDCL OCCURS 0 WITH HEADER LINE.
DATA: GT_ZGLDDCL LIKE ZGLDDCL OCCURS 0 WITH HEADER LINE.
DATA: TL_ZGLDDCL LIKE ZGLDDCL OCCURS 0 WITH HEADER LINE.
DATA: FLAG_SUCCESS(1).
RANGES: R_RSNUM FOR RESB-RSNUM.
RANGES: R_MATNR FOR RESB-MATNR.
*&--------------------------------------------------------------------*
*&????? 屏幕顯示
*&--------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_WERKS LIKE RESB-WERKS OBLIGATORY DEFAULT '1802',"工廠
??????????? P_DISPO LIKE MARC-DISPO DEFAULT '168'.??? "MRP控制者
SELECT-OPTIONS: S_AUFNR FOR AFKO-AUFNR."生產訂單
SELECTION-SCREEN: END OF BLOCK B1.
*&--------------------------------------------------------------------*
*&????? 程序執行
*&--------------------------------------------------------------------*
START-OF-SELECTION.
??? PERFORM AUTHORITY_CHECK.
??? PERFORM INPUT_CHECK.
??? PERFORM GET_DATA.
??? PERFORM SHOW.
*&---------------------------------------------------------------------*
*&????? Form? GET_DATA
*&---------------------------------------------------------------------*
FORM GET_DATA .
? DATA:
??? LV_OBJNR TYPE AUFK-OBJNR,
??? LV_LINE? TYPE BSVX-STTXT,
??? LV_LOEKZ TYPE AUFK-LOEKZ,
??? LV_FLAG? TYPE CHAR1.
* 剔除訂單狀態為 CLSD、TECO、DLT、CRTD OBOM清單
? CLEAR: GT_AFKO,GT_AFKO[].
? SELECT RSNUM AUFNR INTO TABLE GT_AFKO
???? FROM AFKO
???? WHERE AUFNR IN S_AUFNR.
? IF GT_AFKO[] IS INITIAL.
??? MESSAGE '該訂單預留不存在!' TYPE 'S'.
??? STOP.
? ENDIF.
? LOOP AT GT_AFKO.
* 訂單的對象號
??? SELECT SINGLE OBJNR INTO LV_OBJNR
????? FROM AUFK
???? WHERE AUFNR = GT_AFKO-AUFNR
?????? AND LOEKZ = ''.
??? IF LV_OBJNR IS NOT INITIAL.
* 取得訂單的訂單狀態
????? CALL FUNCTION 'STATUS_TEXT_EDIT'
??????? EXPORTING
????????? OBJNR??????????? = LV_OBJNR
????????? SPRAS??????????? = SY-LANGU
??????? IMPORTING
????????? LINE???????????? = LV_LINE
??????? EXCEPTIONS
????????? OBJECT_NOT_FOUND = 1
????????? OTHERS?????????? = 2.
????? IF LV_LINE CS 'TECO' OR LV_LINE CS 'CLSD' OR
???????? LV_LINE CS 'DLT' OR LV_LINE CS 'CRTD'.
??????????? DELETE GT_AFKO.
????? ENDIF.
??? ENDIF.
? ENDLOOP.
? IF GT_AFKO[] IS INITIAL.
??? MESSAGE '該訂單預留不存在!' TYPE 'S'.
??? STOP.
? ELSE.
????? LOOP AT GT_AFKO.
????????? R_RSNUM-SIGN = 'I'.
????????? R_RSNUM-OPTION = 'EQ'.
????????? R_RSNUM-LOW = GT_AFKO-RSNUM.
????????? APPEND R_RSNUM.
????????? CLEAR R_RSNUM.
????? ENDLOOP.
? ENDIF.
? SELECT AUFNR WERKS RSNUM RSPOS MATNR MEINS BDMNG ENMNG INTO
??? CORRESPONDING FIELDS OF TABLE GT_RESB
??? FROM RESB
??? WHERE RSNUM IN R_RSNUM
????? AND XLOEK <> 'X'?? "刪除的
????? AND DUMPS <> 'X'?? "虛擬件
????? AND DBSKZ <> 'E'?? "父子訂單物料,排除
????? AND BDMNG <> '0'.
? LOOP AT GT_RESB.
????? MOVE-CORRESPONDING GT_RESB TO ITAB_SHOW.
????? COLLECT ITAB_SHOW.
? ENDLOOP.
* 判斷物料是否為鋼管或膠管
? IF ITAB_SHOW[] IS NOT INITIAL.
??? SELECT MATNR DISPO DISMM LGPRO WERKS INTO TABLE GT_MARC
??? FROM MARC
??? FOR ALL ENTRIES IN ITAB_SHOW
??? WHERE MATNR = ITAB_SHOW-MATNR
????? AND WERKS = ITAB_SHOW-WERKS.
? ENDIF.
? SORT GT_MARC BY MATNR.
? LOOP AT ITAB_SHOW.
??? READ TABLE GT_MARC WITH KEY MATNR = ITAB_SHOW-MATNR BINARY SEARCH.
??? IF SY-SUBRC = 0.
??????? ITAB_SHOW-DISPO = GT_MARC-DISPO.
??????? ITAB_SHOW-DISMM = GT_MARC-DISMM.
??????? ITAB_SHOW-LGPRO = GT_MARC-LGPRO.
??????? IF GT_MARC-DISMM = 'ND'.
??????????? ITAB_SHOW-YCXX1 = 'MRP類型為ND,請手動修正MRP參數。'.
??????? ENDIF.
??? ENDIF.
??? MODIFY ITAB_SHOW.
? ENDLOOP.
* 刪除MRP控制者不為168的。
? DELETE ITAB_SHOW WHERE DISPO <> P_DISPO.
* 獲取物料描述
? IF ITAB_SHOW[] IS NOT INITIAL.
??? SELECT MATNR MAKTX INTO TABLE GT_MAKT
????? FROM MAKT
????? FOR ALL ENTRIES IN ITAB_SHOW
????? WHERE MATNR = ITAB_SHOW-MATNR
??????? AND SPRAS = SY-LANGU.
? ENDIF.
? SORT GT_MAKT BY MATNR.
? LOOP AT ITAB_SHOW.
????? READ TABLE GT_MAKT WITH KEY MATNR = ITAB_SHOW-MATNR BINARY SEARCH.
????? IF SY-SUBRC = 0.
????????? ITAB_SHOW-MAKTX = GT_MAKT-MAKTX.
????? ENDIF.
????? MODIFY ITAB_SHOW.
? ENDLOOP.
ENDFORM.??????????????????? " GET_DATA
*&---------------------------------------------------------------------*
*&????? Form? SHOW
*&---------------------------------------------------------------------*
FORM SHOW .
? TYPE-POOLS SLIS.
? DATA: WS_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
??????? WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
??????? WS_LAYOUT????????? TYPE SLIS_LAYOUT_ALV,
??????? WS_SORTFIELDS_TAB? TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
??????? WS_EVENTS????????? TYPE SLIS_T_EVENT.
? DATA: V_REPID LIKE SY-REPID.
? DATA: NN TYPE I VALUE 0.
? DATA: TITLE TYPE LVC_TITLE.
? DEFINE HOUT.
??? NN = NN + 1.
??? WS_FIELDCAT-TABNAME?? = 'ITAB_SHOW'.
??? WS_FIELDCAT-FIELDNAME = '&1'.
??? WS_FIELDCAT-SELTEXT_M =? &2.
??? WS_FIELDCAT-COL_POS?? =? NN.
??? WS_FIELDCAT-OUTPUTLEN =? &3.
??? WS_FIELDCAT-DATATYPE? = '&4'.
*??? ws_fieldcat-do_sum??? = '&5'.
??? WS_FIELDCAT-LZERO???? = 'X'.
??? APPEND WS_FIELDCAT.
??? CLEAR WS_FIELDCAT.
? END-OF-DEFINITION.
? HOUT MATNR????? '物料'??????????????? 15 CHAR.
? HOUT MAKTX????? '物料描述'??????????? 30 CHAR.
? HOUT MEINS????? '單位'???????????????? 6 CHAR.
? HOUT BDMNG????? '需求數量'??????????? 13 QUAN.
? HOUT ENMNG????? '提貨數量'??????????? 13 QUAN.
? HOUT SCDDH????? '生產訂單'??????????? 12 CHAR.
? HOUT DISMM????? 'MRP類型'????????????? 2 CHAR.
? HOUT LGPRO????? '生產倉儲地'?????????? 4 CHAR.
? HOUT YCXX1????? '異常信息1'????????? 100 CHAR.
? HOUT YCXX2????? '生產訂單創建'?????? 100 CHAR.
? HOUT YCXX3????? '生產訂單下達'?????? 100 CHAR.
? HOUT YCXX4????? '生產訂單報工'?????? 100 CHAR.
? HOUT YCXX5????? '生產訂單收貨'?????? 100 CHAR.
*? title = '泵送清單打印報表'.
? WS_LAYOUT-ZEBRA???????????? = 'X'.
? WS_LAYOUT-GET_SELINFOS????? = ''.
? WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
? WS_LAYOUT-DETAIL_POPUP????? = 'X'.
? WS_LAYOUT-NO_KEYFIX???????? = 'X'.
? WS_LAYOUT-BOX_FIELDNAME???? = 'CHKID'.
? V_REPID = SY-REPID.
? CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
??? EXPORTING
????? I_CALLBACK_PROGRAM?????? = V_REPID
????? I_CALLBACK_PF_STATUS_SET = 'MENU_SET'
????? I_CALLBACK_USER_COMMAND? = 'EXECUTE_COMMAND'
????? IS_LAYOUT??????????????? = WS_LAYOUT
????? IT_FIELDCAT????????????? = WS_FIELDCAT[]
????? IT_SPECIAL_GROUPS??????? = WS_FIELDGROUPS_TAB[]
????? IT_SORT????????????????? = WS_SORTFIELDS_TAB[]
????? IT_EVENTS??????????????? = WS_EVENTS[]
????? I_GRID_TITLE???????????? = TITLE
??? TABLES
????? T_OUTTAB???????????????? = ITAB_SHOW
??? EXCEPTIONS
????? PROGRAM_ERROR??????????? = 1
????? OTHERS?????????????????? = 2.
ENDFORM.??????????????????? " SHOW
*&---------------------------------------------------------------------*
*&????? Form? AUTHORITY_CHECK
*&---------------------------------------------------------------------*
FORM AUTHORITY_CHECK .
? AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
?????????? ID 'ACTVT' FIELD '03'
?????????? ID 'WERKS' FIELD P_WERKS.
? IF SY-SUBRC <> 0.
??? MESSAGE '沒有工廠的權限!' TYPE 'I'.
??? STOP.
? ENDIF.
ENDFORM.??????????????????? " AUTHORITY_CHECK
*---------------------------------------------------------------------*
*?????? FORM MENU_SET???????????????????????????????????????????????? *
*---------------------------------------------------------------------*
FORM MENU_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
? SET PF-STATUS 'S001' .
ENDFORM.??????????????????? "menu_set
*---------------------------------------------------------------------*
*?????? FORM EXECUTE_COMMAND????????????????????????????????????????? *
*---------------------------------------------------------------------*
*?????? ........????????????????????????????????????????????????????? *
*---------------------------------------------------------------------*
*? -->? R_UCOMM?????????????????????????????????????????????????????? *
*? -->? RS_SELFIELD?????????????????????????????????????????????????? *
*---------------------------------------------------------------------*
FORM EXECUTE_COMMAND USING R_UCOMM LIKE SY-UCOMM
??????????????????????? RS_SELFIELD TYPE SLIS_SELFIELD.
*從ALV讀取更新數據
?? READ TABLE ITAB_SHOW INDEX RS_SELFIELD-TABINDEX.
?? DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
?? DATA: ERR(1).
?? CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
???????? IMPORTING? E_GRID = LR_GRID.
?? CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
?? RS_SELFIELD-REFRESH = 'X'.? "自動刷新
? CASE R_UCOMM.
??? WHEN 'DDPCL'.
????? CLEAR : R_MATNR,R_MATNR[].
????? LOOP AT ITAB_SHOW WHERE CHKID = 'X'.
* 選中的物料 ADD BY LIURB 20110720
??????? R_MATNR-SIGN = 'I'.
??????? R_MATNR-OPTION = 'EQ'.
??????? R_MATNR-LOW = ITAB_SHOW-MATNR.
??????? APPEND R_MATNR.
??????? CLEAR R_MATNR.
* 生成生產訂單-CO01/CO02
??????? PERFORM CREAT_PO.
??????? SELECT * INTO CORRESPONDING FIELDS OF TABLE IN_ZGLDDCL
????????? FROM ZGLDDCL
????????? WHERE MATNR = ITAB_SHOW-MATNR
??????????? AND WERKS = ITAB_SHOW-WERKS
??????????? AND SCDDH = ITAB_SHOW-SCDDH.
??????? READ TABLE IN_ZGLDDCL INDEX 1.
* 訂單下達
??????? IF SY-SUBRC = 0.
??????????? IF IN_ZGLDDCL-FLAG2 = 'X'.
??????????????? ITAB_SHOW-YCXX3 = '訂單已下達,不能重復下達'.
??????????? ELSE.
??????????????? WAIT UP TO 1 SECONDS.
??????????????? PERFORM CALL_BDC_DDXD.
??????????? ENDIF.
*訂單工序報工-CO15
??????????? IF IN_ZGLDDCL-FLAG3 = 'X'.
??????????????? ITAB_SHOW-YCXX4 = '工序已報工,不能重復報工'.
??????????? ELSE.
??????????????? WAIT UP TO 1 SECONDS.
??????????????? PERFORM GET_GXBG.
??????????? ENDIF.
*?? 訂單收貨 - MB31
??????????? IF IN_ZGLDDCL-FLAG4 = 'X'.
??????????????? ITAB_SHOW-YCXX5 = '訂單已收貨,不能重復收貨'.
??????????? ELSE.
??????????????? WAIT UP TO 1 SECONDS.
??????????????? PERFORM GET_DDSH.
??????????? ENDIF.
??????? ENDIF.
??????? MODIFY ITAB_SHOW.
????? ENDLOOP.
*?? 訂單投料 - MB1A
????? WAIT UP TO 1 SECONDS.
????? PERFORM GET_DDTL.
*?? 投料信息顯示
??? WHEN 'XSDDTLJG'.
????? PERFORM SHOW_DDTLXX.
??? WHEN 'EXIT'.
????? LEAVE PROGRAM.
??? WHEN 'BACK1' OR 'CANCEL'.
????? SUBMIT ZR_MM_GLDDCL? VIA SELECTION-SCREEN.
? ENDCASE.
ENDFORM.??????????????????? "execute_command
*&---------------------------------------------------------------------*
*&????? Form? CREAT_PO
*&---------------------------------------------------------------------*
*?????? text
*----------------------------------------------------------------------*
FORM CREAT_PO .
??? DATA: I_ORDDATA LIKE BAPI_PP_ORDER_CREATE OCCURS 0 WITH HEADER LINE,
????????? I_RETURN LIKE BAPIRET2,
????????? I_ORDER_NUMBER LIKE BAPI_ORDER_KEY-ORDER_NUMBER,
????????? I_ORDER_TYPE LIKE BAPI_ORDER_COPY-ORDER_TYPE.
??? DATA: TEMP_AUFNR LIKE AFPO-AUFNR.
??? DATA: FLAG(1),
????????? FLAG_RSNUM LIKE RESB-RSNUM,
????????? FLAG_MATNR LIKE RESB-MATNR,
????????? FLAG_AUFNR LIKE AFKO-AUFNR,
????????? FLAG_BDMNG LIKE RESB-BDMNG,
????????? CL_BDMNG LIKE RESB-BDMNG.
* 判斷是否已經對該訂單的物料生成了生產訂單
????? CLEAR : FLAG,FLAG_RSNUM,FLAG_MATNR,FLAG_AUFNR,FLAG_BDMNG.
????? CLEAR : GT_ZGLDDCL,GT_ZGLDDCL[].
????? SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ZGLDDCL
??????? FROM ZGLDDCL
??????? WHERE MATNR = ITAB_SHOW-MATNR
????????? AND WERKS = ITAB_SHOW-WERKS.
????? LOOP AT GT_ZGLDDCL WHERE MATNR = ITAB_SHOW-MATNR
?????????????????????????? AND WERKS = ITAB_SHOW-WERKS.
????????? IF GT_ZGLDDCL-RSNUM IN R_RSNUM.
????????????? FLAG_BDMNG = FLAG_BDMNG + GT_ZGLDDCL-BDMNG.
????????????? IF GT_ZGLDDCL-SCDDH IS NOT INITIAL.
????????????????? FLAG = 'X'.
????????????????? FLAG_AUFNR = GT_ZGLDDCL-SCDDH.
????????????? ELSE.
????????????????? FLAG_RSNUM = GT_ZGLDDCL-RSNUM.
????????????? ENDIF.
????????? ENDIF.
????? ENDLOOP.
* 判斷需求數量與已下單的數量是否相同,
* 如果小于大于下單數量,則允許下單,數量為差異量
* ADD BY LIURB 20110720
????? CL_BDMNG = ITAB_SHOW-BDMNG.
????? IF FLAG_BDMNG <> ITAB_SHOW-BDMNG.
????????? CL_BDMNG = ITAB_SHOW-BDMNG - FLAG_BDMNG.
????????? FLAG = ''.
????????? ITAB_SHOW-BDMNG = CL_BDMNG.
????? ENDIF.
????? CLEAR : I_ORDDATA ,I_ORDDATA[].
????? I_ORDDATA-MATERIAL = ITAB_SHOW-MATNR.
????? I_ORDDATA-PLANT = ITAB_SHOW-WERKS.
????? I_ORDDATA-PLANNING_PLANT = ITAB_SHOW-WERKS.
????? I_ORDDATA-ORDER_TYPE = 'PP51'.
????? I_ORDDATA-QUANTITY = CL_BDMNG.
????? I_ORDDATA-BASIC_START_DATE = SY-DATUM.
????? I_ORDDATA-BASIC_END_DATE = SY-DATUM.
????? I_ORDDATA-QUANTITY_UOM = ITAB_SHOW-MEINS.
????? APPEND I_ORDDATA.
????? IF FLAG = 'X'.
????????? ITAB_SHOW-YCXX2 = '訂單已創建,不能重復創建'.
????????? ITAB_SHOW-SCDDH = FLAG_AUFNR.
????? ELSE.
??????? CLEAR: I_RETURN.
??????? CALL FUNCTION 'BAPI_PRODORD_CREATE'
??????? EXPORTING
????????? ORDERDATA??????? = I_ORDDATA
??????? IMPORTING
????????? RETURN?????????? = I_RETURN
????????? ORDER_NUMBER???? = I_ORDER_NUMBER
????????? ORDER_TYPE?????? = I_ORDER_TYPE.
??????? IF I_RETURN-TYPE <>? 'E'.
??????????? CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
????????????? EXPORTING
??????????????? WAIT = 'X'.
??????????? ITAB_SHOW-SCDDH = I_ORDER_NUMBER.
??????????? ITAB_SHOW-YCXX2 = '訂單創建成功'.
*** 更新自定義表
??????????? FLAG_MATNR = ITAB_SHOW-MATNR.
??????????? PERFORM UPDATE_ZGLDDCL USING
??????????????????? FLAG_RSNUM I_ORDER_NUMBER FLAG_MATNR.
??????? ELSE.
??????????? CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
??????????? FLAG_SUCCESS = ''.
??????????? WAIT UP TO 1 SECONDS.
??????????? ITAB_SHOW-YCXX2 = I_RETURN-MESSAGE.
??????? ENDIF.
????? ENDIF.
ENDFORM.??????????????????? " CREAT_PO
*&---------------------------------------------------------------------*
*&????? Form? INPUT_CHECK
*&---------------------------------------------------------------------*
FORM INPUT_CHECK .
??? IF S_AUFNR IS INITIAL.
??????? MESSAGE '該訂單預留不存在!' TYPE 'S'.
??????? STOP.
??? ENDIF.
??? IF P_DISPO IS INITIAL.
??????? MESSAGE 'MRP控制者不能為空!' TYPE 'S'.
??????? STOP.
??? ENDIF.
*鋼管的MRP控制者為168,膠管的MRP控制者為170
*目前只處理鋼管2011.7.14
??? IF P_DISPO <> '168'.
??????? MESSAGE 'MRP控制者必須為168!' TYPE 'S'.
??????? STOP.
??? ENDIF.
ENDFORM.??????????????????? " INPUT_CHECK
*&---------------------------------------------------------------------*
*&????? Form? CALL_BDC_DDXD
*&---------------------------------------------------------------------*
*?????? 訂單下達
*----------------------------------------------------------------------*
FORM CALL_BDC_DDXD.
* START BDC
? DO 2 TIMES.
??? CLEAR: BDCDATA,BDCDATA[],BDCMESS,BDCMESS[].
??? PERFORM BDC_DYNPRO????? USING 'SAPLCOKO1'?'0110'.
??? PERFORM BDC_FIELD?????? USING 'BDC_OKCODE'?'/00'.
??? PERFORM BDC_FIELD?????? USING 'CAUFVD-AUFNR'
????????????????????????????????? ITAB_SHOW-SCDDH.
??? PERFORM BDC_FIELD?????? USING 'R62CLORD-FLG_OVIEW'
????????????????????????????????? 'X'.
??? PERFORM BDC_DYNPRO????? USING 'SAPLCOKO1'?'0115'.
??? PERFORM BDC_FIELD?????? USING 'BDC_OKCODE'?'=FREI'.
??? PERFORM BDC_DYNPRO????? USING 'SAPLCOKO1'?'0115'.
??? PERFORM BDC_FIELD?????? USING 'BDC_OKCODE'
??????????????????????????????????? '=BU'.
??? BDC_MODE = P_MODE.
??? WAIT UP TO 1 SECONDS.
??? CALL TRANSACTION 'CO02' USING BDCDATA
????????????????????????????? UPDATE 'S' MODE? BDC_MODE
????????????????????????????? MESSAGES INTO BDCMESS.
??? IF SY-SUBRC = 0.
??????? COMMIT WORK.
??????? ITAB_SHOW-YCXX3 = '下達成功'.
??????? UPDATE ZGLDDCL SET FLAG2 = 'X'
???????????????????? WHERE SCDDH = ITAB_SHOW-SCDDH
?????????????????????? AND MATNR = ITAB_SHOW-MATNR.
??????? EXIT.
??? ELSE.
??????? ROLLBACK WORK.
??????? ITAB_SHOW-YCXX3 = '下達失敗,請手動下達'.
??? ENDIF.
? ENDDO.
* END BDC
ENDFORM.??????????????????? " CALL_BDC_DDXD
*&---------------------------------------------------------------------*
*&????? Form? bdc_dynpro
*&---------------------------------------------------------------------*
*?????? text
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
? CLEAR BDCDATA.
? BDCDATA-PROGRAM = PROGRAM.
? BDCDATA-DYNPRO = DYNPRO.
? BDCDATA-DYNBEGIN = 'X'.
? APPEND BDCDATA.
ENDFORM.??????????????????? "bdc_dynpro
*&---------------------------------------------------------------------*
*&????? Form? bdc_dynpro
*&---------------------------------------------------------------------*
*?????? text
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
? CLEAR BDCDATA.
? BDCDATA-FNAM = FNAM.
? BDCDATA-FVAL = FVAL.
? APPEND BDCDATA.
ENDFORM.??????????????????? "bdc_field
*&---------------------------------------------------------------------*
*&????? Form? GET_GXBG
*&---------------------------------------------------------------------*
*?????? text
*----------------------------------------------------------------------*
FORM GET_GXBG.
* START BDC
??? CLEAR: BDCDATA,BDCDATA[],BDCMESS,BDCMESS[].
??? PERFORM BDC_DYNPRO????? USING 'SAPLCORU'?'0400'.
??? PERFORM BDC_FIELD?????? USING 'BDC_OKCODE'?'/00'.
??? PERFORM BDC_FIELD?????? USING 'CORUF-AUFNR' ITAB_SHOW-SCDDH.
??? PERFORM BDC_DYNPRO????? USING 'SAPLCORU'?'0410'.
??? PERFORM BDC_FIELD?????? USING 'BDC_OKCODE' '=BU'.
??? PERFORM BDC_FIELD?????? USING 'CORUF-AUTER'?'X'.
??? PERFORM BDC_FIELD?????? USING 'CORUF-AUSBU'?''.
??? BDC_MODE = P_MODE.
??? CALL TRANSACTION 'CO15' USING BDCDATA
????????????????????????????? UPDATE 'S' MODE? BDC_MODE
????????????????????????????? MESSAGES INTO BDCMESS.
??? IF SY-SUBRC = 0.
??????? COMMIT WORK.
??????? UPDATE ZGLDDCL SET FLAG3 = 'X'
???????????????????? WHERE SCDDH = ITAB_SHOW-SCDDH
?????????????????????? AND MATNR = ITAB_SHOW-MATNR.
??????? ITAB_SHOW-YCXX4 = '報工成功'.
??? ELSE.
??????? ROLLBACK WORK.
??????? ITAB_SHOW-YCXX4 = '報工失敗,請手動報工'.
??? ENDIF.
* END BDC
ENDFORM.??????????????????? " GET_GXBG
*&---------------------------------------------------------------------*
*&????? Form? GET_DDSH
*&---------------------------------------------------------------------*
*?????? 訂單收貨
*----------------------------------------------------------------------*
FORM GET_DDSH .
??? DATA:
??? LW_AUFNR TYPE AUFNR,
??? LW_MATNR TYPE MATNR,
??? LW_MESSAGE(100).
? DATA:
??? I_GHEADER?? TYPE BAPI2017_GM_HEAD_01,
??? I_MDOCUMENT TYPE BAPI2017_GM_HEAD_RET-MAT_DOC,
??? I_MDOCYEAR? TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
??? I_GITEM???? TYPE TABLE OF BAPI2017_GM_ITEM_CREATE WITH HEADER LINE,
??? I_RETURN??? TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
????? CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
??????? EXPORTING
????????? INPUT?? = ITAB_SHOW-SCDDH
??????? IMPORTING
????????? OUTPUT? = LW_AUFNR.
????? I_GHEADER-DOC_DATE?? = SY-DATUM.
????? I_GHEADER-PSTNG_DATE = SY-DATUM.
????? SELECT MATNR
??????? INTO LW_MATNR
??????? FROM AFPO
????????? UP TO 1 ROWS
?????? WHERE AUFNR = LW_AUFNR.
????? ENDSELECT.
????? I_GITEM-MOVE_TYPE? = '101'.
????? I_GITEM-MVT_IND??? = 'F'. "有關生產單的貨物移動
????? I_GITEM-PLANT????? = ITAB_SHOW-WERKS.
????? I_GITEM-STGE_LOC?? = ITAB_SHOW-LGPRO.
????? I_GITEM-MATERIAL?? = LW_MATNR.
????? I_GITEM-ENTRY_QNT? = ITAB_SHOW-BDMNG.
????? I_GITEM-ORDERID??? = LW_AUFNR.
????? APPEND I_GITEM.
????? CLEAR : I_RETURN,I_RETURN[].
????? CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
??????? EXPORTING
????????? GOODSMVT_HEADER?????? = I_GHEADER
????????? GOODSMVT_CODE???????? = '02' "MB31
??????? IMPORTING
????????? MATERIALDOCUMENT????? = I_MDOCUMENT
????????? MATDOCUMENTYEAR?????? = I_MDOCYEAR
??????? TABLES
????????? GOODSMVT_ITEM???????? = I_GITEM
????????? RETURN??????????????? = I_RETURN.
????? IF I_MDOCUMENT IS NOT INITIAL.
??????? CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
??????????????? EXPORTING
????????????????? WAIT = 'X'.
??????? UPDATE ZGLDDCL SET FLAG4 = 'X'
???????????????????? WHERE SCDDH = ITAB_SHOW-SCDDH
?????????????????????? AND MATNR = ITAB_SHOW-MATNR.
??????? ITAB_SHOW-YCXX5 = '收貨成功'.
????? ELSE.
?????? ITAB_SHOW-YCXX5 = I_RETURN-MESSAGE.
????? ENDIF.
ENDFORM.??????????????????? " GET_DDSH
*&---------------------------------------------------------------------*
*&????? Form? GET_DDTL
*&---------------------------------------------------------------------*
*?????? 訂單投料
*----------------------------------------------------------------------*
FORM GET_DDTL .
??? DATA:
??? LV_ERRFLG?? TYPE CHAR1,
??? LV_XCHPF??? TYPE MARA-XCHPF,
??? LV_BDMNG??? TYPE RESBD-BDMNG,
??? LT_MCHB???? TYPE MCHB OCCURS 0 WITH HEADER LINE,
??? I_GHEADER?? TYPE TABLE OF BAPI2017_GM_HEAD_01 WITH HEADER LINE ,
??? I_GHEADRET? TYPE TABLE OF BAPI2017_GM_HEAD_RET WITH HEADER LINE ,
??? I_MDOCUMENT TYPE BAPI2017_GM_HEAD_RET-MAT_DOC,
??? I_MDOCYEAR? TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
??? I_GITEM???? TYPE TABLE OF BAPI2017_GM_ITEM_CREATE WITH HEADER LINE ,
??? I_GSNUMBER? TYPE TABLE OF BAPI2017_GM_SERIALNUMBER WITH HEADER LINE,
??? I_RETURN??? TYPE TABLE OF BAPIRET2 WITH HEADER LINE,
??? LS_MSEG???? TYPE MSEG,
??? TLSL??????? LIKE RESB-BDMNG.
??? CONCATENATE SY-UNAME ' ' SY-TCODE INTO I_GHEADER-HEADER_TXT.
??? I_GHEADER-DOC_DATE?? = SY-DATUM.
??? I_GHEADER-PSTNG_DATE = SY-DATUM.
??? APPEND I_GHEADER.
??? CLEAR : GT_DDTL,GT_DDTL[],TL_ZGLDDCL,TL_ZGLDDCL[].
* 比較ITAB_SHOW和GT_RESB,刪除GT_RESB中不滿足條件的物料
??? DELETE GT_RESB WHERE MATNR NOT IN R_MATNR.
??? IF GT_RESB[] IS NOT INITIAL.
????? SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_DDTL
??????? FROM RESB
??????? FOR ALL ENTRIES IN GT_RESB
??????? WHERE MATNR = GT_RESB-MATNR
????????? AND RSNUM IN R_RSNUM
????????? AND XLOEK <> 'X'?? "刪除的
????????? AND DUMPS <> 'X'?? "虛擬件
????????? AND DBSKZ <> 'E'?? "父子訂單物料,排除
????????? AND BDMNG <> '0'.
??? ENDIF.
??? IF GT_DDTL[] IS NOT INITIAL.
?????? SELECT * INTO CORRESPONDING FIELDS OF TABLE TL_ZGLDDCL
????????? FROM ZGLDDCL
????????? FOR ALL ENTRIES IN GT_DDTL
????????? WHERE MATNR = GT_DDTL-MATNR
??????????? AND WERKS = GT_DDTL-WERKS
??????????? AND AUFNR = GT_DDTL-AUFNR.
??? ENDIF.
??? SORT ITAB_SHOW BY MATNR.
??? SORT TL_ZGLDDCL BY AUFNR MATNR WERKS.
??? LOOP AT GT_DDTL.
??????? READ TABLE GT_MARC WITH KEY
????????????? MATNR = GT_DDTL-MATNR BINARY SEARCH.
??????? IF SY-SUBRC = 0.
??????????? GT_DDTL-LGPRO = GT_MARC-LGPRO.
??????????? MODIFY GT_DDTL.
??????? ENDIF.
??????? READ TABLE TL_ZGLDDCL WITH KEY
????????????? AUFNR = GT_DDTL-AUFNR
????????????? MATNR = GT_DDTL-MATNR
????????????? FLAG1 = 'X'
????????????? FLAG2 = 'X'
????????????? FLAG3 = 'X'
????????????? FLAG4 = 'X'
????????????? BINARY SEARCH.
*如果該物料的所有操作沒有成功,則不對該物料投料
??????? IF SY-SUBRC <> 0.
??????????? GT_DDTL-YCXX1 = '訂單物料異常,不能投料'.
??????????? MODIFY GT_DDTL.
??????????? CONTINUE.
??????? ENDIF.
??????? CLEAR: I_RETURN,I_RETURN[],I_GITEM,I_GITEM[],LV_ERRFLG,TLSL.
??????? TLSL = GT_DDTL-BDMNG - GT_DDTL-ENMNG.
*如果已經投過料,則不投
??????? IF TL_ZGLDDCL-FLAG5 = 'X' AND TLSL = 0.
??????????? GT_DDTL-YCXX1 = '訂單已投料,不能重復投料'.
??????????? MODIFY GT_DDTL.
??????????? CONTINUE.
??????? ENDIF.
??????? I_GITEM-MATERIAL?? = GT_DDTL-MATNR.
??????? I_GITEM-STGE_LOC?? = GT_DDTL-LGPRO.
??????? I_GITEM-ENTRY_QNT? = TLSL.
??????? I_GITEM-ENTRY_UOM? = GT_DDTL-MEINS.
??????? I_GITEM-MOVE_TYPE? = '261'.
??????? I_GITEM-PLANT????? = GT_DDTL-WERKS.
??????? I_GITEM-ORDERID??? = GT_DDTL-AUFNR.
??????? I_GITEM-RESERV_NO? = GT_DDTL-RSNUM.
??????? I_GITEM-RES_ITEM?? = GT_DDTL-RSPOS.
??????? APPEND I_GITEM.
*?????? 向生產訂單的預留發料
??????? CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
????????? EXPORTING
??????????? GOODSMVT_HEADER?????? = I_GHEADER
??????????? GOODSMVT_CODE???????? = '03' "MB1A
????????? IMPORTING
??????????? GOODSMVT_HEADRET????? = I_GHEADRET
??????????? MATERIALDOCUMENT????? = I_MDOCUMENT
??????????? MATDOCUMENTYEAR?????? = I_MDOCYEAR
????????? TABLES
??????????? GOODSMVT_ITEM???????? = I_GITEM
??????????? GOODSMVT_SERIALNUMBER = I_GSNUMBER
??????????? RETURN??????????????? = I_RETURN.
??????? LOOP AT I_RETURN.
????????? IF I_RETURN-TYPE = 'E' OR
???????????? I_RETURN-TYPE = 'A'.
??????????? LV_ERRFLG = 'X'.
????????? ENDIF.
??????? ENDLOOP.
??????? IF LV_ERRFLG = 'X'.
????????? CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
????????? WAIT UP TO 1 SECONDS.
????????? GT_DDTL-YCXX1 = I_RETURN-MESSAGE.
??????? ELSE.
????????? CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
??????????? EXPORTING
????????????? WAIT = 'X'.
????????? UPDATE ZGLDDCL SET FLAG5 = 'X'
???????????????????????????? ENMNG = TLSL
?????????????????????? WHERE AUFNR = GT_DDTL-AUFNR
???????????????????????? AND MATNR = GT_DDTL-MATNR
???????????????????????? AND WERKS = GT_DDTL-WERKS.
????????? GT_DDTL-YCXX1 = '訂單投料成功'.
??????? ENDIF.
??????? MODIFY GT_DDTL.
??? ENDLOOP.
ENDFORM.??????????????????? " GET_DDTL
*&---------------------------------------------------------------------*
*&????? Form? UPDATE_ZGLDDCL
*&---------------------------------------------------------------------*
*?????? text
*----------------------------------------------------------------------*
FORM UPDATE_ZGLDDCL? USING??? P_FLAG_RSNUM
????????????????????????????? P_O_ORDER_NUMBER
????????????????????????????? P_FLAG_MATNR.
* 比較ITAB_SHOW和GT_RESB,刪除GT_RESB中不滿足條件的物料
??? DELETE GT_RESB WHERE MATNR NOT IN R_MATNR.
??? CLEAR : GT_ZGLDDCL,GT_ZGLDDCL[].
??? LOOP AT GT_RESB WHERE MATNR = P_FLAG_MATNR.
??????? MOVE-CORRESPONDING GT_RESB TO GT_ZGLDDCL.
??????? COLLECT GT_ZGLDDCL.
??? ENDLOOP.
* 刪除重復項
??? SORT GT_ZGLDDCL BY AUFNR MATNR.
??? DELETE ADJACENT DUPLICATES FROM GT_ZGLDDCL.
??? LOOP AT GT_ZGLDDCL.
??????? IF GT_ZGLDDCL-RSNUM = P_FLAG_RSNUM.
??????????? GT_ZGLDDCL-SCDDH = P_O_ORDER_NUMBER.
??????? ELSE.
??????????? IF GT_ZGLDDCL-SCDDH IS INITIAL.
??????????????? GT_ZGLDDCL-SCDDH = P_O_ORDER_NUMBER.
??????????? ENDIF.
??????? ENDIF.
??????? GT_ZGLDDCL-FLAG1 = 'X'."訂單創建成功
??????? MODIFY GT_ZGLDDCL.
??? ENDLOOP.
* 將數據插入自定義表中
??? IF GT_ZGLDDCL[] IS NOT INITIAL.
??????? MODIFY ZGLDDCL FROM TABLE GT_ZGLDDCL.
??? ENDIF.
ENDFORM.??????????????????? " UPDATE_ZGLDDCL
*&---------------------------------------------------------------------*
*&????? Form? SHOW_DDTLXX
*&---------------------------------------------------------------------*
FORM SHOW_DDTLXX .
? TYPE-POOLS SLIS.
? DATA: WS_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
??????? WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
??????? WS_LAYOUT????????? TYPE SLIS_LAYOUT_ALV,
??????? WS_SORTFIELDS_TAB? TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
??????? WS_EVENTS????????? TYPE SLIS_T_EVENT.
? DATA: V_REPID LIKE SY-REPID.
? DATA: NN TYPE I VALUE 0.
? DATA: TITLE TYPE LVC_TITLE.
? DEFINE HOUT.
??? NN = NN + 1.
??? WS_FIELDCAT-TABNAME?? = 'GT_DDTL'.
??? WS_FIELDCAT-FIELDNAME = '&1'.
??? WS_FIELDCAT-SELTEXT_M =? &2.
??? WS_FIELDCAT-COL_POS?? =? NN.
??? WS_FIELDCAT-OUTPUTLEN =? &3.
??? WS_FIELDCAT-DATATYPE? = '&4'.
*??? ws_fieldcat-do_sum??? = '&5'.
??? WS_FIELDCAT-LZERO???? = 'X'.
??? IF WS_FIELDCAT-FIELDNAME = 'AUFNR'.
????? WS_FIELDCAT-REF_FIELDNAME = 'AUFNR' .
????? WS_FIELDCAT-REF_TABNAME = 'AFPO'.
??? ENDIF.
??? APPEND WS_FIELDCAT.
??? CLEAR WS_FIELDCAT.
? END-OF-DEFINITION.
? HOUT AUFNR????? '訂單'??????????????? 12 CHAR.
? HOUT MATNR????? '物料'??????????????? 15 CHAR.
? HOUT MEINS????? '單位'???????????????? 6 CHAR.
? HOUT BDMNG????? '需求數量'??????????? 13 QUAN.
? HOUT ENMNG????? '提貨數量'??????????? 13 QUAN.
? HOUT LGPRO????? '生產倉儲地'?????????? 4 CHAR.
? HOUT YCXX1????? '異常信息1'????????? 100 CHAR.
*? title = ''.
? WS_LAYOUT-ZEBRA???????????? = 'X'.
? WS_LAYOUT-GET_SELINFOS????? = ''.
? WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
? WS_LAYOUT-DETAIL_POPUP????? = 'X'.
? WS_LAYOUT-NO_KEYFIX???????? = 'X'.
*? WS_LAYOUT-BOX_FIELDNAME???? = 'CHKID'.
? V_REPID = SY-REPID.
? CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
??? EXPORTING
????? I_CALLBACK_PROGRAM?????? = V_REPID
*????? i_callback_pf_status_set = 'MENU_SET'
*????? i_callback_user_command? = 'EXECUTE_COMMAND'
????? IS_LAYOUT??????????????? = WS_LAYOUT
????? IT_FIELDCAT????????????? = WS_FIELDCAT[]
????? IT_SPECIAL_GROUPS??????? = WS_FIELDGROUPS_TAB[]
????? IT_SORT????????????????? = WS_SORTFIELDS_TAB[]
????? IT_EVENTS??????????????? = WS_EVENTS[]
????? I_GRID_TITLE???????????? = TITLE
??? TABLES
????? T_OUTTAB???????????????? = GT_DDTL
??? EXCEPTIONS
????? PROGRAM_ERROR??????????? = 1
????? OTHERS?????????????????? = 2.
ENDFORM.??????????????????? " SHOW_DDTLXX
轉載自:?
http://blog.csdn.net/reacleliu/article/details/6606290
總結
以上是生活随笔為你收集整理的SAP 物料订单创建、下达、报工、收货与投料(ABAP代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何设置'REUSE_ALV_GRID_
- 下一篇: 如何在Excel中使用VB宏连接SAP系