lunes, 22 de mayo de 2017

LUNES 22/05/2017

Enlace dropbox:
https://www.dropbox.com/sh/3a3k4tv01bmqkl5/AADJ5-Bd-PjCSxRfOSyoPNhUa?dl=0 


Se tienen dos grabaciones una con clase libre (Clase 9A00) y otra del ejemplo anterior, semana pasada. La primera con campo de nro. de orden libre y buscando generar el error de al procesar batch input desde la misma SM35 no jala los datos.

Para probar esto se va a la transacción SM35 y sobre la grabación se da click a procesar -> luego enter ->



nos llevará a la transacción tal cuál como si fueramos a crearla pero con los datos que usamos en la grabación inicial -> para esto solo se le da ENTER (la idea no es volver a llenar algún dato) seguidamente para ver como van jalando los datos que luego serán variables según nuestro RFC. Pero veamos dos casos donde usamos este botón PROCESAR:

1er caso... Se ingreso nuevamente al mandante cerrando nuestra sesión anterior, esta nueva sin haber ingresado o usado la transacción KO01 como se ve en imagenes al procesar la grabación te pide la sociedad CO la cuál nuestra grabación si contempla, ya que la hicimos en la sesión anterior. Te darás cuenta que los datos los jala sin problema alguno conforme se va dando enter (salvo el nro. de Orden que se explicará luego...)


2do caso... 
Se ejecuto la primera grabación con el botón procesar sin problema alguno (haciendo los cambios en el numero de orden que se explicará luego), luego el resto de los datos los jalo de la grabación modelo. Ahora sin salir de la sesión se vuelve a ejecutar la grabación desde la SM35 (tener en cuenta que para este momento la sociedad CO ya se fijo) y como se observa la pantalla siguiente, de los datos de la orden se quedaron en blanco, no se llenaron... el problema? se salto la dynpro de la sociedad CO.

Nuestro batch invoca a la pantalla pero SAP al no necesitarla crea un conflicto y ocurre lo ya mencionado.




Solución
Se encontró en la siguiente web una solución para hacer nuestro batch input dinámico, de manera que reconozca cuando el campo CO este fijado y de ser así se salte el bloque seleccionado en la imagen anterior del batch.

http://foros.consultoria-sap.com/t/problemas-con-batch-input-y-ventanas-dinamicas/3303/10



Como se observa se condiciona el bloque del llenado de la sociedad CO en caso este pre-fijado o no. Para el caso de la imagen se mantiene en la sesión de la nueva grabación por tanto ya esta fijado y se saltará dicho bloque.



Haciendo así, como se observa, que los datos del batch se jalen sin problemas. Ahora, tener en cuenta que el número de orden te lo reconoce en más de una vez por tanto se deberá considerar como dato a ingresar cuantas veces el batch lo registre.




Recomendaciones:
El pgm / función ya lo tienes preparado por tanto solo te quedaría añadir la parte de la lógica sombreada, al lado izquierdo tenemos el pgm creado por la SM35 y a la derecha el acondicionado con macros. La variable es creada al inicio de la función, antes del LOOP.

DATA: LV_KOKRS TYPE AUFK-KOKRS.
El código esta en el dropbox de igual manera y líneas más abajo.


éxitos, tu puedes!


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

            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.

*22.05.2017
CLEAR LV_KOKRS.
GET PARAMETER ID 'CAC' FIELD LV_KOKRS.
IF LV_KOKRS IS INITIAL.
BDC_DYNPRO 'SAPLSP04' '0300' 'X'.
BDC_FIELD 'BDC_CURSOR' 'SVALD-VALUE(01)'.
BDC_FIELD 'BDC_OKCODE' '=FURT'.
BDC_FIELD 'SVALD-VALUE(01)' 'EICL'.
ENDIF.
*22.05.2017

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

martes, 16 de mayo de 2017

LOGICA MENSAJES KO01 - 16/05

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
*"----------------------------------------------------------------------
DATAWA_LORDENT LIKE LINE OF PO_ORDENT.
*----------------------------------------------------------------------*
* DEFINICIONES PARA BATCH INPUT
*----------------------------------------------------------------------*
DATAI_MSGBI      LIKE BAPIRET2 OCCURS WITH HEADER LINE.
DATAOPT          TYPE CTU_PARAMS.
DATAI_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.

DATAWA_PARAMETERS TYPE CTU_PARAMS.
DATAWA_MESSTAB LIKE LINE OF MESSTAB.

DATALV_MESSAGE(250TYPE C,
      LV_MESSAGE_AUX(250TYPE C.
DATALV_AUFNR TYPE AUFK-AUFNR.
DATALV_USER7(10TYPE C.
DATALV_PROZS(6TYPE C.

            DATALV_CTU TYPE APQI-PUTACTIVE VALUE 'X'.
            DATALV_MODE TYPE APQI-PUTACTIVE VALUE 'N'.
            DATALV_UPD TYPE APQI-PUTACTIVE VALUE 'S'.
            DATAGS_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 BDCDATAMESSTAB.
            CLEAR   BDCDATAMESSTAB.
            CLEAR   LV_MESSAGELV_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.

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.