PDA

Ver la Versión Completa : Execute procedure


VRO
25-01-2005, 10:17:26
hola,¿que hay de nuevo?, vereis

mi problema puede que sea muy sencillo de solucionar pero me he ozecado y no veo el error.
He hecho un procedimiento almacenado para importar una tabla de Access a Interbase.

1º- utilizo un ADOQuery para leer los datos de la tabla en Access
2º- Ejecuto con un Query de interbase el procedimiento almacenado.

Acontinuación os pongo el código utilizado para ver si vosotros veis el error, porque yo ya no se que hacer.

Procedimiento almacenado:

SET TERM!!;
CREATE PROCEDURE IMPORTAR (NUMERO INTEGER, FECHA DATE, LECTURA FLOAT, CONSUMO FLOAT)
AS
DECLARE VARIABLE var1 INTEGER;
DECLARE VARIABLE var2 INTEGER;
BEGIN
SELECT count(NUMERO)
FROM lecturas
where numero=:numero and fecha=:fecha
INTO :var1;
BEGIN
IF (:VAR1=0) THEN
begin
select count(numero)
from contadores
where numero=:numero
into :var2;
if (:var2<>0) then
INSERT INTO lecturas(numero,fecha,lectura,perdidas,consumo,est,tiempo,averiado,festivo,cerrado)
VALUES (:NUMERO,:FECHA,:LECTURA,0,:CONSUMO,1,null,0,0,0);
end
ELSE
UPDATE lecturas
SET FECHA=:FECHA, LECTURA=:LECTURA,CONSUMO=:CONSUMO
WHERE NUMERO=:NUMERO;
END
END!!
SET TERM;!!


con este query llamo al procedimiento.

query.Close;
query.sql.Add('execute procedure importar '+ADOquery.fieldbyname('contador').Text+','+
+FormatDateTime('mm/dd/yy',ADOquery.Fieldbynem('fecha').asdatetime)+','+ADOQuery.fieldbyname('lectura').text+','+ADoquery.f ieldbyname('consumo').text+'');
query.ExecSQL;


El error que da es:Unexpected end of command, podeis pensar que es porque en el execute procedure los parametros de entrada no les pobgo parentesis, si les pongo me da error en el paréntesis.

Yo pienso queigual es por pasar la fecha como String y ser date, en ese caso,¿ como le paso directamente como date?.

Fijo que es una tontería pero no consugo verlo.
Ante todo mi enorme agradecimiento.

pacogarcia
25-01-2005, 12:01:22
hola.

Prueba de esta forma:


query.Close;
query.sql.Add('execute procedure importar( numero, fecha, date, lectura,consumo)');
query.sql.Add('values(:numero,:fecha,:date,:lectura,:consumo)');

query.ParamByName('numero').AsString := ADOquery.fieldbyname('contador').Text;
Query.ParamByName('fecha').AsDateTime := ADOquery.Fieldbynem('fecha').asdatetime;
... // El resto de campos.
query.ExecSQL;


El campo 'numero' lo he puesto como string, ya que tu lo tenias puesto con Text en la query pero tambien puedes pasarlo como integer.
Tienes mas informacion en la ayuda de Delphi.

Espero que te sirva.
Un saludo.

VRO
25-01-2005, 12:45:24
Me va bien haciendole un pequeño arreglillo, total que me ha quedado así:


query.Close;
query.sql.Add('execute procedure importar( :numero, :fecha,:lectura,:consumo)');

query.ParamByName('numero').AsString := ADOquery.fieldbyname('contador').Text;
Query.ParamByName('fecha').AsDateTime := ADOquery.Fieldbynem('fecha').asdatetime;
... // El resto de campos.
query.ExecSQL;


Me ocurre un pequeño problemilla con la fecha que es cuando hago una comparación,insercion etc el formato fecha tiene que ser:'mm/dd/yy'
el formato que saco yo de la consulta query que me da el dato es 'dd/mm/yy',pero bueno eso sólo es cambiar el formato, ya lo he ehcho mas veces,(¡¡creo)

Una preguntilla, no se si te he comentado que saco los datos de una tabla de Access a la que accedo con un ADoQuery creo que si y para importar los datos hago el codigo que me pasaste dentro de un while cunado el while entra una vez lo inserta sin problemas, cuando entramos por segunda vez me pone error en execute

sabes porque muchas gracias.

Gracias

pacogarcia
26-01-2005, 11:44:35
hola de Nuevo.


Creo que el problema lo tienes porque pones dentro del bucle el

query.sql.Add('execute procedure importar( :numero, :fecha,:lectura,:consumo)');


Deberia quedar mas o menos asi:


// El texto de la sentencia SQL lo añades fuera del bucle.
query.sql.Add('execute procedure importar( :numero, :fecha,:lectura,:consumo)');

while not ADOQuery.eof do
begin
Query.ParamByName('numero').AsString := ADOquery.fieldbyname('contador').Text;
Query.ParamByName('fecha').AsDateTime := ADOquery.Fieldbynem('fecha').asdatetime;
... // El resto de campos.
Query.ExecSQL;
ADOQuery.Next;
end;

Un saludo.

VRO
26-01-2005, 17:55:57
Gracias Paco , ese era el fallo.

¡¡Jo!!, vaya tontería mira que no darme cuenta, no si cuando uno se ozeca, no ve más delante de sus ojos.

Muvhísimas gracias por tus respuestas que me han servido de mucha ayuda.