You are on page 1of 4

Control de devolución en orden de servicio

Se creó proyecto Z_EQUIP (Ejemplo)


*&--------------------------------------------------------------------
-*
*&  Include           ZXCO1U23
*&--------------------------------------------------------------------
-*

DATA: zmatnr        TYPE matnr,
      zemng         TYPE enmng,
      t_zemng       TYPE enmng,
      zemng_dev     TYPE enmng,
      t_zemng_dev   TYPE enmng,
      t_zemng_dev_t TYPE enmng.

DATA: w_resb     TYPE resb,
      w_resb_dev TYPE resb.

*Control de componentes que nunca salieron
IF is_component-bwart = '262' .

*Control devolución si existe repuesto

  SELECT SINGLE matnr INTO zmatnr FROM resb WHERE rsnum = is_header-
rsnum AND
                                                  matnr = is_component
-matnr .
  IF sy-subrc NE 0 .
    MESSAGE: 'No se puede devolver material que nunca salió ' TYPE 'I' 
.
    RAISE no_changes_allowed .
  ENDIF.

*Control devolución cantidad de repuestos con lo que se ingresa
  SELECT * FROM resb INTO w_resb WHERE matnr = is_component-matnr AND
                                   bwart = '261'                  AND
                                   rsnum = is_header-rsnum        AND
                                   xloek <> 'X'                   AND
                                   kzear = 'X' .
    IF sy-subrc EQ 0 .
      MOVE w_resb-enmng TO zemng.
      ADD zemng TO t_zemng.
    ENDIF.
  ENDSELECT.

  SELECT * FROM resb INTO w_resb_dev WHERE matnr = is_component-matnr 
AND
                                   bwart = '262'                  AND
                                   rsnum = is_header-rsnum        AND
                                   xloek <> 'X'                   AND
                                   kzear = 'X' .
    IF sy-subrc EQ 0 .
      MOVE w_resb_dev-enmng TO zemng_dev.
      ADD zemng_dev TO t_zemng_dev.
    ENDIF.
  ENDSELECT.

  t_zemng_dev_t = is_component-bdmng + t_zemng_dev.
  IF t_zemng_dev_t > t_zemng .
    MESSAGE: 'No se puede devolver más cantidad que la que se sacó ' T
YPE 'I' .
    RAISE no_changes_allowed .
  ENDIF.
ENDIF.

*Control de salida y devolución en orden de servicio
DATA: BEGIN OF iresbd OCCURS 0.
        INCLUDE STRUCTURE resbd.
DATA: END   OF iresbd.

DATA: wa_iresbd LIKE LINE OF iresbd.
DATA: w_resb  LIKE LINE OF iresbd,
      zemng   TYPE enmng,
      t_zemng TYPE enmng,
      lv_dif  TYPE bdmng.

DATA: BEGIN OF tbd OCCURS 0,
        matnr TYPE matnr,
        bdmng TYPE bdmng,
      END OF tbd.

DATA: BEGIN OF tmem OCCURS 0,
        matnr TYPE matnr,
        bdmng TYPE bdmng,
      END OF tmem.

CALL FUNCTION 'PM_ORDER_DATA_READ'
  EXPORTING
    order_number = caufvd_imp-aufnr
*   CALL_FROM_NOTIF       =
*  IMPORTING
*   WCAUFVD      =
*   WILOA        =
*   WRIWO1       =
  TABLES
*   IAFFHD       =
*   IAFVGD       =
    iresbd       = iresbd.
break fsimovic.
"Recorremos registros ya existentes en BD.
LOOP AT iresbd INTO wa_iresbd WHERE kzear = 'X'.

  IF wa_iresbd-bwart = '262' .
    wa_iresbd-bdmng = wa_iresbd-bdmng * -1.
  ENDIF.

  tbd-matnr = wa_iresbd-matnr.
  tbd-bdmng = wa_iresbd-bdmng.
  COLLECT tbd.

ENDLOOP.

"Recorremos registros en memoria.
LOOP AT iresbd INTO wa_iresbd WHERE kzear IS INITIAL.

  IF wa_iresbd-bwart = '262' .
    wa_iresbd-bdmng = wa_iresbd-bdmng * -1.
  ENDIF.

  tmem-matnr = wa_iresbd-matnr.
  tmem-bdmng = wa_iresbd-bdmng.
  COLLECT tmem.

ENDLOOP.

LOOP AT iresbd INTO wa_iresbd.

  CLEAR tbd.
  READ TABLE tbd WITH KEY matnr = wa_iresbd-matnr.

  CLEAR tmem.
  READ TABLE tmem WITH KEY matnr = wa_iresbd-matnr.

  lv_dif = tbd-bdmng + tmem-bdmng.

  IF lv_dif < 0 .
     MESSAGE: 'No se puede devolver más cantidad que la que se sacó ' 
TYPE 'E'.
    EXIT.
  ENDIF.
ENDLOOP.

You might also like