FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Ayuda con ClientDataset
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 |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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 |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
ayuda ClientDataSet, DataSetProvider y ApplyUpdates | cmm07 | Varios | 1 | 23-03-2008 08:27:28 |
Ayuda: ClientDataset | Fita | Conexión con bases de datos | 2 | 11-10-2005 19:18:44 |
ClientDataSet y W98 | tgsistemas | Conexión con bases de datos | 5 | 03-08-2004 10:13:06 |
ClientDataSet | narvaez.om | Conexión con bases de datos | 2 | 19-05-2004 18:58:21 |
Ayuda con ClientDataSet!!!! | Selene | Providers | 4 | 28-08-2003 19:21:27 |
|