Autor Tema: MB_CREATE_GOODS_MOVEMENT  (Leído 13505 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Enrique.Borroni

  • Moderador_
  • Usuario Completo
  • *****
  • Mensajes: 89
    • Ver Perfil
MB_CREATE_GOODS_MOVEMENT
« en: 03 de Noviembre de 2007, 09:58:10 am »
FUNCION MB_CREATE_GOODS_MOVEMENT
TIPO MM
DESCRIPCION MB_CREATE_GOODS_MOVEMENT




Ejemplo
*&---------------------------------------------------------------------*
*&      Form  INICIALIZAR_TABLAS_INTERNAS
*&---------------------------------------------------------------------*
*       Ponemos los datos en su sitio
*----------------------------------------------------------------------*
FORM MM2_INI_TABLAS_INTERNAS.

  FREE: I_MM2_IMSEG, I_MM2_EMSEG, I_MM2_VM07M, I_MM2_MSEG,
        I_MM2_EMKPF, I_MM2_MKPF, I_MM2_IMKPF.
  free: i_mm2_errores, i_mm2_warnings, i_mm2_finales.

  PERFORM MM2_ANYADIR_ENTRADA.

ENDFORM.                               "INICIALIZAR_TABLAS_INTERNAS

*&---------------------------------------------------------------------*
*&      Form  ANYADIR_ENTRADA
*&---------------------------------------------------------------------*
*       Añade los datos de i_mm2_entrada a las tablas internas de
*       entrada de la función MB_CREATE_GOODS_MOVEMENT.
*----------------------------------------------------------------------*
FORM MM2_ANYADIR_ENTRADA.

* Datos básicos
  i_mm2_imseg-bwart = i_mm2_entrada-bwart.      "Tipo de movimiento
  i_mm2_imseg-matnr = i_mm2_entrada-matnr.      "Material
  i_mm2_imseg-erfmg = i_mm2_entrada-erfmg.      "Cantidad
  i_mm2_imseg-erfme = i_mm2_entrada-erfme.      "Unidad de medida
  i_mm2_imseg-werks = i_mm2_entrada-werks.      "Centro origen
  i_mm2_imseg-umwrk = i_mm2_entrada-umwrk.      "Centro destino
  i_mm2_imseg-lgort = i_mm2_entrada-lgort.      "Almacén origen
  i_mm2_imseg-umlgo = i_mm2_entrada-umlgo.      "Almacén destino

* Datos opcionales
  i_mm2_imseg-kostl = i_mm2_entrada-kostl.      "Centro de coste
*  i_mm2_imseg-kostl = p_kostl.                   "Nº de serie
  i_mm2_imseg-elikz = i_mm2_entrada-elikz.      "Entrega final
  i_mm2_imseg-insmk = i_mm2_entrada-insmk.      "Tipo de stock

* Datos pedido
  i_mm2_imseg-ebeln = i_mm2_entrada-ebeln.      "Orden de compra
  i_mm2_imseg-ebelp = i_mm2_entrada-ebelp.      "Posición

* Datos fabricación
  i_mm2_imseg-aufnr = i_mm2_entrada-aufnr.      "Orden fabricación

* Albarán proveedor
  i_mm2_imseg-vbeln = i_mm2_entrada-vbeln.      "Nota entrega

* Otros
  i_mm2_imseg-sobkz = i_mm2_entrada-sobkz.      "Stock especial
  i_mm2_imseg-lifnr = i_mm2_entrada-lifnr.      "Proveedor
  i_mm2_imseg-wempf = i_mm2_entrada-wempf.      "Receptor
  i_mm2_imseg-konto = i_mm2_entrada-konto.      "Cuenta contable
  i_mm2_imseg-grund = i_mm2_entrada-grund.      "Motivo del movimiento
  I_MM2_IMSEG-TBPKZ = 'X'.             "No generar necesidad transporte

* Indicador de movimiento
  clear i_mm2_imseg-kzbew.             "Movimiento sin referencia
  if i_mm2_entrada-zsubtipo = '01'.    "Movimiento con pedido
    i_mm2_imseg-kzbew = 'B'.
  ELSEIF I_MM2_ENTRADA-ZSUBTIPO = '02'."Movimiento con orden de
                                       "fabric.
    i_mm2_imseg-kzbew = 'F'.
  ENDIF.

  append i_mm2_imseg.

* Datos de cabecera de documento
  I_MM2_IMKPF-FRBNR = I_MM2_ENTRADA-FRBNR.      "Vale de material
  I_MM2_IMKPF-BLDAT = I_MM2_ENTRADA-BLDAT.     "Fecha de contabilización
  I_MM2_IMKPF-BUDAT = I_MM2_ENTRADA-BUDAT.      "Fecha de documento
  I_MM2_IMKPF-USNAM = SY-UNAME.        "Nombre del usuario
  I_MM2_IMKPF-BKTXT = I_MM2_ENTRADA-BKTXT.      "Concepto

  APPEND I_MM2_IMKPF.

ENDFORM.                               "ANYADIR_ENTRADA

*&---------------------------------------------------------------------*
*&      Form  CREAR_MOVIMIENTOS_MM
*&---------------------------------------------------------------------*
*       Generamos el movimiento contable y el movimiento MM llamando
*       a la funcion MB_CREATE_GOODS_MOVEMENT.
*       Si es un movimiento que requiere nº de serie, lo introduciremos
*       mediante Batch-Input.
*----------------------------------------------------------------------*
FORM MM2_CREAR_MOVIMIENTOS_MM.
  DATA: L_FLAG,
        L_BI.

  CLEAR L_BI.
  IF V_MM2_MODO_PROCESO_BATCH NE 'N'.
    L_BI = 'X'.
  ELSE.
* Compruebo si tiene carácterísticas de PA
    IF NOT I_MM2_ENTRADA-KONTO IS INITIAL.
      PERFORM MM2_COMPROBAR_CARACT_PA USING I_MM2_ENTRADA-KONTO
                                        CHANGING L_FLAG.
      IF L_FLAG = 'X'.
        L_BI = 'X'.
      ENDIF.
    ENDIF.

* Compruebo si tiene nº de serie
    IF NOT V_MM2_NEC_NUM_SERIE IS INITIAL.
      L_BI = 'X'.
    ENDIF.
  ENDIF.

  IF L_BI IS INITIAL.

    PERFORM MM2_FUNCION_MOV_MM.

    IF NOT V_MM2_NEC_NUM_SERIE IS INITIAL AND
       NOT I_MM2_ENTRADA-SERNR IS INITIAL.
      L_BI = 'X'.
    ENDIF.
  ENDIF.

  IF L_BI = 'X'.
    PERFORM MM2_BATCH_INPUT.
  ENDIF.


ENDFORM.                               " CREAR_MOVIMIENTOS_MM

*&---------------------------------------------------------------------*
*&      Form  MM2_FUNCION_MOV_MM
*&---------------------------------------------------------------------*
*       Generamos el movimiento contable y el movimiento MM llamando
*       a la funcion MB_CREATE_GOODS_MOVEMENT.
*----------------------------------------------------------------------*
FORM MM2_FUNCION_MOV_MM.

  CALL FUNCTION 'MB_CREATE_GOODS_MOVEMENT'
       EXPORTING
            IMKPF       = I_MM2_IMKPF
*           xallp       = ' '
*           xallr       = ' '
            ctcod       = i_mm2_entrada-tcode
*           xqmcl       = ' '
*           XLISU       = X
*           OLD_SUBRC   = ' '
*           IPKCOM      = ' '
            X_AUTHORITY = 'X'
       IMPORTING
            EMKPF       = I_MM2_EMKPF
       TABLES
            EMSEG       = I_MM2_EMSEG
            imseg       = i_mm2_imseg
       EXCEPTIONS
            OTHERS      = 1.

* Comprobamos si ha devuelto errores
  MM-SUBRC = SY-SUBRC.
  IF SY-SUBRC EQ 0.
    i_mm2_finales-mblnr = i_mm2_emseg-mblnr.
    loop at i_mm2_emseg.
      if i_mm2_emseg-msgid ne '00' and
         i_mm2_emseg-msgid ne '  '.
        MM-SUBRC = 4.
      ENDIF.
    ENDLOOP.
    IF I_MM2_EMKPF-SUBRC <> 0.
      MM-SUBRC = 4.
    ELSE.
      SET PARAMETER ID 'MBN' FIELD I_MM2_EMKPF-MBLNR.
      SET PARAMETER ID 'MJA' FIELD I_MM2_EMKPF-MJAHR.
    ENDIF.
  ENDIF.

  IF MM-SUBRC <> 0.
    CLEAR I_MM2_EMKPF.
    SET PARAMETER ID 'MBN' FIELD I_MM2_EMKPF-MBLNR.
    SET PARAMETER ID 'MJA' FIELD I_MM2_EMKPF-MJAHR.
    ROLLBACK WORK.
* Mostramos los errores generados por la función
    loop at i_mm2_emseg where msgid <> space.
      perform mm2_obtener_linea_error using i_mm2_emseg-msgid
                                        i_mm2_emseg-msgty
                                        i_mm2_emseg-msgno
                                        i_mm2_emseg-msgv1
                                        i_mm2_emseg-msgv2
                                        i_mm2_emseg-msgv3
                                        i_mm2_emseg-msgv4
                               CHANGING V_MM2_LINEA.
      read table i_mm2_imseg index sy-tabix.
      IF SY-SUBRC = 0.
        i_mm2_errores-matnr = i_mm2_imseg-matnr.
        i_mm2_errores-ebeln = i_mm2_imseg-ebeln.
        i_mm2_errores-aufnr = i_mm2_imseg-aufnr.
      ENDIF.
      i_mm2_errores-linea = V_MM2_LINEA.
      append i_mm2_errores.
* Si el mensajes es IO 304, es que el error se ha producido por
* no necesitar nº de serie
      if i_mm2_emseg-msgid = 'IO' and i_mm2_emseg-msgno = '304'.
        V_MM2_NEC_NUM_SERIE = 'X'.
      ENDIF.
    ENDLOOP.

    V_MM2_ERROR = 'X'.

  ELSE.
    append i_mm2_finales.

    PERFORM MM2_POST_DOCUMENT.

  ENDIF.

* Borro posibles mensajes de error duplicados
  sort i_mm2_errores.
  delete adjacent duplicates from i_mm2_errores.
  sort i_mm2_warnings.
  delete adjacent duplicates from i_mm2_warnings.

ENDFORM.                               " CREAR_MOVIMIENTOS_MM

*&---------------------------------------------------------------------*
*&      Form  MM2_POST_DOCUMENT
*&---------------------------------------------------------------------*
*       Genera el documento correspondiente al movimiento y realiza
*       el COMMIT
*----------------------------------------------------------------------*
FORM MM2_POST_DOCUMENT.

  MOVE-CORRESPONDING I_MM2_EMSEG TO I_MM2_MSEG.
  MOVE-CORRESPONDING I_MM2_EMKPF TO I_MM2_MKPF.
  I_MM2_VM07M-XPBED = 'X'. "Reducción de neces. en mov. de mercancias.

  CALL FUNCTION 'MB_POST_DOCUMENT' IN UPDATE TASK
       TABLES
            ZMKPF  = I_MM2_MKPF
            ZMSEG  = I_MM2_MSEG
            ZVM07M = I_MM2_VM07M
       EXCEPTIONS
            OTHERS = 1.

  IF V_MM2_NO_COMMIT IS INITIAL.
    COMMIT WORK AND WAIT.
  ENDIF.

ENDFORM.
Saludos.

Atte.,
Enrique Borroni

maito : enrique.borroni@abap.es