TABDEFS (TSFTABDEF) – Gráfico de barras en form Smartforms

Mi requerimiento era imprimir en un formulario un grafico de barras que muestre el ritmo de máquinas a lo largo de un mes, mi primera opción era usar IGS para generar el gráfico de barras en un formato de imagen y luego “subir” dicha imagen a SAP de forma dinámica para que luego en el smartforms levante dicha imagen. El problema pasa que la SE78 solo soporta BMP y TIFF y el IGS genera GIF o JPG. Hay una forma de hacerlo, investigue y existe una forma de convertir una imagen JPG a BMP, por ejemplo. El  problema es que tarda bastante en realizar dicha conversión y como mi requerimiento era imprimir varios formularios en una sola corrida no podía darme el lujo de que tarde mucho.

Por lo cual tuve que usar otra opción y la solución fue la tabla TABDEFS de tipo TSFTABDEF. Esta tabla mantiene la información de las definiciones de las Tablas de un Smartform, incluyendo el color de los Templates, entonces se me ocurrió la idea de Editar dicha tabla de forma dinámica para realizar el “look” de un gráfico de barras. Así que hice todo el gráfico en base de tablas y templates de smartforms.

El resultado de algunos días de trabajo fue esto:

                image

Esa imagen en realidad son muchísimas celdas de un solo color, que de forma dinámica les cambio los colores para que de el look gráfico de barras.

 

Les voy a dar las pautas que yo seguí por si tienen que usarlas en algún futuro.

1.  Definir los datos del grafico, o sea la longitud de las barras del gráfico. Para que sea sencillo para verlo a simple vista lo que hice fue crear una tabla interna de 100 registros (cada registro equivale a una unidad, que puede ser de 0 a 100) y 31 columnas (1 por cada día).

Al formulario le pase en una estructura con 31 campos el valor de dicho día y con la siguiente lógica armo una tabla que queda así , similar al gráfico de barras a nivel tabla interna

                            image

*Armado de la tabla TI_GRAFICO que determina las barra del grafico
* La tabla TI_GRAFICO va a ser una tabla 100 x 31
* En cada celda quedará una X en el caso de que deba ir valor de columna
l_cont = 100.

DO 100 times.
  DO 31 times.
    l_dia = l_dia + 1.
    CONCATENATE ‘WA_NOTIF-DIA_’ l_dia INTO l_campo.
    ASSIGN (l_campo) to <fs>.

    CONCATENATE ‘WA_GRAFICO-DAY_’ l_dia INTO l_campo1.
    ASSIGN (l_campo1) to <fs1>.

    l_ritmo = <fs>. "WA_NOTIF-DIA_01.

    IF l_ritmo >= l_cont.
      <fs1> = ‘X’.
    ENDIF.
  ENDDO.
  CLEAR l_dia.

* Va del 100 al 0.
  l_cont = l_cont – 1.
  APPEND wa_grafico TO ti_grafico.
  CLEAR wa_grafico.
ENDDO.

2.  Armado del esqueleto del gráfico de barras:

En el MAIN del Smartforms cree 100 templates 1 para cada valor del porcentaje 1%-100%

Cada template tiene 63 columnas de 1 MM de alto y 0,43 CM de largo. de color Verde

        image

63 columnas porque como no tengo líneas dejo una columna de separación

O sea que tengo 6300 celdas de color verde a mi disposición.

3. La lógica de la tabla TSFTABDEF.

Antes de explicar la lógica, algunas observaciones:

  • No se pueden modificar las líneas o bordes del template, solamente los colores. Los colores funcionan con código R,G,B de 0-255 (también hay que setearlos en notación hexadecimal).
  • Se debe modificar ANTES de procesar las ventanas con los templates del grafico de barras, lo que significa que no puedo editar dinámicamente los valores en el MAIN, sino que en un bloque de código ABAP tengo que definir toda la tabla.

* Declaraciones
DATA: l_cont(2) TYPE N,
      l_mod TYPE I,
      l_index TYPE I,
      l_col   TYPE I,
      l_campo TYPE STRING.

FIELD-SYMBOLS: <fs>.
FIELD-SYMBOLS: <F_TAB> TYPE TSFTABDEF.    " Table – Actual SF definitions

DATA: L_TABDEF  TYPE SSFTABDEF,     " Work Area for the Table

      T_LTYPES  TYPE TSFLTYPE,      " Table – Line types
      L_LTYPES  TYPE SSFLTYPE,      " Work Area for the table

      T_COLINFO TYPE TSFCOLINFO,    " Table – Columns
      L_COLINFO TYPE SSFCOLINFO,    " Work area for the table

      T_BORDER  TYPE TSFCTABA,      " Tables – Borders
      L_BORDER  TYPE SSFCTABA.      " Work Area for the border

* Assign the table definition to the table field symbol
* Assiging by ‘(Program)Tablename’ will give as the actual table
*   which contains the defination of the Smartform. We will change
*   respective table background color.
ASSIGN (‘(SAPLSTXBC)TABDEFS’) TO <F_TAB>.

* Table definition table
LOOP AT <F_TAB> INTO L_TABDEF.
*/Solamente se loopean los 100 template del gráfico
  CHECK L_TABDEF-NAME+1(8) = ‘TEMPLATE’.
  l_index = l_index + 1.

* En TI_GRAFICO tengo el layout del gráfico a mostrar
  READ TABLE TI_GRAFICO INDEX l_index INTO WA_GRAFICO.
*   Table line Types
*    Line type TYPE1 from the table MAIN_TABLE
    LOOP AT L_TABDEF-TLTYPE INTO L_LTYPES.
*     Coloum information
*       Column1 (cell) of the TYPE1
      CLEAR: l_col, l_cont.
      LOOP AT L_LTYPES-TCOLINFO INTO L_COLINFO.

      l_col = l_col + 1.
      l_mod = l_col MOD 2.

* Solamente chequeo las columanas Pares
        IF l_mod = 0. "Col pares
          l_cont = l_cont + 1.

           CONCATENATE ‘WA_GRAFICO-DAY_’ l_cont INTO l_campo.
           ASSIGN (l_campo) to <fs>.

*Si <fs> esta vacío limpio la celda
           IF <fs> IS INITIAL.
*           Borders
*             Background color and borders for that cell
             LOOP AT L_COLINFO-BORDERS INTO L_BORDER.
*               Clearing the color parameters for the cell
               CLEAR: L_BORDER-INTENSITY,            " Intensity
                      L_BORDER-FILLCOLOR,            " Color Used
                      L_BORDER-CFILLCOLOR.           " Color used in Hexa

                MODIFY L_COLINFO-BORDERS FROM L_BORDER.
              ENDLOOP.

              MODIFY L_LTYPES-TCOLINFO FROM L_COLINFO.
            ENDIF.
* Las columnas impares siempre se limpian

        ELSE.  " col impares
*           Background color and borders for that cell
           LOOP AT L_COLINFO-BORDERS INTO L_BORDER.
*             Clearing the color parameters for the cell
             CLEAR: L_BORDER-INTENSITY,              " Intensity
                    L_BORDER-FILLCOLOR,              " Color Used
                    L_BORDER-CFILLCOLOR.             " Color used in Hexa
              MODIFY L_COLINFO-BORDERS FROM L_BORDER.
            ENDLOOP.
            MODIFY L_LTYPES-TCOLINFO FROM L_COLINFO.
        ENDIF.
      ENDLOOP.

      MODIFY L_TABDEF-TLTYPE FROM L_LTYPES.
    ENDLOOP.
    MODIFY <F_TAB> FROM L_TABDEF.
ENDLOOP.

CLEAR l_index.

** Linea Promedio
*——————————————————
LOOP AT <F_TAB> INTO L_TABDEF.
CHECK L_TABDEF-NAME+1(8) = ‘TEMPLATE’.
l_index = l_index + 1.
* Linea promedio
IF l_index = g_promedio.
  LOOP AT L_TABDEF-TLTYPE INTO L_LTYPES.
    LOOP AT L_LTYPES-TCOLINFO INTO L_COLINFO.
         LOOP AT L_COLINFO-BORDERS INTO L_BORDER.
           IF ( L_BORDER-FILLCOLOR-RED     <> ‘078’ AND
                L_BORDER-FILLCOLOR-GREEN   <> ‘146’ AND
                L_BORDER-FILLCOLOR-BLUE    <> ‘088’ ).

             L_BORDER-INTENSITY         = ‘100’.
             L_BORDER-FILLCOLOR-RED     = ‘021’.
             L_BORDER-FILLCOLOR-GREEN   = ‘137’.
             L_BORDER-FILLCOLOR-BLUE    = ‘255’.
             L_BORDER-FILLCOLOR-USED    = ‘X’.

             L_BORDER-CFILLCOLOR-XRED   = ’15’.
             L_BORDER-CFILLCOLOR-XGREEN = ’89’.
             L_BORDER-CFILLCOLOR-XBLUE  = ‘FF’.
             L_BORDER-CFILLCOLOR-COLOR  = ‘X’.
             MODIFY L_COLINFO-BORDERS FROM L_BORDER.
           ENDIF.
          ENDLOOP.
          MODIFY L_LTYPES-TCOLINFO FROM L_COLINFO.
    ENDLOOP.
    MODIFY L_TABDEF-TLTYPE FROM L_LTYPES.
  ENDLOOP.
  MODIFY <F_TAB> FROM L_TABDEF.
ENDIF.
ENDLOOP.
*——————————————————

Si bien parece complicado es bastante simple, primero tomamos los valores de la tabla TABDEFS.

ASSIGN (‘(SAPLSTXBC)TABDEFS’) TO <F_TAB>.

En esta tabla estan TODAS las deficiones de tablas, por lo cual yo restrinjo que loopee los templates que use para el gráfico.

CHECK L_TABDEF-NAME+1(8) = ‘TEMPLATE’.

Viendo en modo debug a la tabla TABDEFS se van a dar cuenta de como funciona, por lo cual tan solo veo contra mi tabla TI_GRAFICO (la del punto 1) si ese lugar tiene que seguir coloreado o si debe limpiarse, como todas las columnas impares (que se usan para separar las columnas).

Luego dejé el código de como hacer una de las líneas de referencia.

4.  Retocar y agregarle información al gráfico de barras.

Luego de que logre funcionar el gráfico en sí, decidí mejorarle la estética del form, le agregué el cuadro de referencias y una tabla superior con los valores numéricos de la tabla.

One thought on “TABDEFS (TSFTABDEF) – Gráfico de barras en form Smartforms

  1. Hola Rodrigo! Te felicito por tu maravilloso blog… es increíble!!
    Tengo un problemilla con el cópdigo: ASSIGN (‘(SAPLSTXBC)TABDEFS’) TO .
    No consigo asignar ningún valor a , aparece vacío.
    Un saludo y muchas gracias!!

Leave a reply to Victor Cancel reply