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.