SAP 物料订单创建、下达、报工、收货与投料(ABAP代码) |
您所在的位置:网站首页 › sap创建生产订单自动下达了怎么回事 › 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 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |