[Lazarus-es] Como borrar recordset usando TSQLQuery
Ismael L. Donis Garc?a
ismael en citricos.co.cu
Mar Dic 1 23:08:29 CET 2009
JoshyFun definitivamente debe ser como dices un problema de FPC 2.3.1, por
lo que hice lo que me planteabas cuestión que ya había pensado, pero que no
quería hacer porque tengo que volver a realizar la consulta para volver a
cargarla con los datos actualizados.
Al final el programa original quedó: (ya que he tomado la opción de un
programa de prueba donde pruebo antes de consultar dado la cantidad de dudas
y problemas que voy presentando)
while not dtm.sqldto.EOF do
begin
if not dtm.sqlcla.Locate('entidad',
dtm.sqldto.FieldValues['entidad'], []) then
begin
sqlstr := 'delete from mpdatge where mpdatge.entidad=''' +
dtm.sqldto.FieldValues['entidad'] + '')';
dtm.rsup(strsql); // Esto es un función que tengo
implementada para INSERT, UPDATE y DELETE
end;
dtm.sqldto.Next;
end;
strsql := 'select * from mpdatge';
dtm.rsdto(strsql, true, true); // Esto es un función implementada para
SELECT o CLOSE QUERY
GRACIAS por todo
=========
¦¦ ISMAEL ¦¦
=========
"Oír o leer sin reflexionar es una ocupación inútil".
Confucio (551-479 a. C.); filósofo chino.
----- Mensaje original -----
De: "JoshyFun" <joshyfun en gmail.com>
Para: "Spanish version of Lazarus List"
<lazarus-es en lists.lazarus.freepascal.org>
Enviado: martes, 01 de diciembre de 2009 12:20
Asunto: Re: [Lazarus-es] Como borrar recordset usando TSQLQuery
Hello Ismael,
Tuesday, December 1, 2009, 6:20:36 PM, you wrote:
ILDGa> Como borrar un record usando TSQLQuery trato de hacer lo siguiente y
da
ILDGa> error, no se como decir que borre el record donde está parado el
cursor.
ILDGa> while not SQLQuery1.EOF do
ILDGa> begin
ILDGa> if not SQLQuery2.Locate('mprima',
ILDGa> SQLQuery1.FieldValues['mprima'], [])
ILDGa> then
ILDGa> SQLQuery1.Delete; // esto da error
ILDGa> SQLQuery1.Next;
ILDGa> end;
Eso depende del Select que hayas hecho, el resultado de un select
puede ser "updatable" o "fixed/readonly". Para que sea "updatable" el
select debe de afectar a una tabla sólo y entre lo campos disponibles
debe de estar la "primary key". Si haces joins o similares esta será
readonly ya que no hay forma de saber exactamente como realizar los
borrados. Supongo que tu caso será el segundo ya que te da un error,
así que la "solución" sería algo como:
while not Query1.eof do begin
if Query1.FieldByName('Borrable').asBoolen=true then begin
Query2:=TSQLQuery.Create(.......);
Query2.connection,transaction,etc=lo que sea;
Query2.SQL.Text='DELETE FROM TABLA WHERE Clave=:IDCLAVE';
Query2.Params.ParamByName('IDCLAVE').asInteger=Query1.FieldByName('ID').asInteger;
Query2.ExecSQL;
FreeAndNIL(Query2);
end;
Query1.Next;
end;
Esto también lo puedes solucionar creando un SQLDelete en Query1, con
un contenido:
Query1.DeleteSQL.SQL.Text='DELETE FROM TABLA WHERE Clave=:ID';
Y entonces funcionaría tu sistema, pero creo que esto falla en la
versión 2.4.0 del compilador si borras más de un registro sin hacer un
commit justo después de borrar, lo que hace que tu Query1 deje de ser
válido y tengas que volver a empezar desde el principio.
Si usas la versión trunk del compilador esto function, o sea, la
2.5.1.
--
Best regards,
JoshyFun
_______________________________________________
Lazarus-es mailing list
Lazarus-es en lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
More information about the Lazarus-es
mailing list