Estoy ahora en el apartado “CASE” de un programa que tiene varias opciones.
El problema es que no sé cómo hacer para que el código de las opciones me aparezca en una segunda ventana, es decir, estoy viendo toda la presentación en la misma ventana y lo que quiero es que según la opción que se elija, muestre las opciones del elemento seleccionado.
No se si lo he explicado bien.
Os dejo el código a ver si me pódeis volver a echar una mano.
SELECTION-SCREEN BEGIN OF BLOCK binicio WITH FRAME TITLE text-001.
PARAMETERS: p_empl_a RADIOBUTTON GROUP empl.
SKIP.
PARAMETERS: p_empl_m RADIOBUTTON GROUP empl DEFAULT 'X'.
SKIP.
PARAMETERS: p_empl_b RADIOBUTTON GROUP empl.
SELECTION-SCREEN END OF BLOCK binicio.
INITIALIZATION.
START-OF-SELECTION.
*******************************AÑADIR EMPLEADOS A LA TABLA************************************
CASE 'X'.
WHEN p_empl_a.
DATA: "gs_empleados TYPE STANDARD TABLE OF zempleados_ap329,
wa_empleados TYPE zempleados_ap329,
lv_id TYPE zempleados_ap329-id.
FORMAT COLOR COL_HEADING.
SELECTION-SCREEN BEGIN OF BLOCK bempleado WITH FRAME TITLE text-002.
PARAMETERS: pa_id TYPE i LENGTH 4,
pa_nom TYPE znombre_ap00329,
pa_ape1 TYPE zapellido1_ap00329,
pa_ape2 TYPE zapellido2_ap00329,
pa_dni TYPE zdni_ap00329,
pa_tel TYPE asld2tel,
pa_dpto TYPE zdpto_ap00329.
SELECTION-SCREEN END OF BLOCK bempleado.
wa_empleados-id = pa_id.
wa_empleados-nombre = pa_nom.
wa_empleados-apellido1 = pa_ape1.
wa_empleados-apellido2 = pa_ape2.
wa_empleados-dni = pa_dni.
wa_empleados-telefono = pa_tel.
wa_empleados-departamento = pa_dpto.
**
SELECT SINGLE id
FROM zempleados_ap329
INTO lv_id
WHERE id EQ pa_id.
TRY.
*Primer subrc para comprobar la consulta.
IF sy-subrc EQ 0.
*El valor de sy-subrc si la consulta anterior se aplica, es 0, por tanto, el ID ya está registrado.
MESSAGE: 'El identificador de usuario ya ha sido utilizado.' TYPE 'E'.
ELSE.
*Si no se registra el identificador de usuario, no se van a registrar los datos.
sy-subrc = 0.
IF wa_empleados-id IS NOT INITIAL.
IF sy-subrc EQ 0.
INSERT zempleados_ap329 FROM wa_empleados.
IF sy-subrc EQ 0.
FORMAT COLOR COL_POSITIVE INVERSE ON.
WRITE: / 'Registro insertado correctamente.',
/ wa_empleados-id,
/ wa_empleados-nombre,
/ wa_empleados-apellido1,
/ wa_empleados-apellido2,
/ wa_empleados-dni,
/ wa_empleados-telefono.
ELSE.
FORMAT COLOR COL_NEGATIVE INVERSE ON.
WRITE: / 'Error al insertar registro'.
ENDIF.
ENDIF.
ELSE.
WRITE: / 'No se ha indicado el identificador de usuario.'.
ENDIF.
ENDIF.
CATCH cx_root.
ENDTRY.
*******************************MODIFICAR EMPLEADOS EN LA TABLA************************************
WHEN p_empl_m.
*******************************ELIMINAR EMPLEADOS DE LA TABLA************************************
WHEN p_empl_b.
WHEN OTHERS.
ENDCASE.
A ver, creo que lo que quieres es mostrar una pantalla de seleccion segun un criterio ??? si es asi, pues el criterio asumo que lo define el mismo usuario al elegir una opcion u otra !! entonces eso no lo haces en el star-of-seleccion.
Ahora, si quieres mostrar dynpro segun variables ya en ejecucion del programa puedes hacer varias dynpro y llamarlas o crear un modulepool
Eso es.
Lo que quiero es que según la opción que marque el usuario aparezca una ventana u otra, independientemente de la primera pantalla, donde el usuario elige la acción a realizar.
con este codigo (una pantalla con muchos campos, pero mejor, tienes varias opciones) puedes hacerlo, ya tu lo puedes adaptar a tu necesidad.
Esta es la parte del top
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-000.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(18) FOR FIELD p_pernr.
PARAMETERS: p_pernr TYPE p0000-pernr. "Nro personal
SELECTION-SCREEN POSITION 30.
PARAMETERS: p_name TYPE emnam MODIF ID p2. "Nombre nro personal
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(18) FOR FIELD p_schkz.
PARAMETERS: p_schkz TYPE schkn MODIF ID p2. "Horario de trabajo
SELECTION-SCREEN POSITION 30.
PARAMETERS: p_rtext TYPE retext MODIF ID p2. "Texto horario
SELECTION-SCREEN END OF LINE.
PARAMETERS: p_crear TYPE c RADIOBUTTON GROUP gr1 MODIF ID id1, "Crear
p_mod TYPE c RADIOBUTTON GROUP gr1 MODIF ID id1, "Modificar
p_supr TYPE c RADIOBUTTON GROUP gr1 MODIF ID id2 DEFAULT 'X'. "Eliminar
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) text-002 FOR FIELD p_begda.
SELECTION-SCREEN POSITION 11.
PARAMETERS:p_begda TYPE p0000-begda OBLIGATORY. "Fecha inicio
SELECTION-SCREEN COMMENT 27(10) text-003 FOR FIELD p_endda.
SELECTION-SCREEN POSITION 37.
PARAMETERS:p_endda TYPE p0000-endda OBLIGATORY. "Fecha fin
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-004.
PARAMETERS: p_in TYPE c AS CHECKBOX MODIF ID id5, "Entrada
p_out TYPE c AS CHECKBOX MODIF ID id5. "Salida
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-005.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(10) FOR FIELD p_hin MODIF ID id3.
PARAMETERS: p_hin TYPE anstd MODIF ID id3. "Horas de entrada
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(10) FOR FIELD p_min MODIF ID id3.
PARAMETERS: p_min TYPE anstd MODIF ID id3. "Minutos de entrada
SELECTION-SCREEN END OF LINE.
PARAMETERS: p_h_r_in TYPE c AS CHECKBOX MODIF ID id8. "Horario Rotativo
SELECT-OPTIONS: p_rin1 FOR syst-uzeit NO-EXTENSION MODIF ID id6, "Rango IN 1
p_rin2 FOR syst-uzeit NO-EXTENSION MODIF ID id6. "Rango IN 2
SELECTION-SCREEN END OF BLOCK b4.
SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-006.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(10) FOR FIELD p_hou MODIF ID id4.
PARAMETERS: p_hou TYPE anstd MODIF ID id4. "Horas de entrada
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 01(10) FOR FIELD p_mou MODIF ID id4.
PARAMETERS: p_mou TYPE anstd MODIF ID id4. "Minutos de entrada
SELECTION-SCREEN END OF LINE.
PARAMETERS: p_h_r_ou TYPE c AS CHECKBOX MODIF ID id9. "Horario Rotativo
SELECT-OPTIONS: p_rou1 FOR syst-uzeit NO-EXTENSION MODIF ID id7, "Rango OUT 1
p_rou2 FOR syst-uzeit NO-EXTENSION MODIF ID id7. "Rango OUT 2
SELECTION-SCREEN END OF BLOCK b5.
Luego en el metodo AT SELECTION-SCREEN OUTPUT agrego lo siguiente:
"Ocultar/mostrar campos segun funcionalidad
PERFORM fo_mostrar_ocultar_campos.
FORM fo_mostrar_ocultar_campos.
DATA: ti_0001 TYPE TABLE OF p0001.
FIELD-SYMBOLS: <lf_0001> TYPE p0001.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = p_pernr
infty = c_0001
begda = sy-datum
endda = sy-datum
TABLES
infty_tab = ti_0001.
SORT ti_0001 BY endda DESCENDING.
READ TABLE ti_0001 ASSIGNING <lf_0001> INDEX 1.
IF <lf_0001> IS ASSIGNED.
p_name = <lf_0001>-ename. "Nombre nro personal
"Info del horario de trabajo.
PERFORM fo_get_info_0007.
ELSE.
CLEAR: p_name, p_schkz,
p_rtext.
ENDIF.
LOOP AT SCREEN.
IF screen-group1 = c_p2. "Ocultar nombre nro personal e info del horario
screen-input = 0.
ENDIF.
*Ocultar todos los campos para la opcion de eliminar.
IF ( p_supr IS NOT INITIAL ) AND ( screen-group1 EQ c_id3 OR screen-group1 EQ c_id4 OR
screen-group1 EQ c_id5 OR screen-group1 EQ c_id6 OR
screen-group1 EQ c_id7 OR screen-group1 EQ c_id8 OR
screen-group1 EQ c_id9 ).
screen-active = 0.
ENDIF.
*Mostrar los campos segun las opciones de crear y modificar
*solo los campos necesarios.
IF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS INITIAL AND p_out IS INITIAL ) AND ( screen-group1 EQ c_id3 OR
screen-group1 EQ c_id4 OR screen-group1 EQ c_id6 OR screen-group1 EQ c_id7 OR screen-group1 EQ c_id8 OR screen-group1 EQ c_id9 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS NOT INITIAL AND p_out IS INITIAL ) AND ( p_h_r_in IS INITIAL )
AND ( screen-group1 EQ c_id4 OR screen-group1 EQ c_id6 OR screen-group1 EQ c_id7 OR screen-group1 EQ c_id9 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS NOT INITIAL AND p_out IS INITIAL ) AND
( p_h_r_in IS NOT INITIAL ) AND ( screen-group1 EQ c_id4 OR screen-group1 EQ c_id7 OR screen-group1 EQ c_id9 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS NOT INITIAL AND p_out IS NOT INITIAL ) AND
( p_h_r_in IS INITIAL AND p_h_r_ou IS NOT INITIAL ) AND ( screen-group1 EQ c_id6 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS NOT INITIAL AND p_out IS NOT INITIAL ) AND
( p_h_r_in IS NOT INITIAL AND p_h_r_ou IS INITIAL ) AND ( screen-group1 EQ c_id7 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS INITIAL AND p_out IS NOT INITIAL ) AND
( p_h_r_ou IS INITIAL ) AND ( screen-group1 EQ c_id7 OR screen-group1 EQ c_id3 OR screen-group1 EQ c_id6 OR
screen-group1 EQ c_id8 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS NOT INITIAL AND p_out IS NOT INITIAL ) AND
( p_h_r_ou IS NOT INITIAL AND p_h_r_in IS INITIAL ) AND ( screen-group1 EQ c_id6 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS INITIAL AND p_out IS NOT INITIAL ) AND
( p_h_r_ou IS NOT INITIAL AND p_h_r_in IS INITIAL ) AND ( screen-group1 EQ c_id6 OR screen-group1 EQ c_id3 OR
screen-group1 EQ c_id8 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS NOT INITIAL AND p_out IS NOT INITIAL ) AND
( p_h_r_ou IS INITIAL AND p_h_r_in IS INITIAL ) AND ( screen-group1 EQ c_id6 OR screen-group1 EQ c_id7 ).
screen-active = 0.
ELSEIF ( p_crear IS NOT INITIAL OR p_mod IS NOT INITIAL ) AND ( p_in IS INITIAL AND p_out IS NOT INITIAL ) AND
( screen-group1 EQ c_id6 OR screen-group1 EQ c_id3 OR screen-group1 EQ c_id8 ).
screen-active = 0.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDFORM. "FO_MOSTRAR_OCULTAR_CAMPOS
La subrutina PERFORM fo_get_info_0007, no es necesaria para ocultar los campos, esa parte la puedes quitar
En ABAP no “construyes” (por decirlo de alguna manera) diferentes pantallas de selección en función del parámetro que selecciones. Sino que “construyes” toda la pantalla de selección, con todos los parámetros, select-options, radiobuttons, etc. y vas ocultando/mostrando en función de la casuística que definas.
Voy a ver si logro entender el código y os cuento como ha ido.
Podría ir orientado a alguna casilla con “Matchcode” de ventanas, pero voy a ver si lo entiendo.
buenas, por lo que he visto en tu codigo lo que quieres hacer es controlar tres opciones, crear modificar o borrar datos de empleado de una tabla, datos que pones en la pantalla de selección… yo creo que no necesitas complicarte la vida ocultando campos, tienes los datos del empleado y segun la opcion (radio button haces un insert, modify o delete a la base de datos y ya está.
Para practicar como ocultar o mostrar campos en función de las opciones el codigo que te ha puesto @canuto te irá perfecto
hay que buscar la forma mas sencilla de hacer las cosas
Os pego el código por si a alguien le sirve. Aún falta por modificar, ya que parte del código lo he pegado del enlace del foro que hay más arriba.
SELECTION-SCREEN BEGIN OF BLOCK blg WITH FRAME TITLE text-000.
SELECTION-SCREEN BEGIN OF BLOCK binicio WITH FRAME TITLE text-001.
PARAMETERS: p_empl_a RADIOBUTTON GROUP empl USER-COMMAND cmd DEFAULT 'X'.
SKIP.
PARAMETERS: p_empl_m RADIOBUTTON GROUP empl.
SKIP.
PARAMETERS: p_empl_b RADIOBUTTON GROUP empl.
SELECTION-SCREEN BEGIN OF BLOCK bempleado WITH FRAME TITLE text-002.
PARAMETERS:
pa_id TYPE i LENGTH 4 MODIF ID b1,
pa_nom TYPE znombre_ap00329 MODIF ID b1,
pa_ape1 TYPE zapellido1_ap00329 MODIF ID b1,
pa_ape2 TYPE zapellido2_ap00329 MODIF ID b1,
pa_dni TYPE zdni_ap00329 MODIF ID b1,
pa_tel TYPE asld2tel MODIF ID b1,
pa_dpto TYPE zdpto_ap00329 MODIF ID b1.
*Introducir otro parametro con fecha de alta.
SELECTION-SCREEN END OF BLOCK bempleado.
SELECTION-SCREEN BEGIN OF BLOCK bl0c WITH FRAME TITLE text-003.
PARAMETERS:
ro1 RADIOBUTTON GROUP rad3 MODIF ID b2,
ro2 RADIOBUTTON GROUP rad3 MODIF ID b2.
SELECTION-SCREEN END OF BLOCK bl0c.
SELECTION-SCREEN END OF BLOCK binicio.
SELECTION-SCREEN BEGIN OF BLOCK bl2 WITH FRAME TITLE text-004.
PARAMETERS:
p_stras LIKE kna1-stras MODIF ID b3," OBLIGATORY, " CALLE1 / DIRECCIÓN
p_calle2(40) TYPE c MODIF ID b3, " CALLE2 / DIRECCIÓN
p_telf1 LIKE kna1-telf1 MODIF ID b3, " TELEFONO
p_telf2 LIKE kna1-telf1 MODIF ID b3, " FAX
p_correo(50) TYPE c MODIF ID b3. " CORREO
SELECTION-SCREEN END OF BLOCK bl2.
SELECTION-SCREEN END OF BLOCK blg.
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
PERFORM formulario.
START-OF-SELECTION.
DATA: "gs_empleados TYPE STANDARD TABLE OF zempleados_ap329,
wa_empleados TYPE zempleados_ap329,
lv_id TYPE zempleados_ap329-id.
wa_empleados-id = pa_id.
wa_empleados-nombre = pa_nom.
wa_empleados-apellido1 = pa_ape1.
wa_empleados-apellido2 = pa_ape2.
wa_empleados-dni = pa_dni.
wa_empleados-telefono = pa_tel.
wa_empleados-departamento = pa_dpto.
**
SELECT SINGLE id
FROM zempleados_ap329
INTO lv_id
WHERE id EQ pa_id.
TRY.
*Primer subrc para comprobar la consulta.
IF sy-subrc EQ 0.
*El valor de sy-subrc si la consulta anterior se aplica, es 0, por tanto, el ID ya está registrado.
MESSAGE: 'El identificador de usuario ya ha sido utilizado.' TYPE 'E'.
ELSE.
*Si no se registra el identificador de usuario, no se van a registrar los datos.
sy-subrc = 0.
IF wa_empleados-id IS NOT INITIAL.
IF sy-subrc EQ 0.
INSERT zempleados_ap329 FROM wa_empleados.
IF sy-subrc EQ 0.
FORMAT COLOR COL_POSITIVE INVERSE ON.
WRITE: / 'Registro insertado correctamente.',
/ wa_empleados-id,
/ wa_empleados-nombre,
/ wa_empleados-apellido1,
/ wa_empleados-apellido2,
/ wa_empleados-dni,
/ wa_empleados-telefono.
ELSE.
FORMAT COLOR COL_NEGATIVE INVERSE ON.
WRITE: / 'Error al insertar registro'.
ENDIF.
ENDIF.
ELSE.
WRITE: / 'No se ha indicado el identificador de usuario.'.
ENDIF.
ENDIF.
CATCH cx_root.
ENDTRY.
FORM formulario.
LOOP AT SCREEN.
IF p_empl_a EQ 'X'.
IF screen-group1 = 'B1'.
screen-active = '1'.
ENDIF.
ELSE.
IF screen-group1 = 'B1'.
screen-active = '0'.
ENDIF.
ENDIF.
IF p_empl_m EQ 'X'.
IF screen-group1 = 'B2'.
screen-active = '1'.
ENDIF.
ELSE.
IF screen-group1 = 'B2'.
screen-active = '0'.
ENDIF.
ENDIF.
IF p_empl_b EQ 'X'.
IF screen-group1 = 'B3'.
screen-active = '1'.
ENDIF.
ELSE.
IF screen-group1 = 'B3'.
screen-active = '0'.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.