FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Manejo de errores en un procedimiento
Hola a todos:
Mi situación es la siguiente, como puedo capturar el error que genera un procedimiento, este es el codigo que estoy generando procedure Tpr0002.PERIODO_ACTIVO (pw_plan_clave, pw_tipo :string; var pw_anio, pw_numero :integer; pw_error :variant); begin pw_error := NULL; try Q_Consulta.Close; Q_Consulta.SQL.Clear; Q_Consulta.SQL.Add(' SELECT cipl_anio AS pw_anio, MIN(cipla_numero) AS pw_numero '); Q_Consulta.SQL.Add(' FROM sil_cierres_planta '); Q_Consulta.SQL.Add(' WHERE cipl_plan_clave = w_plan_clave '); Q_Consulta.SQL.Add(' AND cipl_tipo = w_tipo '); Q_Consulta.SQL.Add(' AND cipl_estatus = ''A'' '); Q_Consulta.SQL.Add(' AND cipl_anio = (SELECT MIN(cipl_anio) '); Q_Consulta.SQL.Add(' FROM sil_cierres_planta '); Q_Consulta.SQL.Add(' WHERE cipl_plan_clave = w_plan_clave '); Q_Consulta.SQL.Add(' AND cipl_tipo = w_tipo '); Q_Consulta.SQL.Add(' AND cipl_estatus = ''A'') '); Q_Consulta.SQL.Add(' GROUP BY cipl_anio '); Q_Consulta.ParamByName('pw_plan_clave').Value := pw_plan_clave; Q_Consulta.ParamByName('pw_tipo').Value := pw_tipo; Q_Consulta.Open; pw_anio := Q_Consulta.FieldValues['pw_anio']; pw_numero := Q_Consulta.FieldValues['pw_numero']; Q_Consulta.Close; except pw_error := 'Se produjo un error'; on E: Exception do begin pw_error := E.Message; if (E is EDBEngineError) then with EDBEngineError(E).Errors[0] do pw_error := ErrorCode; end; end; end; lo que necesito es atrapar el error si es que hubiese en la variable pw_error pero no me asigna nada, ya probe pasandole directamente el mensage, utilizando el EDBEngineError, pero cuando sale del excep la variavle sale sin asignación, alguien tendra alguna sugerencia de como puedo hacerle para obtener ese dato y posteriormente utilizarlo gracias de antemano |
#2
|
||||
|
||||
Hola,
Es de suponer que tengas declarada una variable global cuyo identificador es "pw_error" y su tipo "Variant". Pues bien, cuando pasas dicha variable al procedimiento que nos ocupa lo haces por valor y no por referencia. De este modo, cualquier cambio en la variable "pw_error" dentro del procedimiento quedará en el propio procedimiento, es decir, la variable "pw_error" no cambiará su contenido original. Prueba a pasar por referencia la misma variable "pw_error", es decir, añade en el procedimiento (tanto en su declaración como en la implementación del mismo), antes del identificador de la variable la palabra reservada "var". Así, cualquier cambio que se llevara a cabo en la variable "pw_error" dentro del procedimiento afectaría a la propia variable "pw_error", quiere decirse que conseguirías lo que pretendes. |
#3
|
|||
|
|||
Gracia David por dedicar tiempo a responder a mi duda.
lo que quiero aclarar es que ya tiene un "var" en la declaracion,.... debo ponerle otro? |
#4
|
||||
|
||||
Hola,
Echa un vistazo a la cabecera del procedimiento: Las variables que pasas por referencia son "pw_anio"y "pw_numero", de tipo integer las dos. Pero, "pw_error" no se pasa por referencia. Tendrás que añadir la palabra reservada "var" antes del identificador de la variable, tal que así:
|
#5
|
|||
|
|||
Muchas gracias David, lo hice como me indicaste y ya tengo el error.
Saludos |
|
|
|