Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   SQL no actualiza los datos (https://www.clubdelphi.com/foros/showthread.php?t=63346)

Garfio 10-02-2009 11:07:27

SQL no actualiza los datos
 
Tengo el siguiente programa en Delphi 7 con Interbase 6. Uso los componentes de base de datos de interbase. El código es:
Código Delphi [-]
       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
Código SQL [-]
select * from "Cabeceras"
where
  "idMensaje" = :IDMEN
y para el Update
Código SQL [-]
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:
Código:

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

Creo que las comillas sobran en todas partes...

Garfio 10-02-2009 14:42:50

No puedo quitar las comillas, es SQl Dialect 3
 
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)
Código SQL [-]
select * from "Cabeceras"
where
  "idMensaje" = :IDMEN
Por lo tanto, creo que por lo menos los parámetros en el Update tampoco deberían llevarlas:
Código SQL [-]
update "Cabeceras"
set
  "Cabeceras"."procesado" = :procesado
where
  "Cabeceras"."idMensaje" = :OLD_idMensaje
También puedes probar el quitar la parte OLD_ del parámetro

Código SQL [-]
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:
Código Delphi [-]
       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
Código SQL [-]
set "procesado" = :PROCE
y luego en Delphi pongo
Código Delphi [-]
SQL.Parambyname('PROCE'). asString := '1';
me da error de 'Field PROCE not found'

Garfio 10-02-2009 16:46:02

Rectificación
 
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í.


La franja horaria es GMT +2. Ahora son las 14:02:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi