NOTESE QUE TOMA EL PRIMER ERROR DEL MENSAJE DE LA TX
EN CASO NO SEA ERROR TE TOMA EL PRIMER Y SEGUNDO MENSAJE
EN CASO EXISTA UN SEGUNDO Y TE LO CONCATENA. TE PUSE
EN COMENTARIOS DONDE IRIA LA LOGICA PARA QUE GUARDES LOS DATOS A
LA TABLA Z EN CASO NO GENERE LA ORDEN.
TU PUEDES!
CODIGO:
FUNCTION ZPRUEBA_ORDEN_TRABAJO.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(PO_ORDENT) TYPE ZAC_LORDENT
*" EXPORTING
*" REFERENCE(MESSAGE) TYPE LS_MSG
*"----------------------------------------------------------------------
DATA: WA_LORDENT LIKE LINE OF PO_ORDENT.
*----------------------------------------------------------------------*
* DEFINICIONES PARA BATCH INPUT
*----------------------------------------------------------------------*
DATA: I_MSGBI LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA: OPT TYPE CTU_PARAMS.
DATA: I_LOG_HANDLE TYPE BALLOGHNDL.
DATA: BEGIN OF BDCDATA OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDCDATA.
DATA: BEGIN OF MESSTAB OCCURS 10.
INCLUDE STRUCTURE BDCMSGCOLL.
DATA END OF MESSTAB.
DATA: WA_PARAMETERS TYPE CTU_PARAMS.
DATA: WA_MESSTAB LIKE LINE OF MESSTAB.
DATA: LV_MESSAGE(250) TYPE C,
LV_MESSAGE_AUX(250) TYPE C.
DATA: LV_AUFNR TYPE AUFK-AUFNR.
DATA: LV_USER7(10) TYPE C.
DATA: LV_PROZS(6) TYPE C.
DATA: LV_CTU TYPE APQI-PUTACTIVE VALUE 'X'.
DATA: LV_MODE TYPE APQI-PUTACTIVE VALUE 'N'.
DATA: LV_UPD TYPE APQI-PUTACTIVE VALUE 'S'.
DATA: GS_MESSTAB LIKE LINE OF MESSTAB.
WA_PARAMETERS-DISMODE = 'N'.
WA_PARAMETERS-UPDMODE = 'L'.
WA_PARAMETERS-RACOMMIT = 'X'.
*----------------------------------------------------------------------*
*BDC_DYNPRO
* CLEAR BDCDATA.
* BDCDATA-PROGRAM = PROGRAM.
* BDCDATA-DYNPRO = DYNPRO.
* BDCDATA-DYNBEGIN = 'X'.
* APPEND BDCDATA.
*BDC_FIELD
* CLEAR BDCDATA.
* BDCDATA-FNAM = FNAM.
* BDCDATA-FVAL = FVAL.
* APPEND BDCDATA.
DEFINE BDC_DYNPRO.
CLEAR BDCDATA.
BDCDATA-PROGRAM = &1.
BDCDATA-DYNPRO = &2.
BDCDATA-DYNBEGIN = &3.
APPEND BDCDATA.
END-OF-DEFINITION.
DEFINE BDC_FIELD.
CLEAR BDCDATA.
BDCDATA-FNAM = &1.
BDCDATA-FVAL = &2.
APPEND BDCDATA.
END-OF-DEFINITION.
LOOP AT PO_ORDENT INTO WA_LORDENT.
*----------------------------------------------------------------------*
* VALIDACIÓN EXISTENCIA ORDEN
*----------------------------------------------------------------------*
SELECT SINGLE AUFNR
INTO LV_AUFNR
FROM AUFK
WHERE AUART EQ WA_LORDENT-AUART "Clase Orden
AND AUTYP EQ WA_LORDENT-AUTYP "Tipo de Orden / por lo general amarrada a la Clase de Orden
AND AUFEX EQ WA_LORDENT-AUFNR.
IF LV_AUFNR IS NOT INITIAL.
CONCATENATE 'Orden' WA_LORDENT-AUFNR
'relacionada a Orden SAP: ' LV_AUFNR INTO
LV_MESSAGE SEPARATED BY SPACE.
MOVE LV_MESSAGE TO MESSAGE.
CONTINUE.
ELSE.
*----------------------------------------------------------------------*
* LLENADO BATCH INPUT
*----------------------------------------------------------------------*
REFRESH : BDCDATA, MESSTAB.
CLEAR : BDCDATA, MESSTAB.
CLEAR : LV_MESSAGE, LV_MESSAGE_AUX.
CLEAR LV_USER7.
CLEAR LV_PROZS.
CONCATENATE WA_LORDENT-USER7+6(2)
WA_LORDENT-USER7+4(2)
WA_LORDENT-USER7+0(4)
INTO LV_USER7 SEPARATED BY '.'.
WRITE WA_LORDENT-PROZS TO LV_PROZS.
CONDENSE LV_PROZS.
BDC_DYNPRO 'SAPMKAUF' '0100' 'X'.
BDC_FIELD 'BDC_CURSOR' 'COAS-AUART'.
BDC_FIELD 'BDC_OKCODE' '/00'.
BDC_FIELD 'COAS-AUART' WA_LORDENT-AUART.
BDC_DYNPRO 'SAPMKAUF' '0600' 'X'.
BDC_FIELD 'BDC_OKCODE' '=BUT2'.
BDC_FIELD 'COAS-KTEXT' WA_LORDENT-KTEXT.
BDC_FIELD 'COAS-BUKRS' WA_LORDENT-BUKRS.
BDC_FIELD 'COAS-WERKS' WA_LORDENT-WERKS.
BDC_FIELD 'COAS-SCOPE' 'GG'. "Gastos Generales "FIJO
BDC_FIELD 'COAS-PRCTR' WA_LORDENT-PRCTR.
BDC_FIELD 'COAS-KOSTV' WA_LORDENT-KOSTV.
BDC_FIELD 'COAS-AKSTL' WA_LORDENT-AKSTL.
BDC_FIELD 'COAS-ABUKR' WA_LORDENT-ABUKR.
BDC_FIELD 'COAS-AUFEX' WA_LORDENT-AUFNR. "Es la orden externa, que viene del otro sistema
*Antes de pasar a otra dynpro aquí se podría agregar otro campo de la misma dynpro, ejm División por ejemplo
*y lo mismo con otros campos que se encuentren dentro de un grupo de dynpro
*BDC_FIELD 'COAS-GSBER' WA_LORDENT-GSBER.
BDC_DYNPRO 'SAPMKAUF' '0600' 'X'.
BDC_FIELD 'BDC_OKCODE' '=BUT4'. "Pestañas
BDC_FIELD 'COAS-WAERS' WA_LORDENT-WAERS. "Por lo general ya arrastra del sistema
BDC_DYNPRO 'SAPMKAUF' '0600' 'X'.
BDC_FIELD 'BDC_OKCODE' '=ABVO'.
BDC_FIELD 'COAS-USER0' WA_LORDENT-USER0.
BDC_FIELD 'COAS-USER2' WA_LORDENT-USER2.
BDC_FIELD 'COAS-USER6' WA_LORDENT-USER6.
BDC_FIELD 'COAS-USER7' LV_USER7.
BDC_FIELD 'COAS-USER9' 'X'.
BDC_DYNPRO 'SAPLKOBS' '0130' 'X'.
BDC_FIELD 'BDC_CURSOR' 'COBRB-EXTNR(01)'.
BDC_FIELD 'BDC_OKCODE' '/00'.
BDC_FIELD 'COBRB-KONTY(01)' WA_LORDENT-KONTY.
BDC_FIELD 'DKOBR-EMPGE(01)' WA_LORDENT-EMPGE.
BDC_FIELD 'COBRB-PROZS(01)' LV_PROZS.
BDC_FIELD 'COBRB-PERBZ(01)' WA_LORDENT-PERBZ.
BDC_FIELD 'COBRB-EXTNR(01)' WA_LORDENT-EXTNR.
BDC_DYNPRO 'SAPLKOBS' '0130' 'X'.
BDC_FIELD 'BDC_CURSOR' 'COBRB-KONTY(01)'.
BDC_FIELD 'BDC_OKCODE' '=SICH'.
*----------------------------------------------------------------------*
* EJECUCIÓN BATCH INPUT
*----------------------------------------------------------------------*
CALL TRANSACTION 'KO01'
USING BDCDATA
OPTIONS FROM WA_PARAMETERS
MESSAGES INTO MESSTAB.
*----------------------------------------------------------------------*
* RECEPCIÓN MENSAJE
*----------------------------------------------------------------------*
IF MESSTAB[] IS NOT INITIAL. "El batch input arrojo un mensaje
READ TABLE MESSTAB INTO GS_MESSTAB
WITH KEY MSGTYP = 'S'
MSGID = 'KO'
MSGNR = 107.
IF SY-SUBRC EQ 0. "Encontró el mensaje que confirma creación
CONCATENATE 'Se creo Orden CO SAP : ' GS_MESSTAB-MSGV1
'para la Orden' WA_LORDENT-AUFNR
INTO LV_MESSAGE
SEPARATED BY space.
MOVE LV_MESSAGE TO MESSAGE.
ELSE. "Lee el primer error
READ TABLE MESSTAB INTO GS_MESSTAB
WITH KEY MSGTYP = 'E'.
IF SY-SUBRC EQ 0.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = GS_MESSTAB-MSGID
MSGNR = GS_MESSTAB-MSGNR
MSGV1 = GS_MESSTAB-MSGV1
MSGV2 = GS_MESSTAB-MSGV2
MSGV3 = GS_MESSTAB-MSGV3
MSGV4 = GS_MESSTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
MOVE LV_MESSAGE TO MESSAGE.
* IF SY-SUBRC <> 0. "No se genero el mensaje de la tx
* CONCATENATE
* 'No se generó la Orden CO SAP para la orden '
* WA_LORDENT-AUFNR
* INTO LV_MESSAGE
* SEPARATED BY SPACE.
* MOVE LV_MESSAGE TO MESSAGE.
* ELSE.
* CONCATENATE 'Error SAP: ' LV_MESSAGE INTO
* LV_MESSAGE SEPARATED BY SPACE.
* MOVE LV_MESSAGE TO MESSAGE.
* ENDIF.
ELSE. "Cualquier otro mensaje que no creo orden y no es tipo 'E'
* CONCATENATE
* 'No se generó la Orden CO SAP para la orden '
* WA_LORDENT-AUFNR
* INTO LV_MESSAGE
* SEPARATED BY SPACE.
* MOVE LV_MESSAGE TO MESSAGE.
READ TABLE MESSTAB INTO GS_MESSTAB INDEX 1.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = GS_MESSTAB-MSGID
MSGNR = GS_MESSTAB-MSGNR
MSGV1 = GS_MESSTAB-MSGV1
MSGV2 = GS_MESSTAB-MSGV2
MSGV3 = GS_MESSTAB-MSGV3
MSGV4 = GS_MESSTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
READ TABLE MESSTAB INTO GS_MESSTAB INDEX 2.
IF sy-subrc EQ 0.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = GS_MESSTAB-MSGID
MSGNR = GS_MESSTAB-MSGNR
MSGV1 = GS_MESSTAB-MSGV1
MSGV2 = GS_MESSTAB-MSGV2
MSGV3 = GS_MESSTAB-MSGV3
MSGV4 = GS_MESSTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE_AUX.
ENDIF.
CONCATENATE LV_MESSAGE LV_MESSAGE_AUX INTO LV_MESSAGE SEPARATED BY SPACE.
MOVE LV_MESSAGE TO MESSAGE.
ENDIF.
"OJO!
"En esta parte del codigo puede ingresarse la logica para guardar todo dentro de una tabla Z
"ya que dentro de este ELSE es que se indica que no se generó la Orde CO, en este punto tomarias los datos del WA_LORDENT y lo guardarias en tu Z, campo por campo o concatenando todo, las dos maneras deberia funcionar.
ENDIF.
ENDIF.
ENDIF. "Validación existencia Orden Externa
ENDLOOP.
ENDFUNCTION.
No hay comentarios.:
Publicar un comentario