Ir al contenido


Foto

Dudas con EmptyDataSet

dataset

  • Por favor identifícate para responder
8 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 751 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 enero 2020 - 07:35

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

Editado por JoAnCa, 23 enero 2020 - 07:39 .

  • 0

#2 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 751 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 enero 2020 - 08:05

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

Archivos adjuntos


Editado por JoAnCa, 23 enero 2020 - 08:09 .

  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.139 mensajes
  • LocationMéxico

Escrito 23 enero 2020 - 09:47

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
  • 751 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 enero 2020 - 01:12

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.

Editado por JoAnCa, 23 enero 2020 - 01:32 .

  • 0

#5 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 751 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 enero 2020 - 01:48

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

Editado por JoAnCa, 23 enero 2020 - 01:48 .

  • 0

#6 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 751 mensajes
  • LocationPinar del Río, Cuba

Escrito 23 enero 2020 - 03:10

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
  • 14.139 mensajes
  • LocationMéxico

Escrito 24 enero 2020 - 09:25

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
  • 29 mensajes
  • LocationColombia

Escrito 24 enero 2020 - 04:44

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
  • 751 mensajes
  • LocationPinar del Río, Cuba

Escrito 29 enero 2020 - 07:28

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;


Editado por JoAnCa, 29 enero 2020 - 07:35 .

  • 0





Etiquetado también con una o más de estas palabras: dataset