今天遇到個小問題,引以為戒。。。就復制代碼過來吧
中間加了段查詢的代碼,RSART在BOM設置為中止,后繼相關的時候會設置個值。。。這個值在過賬的時候就很重要了。。。
吃一塹長一智
*&---------------------------------------------------------------------* *& Form PRM_POST *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM PRM_POST . DATA: LV_LINE_ID TYPE I. DATA:GV_ERROR(1) TYPE C. DATA:LV_RSNUM TYPE RESB-RSNUM. DATA:LV_RSART TYPE RESB-RSART."add by ly 20161101 fro 中止后繼物料 IF MAT_DOC IS NOT INITIAL. MESSAGE '請不要重復過賬!' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. CLEAR:LV_LINE_ID,GMHEAD,GOODSMVT_ITEM[],GOODSMVT_SERIALNUMBER[],LT_ERRMSG[],GMCODE,MTHEAD,GT_MESSAGE[],GT_ZMMT001[]. CASE GV_ZRENO+0(1). WHEN 'A' OR 'B'."生產領退料 GMCODE-GM_CODE = '03'. WHEN 'D' OR 'E'."反沖發退料 GMCODE-GM_CODE = '04'. WHEN 'C' OR 'F'."超領 GMCODE-GM_CODE = '03'. WHEN 'G'."大工單領料 GMCODE-GM_CODE = '03'. WHEN OTHERS. ENDCASE. GMHEAD-PSTNG_DATE = SY-DATUM."mkpf-bldat. GMHEAD-DOC_DATE = SY-DATUM."mkpf-budat. GMHEAD-PR_UNAME = SY-UNAME. GMHEAD-REF_DOC_NO = GV_ZRENO. GMHEAD-BILL_OF_LADING = GV_ZRENO. SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ZMMT001 FROM ZMMT001 WHERE ZRENO = GV_ZRENO AND STATU = ''. LOOP AT GT_TABLE INTO GW_TABLE. IF GW_TABLE-ZSHLT = 0. CONTINUE. ENDIF. ADD 1 TO LV_LINE_ID. GOODSMVT_ITEM-LINE_ID = LV_LINE_ID. GOODSMVT_ITEM-MATERIAL = GW_TABLE-MATNR. IF GV_ZRENO+0(1) = 'A'. GOODSMVT_ITEM-PLANT = GW_TABLE-WERKZ. ELSE. GOODSMVT_ITEM-PLANT = GW_TABLE-WERKS. ENDIF. GOODSMVT_ITEM-BATCH = GW_TABLE-CHARG. GOODSMVT_ITEM-STGE_LOC = GW_TABLE-FROM_LGORT. CLEAR:LV_RSNUM,LV_RSART. CASE GW_TABLE-ZRENO+0(1). WHEN 'A'."訂單發料 GOODSMVT_ITEM-MOVE_TYPE = '261'. GOODSMVT_ITEM-RESERV_NO = GW_TABLE-RSNUM. GOODSMVT_ITEM-RES_ITEM = GW_TABLE-RSPOS. SELECT SINGLE RSNUM RSART INTO (LV_RSNUM,LV_RSART) FROM RESB WHERE RSNUM = GW_TABLE-RSNUM AND RSPOS = GW_TABLE-RSPOS AND MATNR = GW_TABLE-MATNR. IF LV_RSNUM IS INITIAL. GV_ERROR = 'X'. GS_MESSAGE-MSGID = 'ZMSG'. GS_MESSAGE-MSGTY = 'E'. GS_MESSAGE-MSGNO = '000'. GS_MESSAGE-MSGV1 = GW_TABLE-ZPOSN. GS_MESSAGE-MSGV2 = '該行訂單物料已變更,不允許發料!'. APPEND GS_MESSAGE TO GT_MESSAGE. ENDIF. GOODSMVT_ITEM-RES_TYPE = LV_RSART. WHEN 'B'."訂單退料 GOODSMVT_ITEM-MOVE_TYPE = '261'. GOODSMVT_ITEM-RESERV_NO = GW_TABLE-RSNUM. GOODSMVT_ITEM-RES_ITEM = GW_TABLE-RSPOS. GOODSMVT_ITEM-ITEM_TEXT = GW_TABLE-SGTXT. GOODSMVT_ITEM-XSTOB = 'X'. "使用沖銷移動類型標識符 SELECT SINGLE RSNUM RSART INTO (LV_RSNUM,LV_RSART) FROM RESB WHERE RSNUM = GW_TABLE-RSNUM AND RSPOS = GW_TABLE-RSPOS AND MATNR = GW_TABLE-MATNR. IF LV_RSNUM IS INITIAL. GV_ERROR = 'X'. GS_MESSAGE-MSGID = 'ZMSG'. GS_MESSAGE-MSGTY = 'E'. GS_MESSAGE-MSGNO = '000'. GS_MESSAGE-MSGV1 = GW_TABLE-ZPOSN. GS_MESSAGE-MSGV2 = '該行訂單物料已變更,不允許發料!'. APPEND GS_MESSAGE TO GT_MESSAGE. ENDIF. GOODSMVT_ITEM-RES_TYPE = LV_RSART. WHEN 'C'."超領發料 GOODSMVT_ITEM-MOVE_TYPE = '261'. GOODSMVT_ITEM-ORDERID = GW_TABLE-AUFNR. WHEN 'D'."反沖發料 GOODSMVT_ITEM-MOVE_TYPE = '311'. GOODSMVT_ITEM-MOVE_STLOC = GW_TABLE-LGORT. WHEN 'E'."反沖退料 GOODSMVT_ITEM-MOVE_TYPE = '311'. GOODSMVT_ITEM-MOVE_STLOC = GW_TABLE-LGORT. WHEN 'F'."超領退料 GOODSMVT_ITEM-MOVE_TYPE = '261'. GOODSMVT_ITEM-ORDERID = GW_TABLE-AUFNR. WHEN 'G'."大工單領料 GOODSMVT_ITEM-MOVE_TYPE = '261'. GOODSMVT_ITEM-ORDERID = GW_TABLE-AUFNR. WHEN OTHERS. ENDCASE. IF GW_TABLE-ZSHLT < 0. GOODSMVT_ITEM-MOVE_TYPE = '531'. GW_TABLE-ZSHLT = GW_TABLE-ZSHLT * -1. ENDIF. GOODSMVT_ITEM-ENTRY_QNT = GW_TABLE-ZSHLT. "結余數量. GOODSMVT_ITEM-ENTRY_UOM = GW_TABLE-MEINS. " IF GW_TABLE-ZSHLT > GW_TABLE-ZJHLT AND ( GW_TABLE-ZRENO+0(1) = 'A' OR GW_TABLE-ZRENO+0(1) = 'B' ) AND GW_TABLE-ZJHLT > 0. GV_ERROR = 'X'. MESSAGE '普通領料不能超量發料' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. IF GW_TABLE-LGORT = '' AND GOODSMVT_ITEM-MOVE_TYPE = '311' AND GW_TABLE-AUFNR <> ''. GV_ERROR = 'X'. MESSAGE '超領/退料單需要有接收庫位的工單' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. APPEND GOODSMVT_ITEM. LOOP AT GT_SEA INTO GW_SEA WHERE ZRENO = GW_TABLE-ZRENO AND ZPOSN = GW_TABLE-ZPOSN. GOODSMVT_SERIALNUMBER-MATDOC_ITM = LV_LINE_ID. IF GW_SEA-SERNR IS INITIAL. GV_ERROR = 'X'. MESSAGE '請輸入所有的序列號!' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. GOODSMVT_SERIALNUMBER-SERIALNO = GW_SEA-SERNR. APPEND GOODSMVT_SERIALNUMBER. ENDLOOP. ENDLOOP. IF GOODSMVT_ITEM[] IS NOT INITIAL AND GV_ERROR = ''. CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING GOODSMVT_HEADER = GMHEAD GOODSMVT_CODE = GMCODE IMPORTING GOODSMVT_HEADRET = MTHEAD MATERIALDOCUMENT = MAT_DOC TABLES GOODSMVT_ITEM = GOODSMVT_ITEM GOODSMVT_SERIALNUMBER = GOODSMVT_SERIALNUMBER RETURN = LT_ERRMSG. IF MAT_DOC IS NOT INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. LOOP AT GT_ZMMT001 INTO GW_ZMMT001. LOOP AT GT_TABLE INTO GW_TABLE WHERE ZRENO = GW_ZMMT001-ZRENO AND ZPOSN = GW_ZMMT001-ZPOSN. GW_ZMMT001-ZJHLT = GW_TABLE-ZJHLT. GW_ZMMT001-ZSHLT = GW_TABLE-ZSHLT. * IF GW_ZMMT001-ZJHLT = 0. GW_ZMMT001-STATU = 'C'. GW_ZMMT001-ZNAME = SY-UNAME. GW_ZMMT001-ZDATE = SY-DATUM. GW_ZMMT001-ZTIME = SY-UZEIT. * UPDATE ZMMT001 SET ZSHLT = GW_TABLE-ZSHLT STATU = 'C' WHERE ZRENO = GW_TABLE-ZRENO AND ZPOSN = GW_TABLE-ZPOSN. * ENDIF. ENDLOOP. MODIFY GT_ZMMT001 FROM GW_ZMMT001. ENDLOOP. MODIFY ZMMT001 FROM TABLE GT_ZMMT001. * COMMIT WORK. * MESSAGE MAT_DOC TYPE 'S'. GS_MESSAGE-MSGID = 'ZMSG'. GS_MESSAGE-MSGTY = 'S'. GS_MESSAGE-MSGNO = '000'. GS_MESSAGE-MSGV1 = '已生成物料憑證'. GS_MESSAGE-MSGV2 = MAT_DOC. APPEND GS_MESSAGE TO GT_MESSAGE. ELSE. LOOP AT LT_ERRMSG. GS_MESSAGE-MSGID = LT_ERRMSG-ID. GS_MESSAGE-MSGTY = LT_ERRMSG-TYPE. GS_MESSAGE-MSGNO = LT_ERRMSG-NUMBER. GS_MESSAGE-MSGV1 = LT_ERRMSG-MESSAGE_V1. GS_MESSAGE-MSGV2 = LT_ERRMSG-MESSAGE_V2. GS_MESSAGE-MSGV3 = LT_ERRMSG-MESSAGE_V3. GS_MESSAGE-MSGV4 = LT_ERRMSG-MESSAGE_V4. APPEND GS_MESSAGE TO GT_MESSAGE. ENDLOOP. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDIF. ENDIF. IF GT_MESSAGE[] IS NOT INITIAL. CALL FUNCTION 'USMD_MESSAGE_POPUP' EXPORTING IT_MESSAGE = GT_MESSAGE[] IF_SAVE_NECESSARY = GV_NECESSARY. ENDIF. ENDFORM.
