PDA

Ver la Versión Completa : Actualizar todos los registros de un ClientDataSet


oscarac
22-10-2018, 22:40:12
Como dice el titulo como hago para actualizar todos los registros ?
la idea es que tengo una tabla en memoria con varios registros y una columna de ITEM que va del 1 al Nº total de registros

imaginemos que tengo una tabla con 60 registros, enumerados y si borro el registro 20, todos los demas deben re-enumerarse y tendre 59 registros....

estaba pensando en


vitem := 1;
CdsAsiento.First;
While not cdsasiento.eof do
Begin
cdsasiento.edit;
cdsasiento.item.value := vItem;
cdsasiento.post;
inc(vitem);
End;



existe alguna otra manera?

Caminante
23-10-2018, 00:09:54
Hola


Como es un clientdataset podrias crear el campo para la numeracion como calculado y luego en el evento oncalcfields:


MiDataset.fieldbyname('Num').asinteger:=Midataset.recno;


No lo he probado pero una vez hice lo mismo y mas o menos recuerdo que asi lo resolvi.



Espero sea util


Saludos

oscarac
23-10-2018, 00:21:07
no funciona, me sale 0 en todos los registros.

ecfisa
23-10-2018, 19:53:37
Hola.

Pero, ¿ Asignaste la propiedad TClientDataSet.RecNo al campo calculado en el evento OnCalcFields del TClientDataSet ?

Saludos :)

oscarac
23-10-2018, 20:28:28
me explicas como se hace por favor?

ecfisa
23-10-2018, 21:29:08
Hola.

Si por supuesto, va un ejemplo:

1.- Sobre el TClientDataSet hace click con botón derecho del mouse y agrega los campos persistentes:
https://i.postimg.cc/KvWVbzcd/Add-All-Fields.png

2.- Agrega un nuevo campo:
https://i.postimg.cc/wBMtzV6k/NewField.png

3.- Definelo:
https://i.postimg.cc/qqw0gPw6/Def-New-Field.png

Y luego, estando seleccionado el TClientDataSet, desde el Object Inspector -> events -> doble click sobre el evento -> OnCalcFields y dentro del procedimiento este código:

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
cdsRecNo.Value := ClientDataSet1.RecNo;
end;


Saludos :)

oscarac
24-10-2018, 02:06:25
ah si
hice eso, agregue un campo Item (Calculated)
pero me sale cualquier cosa

ecfisa
24-10-2018, 16:07:59
Hola.

En mis pruebas mantiene correctamente la numeracion de los registros al agregarlos o al borrarlos:
https://i.postimg.cc/0NN1KCW4/video.gif

Pero, hay que tomar en cuenta que no todos los DataSet reconocen posiciones y eso podría estar dandote algun problema. En la categoría de los que no lo hacen entran aquellos que soportan cliente/servidor.

Como desconozco el gestor de base de datos y los componentes de conexión que estas usando, no podría decir mucho mas...

Saludos :)

Caminante
24-10-2018, 17:04:56
Hola.

En mis pruebas mantiene correctamente la numeracion de los registros al agregarlos o al borrarlos:
https://i.postimg.cc/0NN1KCW4/video.gif






En el programa que tenia tambien funcionaba bien sobre el clientdataset. Tal vez tengas en la propiedad packetrecords un valor diferente al que tiene por defecto y eso este afectando (Creo). Fuera de eso no se que pueda estar pasando.
Por desgracia no he podido encontrar el codigo de mi programa para compararlo.


Saludos

oscarac
27-11-2018, 17:34:28
Uso MsSQL me conecto via FireDac

Hola.

En mis pruebas mantiene correctamente la numeracion de los registros al agregarlos o al borrarlos:
https://i.postimg.cc/0NN1KCW4/video.gif

Pero, hay que tomar en cuenta que no todos los DataSet reconocen posiciones y eso podría estar dandote algun problema. En la categoría de los que no lo hacen entran aquellos que soportan cliente/servidor.

Como desconozco el gestor de base de datos y los componentes de conexión que estas usando, no podría decir mucho mas...

Saludos :)

oscarac
27-12-2018, 16:24:41
aun no puedo solucionar este problema
he seguido los pasos indicados y nada

alguna referencia adicional?

Al González
27-12-2018, 20:02:57
Hola Oscar. Tal vez deberías mostrar lo que estás haciendo, por lo menos con el 10% de dedicación y detalle que tuvo ecfisa para orientarte.

La pereza para los que programan en Visual Basic, colega. ;-)

oscarac
27-12-2018, 20:25:59
entendi cual es el problema.
lo que me dio ecfisa si funciona ya lo probe, el tema es que posteriormente al post, recorro los registros del ClientDataSet, para hacer unos calculos (sumas, acumulados, etc), es ahi donde se hace bolas.
lo solucione, pero ahora me doy con la sorpresa que cuando ejecuro la instruccion

CdsDetalle.First

el campo Item se pone en blanco (cero) en todos los registros...
cosa de locos