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 08-07-2003
alfgonvar alfgonvar is offline
Registrado
 
Registrado: jul 2003
Ubicación: Canarias
Posts: 3
Poder: 0
alfgonvar Va por buen camino
Actualizacion query

Buenas a todos: resulta que usamos un programa que accede a los datos de una tabla compartida. Como pueden acceder varias personas simultaneamente y para evitar problemas, he hecho que el acceso sea sobre un query de esa tabla y no sobre la tabla directamente. El problema que se me plantea es el siguiente. Cada vez que se va a añadir un nuevo registro, se abre la tabla, se añade el registro y se vuelve a cerrar y a continuación se vuelve a hacer el query sobre la tabla. El problema es que el nuevo registro no aparece en el query. Sin embargo abro la tabla con el Database Desktop y el registro si está.
Supongo que el fallo está en la memoria intermedia o en el buffer de escritura, pero no se como atacarlo.
Me pueden ayudar?

Graaaacias.
Alf
Responder Con Cita
  #2  
Antiguo 08-07-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
en el evento AfterPost de la Tabla pon

Tabla.FlushBuffers

Esto forzara la grabacion de los datos a disco
Responder Con Cita
  #3  
Antiguo 10-07-2003
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
Hola. He querido continuar este hilo por que a mí me suceden algunas cosas "extrañas" muy parecidas.

En mi módulo de datos trabajo con dos componentes TIBTransaction, uno se llama IBTran, y el otro TIBTranLiq.

Tengo un TIBQuery llamado IBQ1 cuyo componente de transacción por defecto es IBTran, y un TIBQuery llamado IBEmpleados.

Voy a eliminar un empleado, pero antes necesito eliminar las referencias en otra tabla llamada "Afiliaciones".

Ahora hago lo siguiente:

Código:
CodigoEmpleado = IBEmpleados.FieldByName('Codigo').AsString;

IBQ1.SQL.Clear;
IBQ1.SQL.Add('DELETE FROM "Afiliaciones" WHERE "Empleado" = '''+CodigoEmpleado);
IBQ1.ExecSQL;
IBTran.Commit;

IBQ1.SQL.Clear;
IBQ1.SQL.Add('DELETE FROM "Empleados" WHERE "Codigo" = '''+CodigoEmpleado);
IBQ1.ExecSQL;
IBTran.Commit;
Bueno, resulta que inspecciono la variable CodigoEmpleado, y efectivamente tiene el valor que debe tener. Si ejecuto la sentencia:

Código:
DELETE FROM "Afiliaciones" WHERE "Empleado" = '12345'
(suponiendo que la variable CodigoEmpleado tuviera ese valor), desde IBConsole, y doy click en COMMIT TRANSACTION todo funciona, pero resulta que desde mi aplicación en Delphi, no elimina los registros correspondiente, por lo que se genera una excepción al ejecutar la siguiente sentencia DELETE.

Alguien podría ayudarme?

Muchas gracias.

PD.

1. La sentencia FluchBuffers es como ejecutar Commit?

2. Cuando un Commit en una transacción no se muestran los resultados en la otra (después de ejecutar los commits correspondientes). Qué puedo hacer en este caso?
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita
  #4  
Antiguo 10-07-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Bueno, no te funciona porque te falta cerrar las comillas, es decir, tienes que hacer la sentencia asi

Código:
IBQ1.SQL.Clear;
IBQ1.SQL.Add('DELETE FROM "Afiliaciones" WHERE "Empleado" = '''+CodigoEmpleado+'''');
IBQ1.ExecSQL;
IBTran.Commit;

IBQ1.SQL.Clear;
IBQ1.SQL.Add('DELETE FROM "Empleados" WHERE "Codigo" = '''+CodigoEmpleado+'''');
IBQ1.ExecSQL;
IBTran.Commit;

o bien

IBQ1.SQL.Clear;
IBQ1.SQL.Add('DELETE FROM "Afiliaciones" WHERE "Empleado" = '+QuotedText(CodigoEmpleado));
IBQ1.ExecSQL;
IBTran.Commit;

IBQ1.SQL.Clear;
IBQ1.SQL.Add('DELETE FROM "Empleados" WHERE "Codigo" = '+QuotedText(CodigoEmpleado));
IBQ1.ExecSQL;
IBTran.Commit;
Respecto a tu pregunta, sí, mas o menos se podria considerar que un FluchBuffers es como un Commit, pero no es exactamente lo mismo, ya que en un SGDB como IB puedes rechazar los cambios con un Rollback (lo contrario de Commit), pero no puedes hacerlo con PDOX. Si sales del programa o cierras la conexion, se realizaria el FluchBuffers de las tablas.

Despues de realizar un Commit, para ver esos cambios desde otra transaccion, necesitas hacer un Close y un Open del Dataset.

Por otra parte, si tienes que borrar registros de una tabla "ligados" al borrado de otra, te recomiendo que crees claves foraneas que te lo gestionen ellas mismas y asi te despreocupas (o bien un trigger que vendria a ser lo mismo)

Bueno, espero te sirva
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


La franja horaria es GMT +2. Ahora son las 19:38:49.


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