martes, 13 de enero de 2015

Un programa para crear objetos de diccionario y otros objetos de desarrollo.

Estoy aplicando la nota "1997540 - PT: Manual changes flag added to WSPT_LIKP" y me he encontrado la grata sorpresa que aplicando la nota se instala el programa NOTE_1997540 que según pone en la nota "This program generates ABAP dictionary objects and other ABAP development objects in the ERP system" lo cual es un gran que y va en una buena línea por parte de SAP porque siempre me ha costado entender lo de tener que hacer pasoS manuales para crear elementos, dominios y otros objetos de diccionario de la SE11. Agradezco el detalle y habrá que buscar tiempo para mirar el programa y poder readaptarlo para situaciones análogas.

Como curiosidad en la nota también habla de la tabla DWINACTIV que es la tabla donde se guardan los objetos pendientes de activación. 

Y parece que la línea es esta.

Porque en la nota "1992838 - PT: WS - Contingency approval" tenemos un programa análogo NOTE_1992838.

miércoles, 9 de julio de 2014

Notas para rejilla, grid, tabla en un SapScript

Para hacer una tabla (grid, rejilla) con el BOX pero que pueda ir variando de alturas.

Declaramos variables en el programa de control:

DATA: wnx TYPE p LENGTH 5 DECIMALS 2,
      wny LIKE wnx,
      wx0(5),
      wy0 LIKE wx0 .


Contamos líneas.

En la parte que vamos pintando la línea vamos sumando.
Por una parte inicializamos
    CLEAR: wx0, wy0.
    wnx = '0.9'.
    wny = '2.2'.
*
    CALL FUNCTION 'WRITE_FORM'                              
         EXPORTING
           element   = 'LINEA_TITLE'    
           window    = 'MAIN'.

*
Y vamos sumando dentro del loop a la tabla que pintamos.

    LOOP AT i_tabla.
*
      IF sy-tabix = 1.
        ADD '0.5' TO wny.
      ELSE.
        ADD '0.8' TO wny.
      ENDIF.

*
      wx0 = wnx.
      wy0 = wny.
*
      " when oper not marked for print
      CALL FUNCTION 'WRITE_FORM'                              "
           EXPORTING
             element   = 'LINEA'  
             window    = 'MAIN'.

*
    ENDLOOP.


En sapscript tenemos elementos en ventana MAIN.

/E LINEA_TITLE
/: BOX XPOS '0.90' CM YPOS '2.2' CM WIDTH '18.5' CM HEIGHT '0.5' CM FRAME 10 TW INTENSITY 20
TT <B2>Título1:</>,,&VLINE&<B2> Título2:</>

/E LINEA
BOX XPOS &WX0& CM YPOS &WY0& CM WIDTH '18.5' CM HEIGHT '0.8' CM FRAME 10 TW
TT <I0><H2>& i_tabla-columna1&</></>,,&VLINE&& i_tabla-columna2&


lunes, 23 de junio de 2014

Imágenes o logos dinámicos en un SapScript

Programación:
  TYPES: BEGIN OF ty_logo,
*        tdobject TYPE tdobject,
        tdname TYPE  tdobname, "tdname,
*        tdid TYPE tdid,
        tdbtype TYPE tdbtype,
        tdresolut TYPE tdresolut,
  END OF ty_logo.

PERFORM zlogo_get '0300'.

  FORM zlogo_get USING p_bukrs TYPE bukrs.
*
    CASE p_bukrs.
      WHEN '0300'.
        gl_logo-tdname = 'LOGO_0300'.
        gl_logo-tdbtype = 'BCOL'.
        gl_logo-tdresolut = 300.
      WHEN '0200'.
        gl_logo-tdname = 'LG_0200'.
        gl_logo-tdbtype = 'BCOL'.
        gl_logo-tdresolut = 200.
      WHEN '0400'.
        gl_logo-tdname = 'LOG4EX'.
        gl_logo-tdbtype = 'BCOL'.
        gl_logo-tdresolut = 200.
      WHEN '0500'.
        gl_logo-tdname = 'LOGONEW'.
        gl_logo-tdbtype = 'BCOL'.
        gl_logo-tdresolut = 200.
      WHEN OTHERS.
    ENDCASE.
*
    CALL FUNCTION 'WRITE_FORM'
      EXPORTING
        window = 'LOGO_SOC'.
*
  ENDFORM.  

En la ventana LOGO_SOC comando /:
BITMAP &GL_LOGO-TDNAME& OBJECT GRAPHICS ID BMAP TYPE &GL_LOGO-TDBTYPE& DPI &GL_LOGO-TDRESOLUT&

viernes, 6 de junio de 2014

Depurar (debugging) un smartform.

Este es un truco personal que también le parece útil a Dani, no sé si otra gente lo hacer o si hay alternativas. Como no deja poner break-points no explícitos en el código de los smartforms.

Lo que hago es en la parte alta de la edición del smartform, voy Entorno->Nombre del módulo de funciones. Copio el nombre del módulo de funciones, que además en este caso también es el nombre del grupo de funciones. Voy  a la SE80 y lo copia allí en grupos de funciones. Busco un trozo de código en todo el programa que corresponda al sitio donde quieres debuggar.


A veces no encuentras tu trozo de código... la solución es ponerse encima del grupo de funciones botón derecho, Otras funciones-> Reestructurar lista de objetos.

miércoles, 4 de junio de 2014

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.

  CONSTANTS: LC_ACTION TYPE FIELDNAME VALUE 'ACTION'.

  DATA: BEGIN OF ZTABLA_EXTRACT OCCURS 0010.
          INCLUDE STRUCTURE ZTABLA_COSTES.
          INCLUDE STRUCTURE VIMFLAGTAB.
  DATA: END 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.