Consulta "CASE"

sap-abap
Etiquetas: #<Tag:0x00007fb8dae42678>

#1

Buenas.
Sigo aquí con mis preguntas de novato.

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.

Gracias


#2

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


#3

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.


#4

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


#5

@canuto tiene razón.

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.

Un saludo.


#6

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.

Muchas gracias por el código.


#7

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 :wink:


#8

Cotilleando la seccion de tutoriales me he encontrado con esto, tal vez te sirva de ayuda :slight_smile:

http://foros.consultoria-sap.com/t/seleccion-de-pantallas-segun-radio-button/5144


#9

La verdad es que estoy muy verde todavía, pero es lo que quería.

Todavía me queda bastante por aprender. A ver aprendo un poco más y puedo ayudar en lugar de preguntar.:sweat_smile:

Muchas gracias.


#10

:clap::clap::clap::clap:
Ya lo he conseguido.

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.

#11

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.