Tipos, variables, constantes y forms para trabajo con reports
************************************************************************
*
* INCLUDE ZIREPORTS
*
* DESCRIPCIÓN: Tipos, variables, constantes y forms para trabajo
* con reports
*
* EJEMPLO DE USO:
*
* INITIALIZATION.
*
** Creamos el catalogo del listado desde una estructura del diccionario
* PERFORM report_crear_catalogo TABLES gt_listado_general
* USING 'ZSTRUCTURA'.
*
** Calculamos el tamanio del listado.
* PERFORM report_calcular_tamanio_pagina TABLES gt_listado_general
* USING d_tamanio_listado.
*
** Creamos el catalogo de columnas
* LOOP AT gt_listado_general INTO gt_columna_general.
* gt_columna_general-color = col_background.
* gt_columna_general-justified = c_center_justified.
* APPEND gt_columna_general.
* ENDLOOP.
* TOP-OF-PAGE.
** Escribimos el titulo del listado
* PERFORM report_escribir_campo_cabecera USING l_tab-tab1
* sy-title
* col_heading
* c_center_justified
* 'X'.
* PERFORM report_skip USING 1.
*
** Creamos la cabecera si no se ha creado aun.
* IF i_report_cabecera[] IS INITIAL.
** Imprimimos la versión de puestos (Texto)
* report_aniadir_campo_cabecera 1 l_tab-tab1
* 'Versión de puestos:'
* col_background_off
* c_left_justified.
** Imprimimos la versión de puestos (Valor)
* report_aniadir_campo_cabecera 1 l_tab-tab2
* 'P_VERS-LOW'
* col_background
* c_left_justified.
*
** Imprimimos la Fecha de ejecución (Texto)
* report_aniadir_campo_cabecera 1 l_tab-tab5
* 'Fecha de informe:'
* col_background_off
* c_left_justified.
** Imprimimos la Fecha de ejecución (Valor)
* report_aniadir_campo_cabecera 1 l_tab-tab6
* 'SY-DATUM'
* col_background
* c_right_justified.
* ENDIF.
*
** Mostramos la cabecera de la pagina
* PERFORM report_imprimir_cabecera_pag USING 'X'.
* PERFORM report_skip USING 1.
*
** Imprimimos la cabecera de las columnas
* PERFORM report_imprimir_cabecera_col TABLES gt_columna_general.
*
* START-OF-SELECTION
* Se recoge el listado en una tabla interna P. Ej: gt_listado
* END-OF-SELECTION
* LOOP AT gt_listado.
* ON CHANGE OF gt_listado-cabecera.
* NEW-PAGE.
* ENDON.
* Imprimimos la fila
* PERFORM report_imprimir_fila TABLES gt_listado
* USING gt_listado_general.
* ENDLOOP.
*
* Este es el listado mas basico, pero si controlais los form se pueden
* realizar totalizaciones y algunos controles más.
*
* Para referiros a colores utilizad siempre las constantes:
** Colores intensified on
*CONSTANTS: col_background TYPE i VALUE '0',
* col_heading TYPE i VALUE '1',
* col_normal TYPE i VALUE '2',
* col_total TYPE i VALUE '3',
* col_key TYPE i VALUE '4',
* col_positive TYPE i VALUE '5',
* col_negative TYPE i VALUE '6',
* col_group TYPE i VALUE '7'.
*
** Colores intensified off
*CONSTANTS: col_background_off TYPE i VALUE '10',
* col_heading_off TYPE i VALUE '11',
* col_normal_off TYPE i VALUE '12',
* col_total_off TYPE i VALUE '13',
* col_key_off TYPE i VALUE '14',
* col_positive_off TYPE i VALUE '15',
* col_negative_off TYPE i VALUE '16',
* col_group_off TYPE i VALUE '17'.
*
** Colores inverse on
*CONSTANTS: col_background_inv TYPE i VALUE '20',
* col_heading_inv TYPE i VALUE '21',
* col_normal_inv TYPE i VALUE '22',
* col_total_inv TYPE i VALUE '23',
* col_key_inv TYPE i VALUE '24',
* col_positive_inv TYPE i VALUE '25',
* col_negative_inv TYPE i VALUE '26',
* col_group_inv TYPE i VALUE '27'.
*
* Mientras que para referiros a justificaciones en el campo o fila usad:
*CONSTANTS: c_right_justified TYPE c VALUE 'R',
* c_left_justified TYPE c VALUE 'L',
* c_center_justified TYPE c VALUE 'C'.
*-----------------------------------------------------------------------
* FORM report_aniadir_campo_cabecera
*
* Añade un campo (P_QUE) a la cabecera, para que cuando se llame
* al form report_imprimir_cabecera_pag dicho campo salga impreso
* en la posición P_COL_INICIO, en el color P_COLOR y justificado
* mediante P_JUSTIFICADO.
*
* Dicho campo se añadira a la línea de cabecera P_LINEA. (no se
* contaran los SKIPS como lineas.
* -->P_COL_INICIO Columna en la que se imprimirá
* -->P_QUE Que imprimir, si es una variable
* escribirla como constante
* p.ej: 'SY-DATUM'.
* -->P_COLOR Color en el que se pintará
* -->P_JUSTIFICADO Justificación que usará
* -->P_LINEA Nº de linea de cabecera en la que
* irá.
*-----------------------------------------------------------------------
* FORM report_acumular_totales
*
* Acumula los campos totalizables que previamente se han incluido
* en la tabla interna i_campos_totales y que pertenezcan a las
* estructuras p_linea y p_totales dentro de la segunda.
*
* -->P_LINEA Estructura a acumular
* -->P_TOTALES Estructura en la que acumular
*-----------------------------------------------------------------------
* FORM report_aniadir_campo_totales
*
* Añade el campo P_FIELDNAME a la tabla I_CAMPOS_TOTALES que
* contiene todos los campos que se van a totalizar en el listado.
* (la totalización la debe hacere el usuario, de esto no se
* encarga el include)
*
* -->P_FIELDNAME Campo a acumular
*-----------------------------------------------------------------------
* FORM report_borrar_similitudes
*
* Recorre las dos estructuras P_LINEA_ANTERIOR y P_LINEA del tipo
* P_I_CATALOGO y elimina en la segunda los campos que tengan
* identico valor en la primera
*
* -->P_I_CATALOGO Catalogo de campos de las estructuras
* -->P_LINEA_ANTERIOR Linea uno a comparar
* -->P_LINEA Linea dos a comparar (aqui se borrara)
*-----------------------------------------------------------------------
* FORM report_buscar_diferencias
*
* Dadas dos estructuras P_LINEA y P_LINEA_ANTERIOR compara todos
* los campos pertenecientes a ambas que esten en el catalogo de
* campos P_I_CATALOGO y cuando encuentre diferencias modifica el
* catalogo para cambiarle el color a P_COLOR.
*
* -->P_I_CATALOGO Catalogo de campos de las estructuras
* -->P_LINEA Linea uno a comparar
* -->P_LINEA_ANTERIOR Linea dos a comparar
* -->P_COLOR Color a asignar a los diferentes
*-----------------------------------------------------------------------
* FORM report_calcular_tamanio_pagina
*
* Dado un catalogo de campos P_I_CATALOGO devuelve el tamaño
* máximo P_TAMANIO que ocuparia imprimir una fila con todos esos
* campos
*
* -->P_I_CATALOGO Catalogo de campos
* -->P_TAMANIO Tamaño calculado
*-----------------------------------------------------------------------
* FORM report_crear_catalogo
*
* Pasandole como parametro el nombre (como texto)de una estructura
* del diccionario SAP devuelve el catalogo de todos sus campos
* para la correcta impresión del listado con este include
*
* -->P_I_CATALOGO Catalogo de campos
* -->P_NAME Nombre de la estructura del diccionario
*-----------------------------------------------------------------------
* FORM report_imprimir_cabecera_col
*
* Dado un catalogo de entrada P_I_CATALOGO imprimiria una linea
* con la cabecera de las columnas.
*
* -->P_I_CATALOGO Catalogo de campos
*-----------------------------------------------------------------------
* FORM report_imprimir_cabecera_pag *
*
* Una vez rellena la tabla de cabecera I_REPORT_CABECERA mediante
* llamadas al form REPORT_ANIADIR_CAMPO_CABECERA se puede llamar
* a este form por ejemplo desde el evento TOP-OF-PAGE para
* imprimir la cabecera en la pantalla.
* Si se marca el flag P_CON_BORDE se mostrara un marco. en este
* caso habra que tener en cuenta que ningun campo de la cabecera
* puede empezar en la columna 1.
*
* -->P_CON_BORDE X si queremos borde, blanco si no
*-----------------------------------------------------------------------
* FORM report_imprimir_fila
*
* Imprime por pantalla los campos de la estructura p_linea segun
* el catalogo de campos P_I_CATALOGO.
*
* -->P_I_CATALOGO Catalogo de campos
* -->P_LINEA Linea a imprimir
*-----------------------------------------------------------------------
* FORM report_imprimir_totales
*
* Imprime por pantalla una fila con los totales informados con
* anterioridad mediante el form report_aniadir_campo_totales
* contenidos en la estructura P_LINEA segun el catalogo de campos
* P_I_CATALOGO
*
* -->P_I_CATALOGO Catalogo de campos
* -->P_LINEA Linea DE TOTALES a imprimir
*-----------------------------------------------------------------------
* FORM report_skip
*
* Realiza el numero de saltos de linea que se le indique mediante
* P_TIMES.
*
* --> P_TIMES Numero de saltos
*-----------------------------------------------------------------------
* FORM report_subrayar_totales
*
* Imprime por pantalla una fila con una linea de subrayado para
* los totales informados con anterioridad mediante el form
* report_aniadir_campo_totales contenidos en la estructura P_LINEA
* segun el catalogo de campos P_I_CATALOGO
*
* -->P_I_CATALOGO Catalogo de campos
* -->P_LINEA Linea DE TOTALES a subrayar
*-----------------------------------------------------------------------
* AUTOR: Ignacio Arnaiz Piorno FECHA: 06-09-2004
* CONTACTO:
Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla
*
* ----------------------------------------------------------------------
* CONTROL DE MODIFICACIONES
* AUTOR EMPRESA FECHA MOTIVO
* .......... ....... DD/MM/AA ................................
* .......... ....... DD/MM/AA ................................
*-----------------------------------------------------------------------
************************************************************************
************************************************************************
* Definición de tipos
************************************************************************
TYPE-POOLS slis.
************************************************************************
* Definición de tablas del sistema
************************************************************************
* INCLUIR UNA ESTRUCTURA DE ESTE TIPO EN EL PROGRAMA PARA CONTROLAR LOS
* TABULADOS DE LA CABECERA
*DATA: BEGIN OF l_tab, "Tabulado de columnas para la cabecera
* tab1 TYPE i VALUE 2,
* tab2 LIKE l_tab-tab1 VALUE 25,
* tab22 LIKE l_tab-tab1 VALUE 17,
* tab3 LIKE l_tab-tab1 VALUE 28,
* tab4 LIKE l_tab-tab1 VALUE 30,
* tab5 LIKE l_tab-tab1 VALUE 165,
* tab6 LIKE l_tab-tab1 VALUE 185,
* END OF l_tab.
************************************************************************
* Definición de constantes
************************************************************************
* Colores intensified on
CONSTANTS: col_background TYPE i VALUE '0',
col_heading TYPE i VALUE '1',
col_normal TYPE i VALUE '2',
col_total TYPE i VALUE '3',
col_key TYPE i VALUE '4',
col_positive TYPE i VALUE '5',
col_negative TYPE i VALUE '6',
col_group TYPE i VALUE '7'.
* Colores intensified off
CONSTANTS: col_background_off TYPE i VALUE '10',
col_heading_off TYPE i VALUE '11',
col_normal_off TYPE i VALUE '12',
col_total_off TYPE i VALUE '13',
col_key_off TYPE i VALUE '14',
col_positive_off TYPE i VALUE '15',
col_negative_off TYPE i VALUE '16',
col_group_off TYPE i VALUE '17'.
* Colores inverse on
CONSTANTS: col_background_inv TYPE i VALUE '20',
col_heading_inv TYPE i VALUE '21',
col_normal_inv TYPE i VALUE '22',
col_total_inv TYPE i VALUE '23',
col_key_inv TYPE i VALUE '24',
col_positive_inv TYPE i VALUE '25',
col_negative_inv TYPE i VALUE '26',
col_group_inv TYPE i VALUE '27'.
CONSTANTS: c_right_justified TYPE c VALUE 'R',
c_left_justified TYPE c VALUE 'L',
c_center_justified TYPE c VALUE 'C'.
************************************************************************
* Definición de estructuras
************************************************************************
TYPES: BEGIN OF t_report_catalogo,
col_pos LIKE sy-cucol, " position of the column
fieldname TYPE slis_fieldname,
cfieldname TYPE slis_fieldname, " field with currency unit
seltext_l LIKE dd03p-scrtext_l, " long key word
seltext_m LIKE dd03p-scrtext_l, " middle key word
seltext_s LIKE dd03p-scrtext_l, " short key word
datatype LIKE dd03p-datatype,
inttype LIKE dd03p-inttype,
intlen LIKE dd03p-intlen,
ddic_outputlen LIKE dd03p-outputlen,
color TYPE i,
justified TYPE c,
END OF t_report_catalogo.
TYPES: BEGIN OF t_report_campos,
tab LIKE sy-colno,
campo(100)," TYPE slis_fieldname,
color TYPE i,
justified TYPE c,
END OF t_report_campos.
TYPES: t_report_campos_tabla
TYPE t_report_campos OCCURS 0.
TYPES: BEGIN OF t_report_cabecera_linea,
num_linea LIKE sy-linno,
campos TYPE t_report_campos_tabla,
END OF t_report_cabecera_linea.
************************************************************************
* Definición de tablas internas
************************************************************************
DATA report_catalogo TYPE t_report_catalogo.
DATA i_report_cabecera
TYPE t_report_cabecera_linea OCCURS 0 WITH HEADER LINE.
DATA i_campos_totales LIKE report_catalogo-fieldname
OCCURS 0 WITH HEADER LINE.
************************************************************************
* Definición de variables
************************************************************************
DATA d_titulo(1000). " Para escribir el titulo en cabecera
DATA d_tamanio_listado LIKE report_catalogo-ddic_outputlen.
DATA d_tamanio_queda LIKE d_tamanio_listado.
DATA d_report_pagina LIKE sy-pagno.
DATA d_titulo_totales(500) VALUE
'Totales ..............................................................
.......................................................................'
.
************************************************************************
* Definición de parámetros
************************************************************************
************************************************************************
* Definición de rango de selección
************************************************************************
************************************************************************
* Definición de la pantalla de selección
************************************************************************
************************************************************************
* Definición de FIELD-SYMBOLS
************************************************************************
************************************************************************
* Definición de MACROS
************************************************************************
DEFINE report_aniadir_campo_cabecera.
perform report_aniadir_campo_cabecera using &2
&3
&4
&5
&1.
END-OF-DEFINITION.
************************************************************************
*
* FORMS ADICIONALES
*
************************************************************************
*&---------------------------------------------------------------------*
*& Form report_acumular_totales
*&---------------------------------------------------------------------*
* Acumula los campos totalizables que previamente se han incluido
* en la tabla interna i_campos_totales y que pertenezcan a las
* estructuras p_linea y p_totales dentro de la segunda.
*----------------------------------------------------------------------*
* -->P_LINEA text
* -->P_TOTALES text
*----------------------------------------------------------------------*
FORM report_acumular_totales USING p_linea
p_totales.
DATA l_texto(1000).
DATA: l_inicio LIKE sy-colno, l_fin LIKE sy-colno.
DATA l_aux_p(18)." TYPE p DECIMALS 3.
FIELD-SYMBOLS .
FIELD-SYMBOLS .
* Rellenamos el rango de campos totales
LOOP AT i_campos_totales.
CLEAR l_texto.
ASSIGN COMPONENT i_campos_totales
OF STRUCTURE p_linea TO .
IF sy-subrc IS INITIAL.
ASSIGN COMPONENT i_campos_totales
OF STRUCTURE p_totales TO .
IF sy-subrc IS INITIAL.
= + .
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " report_acumular_totales
*&---------------------------------------------------------------------*
*& Form report_aniadir_campo_cabecera
*&---------------------------------------------------------------------*
* Añade un campo (P_QUE) a la cabecera, para que cuando se llame
* al form report_imprimir_cabecera_pag dicho campo salga impreso
* en la posición P_COL_INICIO, en el color P_COLOR y justificado
* mediante P_JUSTIFICADO.
* Dicho campo se añadira a la línea de cabecera P_LINEA. (no se
* contaran los SKIPS como lineas.
*----------------------------------------------------------------------*
* -->P_COL_INICIO text
* -->P_QUE text
* -->P_COLOR text
* -->P_JUSTIFICADO text
* -->P_LINEA text
*----------------------------------------------------------------------*
FORM report_aniadir_campo_cabecera USING
value(p_col_inicio) LIKE sy-colno
p_que LIKE d_titulo
p_color LIKE report_catalogo-color
p_justificado LIKE report_catalogo-justified
p_linea TYPE i.
DATA l_campos TYPE t_report_campos.
READ TABLE i_report_cabecera WITH KEY num_linea = p_linea.
IF NOT sy-subrc IS INITIAL.
CLEAR i_report_cabecera.
i_report_cabecera-num_linea = p_linea.
APPEND i_report_cabecera.
ENDIF.
l_campos-tab = p_col_inicio.
l_campos-campo = p_que.
l_campos-color = p_color.
l_campos-justified = p_justificado.
APPEND l_campos TO i_report_cabecera-campos.
MODIFY i_report_cabecera TRANSPORTING campos
WHERE num_linea = p_linea.
SORT i_report_cabecera.
ENDFORM. " report_aniadir_campo_cabecera
*&---------------------------------------------------------------------*
*& Form report_aniadir_campo_totales
*&---------------------------------------------------------------------*
* Añade el campo P_FIELDNAME a la tabla I_CAMPOS_TOTALES que
* contiene todos los campos que se van a totalizar en el listado.
* (la totalización la debe hacere el usuario, de esto no se
* encarga el include)
*----------------------------------------------------------------------*
* -->P_FIELDNAME text
*----------------------------------------------------------------------*
FORM report_aniadir_campo_totales
USING value(p_fieldname) LIKE i_campos_totales.
IF NOT p_fieldname IS INITIAL.
i_campos_totales = p_fieldname.
APPEND i_campos_totales.
ENDIF.
ENDFORM. " report_aniadir_campo_totales
*&---------------------------------------------------------------------*
*& Form report_borrar_similitudes
*&---------------------------------------------------------------------*
* Recorre las dos estructuras P_LINEA_ANTERIOR y P_LINEA del tipo
* P_I_CATALOGO y elimina en la segunda los campos que tengan
* identico valor en la primera
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_LINEA_ANTERIOR text
* -->P_LINEA text
*----------------------------------------------------------------------*
FORM report_borrar_similitudes
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_linea_anterior
p_linea.
FIELD-SYMBOLS .
FIELD-SYMBOLS .
IF NOT p_linea_anterior IS INITIAL.
LOOP AT p_i_catalogo.
ASSIGN COMPONENT p_i_catalogo-fieldname
OF STRUCTURE p_linea TO .
IF sy-subrc IS INITIAL.
ASSIGN COMPONENT p_i_catalogo-fieldname
OF STRUCTURE p_linea_anterior TO .
IF sy-subrc IS INITIAL.
IF = .
CLEAR .
* Definimos el tipo char para que no muestre ceros en los enteros
p_i_catalogo-datatype = 'CHAR'.
p_i_catalogo-inttype = 'C'.
ENDIF.
ENDIF.
ENDIF.
MODIFY p_i_catalogo INDEX sy-tabix.
ENDLOOP.
ENDIF.
ENDFORM. " report_borrar_similitudes
*&---------------------------------------------------------------------*
*& Form report_buscar_diferencias
*&---------------------------------------------------------------------*
* Dadas dos estructuras P_LINEA y P_LINEA_ANTERIOR compara todos
* los campos pertenecientes a ambas que esten en el catalogo de
* campos P_I_CATALOGO y cuando encuentre diferencias modifica el
* catalogo para cambiarle el color a P_COLOR.
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_LINEA text
* -->P_LINEA_ANTERIOR text
* -->P_COLOR text
*----------------------------------------------------------------------*
FORM report_buscar_diferencias
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_linea
p_linea_anterior
p_color.
FIELD-SYMBOLS .
FIELD-SYMBOLS .
IF NOT p_linea_anterior IS INITIAL.
LOOP AT p_i_catalogo.
ASSIGN COMPONENT p_i_catalogo-fieldname
OF STRUCTURE p_linea TO .
IF sy-subrc IS INITIAL.
ASSIGN COMPONENT p_i_catalogo-fieldname
OF STRUCTURE p_linea_anterior TO .
IF sy-subrc IS INITIAL.
IF <> .
p_i_catalogo-color = p_color.
ENDIF.
ENDIF.
ENDIF.
MODIFY p_i_catalogo INDEX sy-tabix.
ENDLOOP.
ENDIF.
ENDFORM. " report_buscar_diferencias
*&---------------------------------------------------------------------*
*& Form report_calcular_tamanio_pagina
*&---------------------------------------------------------------------*
* Dado un catalogo de campos P_I_CATALOGO devuelve el tamaño
* máximo P_TAMANIO que ocuparia imprimir una fila con todos esos
* campos
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_TAMANIO text
*----------------------------------------------------------------------*
FORM report_calcular_tamanio_pagina
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_tamanio.
CLEAR p_tamanio.
LOOP AT p_i_catalogo.
p_tamanio = p_tamanio + p_i_catalogo-ddic_outputlen + 1.
ENDLOOP.
IF sy-subrc IS INITIAL.
p_tamanio = p_tamanio - 1.
ENDIF.
ENDFORM. " report_calcular_tamanio_pagina
*&---------------------------------------------------------------------*
*& Form report_crear_catalogo
*&---------------------------------------------------------------------*
* Pasandole como parametro el nombre (como texto)de una estructura
* del diccionario SAP devuelve el catalogo de todos sus campos
* para la correcta impresión del listado con este include
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_NAME text
*----------------------------------------------------------------------*
FORM report_crear_catalogo
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_name.
DATA i_aux TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA l_struct LIKE dd02l-tabname.
l_struct = p_name.
REFRESH p_i_catalogo[].
* Recuperamos el catalogo de campos standar para una estructura.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
* I_PROGRAM_NAME =
* I_INTERNAL_TABNAME =
i_structure_name = l_struct
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = i_aux[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT i_aux.
CLEAR p_i_catalogo.
MOVE-CORRESPONDING i_aux TO p_i_catalogo.
p_i_catalogo-color = col_background.
* Si no hay texto lo recuperamos del texto del campo directamente de la
* tabla
IF p_i_catalogo-seltext_l IS INITIAL
AND p_i_catalogo-seltext_m IS INITIAL
AND p_i_catalogo-seltext_s IS INITIAL.
SELECT SINGLE ddtext
INTO p_i_catalogo-seltext_l
FROM dd03t
WHERE tabname = l_struct
AND ddlanguage = sy-langu
AND fieldname = p_i_catalogo-fieldname.
p_i_catalogo-seltext_m = p_i_catalogo-seltext_l.
p_i_catalogo-seltext_s = p_i_catalogo-seltext_l.
ENDIF.
CASE p_i_catalogo-inttype.
WHEN 'P'
OR 'b'
OR 's'.
p_i_catalogo-justified = c_right_justified.
* Añadimos un caracter mas de salida para el signo
p_i_catalogo-ddic_outputlen = p_i_catalogo-ddic_outputlen + 1.
WHEN OTHERS.
p_i_catalogo-justified = c_left_justified.
ENDCASE.
APPEND p_i_catalogo.
ENDLOOP.
ENDFORM. " report_crear_catalogo
*&---------------------------------------------------------------------*
*& Form report_escribir_campo_cabecera
*&---------------------------------------------------------------------*
* ATENCIÓN: USO INTERNO.
*----------------------------------------------------------------------*
* -->P_COL_INICIO text
* -->P_QUE text
* -->P_COLOR text
* -->P_JUSTIFICADO text
* -->P_FIN_LINEA text
*----------------------------------------------------------------------*
FORM report_escribir_campo_cabecera USING
value(p_col_inicio) LIKE sy-colno
p_que
p_color LIKE report_catalogo-color
p_justificado LIKE report_catalogo-justified
value(p_fin_linea) TYPE c.
sy-colno = p_col_inicio.
IF NOT p_fin_linea IS INITIAL.
d_tamanio_queda = d_tamanio_listado - sy-colno + 1.
PERFORM report_write
USING
p_que
d_tamanio_queda
p_color
p_justificado.
PERFORM report_skip USING 1.
* SKIP.
ELSE.
d_tamanio_queda = d_tamanio_listado - sy-colno.
PERFORM report_write
USING
p_que
0
p_color
p_justificado.
ENDIF.
ENDFORM. " report_escribir_campo_cabecera
*&---------------------------------------------------------------------*
*& Form report_escribir_linea_cabecera
*&---------------------------------------------------------------------*
* ATENCIÓN: USO INTERNO.
*----------------------------------------------------------------------*
* -->P_LINEA text
*----------------------------------------------------------------------*
FORM report_escribir_linea_cabecera
USING p_linea STRUCTURE i_report_cabecera.
DATA l_flag_last.
FIELD-SYMBOLS .
DATA l_campos TYPE t_report_campos.
LOOP AT p_linea-campos INTO l_campos.
AT LAST.
l_flag_last = 'X'.
ENDAT.
ASSIGN (l_campos-campo) TO .
IF NOT sy-subrc IS INITIAL.
ASSIGN l_campos-campo TO .
ENDIF.
IF NOT l_flag_last IS INITIAL.
PERFORM report_escribir_campo_cabecera USING l_campos-tab
l_campos-color
l_campos-justified
'X'.
ELSE.
PERFORM report_escribir_campo_cabecera USING l_campos-tab
l_campos-color
l_campos-justified
' '.
ENDIF.
ENDLOOP.
ENDFORM. " report_escribir_linea_cabecera
*&---------------------------------------------------------------------*
*& Form report_imprimir_cabecera_col
*&---------------------------------------------------------------------*
* Dado un catalogo de entrada P_I_CATALOGO imprimiria una linea
* con la cabecera de las columnas.
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
*----------------------------------------------------------------------*
FORM report_imprimir_cabecera_col
TABLES p_i_catalogo STRUCTURE report_catalogo.
DATA l_texto(1000).
* Primero se cambia de linea.
PERFORM report_skip USING 1.
LOOP AT p_i_catalogo.
* Vemos si se debe coger un texto u otro.
IF p_i_catalogo-ddic_outputlen >= 40.
l_texto = p_i_catalogo-seltext_l.
ELSEIF p_i_catalogo-ddic_outputlen >= 20.
l_texto = p_i_catalogo-seltext_m.
ELSE.
l_texto = p_i_catalogo-seltext_s.
ENDIF.
PERFORM report_write USING l_texto
p_i_catalogo-ddic_outputlen
p_i_catalogo-color
p_i_catalogo-justified.
ENDLOOP.
PERFORM report_skip USING 1.
* Subrayamos
LOOP AT p_i_catalogo.
ULINE AT (p_i_catalogo-ddic_outputlen).
ENDLOOP.
ENDFORM. " report_imprimir_cabecera_col
*---------------------------------------------------------------------*
* FORM report_imprimir_cabecera_pag *
*---------------------------------------------------------------------*
* Una vez rellena la tabla de cabecera I_REPORT_CABECERA mediante
* llamadas al form REPORT_ANIADIR_CAMPO_CABECERA se puede llamar
* a este form por ejemplo desde el evento TOP-OF-PAGE para
* imprimir la cabecera en la pantalla.
* Si se marca el flag P_CON_BORDE se mostrara un marco. en este
* caso habra que tener en cuenta que ningun campo de la cabecera
* puede empezar en la columna 1.
*---------------------------------------------------------------------*
* --> P_CON_BORDE Text *
*---------------------------------------------------------------------*
FORM report_imprimir_cabecera_pag USING p_con_borde.
IF NOT p_con_borde IS INITIAL.
ULINE AT 1(d_tamanio_listado).
d_tamanio_listado = d_tamanio_listado - 1.
PERFORM report_skip USING 1.
ENDIF.
LOOP AT i_report_cabecera.
IF NOT p_con_borde IS INITIAL.
WRITE sy-vline.
ENDIF.
PERFORM report_escribir_linea_cabecera USING i_report_cabecera.
IF NOT p_con_borde IS INITIAL.
sy-linno = sy-linno - 1.
sy-colno = d_tamanio_listado + 1.
WRITE sy-vline.
PERFORM report_skip USING 1.
ENDIF.
ENDLOOP.
IF NOT p_con_borde IS INITIAL.
d_tamanio_listado = d_tamanio_listado + 1.
ULINE AT (d_tamanio_listado).
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form report_imprimir_fila
*&---------------------------------------------------------------------*
* Imprime por pantalla los campos de la estructura p_linea segun
* el catalogo de campos P_I_CATALOGO.
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_LINEA text
*----------------------------------------------------------------------*
FORM report_imprimir_fila
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_linea.
DATA l_texto(1000).
DATA l_aux_p(18)." TYPE p DECIMALS 3.
FIELD-SYMBOLS .
* Primero se cambia de linea.
IF sy-colno <> 1.
PERFORM report_skip USING 1.
ENDIF.
LOOP AT p_i_catalogo.
CLEAR l_texto.
ASSIGN COMPONENT p_i_catalogo-fieldname
OF STRUCTURE p_linea TO .
IF sy-subrc IS INITIAL.
CASE p_i_catalogo-inttype.
WHEN 'P'
OR 'b'
OR 's'.
WRITE TO l_texto.
* Colocamos el signo delante.
IF < 0.
REPLACE '-' WITH ' ' INTO l_texto.
CONDENSE l_texto NO-GAPS.
CONCATENATE '-' l_texto INTO l_texto.
ENDIF.
WHEN OTHERS.
IF NOT IS INITIAL.
WRITE TO l_texto.
ENDIF.
ENDCASE.
PERFORM report_write USING l_texto
p_i_catalogo-ddic_outputlen
p_i_catalogo-color
p_i_catalogo-justified.
ENDIF.
ENDLOOP.
PERFORM report_skip USING 1.
ENDFORM. " report_imprimir_fila
*&---------------------------------------------------------------------*
*& Form report_imprimir_totales
*&---------------------------------------------------------------------*
* Imprime por pantalla una fila con los totales informados con
* anterioridad mediante el form report_aniadir_campo_totales
* contenidos en la estructura P_LINEA segun el catalogo de campos
* P_I_CATALOGO
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_LINEA text
*----------------------------------------------------------------------*
FORM report_imprimir_totales
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_linea.
DATA l_texto(1000).
DATA: l_inicio LIKE sy-colno, l_fin LIKE sy-colno.
DATA l_aux_p(18)." TYPE p DECIMALS 3.
FIELD-SYMBOLS .
RANGES r_campos_totales FOR i_campos_totales.
* Rellenamos el rango de campos totales
LOOP AT i_campos_totales INTO r_campos_totales-low.
r_campos_totales-option = 'EQ'.
r_campos_totales-sign = 'I'.
APPEND r_campos_totales.
ENDLOOP.
IF sy-colno <> 1.
PERFORM report_skip USING 1.
ENDIF.
LOOP AT p_i_catalogo.
IF p_i_catalogo-fieldname IN r_campos_totales.
CLEAR l_texto.
ASSIGN COMPONENT p_i_catalogo-fieldname
OF STRUCTURE p_linea TO .
IF sy-subrc IS INITIAL.
CASE p_i_catalogo-inttype.
WHEN 'P'
OR 'b'
OR 's'.
WRITE TO l_texto.
* Colocamos el signo delante.
IF < 0.
REPLACE '-' WITH ' ' INTO l_texto.
CONDENSE l_texto NO-GAPS.
CONCATENATE '-' l_texto INTO l_texto.
ENDIF.
WHEN OTHERS.
IF NOT IS INITIAL.
WRITE TO l_texto.
ENDIF.
ENDCASE.
IF l_fin IS INITIAL
AND NOT l_texto IS INITIAL.
l_fin = sy-colno - 2.
ENDIF.
PERFORM report_write USING l_texto
p_i_catalogo-ddic_outputlen
p_i_catalogo-color
p_i_catalogo-justified.
ENDIF.
ELSE.
WRITE AT (p_i_catalogo-ddic_outputlen) ''.
ENDIF.
ENDLOOP.
l_inicio = l_fin / 5.
l_fin = l_fin - l_inicio.
WRITE AT l_inicio(l_fin) d_titulo_totales.
ENDFORM. " report_imprimir_totales
*&---------------------------------------------------------------------*
*& Form report_skip
*&---------------------------------------------------------------------*
* Realiza el numero de saltos de linea que se le indique mediante
* P_TIMES.
*----------------------------------------------------------------------*
* --> P_TIMES text
*----------------------------------------------------------------------*
FORM report_skip USING p_times TYPE i.
DO p_times TIMES.
SKIP.
IF NOT sy-linno = 1.
sy-linno = sy-linno - 1.
ENDIF.
ENDDO.
d_tamanio_queda = d_tamanio_listado.
ENDFORM. " report_skip
*&---------------------------------------------------------------------*
*& Form report_subrayar_totales
*&---------------------------------------------------------------------*
* Imprime por pantalla una fila con una linea de subrayado para
* los totales informados con anterioridad mediante el form
* report_aniadir_campo_totales contenidos en la estructura P_LINEA
* segun el catalogo de campos P_I_CATALOGO
*----------------------------------------------------------------------*
* -->P_I_CATALOGO text
* -->P_LINEA text
*----------------------------------------------------------------------*
FORM report_subrayar_totales
TABLES p_i_catalogo STRUCTURE report_catalogo
USING p_linea.
RANGES r_campos_totales FOR i_campos_totales.
* Rellenamos el rango de campos totales
LOOP AT i_campos_totales INTO r_campos_totales-low.
r_campos_totales-option = 'EQ'.
r_campos_totales-sign = 'I'.
APPEND r_campos_totales.
ENDLOOP.
IF sy-colno <> 1.
PERFORM report_skip USING 1.
ENDIF.
* Subrayamos
LOOP AT p_i_catalogo.
IF p_i_catalogo-fieldname IN r_campos_totales.
ULINE AT (p_i_catalogo-ddic_outputlen).
ELSE.
WRITE AT (p_i_catalogo-ddic_outputlen) ''.
ENDIF.
ENDLOOP.
ENDFORM. " report_subrayar_totales
*---------------------------------------------------------------------*
* FORM Report_write *
*---------------------------------------------------------------------*
* ATENCION: USO INTERNO.
*---------------------------------------------------------------------*
* --> P_QUE *
* --> P_TAMAÑO *
* --> P_COLOR *
* --> P_JUSTIFICACION *
*---------------------------------------------------------------------*
FORM report_write USING l_que
p_tamanio LIKE report_catalogo-ddic_outputlen
l_color TYPE i
p_justificacion LIKE report_catalogo-justified.
DATA l_long TYPE i.
DATA p_que LIKE d_titulo.
DATA p_color LIKE l_color.
p_color = l_color.
WRITE l_que TO p_que.
CONDENSE p_que.
l_long = strlen( p_que ).
IF p_tamanio IS INITIAL.
p_tamanio = l_long.
ENDIF.
l_long = p_tamanio - l_long.
CASE p_justificacion.
WHEN c_left_justified.
WHEN c_center_justified.
l_long = l_long - 1.
l_long = l_long / 2.
DO l_long TIMES.
CONCATENATE '~' p_que INTO p_que.
REPLACE '~' WITH ' ' INTO p_que.
ENDDO.
WHEN c_right_justified.
DO l_long TIMES.
CONCATENATE '~' p_que INTO p_que.
REPLACE '~' WITH ' ' INTO p_que.
ENDDO.
ENDCASE.
IF p_color >= 20.
p_color = p_color - 20.
FORMAT INTENSIFIED ON.
ELSEIF p_color >= 10.
p_color = p_color - 10.
FORMAT INTENSIFIED OFF.
ENDIF.
* Dependiendo del color se imprime de un modo u otro.
CASE p_color.
WHEN col_background.
WRITE p_que(p_tamanio)
COLOR COL_BACKGROUND.
WHEN col_heading.
WRITE p_que(p_tamanio)
COLOR COL_HEADING."
WHEN col_normal.
WRITE p_que(p_tamanio)
COLOR COL_NORMAL.
WHEN col_total.
WRITE p_que(p_tamanio)
COLOR COL_TOTAL.
WHEN col_key.
WRITE p_que(p_tamanio)
COLOR COL_KEY.
WHEN col_positive.
WRITE p_que(p_tamanio)
COLOR COL_POSITIVE.
WHEN col_negative.
WRITE p_que(p_tamanio)
COLOR COL_NEGATIVE.
WHEN col_group.
WRITE p_que(p_tamanio)
COLOR COL_GROUP.
WHEN OTHERS.
MESSAGE e666(01)
WITH 'Error en perform report_write'
'el color' p_color 'no existe.'.
ENDCASE.
FORMAT INTENSIFIED ON.
FORMAT INVERSE OFF.
d_tamanio_queda = d_tamanio_queda - p_tamanio - 1.
ENDFORM.
|