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.

No hay comentarios.:

Publicar un comentario