Foro de programación ABAP

Código abierto => Includes => Mensaje iniciado por: abapito en 07 de Mayo de 2008, 04:53:01 pm

Título: Include para pantallas de selección
Publicado por: abapito en 07 de Mayo de 2008, 04:53:01 pm
Hola quería mostraros este include que suelo utilizar para las pantallas de selección.

Fuente sacada del siguiente http://enlace (http://sap4.com/wiki/index.php?title=ZISELSCN)

Mediante esta librería se pueden realizar de forma sencilla pantallas de selección con logos, tabstrips, etc...
Todas las funciones están comentadas y recomiendo leer la cabecera para tener un conocimiento previo de como usarlo.

Código: [Seleccionar]
************************************************************************
*
*  REPORT ZISELSCN
*
*  DESCRIPCIÓN: Include con macros y forms para la creación de pantallas
*  de selección.
*
*  INSTRUCCIONES: Se han definido las siguientes macros y forms para un
*  correcto funcionamiento:
*---------------------------------------------------------------------*
*    Macro para poner un checkbox en un selection screen
*    PARAMETROS:
*       &1 - Nombre del checkbox
*       &2 - Elemento de texto para el checkbox
*       &3 - Valor por defecto para el checkbox
*    Ejemplo:
*      definir_checkbox p_check text-c01 'X'.
*---------------------------------------------------------------------*
*    Macro para poner un radiobutton en un selection screen
*    PARAMETROS:
*       &1 - Nombre del radiobutton
*       &2 - Elemento de texto para el radiobutton
*       &3 - Grupo al que pertenece el radiobutton
*    Ejemplo:
*      definir_radiobutton p_radio text-c02 GRP1.
*---------------------------------------------------------------------*
*    Macro para poner un parametro en un selection screen
*    PARAMETROS:
*       &1 - Nombre del parametro
*       &2 - Elemento de texto para el parametro
*       &3 - Elemento de datos al que se parece (Definición LIKE)
*       &4 - Valor por defecto
*    Ejemplo:
*      definir_parametro p_nombre text-c01 kna1-kunnr '00045'.
*---------------------------------------------------------------------*
*    Macro para poner una bandeja en un selection screen
*    PARAMETROS:
*       &1 - Nombre de la bandeja
*       &2 - Longitud de la bandeja
*       &3 - Valor por defecto
*       &4 - Descripción de la bandeja
*    Ejemplo:
*      definir_bandeja p_nombre 15 ' ' text-c01.
*---------------------------------------------------------------------*
*    Macro para poner una ventana en la que dibujar el logo
*    PARAMETROS:
*       &1 - Nombre de la ventana
*       &2 - Lineas de la ventana
*    Ejemplo:
*      definir_pantalla_logo logo 5.
*      ¡¡IMPORTANTE!! ADEMAS DE ESTA MACRO HABRA QUE EJECUTAR EL FORM
*      definir_pantalla_logo en el INITIALIZATION.
*---------------------------------------------------------------------*
*    FORMS:
*---------------------------------------------------------------------*
*       FORM selscn_actualizar_pantalla.- Realiza un refresco de la
*       pantalla.
*---------------------------------------------------------------------*
*       FORM selscn_aniadir_linea_bandeja.- Prepara una linea de una
*       bandeja para despues, una vez rellena la tabla llamar al form
*       rellenar_tabla_bandeja
*            -->  P_KEY:  Valor de la linea
*            -->  P_TEXT: Texto a mostrar en la linea
*---------------------------------------------------------------------*
*       FORM selscn_rellenar_tabla_bandeja.- Asigna una serie de valores
*       que previamente se han cargado mediante el form
*       selscn_aniadir_linea_bandeja
*            -->  VALUE(P_PARAMETER): Texto con el nombre del parametro
*                 al que asignarle la tabla.
*---------------------------------------------------------------------*
*       FORM selscn_leer_valor_de_pantalla.- Recupera de la pantalla de
*       selección un valor antes de que se actualice.
*            -->  F_REPID -> Nombre del programa, normalmente SY-REPID
*            -->  F_DYNNR -> Número de dynpro, normalmente SY-DYNNR
*            -->  F_FIELDNAME_IN -> Nombre del campo que pretendemos
*                 recuperar
*            -->  F_FIELDVALUE -> Valor recuperado
*---------------------------------------------------------------------*
*       FORM selscn_definir_pantalla_logo.- Este form deberá utilizarse
*       siempre en el evento INITIALIZATION pasandole:
*            -->P_BLOQUE   Nombre del bloque del selection screen donde
*               este definido el logo.
*            -->P_DYNNR    Nº de dynpro donde este definido el logo.
*            -->P_CONTROL  Control del dynpro en el que se integrará el
*               logo
*---------------------------------------------------------------------*
*
*  MÓDULO AL QUE PERTENECE:
*
*  AUTOR: Ignacio Arnaiz Piorno                        FECHA: 06-09-2004
*  CONTACTO: i_arnaiz@sanesteban.com
*
* ----------------------------------------------------------------------
* CONTROL DE MODIFICACIONES
*   AUTOR         EMPRESA     FECHA       MOTIVO
* ..........      .......   DD/MM/AA  ................................
* ..........      .......   DD/MM/AA  ................................
*-----------------------------------------------------------------------
************************************************************************
*INCLUDE ZISELSCN.

************************************************************************
*                       INCLUDES
************************************************************************

************************************************************************
* Definición de type pools
************************************************************************
  TYPE-POOLS:  vrm. " Para parametros de bandeja
  TYPE-POOLS: rsds. " Para selecciones dinámicas
************************************************************************
* Definición de constantes
************************************************************************
  CONSTANTS: c_logo_screen(100) VALUE 'ZLOGO_COMPAÑIA'.

* Para creación dinámica de selecciones
  CONSTANTS: c_selscn_prog_dinam LIKE sy-repid VALUE 'SAPLSSEL',
             c_selscn_dynn_dinam LIKE sy-dynnr VALUE '2001'.
************************************************************************
* Definición de variables
************************************************************************
  DATA:
      i_slscn_list TYPE vrm_values,
                          " Tabla de valores para cargar una bandeja
      gd_slscn_valor LIKE LINE OF i_slscn_list,
      gd_selection_id TYPE rsdynsel-selid. " ID. para selección dinámica


  DATA l_selscnid(1000).


************************************************************************
* Definición de estructuras
************************************************************************

************************************************************************
* Definición de tablas internas
************************************************************************
  DATA i_campos_selscn    LIKE TABLE OF screen-name.
  DATA i_campos_selscn_wa LIKE LINE OF i_campos_selscn.


  DATA gd_selscn_fields     TYPE rsdsfields OCCURS 0 WITH HEADER LINE.
  DATA gd_selscn_fields_exc TYPE rsdsfields OCCURS 0 WITH HEADER LINE.

************************************************************************
* 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
************************************************************************
  FIELD-SYMBOLS <fs_selscn_campo> TYPE ANY.
************************************************************************
* Definición de MACROS
************************************************************************
*-- Macro para poner un checkbox en un selection screen
*-- &1 - Nombre del checkbox
*-- &2 - Elemento de texto para el checkbox
*-- &3 - Valor por defecto para el checkbox
  DEFINE definir_checkbox.
    selection-screen begin of line.
    parameters: &1 as checkbox default &3.
    selection-screen comment 3(60) &2.
    selection-screen end of line.
  END-OF-DEFINITION.
*-- Macro para poner un radiobutton en un selection screen
*-- &1 - Nombre del radiobutton
*-- &2 - Elemento de texto para el radiobutton
*-- &3 - Grupo al que pertenece el radiobutton
  DEFINE definir_radiobutton.
    selection-screen begin of line.
    parameters: &1 radiobutton group &3.
    selection-screen comment 3(60) &2.
    selection-screen end of line.
  END-OF-DEFINITION.
*-- Macro para poner un radiobutton en un selection screen con commando
*-- &1 - Nombre del radiobutton
*-- &2 - Elemento de texto para el radiobutton
*-- &3 - Grupo al que pertenece el radiobutton
*-- &4 - Grupo al que pertenece el radiobutton
  DEFINE definir_radiobutton_commando.
    selection-screen begin of line.
    parameters: &1 radiobutton group &3 user-command &4.
    selection-screen comment 3(60) &2.
    selection-screen end of line.
  END-OF-DEFINITION.
*-- Macro para poner un parametro en un selection screen
*-- &1 - Nombre del parametro
*-- &2 - Elemento de texto para el parametro
*-- &3 - Elemento de datos al que se parece
*-- &4 - Valor por defecto
  DEFINE definir_parametro.
    selection-screen begin of line.
    selection-screen comment 1(30) &2.
    selection-screen position pos_low.
    parameters: &1 like &3 default &4.
    selection-screen end of line.
  END-OF-DEFINITION.
*-- Macro para poner una bandeja en un selection screen
*-- &1 - Nombre de la bandeja
*-- &2 - Longitud de la bandeja
*-- &3 - Valor por defecto
*-- &4 - Descripción de la bandeja
  DEFINE definir_bandeja.
    selection-screen begin of line.
    selection-screen comment 1(30) &4.
    selection-screen position pos_low.
    parameters: &1 as listbox visible length &2 default &3.
    selection-screen end of line.
  END-OF-DEFINITION.
*-- Macro para poner una bandeja en un selection screen
*-- &1 - Nombre de la bandeja
*-- &2 - Longitud de la bandeja
*-- &3 - Valor por defecto
*-- &4 - Descripción de la bandeja
  DEFINE definir_bandeja_obligatoria.
    selection-screen begin of line.
    selection-screen comment 1(30) &4.
    selection-screen position pos_low.
    parameters: &1 as listbox visible length &2 default &3 obligatory.
    selection-screen end of line.
  END-OF-DEFINITION.
*-- Macro para poner una ventana en la que dibujar el logo
*-- &1 - Nombre de la ventana
*-- &2 - Lineas de la ventana
  DEFINE definir_pantalla_logo.
    selection-screen begin of tabbed block &1 for &2 lines.
    selection-screen end of block &1.
  END-OF-DEFINITION.


*-- Macro para rellenar la tabla con los campos del select dinámico
*-- &1 - Nombre de la tabla
*-- &2 - Lineas del campo
  DEFINE selscn_add_dinamic_fields.
* No puede almacenar más de 70
    describe table gd_selscn_fields lines sy-tabix.
    if sy-tabix < 70.
      gd_selscn_fields-tablename = &1.
      gd_selscn_fields-fieldname = &2.
      append gd_selscn_fields.
    endif.
  END-OF-DEFINITION.

*-- Macro para rellenar select-options o rangos
*-- &1 - Nombre del select-option o el rango
*-- &2 - Valor option
*-- &3 - Valor sign
*-- &4 - Valor low
*-- &5 - Valor high
  DEFINE selscn_add_ranges.
    &1-option = &2.
    &1-sign   = &3.
    &1-low    = &4.
    &1-high   = &5.
    append &1.
  END-OF-DEFINITION.
************************************************************************
*
*                  FORMS ADICIONALES
*
************************************************************************
*---------------------------------------------------------------------*
*       FORM SELSCN_aniadir_linea_bandeja                             *
*---------------------------------------------------------------------*
*       Prepara una linea de una bandeja para despues, una vez rellena*
*       la tabla llamar al form rellenar_tabla_bandeja                *
*---------------------------------------------------------------------*
*  -->  P_KEY:  Valor de la linea                                     *
*  -->  P_TEXT: Texto a mostrar en la linea                           *
*---------------------------------------------------------------------*
  FORM selscn_aniadir_linea_bandeja                         "#EC CALLED
                                    USING p_key             "#EC *
                                          p_text.           "#EC *

    gd_slscn_valor-key = p_key.
    gd_slscn_valor-text = p_text.
    APPEND gd_slscn_valor TO i_slscn_list.


  ENDFORM.                    "SELSCN_aniadir_linea_bandeja

*---------------------------------------------------------------------*
*       FORM SELSCN_rellenar_tabla_bandeja                            *
*---------------------------------------------------------------------*
*       Asigna una serie de valores que previamente se han cargado    *
*       mediante el form añadir_linea_bandeja
*---------------------------------------------------------------------*
*  -->  VALUE(P_PARAMETER): Texto con el nombre del parametro al que  *
*       asignarle la tabla.                                           *
*---------------------------------------------------------------------*
  FORM selscn_rellenar_tabla_bandeja                        "#EC CALLED
                                     USING value(p_parameter)."#EC *

    DATA name TYPE vrm_id.

    name = p_parameter.

    CALL FUNCTION 'VRM_SET_VALUES'
      EXPORTING
        id     = name
        values = i_slscn_list.

    REFRESH i_slscn_list.
    CLEAR i_slscn_list.

  ENDFORM.                    "SELSCN_rellenar_tabla_bandeja


*---------------------------------------------------------------------*
*       FORM SELSCN_leer_valor_de_pantalla                            *
*---------------------------------------------------------------------*
*       Recupera de la pantalla de selección un valor antes de que se *
*       actualice.                                                    *
*---------------------------------------------------------------------*
*  -->  F_REPID -> Nombre del programa, normalmente SY-REPID          *
*  -->  F_DYNNR -> Número de dynpro, normalmente SY-DYNNR             *
*  -->  F_FIELDNAME_IN -> Nombre del campo que pretendemos recuperar  *
*  -->  F_FIELDVALUE -> Valor recuperado                              *
*---------------------------------------------------------------------*
  FORM selscn_leer_valor_de_pantalla                        "#EC CALLED
                              USING f_repid                 "#EC *
                                    f_dynnr                 "#EC *
                              value(f_fieldname_in)         "#EC *
                           CHANGING f_fieldvalue.           "#EC *

    DATA: ltab_fields TYPE TABLE OF dynpread.
    DATA: ltab_fields_wa LIKE LINE OF ltab_fields.
    DATA: lc_dyname LIKE sy-repid.
    DATA: lc_dynumb LIKE sy-dynnr.

    ltab_fields_wa-fieldname = f_fieldname_in.
    APPEND ltab_fields_wa TO ltab_fields.

    lc_dyname = f_repid.

    lc_dynumb = f_dynnr.

    CALL FUNCTION 'DYNP_VALUES_READ'
      EXPORTING
        dyname     = lc_dyname
        dynumb     = lc_dynumb
      TABLES
        dynpfields = ltab_fields
      EXCEPTIONS
        OTHERS     = 01.

    IF sy-subrc IS INITIAL.
      READ TABLE ltab_fields INDEX 1 INTO ltab_fields_wa.
*-- Return the value from the screen
      IF sy-subrc EQ 0.
        f_fieldvalue = ltab_fields_wa-fieldvalue.
      ENDIF.
    ENDIF.
  ENDFORM.                    "SELSCN_leer_valor_de_pantalla

*---------------------------------------------------------------------*
*       FORM selscn_escribir_valor_pantalla                            *
*---------------------------------------------------------------------*
*       Actualiza en la pantalla de selección un valor antes de que se*
*       actualice la pantalla.                                        *
*---------------------------------------------------------------------*
*  -->  F_REPID -> Nombre del programa, normalmente SY-REPID          *
*  -->  F_DYNNR -> Número de dynpro, normalmente SY-DYNNR             *
*  -->  F_FIELDNAME_IN -> Nombre del campo que pretendemos modificar  *
*  -->  F_FIELDVALUE -> Valor a pasar                                 *
*---------------------------------------------------------------------*
  FORM selscn_escribir_valor_pantalla                       "#EC CALLED
                              USING f_repid                 "#EC *
                                    f_dynnr                 "#EC *
                              value(f_fieldname_in)         "#EC *
                           CHANGING f_fieldvalue.           "#EC *

    DATA: ltab_fields TYPE TABLE OF dynpread.
    DATA: ltab_fields_wa LIKE LINE OF ltab_fields.
    DATA: lc_dyname LIKE sy-repid.
    DATA: lc_dynumb LIKE sy-dynnr.

    ltab_fields_wa-fieldname  = f_fieldname_in.
    ltab_fields_wa-fieldvalue = f_fieldvalue.

    APPEND ltab_fields_wa TO ltab_fields.

    lc_dyname = f_repid.

    lc_dynumb = f_dynnr.


    CALL FUNCTION 'DYNP_UPDATE_FIELDS'
      EXPORTING
        dyname               = lc_dyname
        dynumb               = lc_dynumb
        request              = 'A'
      TABLES
        dynpfields           = ltab_fields
      EXCEPTIONS
        invalid_abapworkarea = 1
        invalid_dynprofield  = 2
        invalid_dynproname   = 3
        invalid_dynpronummer = 4
        invalid_request      = 5
        no_fielddescription  = 6
        undefind_error       = 7
        OTHERS               = 8.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDFORM.                    "SELSCN_escribir_valor_pantalla

*---------------------------------------------------------------------*
*       FORM SELSCN_cargar_logo_en_screen                             *
*---------------------------------------------------------------------*
*       Asigna un logo al la pantalla de selección, para ello es      *
*       es necesario primero subir dicho logo a SAP por medio del     *
*       programa SAPMWWW0 (Transacción SMW0).                         *
*---------------------------------------------------------------------*
*  -->  P_CONTAINER Contenedor que se crea en la pantalla             *
*  -->  P_LOGO      Nombre del logo que hay que colocar               *
*---------------------------------------------------------------------*
  FORM selscn_cargar_logo_en_screen                         "#EC CALLED
                                    USING p_container       "#EC *
                                          p_logo.           "#EC *

* URL requerida para dibujar el logo en pantalla
    DATA url(255).
* Objeto contenedor
    DATA logo_container TYPE REF TO cl_gui_custom_container.
* Objeto imagen
    DATA logo_picture TYPE REF TO cl_gui_picture.

* Creamos el contenedor
    CREATE OBJECT logo_container
       EXPORTING container_name = p_container.

* Creamos el objeto imagen asignando el contenedor
    CREATE OBJECT logo_picture
       EXPORTING  parent = logo_container
       EXCEPTIONS error = 1.

* Request an URL from the data provider by exporting the pic_data.
    PERFORM selscn_load_pic_from_db USING p_logo
                             CHANGING url.

* Cargamos el logo
    CALL METHOD logo_picture->load_picture_from_url
      EXPORTING
        url = url.
    IF sy-subrc NE 0.
    ENDIF.

* Hacemos que estire la imagen para colocarlo en todo el contenedor
    CALL METHOD logo_picture->set_display_mode
      EXPORTING
        display_mode = logo_picture->display_mode_fit_center
      EXCEPTIONS
        error        = 1.

  ENDFORM.                    " SELSCN_cargar_logo_en_screen

*&---------------------------------------------------------------------*
*&      Form  SELSCN_LOAD_PIC_FROM_DB
*&---------------------------------------------------------------------*
*       RECUPERA UNA IMAGEN DE SAP Y LA CONVIERTE PARA PODER UTILIZARLA
*       (recogida del programa RSDEMO_PICTURE_CONTROL)
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
  FORM selscn_load_pic_from_db                              "#EC CALLED
                           USING p_image                    "#EC *
                        CHANGING url.                       "#EC *
    DATA query_table TYPE TABLE OF w3query.
    DATA query_table_wa LIKE LINE OF query_table.
    DATA html_table TYPE TABLE OF w3html.
    DATA return_code TYPE  w3param-ret_code.
    DATA content_type TYPE  w3param-cont_type.
    DATA content_length TYPE  w3param-cont_len.
    DATA pic_data TYPE TABLE OF w3mime.
    DATA pic_size TYPE i.

    REFRESH query_table.
    query_table_wa-name = '_OBJECT_ID'.
    query_table_wa-value = p_image.
    APPEND query_table_wa TO query_table.

    CALL FUNCTION 'WWW_GET_MIME_OBJECT'
      TABLES
        query_string        = query_table
        html                = html_table
        mime                = pic_data
      CHANGING
        return_code         = return_code
        content_type        = content_type
        content_length      = content_length
      EXCEPTIONS
        object_not_found    = 1
        parameter_not_found = 2
        OTHERS              = 3.
    IF sy-subrc = 0.
      pic_size = content_length.
    ENDIF.

    CALL FUNCTION 'DP_CREATE_URL'
      EXPORTING
        type     = 'image'
        subtype  = cndp_sap_tab_unknown
        size     = pic_size
        lifetime = cndp_lifetime_transaction
      TABLES
        data     = pic_data
      CHANGING
        url      = url
      EXCEPTIONS
        OTHERS   = 1.                                       "#EC *


  ENDFORM.                               " SELSCN_LOAD_PIC_FROM_DB

*&---------------------------------------------------------------------*
*&      Form  selscn_definir_pantalla_logo
*&---------------------------------------------------------------------*
*       Este from deberá utilizarse siempre en el evento INITIALIZATION
*       pasandole
*----------------------------------------------------------------------*
*      -->P_BLOQUE   Nombre del bloque del selection screen donde este
*                    definido el logo.
*      -->P_DYNNR    Nº de dynpro donde este definido el logo.
*      -->P_CONTROL  Control del dynpro en el que se integrará el logo
*----------------------------------------------------------------------*
  FORM selscn_definir_pantalla_logo                         "#EC CALLED
                             USING    p_bloque              "#EC *
                                      p_dynnr               "#EC *
                                      p_control.            "#EC *

    DATA l_aux(50).

    FIELD-SYMBOLS <bloque> TYPE ANY.

    CONCATENATE p_bloque '-prog' INTO l_aux.
    ASSIGN (l_aux) TO <bloque>.
    <bloque> = sy-repid.

    CONCATENATE p_bloque '-dynnr' INTO l_aux.
    ASSIGN (l_aux) TO <bloque>.
    <bloque> = p_dynnr.

    IF sy-batch IS INITIAL.
      PERFORM selscn_cargar_logo_en_screen
                  USING
                     p_control
                     c_logo_screen.
    ENDIF.

  ENDFORM.                    " selscn_definir_pantalla_logo

*&---------------------------------------------------------------------*
*&      Form  selscn_importar_campos_screen
*&---------------------------------------------------------------------*
*       Lanzandolo al comienzo del programa recogera todos los
*       parametros almacenados con el perform
*       selscn_exportar_campos_screen
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
  FORM selscn_importar_campos_screen.                       "#EC CALLED


    LOOP AT SCREEN.
      IF  NOT screen-name(1) = '%'
      AND NOT screen-name = 'SSCRFIELDS'.
        i_campos_selscn_wa = screen-name.
        APPEND i_campos_selscn_wa TO i_campos_selscn.
        SPLIT screen-name AT '-' INTO i_campos_selscn_wa screen-name.
        IF sy-subrc IS INITIAL.
          CONCATENATE i_campos_selscn_wa '[]' INTO i_campos_selscn_wa.
          APPEND i_campos_selscn_wa TO i_campos_selscn.
        ENDIF.
      ENDIF.
    ENDLOOP.

    DELETE ADJACENT DUPLICATES FROM i_campos_selscn.

    SORT i_campos_selscn.

    LOOP AT i_campos_selscn INTO i_campos_selscn_wa.
      ASSIGN (i_campos_selscn_wa) TO <fs_selscn_campo>.
      IF sy-subrc IS INITIAL.
        CONCATENATE '&' sy-repid '-' i_campos_selscn_wa '&'
               INTO l_selscnid.
        IMPORT campo TO <fs_selscn_campo> FROM MEMORY ID l_selscnid.
      ENDIF.
    ENDLOOP.

  ENDFORM.                    " selscn_importar_campos_screen

*&---------------------------------------------------------------------*
*&      Form  selscn_exportar_campos_screen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
  FORM selscn_exportar_campos_screen.                       "#EC CALLED

    LOOP AT i_campos_selscn INTO i_campos_selscn_wa.
      ASSIGN (i_campos_selscn_wa) TO <fs_selscn_campo>.
      IF sy-subrc IS INITIAL.
        CONCATENATE '&' sy-repid '-' i_campos_selscn_wa '&'
               INTO l_selscnid.
        EXPORT campo FROM <fs_selscn_campo> TO MEMORY ID l_selscnid.
      ENDIF.
    ENDLOOP.

  ENDFORM.                    " selscn_exportar_campos_screen


*&---------------------------------------------------------------------*
*&      Form  SELSCN_ACTUALIZAR_PANTALLA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
  FORM selscn_actualizar_pantalla.                          "#EC CALLED

    DATA lt_dynpread TYPE TABLE OF dynpread.
    DATA lt_dynpread_wa LIKE LINE OF lt_dynpread.
    FIELD-SYMBOLS <fs_campo> TYPE ANY.

    DATA l_repid LIKE sy-repid.
    DATA l_dynnr LIKE sy-dynnr.

    LOOP AT SCREEN.
      IF  NOT screen-name(1) = '%'
      AND NOT screen-name = 'SSCRFIELDS'.
        lt_dynpread_wa-fieldname = screen-name.
        ASSIGN (screen-name) TO <fs_campo>.
        IF sy-subrc IS INITIAL.
          IF NOT <fs_campo> IS INITIAL.
           WRITE <fs_campo> TO lt_dynpread_wa-fieldvalue LEFT-JUSTIFIED.
          ENDIF.
          APPEND lt_dynpread_wa TO lt_dynpread.
        ENDIF.
      ENDIF.
      CLEAR lt_dynpread_wa.
    ENDLOOP.

    l_repid = sy-repid.
    l_dynnr = sy-dynnr.

    CALL FUNCTION 'DYNP_UPDATE_FIELDS'
      EXPORTING
        dyname               = l_repid
        dynumb               = l_dynnr
        request              = 'A'
      TABLES
        dynpfields           = lt_dynpread
      EXCEPTIONS
        invalid_abapworkarea = 1
        invalid_dynprofield  = 2
        invalid_dynproname   = 3
        invalid_dynpronummer = 4
        invalid_request      = 5
        no_fielddescription  = 6
        undefind_error       = 7
        OTHERS               = 8.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDFORM.                    " SELSCN_ACTUALIZAR_PANTALLA


*&---------------------------------------------------------------------*
*&      Form  selscn_rango_dinamico
*&---------------------------------------------------------------------*
*       Programa donde aprender más: BUQAUSWERT_GEN
*       Este form genera una pantalla de selección de forma dinámica
*       a partir de los campos que se le indica en la tabla
*       p_lt_fields_tab rellenando posteriormente la tabla P_LT_WHERE
*       de modo que se puede llegar a construir a partir de ella un
*       select de manera dinámica.
*----------------------------------------------------------------------*
*      -->P_LT_WHERE               Tabla salida para select
*      -->P_LT_FIELDS_TAB          Campos con los que se puede construir
*      -->P_LT_FIELDS_TAB_EXCLUDE  Campos inicialmente desactivados
*      -->P_SELECTION_ID           ID de la selección
*      -->P_TIPO               P=Popup, C=Pantalla Completa, S=Subscreen
*----------------------------------------------------------------------*
  FORM selscn_rango_dinamico
                  TABLES p_lt_where                   TYPE rsds_twhere
                         p_lt_fields_tab    STRUCTURE gd_selscn_fields
                         p_lt_fields_exc    STRUCTURE gd_selscn_fields
                   USING p_selection_id          LIKE gd_selection_id
                         p_tipo.

    DATA lt_fields_tab LIKE p_lt_fields_tab OCCURS 0 WITH HEADER LINE.
    DATA  lt_fields_exc LIKE p_lt_fields_exc OCCURS 0 WITH HEADER LINE.
    DATA lt_tables_tab LIKE rsdstabs OCCURS 0 WITH HEADER LINE.
    DATA lt_expressions TYPE rsds_texpr.
*    DATA lw_expressions LIKE LINE OF lt_expressions.
    DATA lt_where_clauses TYPE rsds_twhere.
    DATA lw_where_clauses  LIKE LINE OF lt_where_clauses .
    DATA lt_field_ranges TYPE rsds_trange.
    DATA l_number_of_active_fields TYPE i.
    DATA lv_error(30)   TYPE c.
    DATA l_pfkey LIKE  rsdspfkey.
    DATA l_popup.
    DATA l_subscreen.

    CASE p_tipo.
      WHEN 'P'.
        l_popup = 'X'.
      WHEN 'S'.
        l_subscreen = 'X'.
      WHEN 'C'.

      WHEN OTHERS.

        MESSAGE e666(01) WITH 'Debe indicar un valor a p_tipo:'
                              'P=Popup,'
                              'C=Pantalla completa'
                              'o S=Subscreen.'.
    ENDCASE.

* Se elige un status sencillo
    l_pfkey-pfkey = '%_FS_P_O'.
    l_pfkey-program = 'RSSYSTDB'.

* Se rellenan las tablas
    LOOP AT p_lt_fields_tab.
      lt_tables_tab-prim_tab = p_lt_fields_tab-tablename.
      COLLECT lt_tables_tab.
    ENDLOOP.


    IF p_selection_id IS INITIAL.
      CALL FUNCTION 'FREE_SELECTIONS_INIT'
       EXPORTING
         kind                           = 'F'
         expressions                    = lt_expressions
*        FIELD_GROUPS_KEY               =
*        RESTRICTION                    =
*        ALV                            =
*        CURR_QUAN_PROG                 = SY-CPROG
*        CURR_QUAN_RELATION             =
       IMPORTING
         selection_id                   = p_selection_id
*        WHERE_CLAUSES                  =
         expressions                    = lt_expressions
*        field_ranges                   =
*        NUMBER_OF_ACTIVE_FIELDS        =
       TABLES
         tables_tab                     = lt_tables_tab
         fields_tab                     = p_lt_fields_tab
*        FIELD_DESC                     =
*        FIELD_TEXTS                    =
*        EVENTS                         =
*        EVENT_FIELDS                   =
         fields_not_selected            = p_lt_fields_exc
*        ALV_QINFO                      =
       EXCEPTIONS
         fields_incomplete              = 1
         fields_no_join                 = 2
         field_not_found                = 3
         no_tables                      = 4
         table_not_found                = 5
         expression_not_supported       = 6
         incorrect_expression           = 7
         illegal_kind                   = 8
         area_not_found                 = 9
         inconsistent_area              = 10
         kind_f_no_fields_left          = 11
         kind_f_no_fields               = 12
         too_many_fields                = 13
         dup_field                      = 14
         field_no_type                  = 15
         field_ill_type                 = 16
         dup_event_field                = 17
         node_not_in_ldb                = 18
         area_no_field                  = 19
         OTHERS                         = 20
                .
      CASE sy-subrc.
        WHEN 1.
          lv_error = 'FIELDS_INCOMPLETE'.
        WHEN 2.
          lv_error = 'FIELDS_NO_JOIN'.
        WHEN 3.
          lv_error = 'FIELD_NOT_FOUND'.
        WHEN 4.
          lv_error = 'NO_TABLES'.
        WHEN 5.
          lv_error = 'TABLE_NOT_FOUND'.
        WHEN 6.
          lv_error = 'EXPRESSION_NOT_SUPPORTED'.
        WHEN 7.
          lv_error = 'INCORRECT_EXPRESSION'.
        WHEN 8.
          lv_error = 'ILLEGAL_KIND'.
        WHEN 9.
          lv_error = 'AREA_NOT_FOUND'.
        WHEN 10.
          lv_error = 'INCONSISTENT_AREA'.
        WHEN 11.
          lv_error = 'KIND_F_NO_FIELDS_LEFT'.
        WHEN 12.
          lv_error = 'KIND_F_NO_FIELDS'.
        WHEN 13.
          lv_error = 'TOO_MANY_FIELDS'.
        WHEN 14.
          lv_error = 'DUP_FIELD'.
        WHEN 15.
          lv_error = 'FIELD_NO_TYPE'.
        WHEN 16.
          lv_error = 'FIELD_ILL_TYPE'.
        WHEN 17.
          lv_error = 'DUP_EVENT_FIELD'.
        WHEN 18.
          lv_error = 'NODE_NOT_IN_LDB'.
        WHEN 19.
          lv_error = 'AREA_NO_FIELD'.
        WHEN 20.
          lv_error = 'OTHERS'.
      ENDCASE.
      IF NOT sy-subrc IS INITIAL.
        MESSAGE e437(r1) WITH 'FREE_SELECTIONS_INIT' lv_error.
      ENDIF.

    ENDIF.

    lt_fields_tab[] = p_lt_fields_tab[].
    lt_fields_exc[] = p_lt_fields_exc[].

    IF NOT p_selection_id IS INITIAL.
      CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
        EXPORTING
          selection_id                  = p_selection_id
          title                         = sy-title
*         FRAME_TEXT                    = ' '
*         status                        = 1
          as_window                     = l_popup
*         START_ROW                     = 2
*         START_COL                     = 2
*         NO_INTERVALS                  = ' '
*         JUST_DISPLAY                  = ' '
          pfkey                         = l_pfkey
*         alv                           = ' '
*         tree_visible                  = 'X'
*         DIAG_TEXT_1                   =
*         DIAG_TEXT_2                   =
*         WARNING_TITLE                 =
          as_subscreen                  = l_subscreen
*         NO_FRAME                      =
        IMPORTING
          where_clauses                 = lt_where_clauses
          expressions                   = lt_expressions
          field_ranges                  = lt_field_ranges
          number_of_active_fields       = l_number_of_active_fields
        TABLES
          fields_tab                    = p_lt_fields_tab
*         FCODE_TAB                     =
          fields_not_selected           = p_lt_fields_exc
        EXCEPTIONS
          internal_error                = 1
          no_action                     = 2
          selid_not_found               = 3
          illegal_status                = 4
          OTHERS                        = 5
                .


      CASE sy-subrc.
        WHEN 1.
          lv_error = 'INTERNAL_ERROR'.
        WHEN 2.
          lv_error = 'NO_ACTION'.
          sy-subrc = 1.
          EXIT.
        WHEN 3.
          lv_error = 'SELID_NOT_FOUND'.
        WHEN 4.
          lv_error = 'ILLEGAL_STATUS'.
      ENDCASE.
      IF NOT sy-subrc IS INITIAL.
        MESSAGE e437(r1) WITH 'FREE_SELECTIONS_DIALOG' lv_error.
      ENDIF.

    ENDIF.

    REFRESH p_lt_fields_exc.

    LOOP AT lt_fields_tab INTO p_lt_fields_exc.
      READ TABLE p_lt_fields_tab
             WITH KEY tablename = p_lt_fields_exc-tablename
                      fieldname = p_lt_fields_exc-fieldname.
      IF NOT sy-subrc IS INITIAL.
        APPEND p_lt_fields_exc.
      ENDIF.
    ENDLOOP.

    p_lt_fields_tab[] = lt_fields_tab[].

    p_lt_where[] = lt_where_clauses[].

  ENDFORM.                    " selscn_rango_dinamico


*&---------------------------------------------------------------------*
*&      Form  selscn_rango_dinamico_tabla
*&---------------------------------------------------------------------*
*       Programa donde aprender más: BUQAUSWERT_GEN
*       Este form genera una pantalla de selección de forma dinámica
*       a partir de los campos que se le indica en la tabla
*       p_lt_fields_tab rellenando posteriormente la tabla P_LT_WHERE
*       de modo que se puede llegar a construir a partir de ella un
*       select de manera dinámica.
*----------------------------------------------------------------------*
*      -->P_LT_WHERE               Tabla salida para select
*      -->P_LT_FIELDS_TAB          Campos con los que se puede construir
*      -->P_LT_FIELDS_TAB_EXCLUDE  Campos inicialmente desactivados
*      -->P_SELECTION_ID           ID de la selección
*      -->P_TIPO               P=Popup, C=Pantalla Completa, S=Subscreen
*----------------------------------------------------------------------*
  FORM selscn_rango_dinamico_tabla
                  TABLES p_lt_where                   TYPE rsds_twhere
                         p_lt_fields_tab    STRUCTURE gd_selscn_fields
                         p_lt_fields_exc    STRUCTURE gd_selscn_fields
                   USING p_selection_id          LIKE gd_selection_id
                         p_tipo.

    DATA lt_tables_tab LIKE rsdstabs OCCURS 0 WITH HEADER LINE.
    DATA lt_expressions TYPE rsds_texpr.
*    DATA lw_expressions LIKE LINE OF lt_expressions.
    DATA lt_where_clauses TYPE rsds_twhere.
    DATA lw_where_clauses  LIKE LINE OF lt_where_clauses .
    DATA lt_field_ranges TYPE rsds_trange.
    DATA l_number_of_active_fields TYPE i.
    DATA lv_error(30)   TYPE c.
    DATA l_pfkey LIKE  rsdspfkey.
    DATA l_popup.
    DATA l_subscreen.

    CASE p_tipo.
      WHEN 'P'.
        l_popup = 'X'.
      WHEN 'S'.
        l_subscreen = 'X'.
      WHEN 'C'.

      WHEN OTHERS.

        MESSAGE e666(01) WITH 'Debe indicar un valor a p_tipo:'
                              'P=Popup,'
                              'C=Pantalla completa'
                              'o S=Subscreen.'.
    ENDCASE.

* Se elige un status sencillo
    l_pfkey-pfkey = '%_FS_P_O'.
    l_pfkey-program = 'RSSYSTDB'.

* Se rellenan las tablas
    LOOP AT p_lt_fields_tab.
      lt_tables_tab-prim_tab = p_lt_fields_tab-tablename.
      COLLECT lt_tables_tab.
    ENDLOOP.


    IF p_selection_id IS INITIAL.
      CALL FUNCTION 'FREE_SELECTIONS_INIT'
       EXPORTING
         kind                           = 'T'
         expressions                    = lt_expressions
*        FIELD_GROUPS_KEY               =
*        RESTRICTION                    =
*        ALV                            =
*        CURR_QUAN_PROG                 = SY-CPROG
*        CURR_QUAN_RELATION             =
       IMPORTING
         selection_id                   = p_selection_id
*        WHERE_CLAUSES                  =
         expressions                    = lt_expressions
*        field_ranges                   =
*        NUMBER_OF_ACTIVE_FIELDS        =
       TABLES
         tables_tab                     = lt_tables_tab
         fields_tab                     = p_lt_fields_tab
*        FIELD_DESC                     =
*        FIELD_TEXTS                    =
*        EVENTS                         =
*        EVENT_FIELDS                   =
         fields_not_selected            = p_lt_fields_exc
*        ALV_QINFO                      =
       EXCEPTIONS
         fields_incomplete              = 1
         fields_no_join                 = 2
         field_not_found                = 3
         no_tables                      = 4
         table_not_found                = 5
         expression_not_supported       = 6
         incorrect_expression           = 7
         illegal_kind                   = 8
         area_not_found                 = 9
         inconsistent_area              = 10
         kind_f_no_fields_left          = 11
         kind_f_no_fields               = 12
         too_many_fields                = 13
         dup_field                      = 14
         field_no_type                  = 15
         field_ill_type                 = 16
         dup_event_field                = 17
         node_not_in_ldb                = 18
         area_no_field                  = 19
         OTHERS                         = 20
                .
      CASE sy-subrc.
        WHEN 1.
          lv_error = 'FIELDS_INCOMPLETE'.
        WHEN 2.
          lv_error = 'FIELDS_NO_JOIN'.
        WHEN 3.
          lv_error = 'FIELD_NOT_FOUND'.
        WHEN 4.
          lv_error = 'NO_TABLES'.
        WHEN 5.
          lv_error = 'TABLE_NOT_FOUND'.
        WHEN 6.
          lv_error = 'EXPRESSION_NOT_SUPPORTED'.
        WHEN 7.
          lv_error = 'INCORRECT_EXPRESSION'.
        WHEN 8.
          lv_error = 'ILLEGAL_KIND'.
        WHEN 9.
          lv_error = 'AREA_NOT_FOUND'.
        WHEN 10.
          lv_error = 'INCONSISTENT_AREA'.
        WHEN 11.
          lv_error = 'KIND_F_NO_FIELDS_LEFT'.
        WHEN 12.
          lv_error = 'KIND_F_NO_FIELDS'.
        WHEN 13.
          lv_error = 'TOO_MANY_FIELDS'.
        WHEN 14.
          lv_error = 'DUP_FIELD'.
        WHEN 15.
          lv_error = 'FIELD_NO_TYPE'.
        WHEN 16.
          lv_error = 'FIELD_ILL_TYPE'.
        WHEN 17.
          lv_error = 'DUP_EVENT_FIELD'.
        WHEN 18.
          lv_error = 'NODE_NOT_IN_LDB'.
        WHEN 19.
          lv_error = 'AREA_NO_FIELD'.
        WHEN 20.
          lv_error = 'OTHERS'.
      ENDCASE.
      IF NOT sy-subrc IS INITIAL.
        MESSAGE e437(r1) WITH 'FREE_SELECTIONS_INIT' lv_error.
      ENDIF.

    ENDIF.

    IF NOT p_selection_id IS INITIAL.
      CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
        EXPORTING
          selection_id                  = p_selection_id
          title                         = sy-title
*         FRAME_TEXT                    = ' '
*         status                        = 1
          as_window                     = l_popup
*         START_ROW                     = 2
*         START_COL                     = 2
*         NO_INTERVALS                  = ' '
*         JUST_DISPLAY                  = ' '
          pfkey                         = l_pfkey
*         alv                           = ' '
*         tree_visible                  = 'X'
*         DIAG_TEXT_1                   =
*         DIAG_TEXT_2                   =
*         WARNING_TITLE                 =
          as_subscreen                  = l_subscreen
*         NO_FRAME                      =
        IMPORTING
          where_clauses                 = lt_where_clauses
          expressions                   = lt_expressions
          field_ranges                  = lt_field_ranges
          number_of_active_fields       = l_number_of_active_fields
        TABLES
          fields_tab                    = p_lt_fields_tab
*         FCODE_TAB                     =
          fields_not_selected           = p_lt_fields_exc
        EXCEPTIONS
          internal_error                = 1
          no_action                     = 2
          selid_not_found               = 3
          illegal_status                = 4
          OTHERS                        = 5
                .

      CASE sy-subrc.
        WHEN 1.
          lv_error = 'INTERNAL_ERROR'.
        WHEN 2.
          lv_error = 'NO_ACTION'.
          sy-subrc = 1.
          EXIT.
        WHEN 3.
          lv_error = 'SELID_NOT_FOUND'.
        WHEN 4.
          lv_error = 'ILLEGAL_STATUS'.
      ENDCASE.
      IF NOT sy-subrc IS INITIAL.
        MESSAGE e437(r1) WITH 'FREE_SELECTIONS_DIALOG' lv_error.
      ENDIF.

    ENDIF.

    p_lt_where[] = lt_where_clauses[].

  ENDFORM.                    " selscn_rango_dinamico_Tabla
Título: Re: Include para pantallas de selección
Publicado por: romyysebas en 10 de Junio de 2008, 06:44:18 pm
Muchas gracias
saludos