[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