Autor Tema: INCLUDE para hacer ALV  (Leído 34629 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado odamaso

  • Novato
  • *
  • Mensajes: 2
    • Ver Perfil
INCLUDE para hacer ALV
« en: 09 de Julio de 2007, 05:44:30 pm »
Este INCLUDE nos facilitará mucho el trabajo a la hora de hacer ALV.



*----------------------------------------------------------------------*
*   INCLUDE ZALV                                                       *
*----------------------------------------------------------------------*

************************************************************************
* Include ZALV: Subrutinas para listado ALV.                           *
************************************************************************

* Es necesario incluir este include en el inicio del programa.
* El inicio del código tiene que empezar por STAR-OF-SELECTION, o no
* lo reconocerá.
* IMPORTANTISIMO. Es obligatorio incluir la 1ª form, y la última.

* Listado de Forms.
* 1.-  OBT_DESCRIP_CAMPOS_TABLA    "Esta form es            OBLIGATORIA.

* 2.-  CAMB_DESCRIP_CAMPOS_TABLA   "Cambia la descrip de cabecera
* 3.-  ELIM_CAMPOS_DE_VISUALIZACION"No se visualizan los campos seleccio
* 4.-  CARAC_GEN_LISTADO           "Da formato al listado
* 5.-  ASIGNAR_MONEDA_COLUMNA      "Asignamos una campo de moneda
* 6.-  ASIGNAR_UNIDAD_MEDIDA       "Asignamos una unidad de medida
* 7.-  ALV_F4                      "Match code para varientes
* 8.-  CHEQUEO_VARIANTE_EXISTE     "Comprueba que exista la variante
* 9.-  ASIGNAR_VARIANTE            "Asignamos la variante al listado
* 10.- ENCABEZADO                  "Llamamos a esta función para inserta
* 11.- ASIGN_O_QUITAR_CAMPO_CLAVE  "Asigna o quita la prop. de Campo Cla
* 12.- Indicar_campo_checkbox      "Definir una columna como checkbox

* 13.- ASIGNAR_USER_COMMAND        "Equivalente a AT USER-COMMAND
* 14.- Asignar_TOP_OF_PAGE         "Deberemos crear FORM TOP_OF_PAGE2
* 15.- Asignar_PF_STATUS           "Asigna un STATUS a un listado

* 16.- VISUALIZAR_LISTA            "Visualizar la lista.     OBLIGATORIA
* 17.- Asignar END_OF_PAGE         "
* 18.- Opciones de Impresión
* 19.- Asignar_edit_campo          "Campo editable en alv
* 20.- Asignar_hotspot             "Activa o desactiva el hotspot

* Normalmente como mínimo es necesario este código si la tabla es I_TAB
*  repname = sy-repid.
*  PERFORM obt_descrip_campos_tabla USING repname 'I_TAB'.
*  PERFORM carac_gen_listado.
*  PERFORM visualizar_lista TABLES I_TAB USING  'I_TAB' repname .


*$*$          Definición de variables para el listado
TYPE-POOLS: slis.
DATA: repname  LIKE sy-repid ,
      layout   TYPE slis_layout_alv,
      printer  TYPE slis_print_alv,
      f2code   LIKE sy-ucomm VALUE  '&ETA',
      fieldtab TYPE slis_t_fieldcat_alv,
      heading  TYPE slis_listheader OCCURS 0 ,
      g_save(1) TYPE c VALUE 'A',
      fausti LIKE  tbsl-faus1,         " string de campos obligatorios
      events TYPE slis_alv_event OCCURS 0,
      sort TYPE slis_t_sortinfo_alv,
      sort_header TYPE slis_sortinfo_alv,
      variant LIKE disvariant,
      user_command TYPE slis_formname,
      status TYPE slis_formname.

CONSTANTS:
    formname_top_of_page   TYPE slis_formname VALUE 'TOP_OF_PAGE',
    formname_end_of_list   TYPE slis_formname VALUE 'END_OF_LIST',
    formname_user_command  TYPE slis_formname VALUE 'USER_COMMAND',
    formname_pf_status_set TYPE slis_formname VALUE 'PF_STATUS'.

FIELD-SYMBOLS <fs> TYPE slis_fieldcat_alv.



*$*$            Definición de Forms de listado

*__________________________________________Form obt_descrip_campos_tabla
FORM obt_descrip_campos_tabla USING p_repname
                                    p_tablename TYPE slis_tabname.
* Esta es la primera form que se tiene que llamar. Así recogemos
* Los atributos de todos los campos de la tabla interna.
* Importante!!: La tabla interna no se tiene que definir como un data
* referenciado a una estructura type (Si se hace de este modo no
* reconocerá ningún campo). Utilizar siempre:
* Data begin of .....  occurs 0.
* Data end of ......
* No utilizar tampoco: Data: itab type standard table of ...............
  REFRESH fieldtab.
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
       EXPORTING
            i_program_name     = p_repname
            i_internal_tabname = p_tablename
            i_inclname         = p_repname
       CHANGING
            ct_fieldcat        = fieldtab.

ENDFORM.

*_________________________________________FORM Camb_descrip_campos_tabla
FORM camb_descrip_campos_tabla USING p_campo  TYPE slis_fieldname
                                     p_descrip.

* Para utilizar esta form previamente tenemos que haber llamado a la
* form obt_descrip_campos_tabla. Tenemos que pasarle el campo de la
* tabla interna y la descripción que queremos que aparezca en la
* cabecera de la columna.

  READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-seltext_l = p_descrip.
*    <fs>-seltext_m = p_descrip.
*    <fs>-seltext_s = p_descrip.
*    <fs>-reptext_ddic = p_descrip.
  ENDIF.

ENDFORM.

*______________________________________FORM elim_campos_de_visualizacion
FORM elim_campos_de_visualizacion USING p_campo  TYPE slis_fieldname.
* Consigue que un campo clave se pueda quitar de la visualización.
* P. Ej. Mandante.
* Tambien elimina de la visualización cualquier campo que no sea clave.
* Desde dentro del listado estos campos se pueden volver a visualizar.

  READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-key_sel = 'X'.
    <fs>-no_out = 'X'.
  ENDIF.
ENDFORM.
*_______________________________________________Carac. gen. del listado.
FORM carac_gen_listado.
*Esta Form contiene características generales del listado. Si se quieren
*estas mismas llamar a la Form, en caso contrario implementarlas desde
*el programa. La estructura de características generales es 'LAYOUT'.
*En El campo INFO_FIELDNAME se le indica la columna que contiene el
*color para cada registro. Si dicha columna, no tiene valor para algún
*registro, dicho registro tendrá el color standard que le toque.
* El formato que tiene que tener la columa COLOR es:
*  'Cxy':
*  C = color (all codes must start with 'C')
*  x = color number ('1'-'9')
*  y = bold ('0' = off, '1' = on)

*__Indicamos que queremos el listado cebreado
  layout-zebra        = 'X'.
*__No afecta porque tenemos user-commmand
  layout-detail_popup = 'X'.
*__Indicamos que Al hacer doble click el user-command = 'DOBCLICK'.
*  layout-f2code = 'DOBCLICK'.
*__Si queremos que al hacer doble click despliegue la ventana desasteris
*  p_layout-f2code = '&ETA'.
  layout-info_fieldname = 'COLOR'.
*  layout-flexible_key = 'X'. "Permite mover campos clave.
  layout-colwidth_optimize = 'X'.
  layout-detail_initial_lines = 'X'.
  layout-detail_titlebar = 'Información Adicional'. "Titulo popup
  layout-totals_only = 'X'.
  layout-detail_popup = 'X'.

ENDFORM.                    " BUILD_LAYOUT

*____________________________________________FORM asignar_moneda_columna
FORM asignar_moneda_columna USING p_columna TYPE slis_fieldname
                                  p_campo_moneda TYPE slis_fieldname.
* En esta form hay que pasar la columna que tiene los importes, y la
* Columna que contiene la moneda para cada registro.
  READ TABLE fieldtab WITH KEY fieldname = p_columna ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-cfieldname = p_campo_moneda.
  ENDIF.

ENDFORM.

*_____________________________________________FORM asignar_unidad_medida
FORM asignar_unidad_medida USING p_columna TYPE slis_fieldname
                                 p_campo_moneda TYPE slis_fieldname.
* En esta form hay que pasar la columna que tiene las cantidades, y la
* Columna que contiene la unidad para cada registro.
  READ TABLE fieldtab WITH KEY fieldname = p_columna ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-qfieldname = p_campo_moneda.
  ENDIF.

ENDFORM.

*____________________________________________________________Form Alv_F4
FORM alv_f4 USING p_repname LIKE sy-repid
                  p_variante LIKE disvariant-variant.

* Esta form devuelve un matchcode con las variantes existentes.
* Tan solo se tiene que poner si se quiere cargar una variante de
* visualización.
* Para poner esta form se tiene que poner:

**** at selection-screen on value-request for p_variante.          *****
**** perform alv_f4 using (Nombreprograma) (Variable_variante).    *****
  variant-report = p_repname.
  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
       EXPORTING
            is_variant = variant
            i_save     = 'A'
       IMPORTING
            es_variant = variant
       EXCEPTIONS
            not_found  = 2.
  IF sy-subrc = 2.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    p_variante = variant-variant.
  ENDIF.
ENDFORM.

*___________________________________________FORM chequeo_variante_existe
FORM chequeo_variante_existe USING p_repname LIKE sy-repid
                                   p_variante LIKE disvariant-variant.

* Esta form solo se tiene que usar si se quiere cargar una variante de
* visualización al sacar el listado.
* Esta form valida que la variante introducida por pantalla exista, en
* caso contrario da un mensaje de error.

*IMPLEMENTACIÓN.
*****at selection-screen.                                          *****
*****  perform alv_check USING (Nombre_prog) (variable_variante).  *****

  variant-report = p_repname.
  variant-variant = p_variante.
  IF NOT p_variante IS INITIAL.
    CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
         EXPORTING
              i_save     = 'A'
         CHANGING
              cs_variant = variant
         EXCEPTIONS
              OTHERS     = 1.
    IF sy-subrc <> 0.
      MESSAGE e321(m7) WITH p_variante variant-report.
    ENDIF.
  ENDIF.

ENDFORM.

*______________________________________________________Asignar variante.
FORM asignar_variante USING p_repname LIKE sy-repid
                            p_variante LIKE disvariant-variant.
* Si se quiere visualizar una variante es obligatorio llamar a esta form
* No es suficiente con llamar a la función de matchcode, o a la form de
* verificación.
  CLEAR variant.
  variant-report = p_repname.
  variant-variant = p_variante.
ENDFORM.

*_______________________________________________________FORM top_of_page
FORM encabezado USING p_linea TYPE slis_entry .
* TOP-OF-PAGE, Se tiene que pasar línea a línea. Se tiene que rellenar
* una variable TYPE slis_entry, que tiene 60 posiciones, y enviarla a
* la form, para cada nueva línea del top-of-page se tiene que volver a
* llamar a la form enviando la nueva línea.

  IF events[] IS INITIAL.
    DATA: ls_event TYPE slis_alv_event.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
         EXPORTING
              i_list_type = 0
         IMPORTING
              et_events   = events.
  ENDIF.
*___Indicamos que tiene que tener TOP-OF-PAGE
  READ TABLE events WITH KEY name = slis_ev_top_of_page
                           INTO ls_event.
  IF sy-subrc = 0.
    MOVE formname_top_of_page TO ls_event-form.
    APPEND ls_event TO events.
  ENDIF.
  DELETE ADJACENT DUPLICATES FROM heading COMPARING ALL FIELDS.
  DATA: hline TYPE slis_listheader.
  hline-typ  = 'H'.
  hline-info = p_linea.
  APPEND hline TO heading.
  CLEAR: hline, p_linea.

ENDFORM.

*________________________________________FORM ASIGN_O_QUITAR_CAMPO_CLAVE
FORM asign_o_quitar_campo_clave USING p_campo TYPE fieldname
           p_x TYPE char1.
*Esta form asigna o quita la propiedad de campo clave. Los campos clave
*Aparecen en color azul a la izquierda de la pantalla, y se quedan
*Bloqueados sin que se puedan mover.
  TRANSLATE p_campo TO UPPER CASE.
  READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-key = p_x.
  ENDIF.
ENDFORM.

*____________________________________________form asignar_ancho_columna
FORM asignar_ancho_columna USING p_campo TYPE fieldname
                                 long TYPE i.
* Esta rutina asigna un ancho a la columna. No es necesario indicarlo
* porque por defecto coge la longitud de la variable.
  TRANSLATE p_campo TO UPPER CASE.
  READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-outputlen = long.
  ENDIF.

ENDFORM.

*____________________________________________Form Indicar_campo_checkbox
FORM indicar_campo_checkbox USING p_campo TYPE fieldname.

* Esta rutina asigna a una columna la propiedad de checkbox.
* El parámetro import es el nombre del campo.
  layout-box_fieldname = p_campo.
ENDFORM.

*_______________________________________________________FORM top_of_page
FORM top_of_page.
*Esta función es interna, y no se tiene que llamar desde el programa de
* control
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
       EXPORTING
            i_logo             = 'LOGO_SOS'
            it_list_commentary = heading.
ENDFORM.

*______________________________________________FORM asignar_user_command
FORM asignar_user_command.
* Se tiene que crear una form dentro del programa de control que tenga
* implementado lo que se quiere hacer en el AT-LINE-SELECTION o
* AT USER COMMAND
* La form que se construya tiene que tener la structura:

*****form user_command using r_ucomm like sy-ucomm               *******
*****                        rs_selfield type slis_selfield.     *******

* El campo r_ucomm  devuelve el código '&ETA' si es un doble click
* la estructura rs_selfield contiene los siguientes campos.

* tabname  : Nombre de la tabla interna
* tabindex : Indice de la tabla interna
* fieldname: Campo en el que estaba posicionado el cursor
* sel_tab_field: Nombre de la celda donde estaba posicionado el cursor
* endsum   : El cursor está sobre la linea de suma final
* sumindex : Si es mayor que cero, indica que es una linea de subtotal
* value    : valor del campo de la lista
* refresh  : (exporting) Se refresca la lista, la lista act. desaparece.
* col_stable:(exporting) keep column positions in refresh
  DATA: ls_event TYPE slis_alv_event.
  FIELD-SYMBOLS <events> LIKE ls_event.
  IF events[] IS INITIAL.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
         EXPORTING
              i_list_type = 0
         IMPORTING
              et_events   = events.
  ENDIF.
*___Indicamos que tiene el evento User-command: At-line-selection
  READ TABLE events WITH KEY name = slis_ev_user_command
                      ASSIGNING <events>.
  CHECK sy-subrc = 0.
  MOVE formname_user_command  TO <events>-form.
ENDFORM.

*_______________________________________________Form asignar_TOP_OF_PAGE
FORM asignar_top_of_page.
* Para el TOP-OF-PAGE, tendremos que crear una rutina que se llame
* ALV_TOP_OF_PAGE. Dentro de esta rutina podremos escribir la cabecera
* que queramos al modo tradicional (Con Writes).

  DATA: ls_event TYPE slis_alv_event.
  FIELD-SYMBOLS <events> LIKE ls_event.
  IF events[] IS INITIAL.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
         EXPORTING
              i_list_type = 0
         IMPORTING
              et_events   = events.
  ENDIF.
  READ TABLE events WITH KEY name = slis_ev_top_of_page
                      ASSIGNING <events>.
  CHECK sy-subrc = 0.
  <events>-form = 'ALV_TOP_OF_PAGE'.
ENDFORM.

*_____________________________________________Form asignar_SET_PF_STATUS
FORM asignar_set_pf_status USING p_status.
* Tenemos que pasar como variable el STATUS que queremos asignar al
* listado.

  DATA: ls_event TYPE slis_alv_event.
  FIELD-SYMBOLS <events> LIKE ls_event.
  IF events[] IS INITIAL.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
         EXPORTING
              i_list_type = 0
         IMPORTING
              et_events   = events.
  ENDIF.
  READ TABLE events WITH KEY name = slis_ev_pf_status_set
         ASSIGNING <events>.
  CHECK sy-subrc = 0.
  <events>-form = p_status.
  SET PF-STATUS p_status.
ENDFORM.

*__________________________________________________FORM visualizar_lista
FORM visualizar_lista TABLES p_itab
                      USING  p_tablename TYPE slis_tabname
                             p_repname LIKE sy-repid.
* valores del g_save.
*   ' ' = No se pueden salvar las variantes de visualización
*   'X' = Solo se pueden salvar las variantes standard
*   'U' = Solo se pueden salvar las variantes de usuario
*   'A' = Se pueden guardar todas las variantes.

  DATA: e_exit_caused_by_caller.


  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
       EXPORTING
            i_callback_program       = p_repname
            i_callback_pf_status_set = status
            i_structure_name         = p_tablename
            is_layout                = layout
            it_fieldcat              = fieldtab
            i_default                = 'A'
            i_save                   = g_save
            it_sort                  = sort
            it_events                = events[]
            is_variant               = variant
            is_print                 = printer
            i_callback_user_command  = 'USER_COMMAND'
       IMPORTING
            e_exit_caused_by_caller  = e_exit_caused_by_caller
       TABLES
            t_outtab                 = p_itab.

ENDFORM.
*_______________________________________________Form asignar_END_OF_LIST
FORM asignar_end_of_list.
* Para el END-OF-LIST, tendremos que crear una rutina que se llame
* ALV_END_OF_LIST. Dentro de esta rutina podremos escribir un párrafo
* al final que queramos al modo tradicional (Con Writes).

  DATA: ls_event TYPE slis_alv_event.
  FIELD-SYMBOLS <events> LIKE ls_event.
  IF events[] IS INITIAL.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
         EXPORTING
              i_list_type = 0
         IMPORTING
              et_events   = events.
  ENDIF.
  READ TABLE events WITH KEY name = slis_ev_end_of_list
                      ASSIGNING <events>.
  CHECK sy-subrc = 0.
  <events>-form = 'ALV_END_OF_LIST'.
ENDFORM.
*_______________________________________________Form opciones_impresora
FORM opciones_impresora.
*Esta Form contiene características para la impresora.

*__Indicamos que no salga la página de selección.
  printer-no_print_selinfos = 'X'.
  printer-no_print_listinfos = 'X'.

ENDFORM.                    " OPCIONES_IMPRESORA
*_______________________________________________Form asignar_edit_campo
*esta form permite hacer un campo de la alv que sea editable

FORM asignar_edit_campo USING p_campo  TYPE slis_fieldname
                              char1.

  READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-input = char1.
*    <fs>-seltext_m = p_descrip.
*    <fs>-seltext_s = p_descrip.
*    <fs>-reptext_ddic = p_descrip.
  ENDIF.
ENDFORM.                    " asignar_edit_campo

*&---------------------------------------------------------------------*
*&      Form  activar_hotspot
*&---------------------------------------------------------------------*
FORM activar_hotspot USING p1 TYPE slis_fieldname
                           p2.

  READ TABLE fieldtab WITH KEY fieldname = p1 ASSIGNING <fs>.
  IF sy-subrc = 0.
    <fs>-hotspot = p2.
  ENDIF.

ENDFORM.                    " activar_hotspot


Desconectado IORIDX

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re: INCLUDE para hacer ALV
« Respuesta #1 en: 17 de Agosto de 2010, 09:19:46 pm »
No he podido implementarlo, mi tabla es como la que sugiere I_TAB

Alguien que ayude? ???

Desconectado IORIDX

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re: INCLUDE para hacer ALV
« Respuesta #2 en: 19 de Agosto de 2010, 10:36:57 pm »
Problema solucionado  ;D

Desconectado ariasnaty

  • Novato
  • *
  • Mensajes: 3
    • Ver Perfil
Re:INCLUDE para hacer ALV
« Respuesta #3 en: 26 de Abril de 2013, 02:44:32 pm »
Carlos,

Declare la variable pero sigue sin funcionar.
Es mucha joda que te pase el codigo?, digamos declare el parametro de seleccion y puedo elegir la variante pero cuando ejecuto el programa  el dato de la variante no lo esta pasando al AVL.

Gracias!!