Error codigo SELECT (Dump)

Aprovecho para hacer también una consulta.
Cómo puedo buscar si existe un valor en una tabla de base de datos que se pasa por una Dynpro?
Estoy intentando hacer consultas sobre la tabla, pero me acaba generando un dump,

DATA: wa_empleados TYPE zempleados_ap329,
           lv_id TYPE i.

PARAMETERS: pa_id   TYPE i LENGTH 4,
            pa_nom  TYPE c LENGTH 20,
            pa_ape1 TYPE c LENGTH 20,
            pa_ape2 TYPE c LENGTH 20.

wa_empleados-id = pa_id.
wa_empleados-nombre = pa_nom.
wa_empleados-apellido1 = pa_ape1.
wa_empleados-apellido2 = pa_ape2.
*
*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.
*Si no se registra el identificador de usuario, no se van a registrar los datos.
  IF wa_empleados-id IS NOT INITIAL.
    IF sy-subrc EQ 0.
      INSERT zempleados_ap329 FROM wa_empleados.
      IF sy-subrc EQ 0.
        WRITE: / 'Registro insertado correctamente.',
               / wa_empleados-id,
               / wa_empleados-nombre,
               / wa_empleados-apellido1,
               / wa_empleados-apellido2.
      ELSE.
        WRITE: / 'Error al insertar registro'.
      ENDIF.
    ENDIF.
  ELSE.
    WRITE: / 'No se ha indicado el identificador de usuario.'.
  ENDIF.
ELSE.
  WRITE: / 'El identificador de usuario ya ha sido utilizado.'.

ENDIF.
  CATCH cx_root.

  ENDTRY.

La consulta “SELECT” está comentada, pero he probado de varias formas.
Lo raro es que haciendo esta consulta, me provoca el dump. También he probado a hacer el “INTO” en una tabla.

@Machord movi tu tema a uno nuevo para llevar un orden !! ya que es una consulta diferente a lo que estamos conversado.

Para mi…esta bien, lo unico mal que veo es

yo lo haria SELECT single ID into lv_id

Lo que yo veo raro es lo siguiente:

Estas buscando en la tabla un ID para comprobar su existencia, eso está OK.

Pero luego, con ese ID, haces un insert, entonces para mí el dump viene por ahí.

Si queres insertar un registro nuevo, el ID no debe existir en la tabla, si lo queres modificar, debes hacer un UPDATE.

Saludos.

Si te da un dump y no capturas el error, puede ser o porque el try lo has puesto fuera de la instrucción que da el error o porque el catch no es de la clase esperada.

Por otra parte sería necesario saber cual es el dump y en que línea te aparece porque o puede ser en el insert como dice @sconoredhot (entonces la pregunta después del SELECT no debería ser sy-subrc = 0 sino sy-subrc ne 0 , porque si al hacer el select encuentre el registro entonces no hay que insertarlo porque tendría clave duplicada). Si el dump no es en el insert podría ser en el select en la parte into porque la variables lv_id no tenga el mismo tipo que ID de la tabla zempleados_ap39. Para evitar esto último podrías declarar la variable lv_id type zempleados_ap39-id.

2 Me gusta

Muchas gracias por las respuestas y por abrir un tema por esto.

Voy a probar lo que proponéis y os cuento.

MUCHAS GRACIAS.
Lo he solucionado con declarar la variable local como ha puesto @Salco, como tipo zempleados_ap329-id y negando la variable sy-subrc.
Quizás sea un poco lioso lo que he hecho, pero me funciona.
Os dejo el código por si le sirve de ayuda a alguien.

[CODE]
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 c LENGTH 20,
pa_ape1 TYPE c LENGTH 20,
pa_ape2 TYPE c LENGTH 20.
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.

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.
WRITE: / ‘El identificador de usuario ya ha sido utilizado.’.
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.
WRITE: / ‘Registro insertado correctamente.’,
/ wa_empleados-id,
/ wa_empleados-nombre,
/ wa_empleados-apellido1,
/ wa_empleados-apellido2.
ELSE.
FORMAT COLOR COL_NEGATIVE.
WRITE: / ‘Error al insertar registro’.
ENDIF.
ENDIF.
ELSE.
WRITE: / ‘No se ha indicado el identificador de usuario.’.
ENDIF.
ENDIF.
CATCH cx_root.
ENDTRY.
[/CODE]

2 Me gusta

No quiero parecer purista pero un par de cosillas :wink:

  • si pones el parametro p_id como mandatory no hace falta que compruebes si esta initial, al fin y al cabo para la funcionalidad no tiene sentido que vaya vacio.

  • el anidamiento try entry if endif.

SELECT SINGLE id
                FROM zempleados_ap329
                INTO lv_id
                WHERE id EQ pa_id.

  IF sy-subrc eq 0.
      WRITE: / 'El identificador de usuario ya ha sido utilizado.'.
    ELSE.

TRY.
 INSERT zempleados_ap329 FROM wa_empleados.
"lo que pongas aqui se ejecutara si no se lanza ninguna excepcion , es decir todo va bien"
 CATCH cx_root."***** -> busca las excepciones que pueda lanzar el insert en lugar de la cx_root"
"lo que pongas aqui solo se ejecutara si ocurre una excepcion."

ENDTRY.

Endif.



2 Me gusta

Así tiene sentido :slight_smile:

Si, lo del try era porque me estaba apareciendo el dump y no lo lograba capturar. Creo que con la excepción cx_root, capturas todos los errores, ya que es la que contiene todos. Corregidme si no es así.
Lo que no entiendo es lo que dices de “p_id como mandatory”.
El “IS NOT INITIAL” lo utilizo para que aparezca un error si el campo ID no es rellenado. También corregidme si no es así, porque como quien dice estoy empezando.

perdona es obligatory no mandatory
aqui tienes mas info sobre pantallas de selccion, al declararlo obligatory el programa no se ejecuta si no estan informados los campos que has declarado asi,

h_tp://www.abap.es/centro_Manual_05_Pantalla_Seleccion.htm

Pues también tienes razón. Al declararlo como Obligatory no puede estar el campo vacío.

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