Jump to content


Photo

Dudas con EmptyDataSet

dataset

  • Please log in to reply
8 replies to this topic

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 posts
  • LocationPinar del Río, Cuba

Posted 23 January 2020 - 07:35 AM

Hola a tod@s

Pues tengo una duda al usar EmptyDataSet, ya que según entiendo me debe vaciar la tabla, es decir eliminar todos los registros del dataset, pero no lo hace.

La ayuda dice:

"Removes all records from the internal data storage of the dataset."

Cuando dice que es "... del almacenamiento interno de datos ...", que quiere decir?
Que lo hace en memoria y no directamente en la BD?

Si es así, entonces que debo hacer para que se aplique el cambio?

Uso MySQL y FireDAC

Este es mi codigo:



delphi
  1. if not chkTodoSinc.Checked then FiltraTabla(ModuloBD.fdtDetallePago, Filtro); ModuloBD.fdtDetallePago.EmptyDataSet;
  2. ModuloBD.fdtDetallePago.Filtered:=False;

El objetivo es eliminar todos los registros según una condición, que puede ser la tabla completa o solo los que se filtren.


PD: No se porque el codigo se "desorganiza" en el post

Edited by JoAnCa, 23 January 2020 - 07:39 AM.

  • 0

#2 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 posts
  • LocationPinar del Río, Cuba

Posted 23 January 2020 - 08:05 AM

Intente hacerlo de esta forma:





delphi
  1. while not ModuloBD.fdtDetallePago.Eof do ModuloBD.fdtDetallePago.Delete;


y me da el error de la imagen, pero la tabla si tiene llave primaria

Attached Files


Edited by JoAnCa, 23 January 2020 - 08:09 AM.

  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 23 January 2020 - 09:47 AM

Hola JoAnCa,

 

Los ClientDataset (CDS) son tablas en memoria y sí, efectivamente, cuando haces el llamado a EmptyDataSet solo lo hace en al CDS, para Insertar, actualizar y/o borrar registros en la base de datos requieres de un Provider el cual es la liga entre La tabla y el ClientDataSet y que ejecutará las órdenes para afectar la tabla correspondiente.

 

El error que se te está presentando es porque se ha perdido el foco del registro que deseas borrar.

 

Saludos


  • 0

#4 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 posts
  • LocationPinar del Río, Cuba

Posted 23 January 2020 - 01:12 PM

Hola JoAnCa,

Los ClientDataset (CDS) son tablas en memoria y sí, efectivamente, cuando haces el llamado a EmptyDataSet solo lo hace en al CDS, para Insertar, actualizar y/o borrar registros en la base de datos requieres de un Provider el cual es la liga entre La tabla y el ClientDataSet y que ejecutará las órdenes para afectar la tabla correspondiente.

El error que se te está presentando es porque se ha perdido el foco del registro que deseas borrar.

Saludos


Gracias por la ayuda

Y como lo podria hacer?, es que hasta ahora siempre he trabajado con un fdTable y un Datasource enlazado que me hace los cambios directamente en la BD (no se si es una mala practica o no, pero ...), me refiero a lo del ClientDataset


Lo del error, lo solucione haciendo un First antes de Delete, para recuperar el foco del registro.

Edited by JoAnCa, 23 January 2020 - 01:32 PM.

  • 0

#5 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 posts
  • LocationPinar del Río, Cuba

Posted 23 January 2020 - 01:48 PM

Lo del error, lo solucione haciendo un First antes de Delete, para recuperar el foco del registro.


Rectifico, me funciono bien solo la primera vez, despues me siguio dando el mismo error

Edited by JoAnCa, 23 January 2020 - 01:48 PM.

  • 0

#6 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 posts
  • LocationPinar del Río, Cuba

Posted 23 January 2020 - 03:10 PM

Pues para no seguir rompiendome la cabeza con la forma que lo estaba haciendo, ahora si lo solucione usando un FDQuery y con la instruccion SQL no da problemas y hace lo que necesito.

La informatica es así, siempre hay mas de una forma de hacer lo mismo.
  • 1

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 24 January 2020 - 09:25 AM

Pues para no seguir rompiendome la cabeza con la forma que lo estaba haciendo, ahora si lo solucione usando un FDQuery y con la instruccion SQL no da problemas y hace lo que necesito.

La informatica es así, siempre hay mas de una forma de hacer lo mismo.

 

Lamento no poder ser de más ayuda amigo, pero de cualquier forma seguiré buscando la solución al problema.

 

Saludos


  • 0

#8 gatosoft

gatosoft

    Member

  • Miembros
  • PipPip
  • 31 posts
  • LocationColombia

Posted 24 January 2020 - 04:44 PM

Como comentaba egostar, el EmptyDataset aplica para TClientDatasets que trabajan como tablas en memoria. Es decir que si tu ClientDataset se conecta a un provider, no aplica, pues está afectando directamente la base de datos....

 

El tema con los Firedac es que debes modificar una opción en el Dataset provider llamada UpdateMode y setearla en: upWhereKeyOnly. Tambien debes verificar que los campos persistentes que tegas en el Query conectado al Provider tengan bien definidos los campos que son llave.

 

Por otro lado, la técnica que utilizas para recorrer el dataet y borrarlo (While...) tiene el problema, que viste... a medida que vas avanzando los registros van desapareciendo y es lo que ocasiona la perdida de foco...

 

Lo ideal es poder eliminar los datos a través de SQL, Pero si debes hacerlo coo indicas, se me ocurre, algo como:


php
  1. While not Query.IsEmpty do
  2.    Query.delete;

Saludo,

 

 

 


  • 1

#9 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 posts
  • LocationPinar del Río, Cuba

Posted 29 January 2020 - 07:28 AM

Como comentaba egostar, el EmptyDataset aplica para TClientDatasets que trabajan como tablas en memoria. Es decir que si tu ClientDataset se conecta a un provider, no aplica, pues está afectando directamente la base de datos....

El tema con los Firedac es que debes modificar una opción en el Dataset provider llamada UpdateMode y setearla en: upWhereKeyOnly. Tambien debes verificar que los campos persistentes que tegas en el Query conectado al Provider tengan bien definidos los campos que son llave.

Por otro lado, la técnica que utilizas para recorrer el dataet y borrarlo (While...) tiene el problema, que viste... a medida que vas avanzando los registros van desapareciendo y es lo que ocasiona la perdida de foco...

Lo ideal es poder eliminar los datos a través de SQL, Pero si debes hacerlo coo indicas, se me ocurre, algo como:



delphi
  1. While not Query.IsEmpty do Query.delete;

Saludo,
Muchas gracias por la aclaración a mis dudas

No sabia que la Query se podia hacer de esa forma que me indicas, en realidad hice mas directo el SQL



delphi
  1. Query.SQL.Text:='DELETE FROM latabla WHERE ' + Filtro + ';';
  2. Query.ExecSQL;


Edited by JoAnCa, 29 January 2020 - 07:35 AM.

  • 0





Also tagged with one or more of these keywords: dataset

IP.Board spam blocked by CleanTalk.