PDA

Ver la Versión Completa : Ayuda con ClientDataset


Fita
22-04-2008, 13:50:39
Hola a todos...

Mi problema es el siguiente:

Mi aplicacion es un sistema de facturacion, con una tabla maestra (cabecera del pedido) y una detalle (con los items cargados). Un provider para cada una y un clientdataset para cada provider. El sistema puede dejar pedidos pendientes, lo que permite una posterior modificación.
Cuando cargan un pedido voy grabando en un campo el n° de item. Cuando llaman a un pedido pendiente y borran un item, el sistema renumera los items cargados. la rutina es así:

nItem := 1;

while not TablaDetalle.eof do // es el clientdataset
begin
Tabladetalle.edit;
TabladetalleItem.value := nItem;
Tabladetalle.post;
TablaDetalle.next;
end;
Luego de esto el clientdataset queda parado en el ultimo registro.

Esto funciona perfecto, pero si vuelven a dejarlo pendiente tengo que hacer un ApplyUpdates(0) para actualizar los datos en el server. Bueno aca es donde falla...

Si se renumeran los items cargadaos Todos los registros de la tablaDetalle se actualizan con el ultimo registro del clientdataset. So no se renumeran los items anda perfecto.
Nota: El n° de item es para el delete:

delete from TablaDetalle where npedido = :npedido and item = nItem

Que puede pasar ?? alguna ayuda será bienvenida

Saludos
Fita
Delphi7 - FIBPlus 6.3

kuan-yiu
22-04-2008, 16:19:17
Nunca, jamás, salvo que sea absoluta y totalmente imprescindible renumeres las líneas de detalle si ese número forma parte de la clave primaria. A mí me ha dado más problemas que ventajas.
En el día a día al usuario le va a importar muy poco si las líneas de detalle internamente son la 2,3,7 o la 1,2,3.
Es mejor ajustar la numeración cuando se muestre en pantalla (si es que lo necesitas) que toquetear las claves primarias.

Fita
23-04-2008, 15:22:28
Hola Kuan-Yiu... gracias por tu preocupación....

El problema es que justamente el campo nItem no forma parte de ninguna clave.
Si bien es cierto lo que tu dices, (al usuario no le importa en que orden estan los registros) en mi caso particular es necesario que cuando cargan un pedido que esta pendiente, éste se muestre en el orden en que lo cargaron (imagínate un pedido de 60 items) para su control.
Mi madre tenía una frase que decía: "La necesidad agudiza el ingenio", y bueno... con ingenio pude resolver el tema, aunque me gustaría saber porque el clientdataset falla de esa manera...
Te cuento como lo he resuelto:

En primer lugar no renumero los renglones (esto generaba la falla).
En el clientdataset detalle he creado un campo calculado: nRecs y en el evento OnCalcFields puse este codigo:

procedure TdmFac002.cds_Lpf022CalcFields(DataSet: TDataSet);
begin
Dataset.FieldByName('nRec').Value := Dataset.RecNo;
end;
Esto va contando los registros para mostrarlos por pantalla.
En el campo nItem sigo numerando los items cargados.
Cuando borran un item en lugar de renumerar hago lo siguiente:

procedure TfrmFac002.SetItems;
begin
with dmFac002 do
begin
nItem := 0;
// Guardo el Item mayor, ya que luego de un delete quedan salteados
cds_Lpf022.First;
while not cds_Lpf022.Eof do
begin
if nItem < cds_Lpf022Item.Value then
begin
nItem := cds_Lpf022Item.Value;
end;
cds_Lpf022.Next;
end;

// sumo 1 al item para que no se repita
inc( nItem );

end;
end;

Y sigo contando los items en la rutina de carga...

Un afectuoso saludo