PDA

Ver la Versión Completa : Manejo de errores en un procedimiento


JavierO
23-08-2005, 01:34:26
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 = :pw_plan_clave ');
Q_Consulta.SQL.Add(' AND cipl_tipo = :pw_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 = :pw_plan_clave ');
Q_Consulta.SQL.Add(' AND cipl_tipo = :pw_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

dec
23-08-2005, 07:50:40
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.

JavierO
23-08-2005, 18:17:31
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?

dec
24-08-2005, 00:12:00
Hola,

Echa un vistazo a la cabecera del procedimiento:


procedure Tpr0002.PERIODO_ACTIVO (pw_plan_clave, pw_tipo: string;
var pw_anio, pw_numero: integer; pw_error: variant);

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


procedure Tpr0002.PERIODO_ACTIVO (pw_plan_clave, pw_tipo: string;
var pw_anio, pw_numero: integer; var pw_error: variant);

JavierO
24-08-2005, 20:40:28
Muchas gracias David, lo hice como me indicaste y ya tengo el error.

Saludos