Foro -Documentación -Código fuente -Contacto -Empleo

Buscar

Traducir

Amazon

ZIREPORTS PDF Imprimir E-mail
Usar puntuación: / 0
MaloBueno 
Código fuente - Includes
Miércoles, 18 de Mayo de 2005 18:37
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.
Comentarios
Buscar
¡Sólo los usuarios registrados pueden escribir comentarios!

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 
home search