工單發料,退料等一些物料的移動


今天遇到個小問題,引以為戒。。。就復制代碼過來吧

中間加了段查詢的代碼,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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM