[Lazarus-es] Como borrar recordset usando TSQLQuery

Ismael L. Donis Garc?a ismael en citricos.co.cu
Mar Dic 1 20:59:32 CET 2009


Me faltaba también el post, es que estoy acostumbrado a visual basic que 
cuando dices delete borra y aquí marca para ser borrado, es más parecido a 
dbase con delete y pack.

Gracias reiteradas, uso FPC 2.3.1. El que viene implícito con la 
instalación.
=========
¦¦ 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