PDA

Ver la Versión Completa : SQL no actualiza los datos


Garfio
10-02-2009, 11:07:27
Tengo el siguiente programa en Delphi 7 con Interbase 6. Uso los componentes de base de datos de interbase. El código es:

DMRepara.QrPre.Close;
DMRepara.QrPre.UnPrepare;
DMRepara.QrPre.ParamByName('ENTRE').asstring := DMRepara.QrCab.FieldbyName('numPreaviso').asstring;
DMRepara.QrPre.Prepare;
DMRepara.QrPre.Open;
DMRepara.QrPre.First;
while not DMRepara.QrPre.Eof do
Begin
if DMRepara.QRPre.FieldByName('numEntre').AsString =
DMRepara.QRCab.FieldByName('numEntre').AsString then
Begin
DMRepara.QrUCab.Close;
DMRepara.QrUCab.UnPrepare;
DMRepara.QrUCab.ParamByName('IDMEN').asinteger := DMRepara.QrPre.FieldbyName('idMensaje').asinteger;
DMRepara.QrUCab.Prepare;
DMRepara.QrUCab.Open;
DMRepara.QrUCab.Edit;
DMRepara.QrUCab.FieldByName('procesado').AsString := '1';
DMRepara.QrUCab.Post;
end;
DMRepara.QrPre.Next;
end;
DMRepara.QRPre.Active := False;
DMRepara.QrCab.Next;
end;
end;
DMRepara.QrUCab.ApplyUpdates;
DMRepara.TRPuerto.Commit;
DMRepara.QrEntr.Close;
DMRepara.QrPre.Close;
DMRepara.QRCab.Close;
DMRepara.QrUCab.Close;


y el SQL que tengo para QrUCab es:
Para el Select

select * from "Cabeceras"
where
"idMensaje" = :IDMEN

y para el Update

update "Cabeceras"
set
"Cabeceras"."procesado" = :"procesado"
where
"Cabeceras"."idMensaje" = :"OLD_idMensaje"

el caso es que no me actualiza el campo procesado a '1'. Lo he probado asignando directamente el valor y tampoco me lo actualiza. Los componentes son TIBQuery y TIBUpdateSQL aunque tambien lo he probado con TIBDataSet y tampoco funciona.
He probado según algunos ejemplos que he visto en el foro y tampoco. Ahora lo tengo con CachedUpdates = True pero tambien lo he probado sin.
La cuestión es que me pasa por todas las sentencias que ha de pasar y no me da error, pero no me actualiza el campo.
Sinceramente, ya no se que hacer. Agradecería cualquier ayuda posible. Gracias.

duilioisola
10-02-2009, 14:07:53
Prueba con este SQL:

update Cabeceras
set
procesado = :procesado
where
idMensaje = :OLD_idMensaje

Creo que las comillas sobran en todas partes...

Garfio
10-02-2009, 14:42:50
Si quito las comillas me da error de 'Field not found'. Interbase está en SQL dialect 3. Inicialmente hice este programa en Delphi 3 (con los componentes de Base de Datos). A mi me funcionaba, pero al instalarlo en el cliente, me daba el error de 'Tabla no encontrada'. Por mucho que lo intenté, no consenguí que funcionara en el cliente. Por eso lo estoy probando en Delphi 7, pero las comillas las tengo que mantener para que no me de errores. La Select la hace bien, por lo menos las Select de las tablas QrCab y QrPre, me hace el Edit, el Post el Commit sin errores pero la base datos no se actualiza.

duilioisola
10-02-2009, 15:34:29
No entiendo como puede funcionar con comillas, pero si dices que lo hace, será así.
De todos modos, si te fijas en el Select, los parámetros no tiene comillas (:IDMEN)

select * from "Cabeceras"
where
"idMensaje" = :IDMEN

Por lo tanto, creo que por lo menos los parámetros en el Update tampoco deberían llevarlas:

update "Cabeceras"
set
"Cabeceras"."procesado" = :procesado
where
"Cabeceras"."idMensaje" = :OLD_idMensaje

También puedes probar el quitar la parte OLD_ del parámetro


update "Cabeceras"
set
"Cabeceras"."procesado" = :procesado
where
"Cabeceras"."idMensaje" = :idMensaje


Y finalmente, si no te da ningún error, puede deberse a que todo está dentro de algún bloque try...except más amplio.
Prueba lo siguiente para ver si falla en algún lado:

try
DMRepara.QrPre.Close;
DMRepara.QrPre.UnPrepare;
DMRepara.QrPre.ParamByName('ENTRE').asstring := DMRepara.QrCab.FieldbyName('numPreaviso').asstring;
DMRepara.QrPre.Prepare;
DMRepara.QrPre.Open;
DMRepara.QrPre.First;
while not DMRepara.QrPre.Eof do
Begin
if DMRepara.QRPre.FieldByName('numEntre').AsString =
DMRepara.QRCab.FieldByName('numEntre').AsString then
Begin
try
DMRepara.QrUCab.Close;
DMRepara.QrUCab.UnPrepare;
DMRepara.QrUCab.ParamByName('IDMEN').asinteger := DMRepara.QrPre.FieldbyName('idMensaje').asinteger;
DMRepara.QrUCab.Prepare;
DMRepara.QrUCab.Open;
DMRepara.QrUCab.Edit;
DMRepara.QrUCab.FieldByName('procesado').AsString := '1';
DMRepara.QrUCab.Post;
except
on E:exception do ShowMessage(E.Message);
end;
end;
DMRepara.QrPre.Next;
end;
DMRepara.QRPre.Active := False;
DMRepara.QrCab.Next;
except
on E:exception do ShowMessage(E.Message);
end;
end;
end;
DMRepara.QrUCab.ApplyUpdates;
DMRepara.TRPuerto.Commit;
DMRepara.QrEntr.Close;
DMRepara.QrPre.Close;
DMRepara.QRCab.Close;
DMRepara.QrUCab.Close;

Garfio
10-02-2009, 16:18:59
Probaré esto último a ver que tal. Lo de los parámetros es muy curioso. En la select me los acepta sin comillas pero en el update no me los acepta sin comillas a no ser que los haya usado en la select. Supongo que en el update son parámetros referidos a campos de la base de datos. Si intento en el update algo del tipo

set "procesado" = :PROCE

y luego en Delphi pongo

SQL.Parambyname('PROCE'). asString := '1';

me da error de 'Field PROCE not found'

Garfio
10-02-2009, 16:46:02
Me acabo de dar cuenta de que solo me actualiza el último registro. ¿Eso quiere decir que el ApplyUpdates lo tengo que hacer registro a registro?. He pasado el proceso dos veces. La primera vez me ha actualizado el último registro que estaba con el campo 'procesado' a ceros. La segunda vez con el último en ese momento.

Delphius
10-02-2009, 20:24:19
Hola Garfio, el tema de las comillas se debe muy posiblemente a que tienes un charset establecido. Al menos así me pasó a mi en Firebird 1.5. Por error establecí un charset y todo tuve que entrecomillar. Realicé una copia de la metadata, por las dudas, y cambié todo los charset y collate de los campos "string" a NONE. Me aseguré además de que en SET NAMES también figure NONE. Volví a crear la base de datos, y ya no fue necesario más comillas.

Por el tema del código, tendría que sentarme a ver donde puede estar el error.

Saludos,

Garfio
11-02-2009, 09:56:22
Probaré lo que dices, pero solo por curiosidad, porque la base de datos no es mía y no se si la puedo cambiar así como así.