[Lazarus-es] Como borrar recordset usando TSQLQuery

JoshyFun joshyfun en gmail.com
Mar Dic 1 19:20:25 CET 2009


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





More information about the Lazarus-es mailing list