domingo, 14 de mayo de 2017

BATCH INPUT : KO01 - EXPLICACION / CODIGOS

ANTES DE TODO, EXITOS, TU PUEDES!
CONCENTRACIÓN AL MÁXIMO POR SI NO SALE A LA PRIMERA...
MIRA BIEN LAS VARIABLES EL DEBUG ETC...
CONCENTRACIÓN

EXPLICACION:

LO SIGUIENTE QUE SE EXPLICARÁ ES LO BÁSICO, BREVE ENCONTRADO EN LA SOLUCIÓN Y DESARROLLO DE LA MISMA ESPERANDO SEA DE AYUDA TANTO A NIVEL FUNCIONAL COMO TECNICA.

LO QUE AQUI VERAS PUEDES VERLO EN CODIGO E IMAGENES EN LA SIGUIENTE RUTA DEL DROPBOX... ENCONTRARAS EL CODIGO ANTIGUO Y EL NUEVO (QUE LIMPIE LO QUE NO USARÍA)


https://www.dropbox.com/sh/a54w9jn0p5m27m3/AACqF4LqcNZtAqhZmZ5HP0ZPa?dl=0


 - SPRO:
En la siguiente RUTA SPRO se puede ver las configuraciones de rangos y clases de ordenes. (tema de investigación, trabajo de funcional)


ESTE ES UN EJEMPLO DEL SERVIDOR ITERP EL CUAL TIENE INTERVALO RANGO
LIBRE SE PUEDE COPIAR ESTE TIPO Y CREAR UN Z EN BASE A ESTE, O IGUAL EL FUNCIONAL A CARGO CREAR LA CLASE CORRECTA. EN INTERNET HA DE HABER GUIAS


RFC (IMPORT/EXPORT)

LA FUNCION RECIBE EN ESTE CASO UNA TABLA, MAS SI BIEN EL EJEMPLO
LEE LA TABLA EL EXPORT SE HA CONSIDERADO SOLO UN MENSAJE,
PODRÍA CAMBIARSE POR UNA TABLA DE MENSAJES PARA CADA ORDEN INGRESADA

SE CREO UN SOLO EXPORT QUE ES UN MENSAJE RESULTANTE, ESTO DEBIDO
A QUE EN ESTA ETAPA SOLO SE TRABAJARA CON UNA ORDEN


VALIDACION:
SE AÑADIO AL CODIGO UNA VALIDACIÓN LA CUAL BUSCA EN LA AUFK (YA QUE SE TRATA DE UN ORDEN EN GENERAL) ENVIANDO LA CLASE EL TIPO Y LA ORDEN EXTERNA LA CUAL ENLAZARÍA CON EL SISTEMA ENGYMAN ARROJANDO ASI RESULTADO DE SI YA FUE CARGADA Y TIENE UNA ORDEN CO SAP ASIGNADA.
PUEDE OMITIRSE ESTA VALIDACION EN LA LOGICA


CONSIDERACIONES:
AL MOMENTO DE EJECUTAR LA FUNCION ENVIANDO DATOS DESDE LA TABLA SURGIO
EL SIGUIENTE INCONVENIENTE, EN LA ESTRUCTURA SE CREO EL CAMPO KONTY
CON TAMAÑO 2 COMO ESTA EN LA TABLA COBRB MAS ARROJABA UN ERROR EL TX
Y SE DESCONFIGURABA EL CAMPO, POR TANTO SE DECIDIO CAMBIAR A 3 CARACTERES TAL COMO SE VE EN LA TRANSACCION Y PODRIA AÑADIRSE
ALGUNA VALIDACION PARA EL ENVIO DE ESTE CAMPO PREVIAMENTE.


OTRA CONSIDERACION ES QUE AL MOMENTO DE PROBAR LA FUNCION LLENANDO LA TABLA DE ESTA MANERA NO ME DI CUENTA QUE NO GRABABA COMPLETO EL KOSTV Y OTROS CAMPOS QUE ESTEN CORTADOS POR LA VENTAN POR ESO MEJOR MAXIMIZAR LA VENTANA Y ASEGURARSE CAMPO POR CAMPO EL DATO QUE SE QUIERE ENVIAR Y COMO SE ENVIA


para el caso del debug se recomienda colocar el punto en la linea que ya pasa el CALL TRANSACTION
en la tabla MESSTAB en caso no le salga el mensaje de exito entrara en las siguientes validaciones, se recomienda cambiarle el MSGTYP 'S' por 'E' para que entre a la logica donde lo muestra como error y saber que puede estar pasando.




SI HUBIERA MAS CAMPOS/DYNPROS:
Si en caso la clase de orden solicite mas campos u se deba omitir alguno se borraria / añadiría de la logica para el bloque de la dynpro tal como se indica en el codigo para el ejemplo del GSBER (Division)
Tener en cuenta tambien que algunos campos se pueden considerar fijos por los cuales se debería borrar de la estructura que recibe la función u ordenarlas mejor.




Se recomienda si hay mas dynpros generar un nuevo batch guardarlo en temporal y hacer lo que se hace similar en la función en vez de usar perform, usar macros (DEFINE) sería solo agregar las dynpros, los BDC_DYNPRO que falten e indiquen tu nuevo batch. En la siguiente imagen se ve el pgm temporal que genero la SM35 y que parte de ese pgm tomé para adecuarlo a la macros (DEFINE) se sube el codigo al dropbox tambien para que compares los cambios/ajustes que se le hizo para que entre en la función...

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.

DATABEGIN OF BDCDATA OCCURS 0.
        INCLUDE STRUCTURE BDCDATA.
DATAEND OF BDCDATA.

DATABEGIN 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(250TYPE C.
DATA: LV_AUFNR TYPE AUFK-AUFNR.
DATA: LV_USER7(10TYPE C.
DATA: LV_PROZS(6TYPE 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.
            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.

          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.
      ENDIF.
ENDIF.
ENDIF.
ENDIF"Validación existencia Orden Externa
ENDLOOP.

ENDFUNCTION.

No hay comentarios.:

Publicar un comentario