Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-02-2009
Garfio Garfio is offline
Miembro
 
Registrado: jul 2006
Posts: 15
Poder: 0
Garfio Va por buen camino
Thumbs up 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.
Responder Con Cita
  #2  
Antiguo 10-02-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.744
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Prueba con este SQL:
Código:
update Cabeceras
set
  procesado = :procesado
where
  idMensaje = :OLD_idMensaje
Creo que las comillas sobran en todas partes...
Responder Con Cita
  #3  
Antiguo 10-02-2009
Garfio Garfio is offline
Miembro
 
Registrado: jul 2006
Posts: 15
Poder: 0
Garfio Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 10-02-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.744
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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" = rocesado
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" = rocesado
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;

Última edición por duilioisola fecha: 10-02-2009 a las 15:37:57.
Responder Con Cita
  #5  
Antiguo 10-02-2009
Garfio Garfio is offline
Miembro
 
Registrado: jul 2006
Posts: 15
Poder: 0
Garfio Va por buen camino
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'
Responder Con Cita
  #6  
Antiguo 10-02-2009
Garfio Garfio is offline
Miembro
 
Registrado: jul 2006
Posts: 15
Poder: 0
Garfio Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 10-02-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 11-02-2009
Garfio Garfio is offline
Miembro
 
Registrado: jul 2006
Posts: 15
Poder: 0
Garfio Va por buen camino
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í.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TFileListBox no se actualiza jfadelphi Varios 2 27-09-2008 11:50:56
No actualiza IBQ trex2000 Conexión con bases de datos 2 19-01-2007 20:52:20
Qreport actualiza datos royrogers84 Varios 2 24-11-2006 17:41:07
No actualiza trex2000 Firebird e Interbase 2 28-01-2005 23:43:20
No actualiza . . . Agar23 Conexión con bases de datos 12 25-05-2004 09:27:52


La franja horaria es GMT +2. Ahora son las 17:05:24.


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