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)
-   -   Actualizacion query (https://www.clubdelphi.com/foros/showthread.php?t=2088)

alfgonvar 08-07-2003 13:14:18

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

__cadetill 08-07-2003 13:34:54

en el evento AfterPost de la Tabla pon

Tabla.FlushBuffers

Esto forzara la grabacion de los datos a disco

mlara 10-07-2003 16:40:20

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?

__cadetill 10-07-2003 17:56:02

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


La franja horaria es GMT +2. Ahora son las 21:51:26.

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