Hola quería mostraros este include que suelo utilizar para las pantallas de selección.
Fuente sacada del siguiente
http://enlaceMediante 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.
************************************************************************
*
* 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