miércoles, 28 de mayo de 2014

Guardar campos en tablas Z con el Generador de actualización de tablas. Evento 01.

Situación:
Tengo una tabla ZTABLA a la que le he creado una vista de actualización para la SM30. Y quiero controlar quien y cuando hace cambios en los campos ERDAT, ERZET, ERNAM, AEDAT, AEZET, AENAM. 

El código de help.sap no acaba de funcionar tal cual.

Solución: Primero bloqueo en la dynpro de la actualización estas columnas para que sólo sean de salida y añado el evento 01 (Antes de grabar los datos en la base de datos) con la siguiente subrutina:

*&---------------------------------------------------------------------*
*&      FORM ZEVENTO01
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ZEVENTO01.

  CONSTANTSLC_ACTION TYPE FIELDNAME VALUE 'ACTION'.

  DATABEGIN OF ZTABLA_EXTRACT OCCURS 0010.
          INCLUDE STRUCTURE ZTABLA_COSTES.
          INCLUDE STRUCTURE VIMFLAGTAB.
  DATAEND OF ZTABLA_EXTRACT.

  DATA LS_DATA_TOTAL          LIKE ZTABLA_EXTRACT.
  DATA LS_DATA_EXTRACT        LIKE ZTABLA_EXTRACT.
  DATA LV_ACTION_TOTAL              TYPE COMT_BOOLEAN.
  DATA LS_TABIX               TYPE SY-TABIX.

  FIELD-SYMBOLS<LV_ACTION_TOTAL>    TYPE CHAR1,
                 <LS_DATA_TOTAL>      TYPE ANY,
                 <LS_DATA_EXTRACT>    TYPE ANY.

  LOOP AT TOTAL.
*
    ASSIGN TOTAL TO <LS_DATA_TOTAL> CASTING LIKE ZTABLA.
    LS_DATA_TOTAL <LS_DATA_TOTAL>.
    ASSIGN COMPONENT LC_ACTION OF STRUCTURE TOTAL TO <LV_ACTION_TOTAL>.
*
    IF SY-SUBRC NE 0.
      LV_ACTION_TOTAL <ACTION>.
      ASSIGN LV_ACTION_TOTAL TO <LV_ACTION_TOTAL>.
    ENDIF.
*
    LV_ACTION_TOTAL <LV_ACTION_TOTAL>.
    CHECK LV_ACTION_TOTAL IS NOT INITIAL.
*
    READ TABLE EXTRACT WITH KEY  <VIM_XTOTAL_KEY>.
*
    IF SY-SUBRC EQ 0.
      LS_TABIX SY-TABIX.
    ELSE.
      CLEAR LS_TABIX.
    ENDIF.
*
    IF LS_DATA_TOTAL-PEINH IS INITIAL.
      LS_DATA_TOTAL-PEINH 1.
    ENDIF.
*
    IF LV_ACTION_TOTAL EQ 'N'." New Entry.
      LS_DATA_TOTAL-ERDAT SY-DATUM.
      LS_DATA_TOTAL-ERZET SY-UZEIT.
      LS_DATA_TOTAL-ERNAM  SY-UNAME.
    ENDIF.
*
    IF LV_ACTION_TOTAL EQ 'U'."Update
      LS_DATA_TOTAL-AEDAT SY-DATUM.
      LS_DATA_TOTAL-AEZET SY-UZEIT.
      LS_DATA_TOTAL-AENAM SY-UNAME.
    ENDIF.
    <LS_DATA_TOTAL> LS_DATA_TOTAL.
*
    MODIFY TOTAL.
    CHECK LS_TABIX GT 0.
    EXTRACT TOTAL.
    MODIFY EXTRACT INDEX LS_TABIX.
*
  ENDLOOP.
*
  SY-SUBRC 0.
ENDFORM.                    "FORM ZEVENTO01

Nota: podemos buscar otras vistas de actualización con eventos en TVIMF para ver como lo hace.
Otras referencias:
http://scn.sap.com/docs/DOC-10318
http://help.sap.com/saphelp_nw04s/helpdata/en/a7/5133ac407a11d1893b0000e8323c4f/frameset.htm

martes, 20 de mayo de 2014

BW: Infopaquete en peticiones vacías.

Al planificar una cadena tengo el problema de que si la fuente de datos no tiene registros y viene vacío se que me queda parado el infopaquete con un aviso (warning) y no continua cuando ya puede ser estemos sin registros. 

Solución que me dio en su momento Laura, vamos al infopaquete, y en el menú superior, vamos a Planificador -> Tratamiento de avertencias y ponemos que sea ok. O en este caso casi mejor Planificador-> Color de semáforo en peticiones vacías e indicamos que semáforo verde.




Lo he hecho directamente en producción. Y para que poder continuar ejecutando la cadena, desde el log la cadena he llegado al monitor del infopaquete y le he cambiado el estado de la cabecera a correcto, esto ya no tendré que hacerlo en este caso por que cambio hecho desde el Planificador.