PDA

Ver la Versión Completa : Actualizar tabla buscando desde un dbgrid


judit25
18-05-2006, 16:44:42
Buenos Días!

Primero perdon por el titulo, no sabia que poner :o

Estoy trabajando con un formulario de factura, el encabezado y el detalle estan asociados a un clientdataSet cada uno, y el detalle esta en un dbgrid y desde ahi mismo hago mis facturas, mi inquitud es la siguiente cuando le de al boton de grabar como puedo hacer para que cada articulo que está en el dbgrid lo buscque en una tabla que se llama Inventario que está en un Data Module y a cada producto le reste la cantidad digitada en el dbgrid a la cantidad actual? :confused:

No se si me explique bien.

Saludos

Y Gracias anticipadas por la ayuda prestada

judit25
18-05-2006, 18:34:04
Abundando un poco más (esto me funciona menos en el último registro)

Estoy empleando este código en el evento BeforeApplyUpdates de CDS2 (que es el clientDataSet del detalle), pero a la hora de grabar me actualiza en la tabla Inventario todos los registros menos el último.

CDS2.First;
while not CDS2.Eof do
begin
if DM.TInventario.Locate('Cod_prod', CDS2Cod_Prod.Value, []) then
begin
DM.TInventario.Edit;
DM.TInventarioCant_Salida.Value := DM.TInventarioCant_Salida.Value + CDS2Cantidad.Value;
DM.TInventarioCant_Actual.Value := DM.TInventarioCant_Actual.Value - CDS2Cantidad.Value;
DM.TInventario.UpdateRecord;
end;
CDS2.Next;
end;

Alguna idea de que me hace falta para que funcione en todos los registros?

Gracias anticipadas

Saludos

Y disculpen las molestias

Lepe
18-05-2006, 18:49:46
Ensures that data-aware controls and detail datasets reflect record updates.

Applications should not need to call UpdateRecord directly unless they provide custom dataset methods that bypass TDataSet methods.

UpdateRecord no hace lo que piensas. Usa Post para guardar los cambios en el CDS, despues usa ApplyUpdates para grabar los datos directamente a la BBDD.

Saludos

judit25
18-05-2006, 18:53:55
gracias Lepe por la respuesta, pero creo que se cruzaron los temas, jeje, no veo la relación de mi problema con eso? o si?

Gracias

ronimaxh
18-05-2006, 20:34:22
bueno como que no esta muy claro lo que quieres hacer, pero seria mejor que comenzaras y dices que db usas, y para rebajar el inventario lo puedes hacer desde el id de la misma factura que generas, asi atrapas el detalle y puedes controlar que articulos se afectaron con la venta.....

judit25
18-05-2006, 21:01:23
Gracias ronimaxh por tu respuesta

estoy utilizando Access conectado con odbc y he podido solucionar parte de mi problema, lo único es que el último registro no me lo actualiza en el inventario, todos menos el último me lo actualiza y no se porque, el código que estoy empleando es el siguiente:

CDS2.First;
while not CDS2.Eof do
begin
if DM.TInventario.Locate('Cod_prod', CDS2Cod_Prod.Value, []) then
begin
DM.TInventario.Edit;
DM.TInventarioCant_Salida.Value := DM.TInventarioCant_Salida.Value + CDS2Cantidad.Value;DM.TInventarioCant_Actual.Value := DM.TInventarioCant_Actual.Value - CDS2Cantidad.Value;DM.TInventario.UpdateRecord;
end;
CDS2.Next;
end;

Este código lo he puesto en el evento BeforeApplyUpdates de CDS2 (que es el clientDataSet del detalle).

Gracias

Lepe
19-05-2006, 12:11:09
UpdateRecord no es para grabar los cambios, por tanto no se guardan JAMÁS.

... Claro... tú dirás pues los cambios si se guardan en todos los registros menos en el último.... Pues sí, porque internamente la VCL cuando realizas un Tdataset.Next mira si hay modificaciones en el registro actual y los guarda automáticamente. Pero en el último registro no se puede hacer un .Next porque se ha llegado al final, por tanto, no se guarda.

Sustituye el "UpdateRecord" por "Post"

Siempre que se haga un Edit / Insert / Append debe llevar asociado un Post / Cancel para evitar este tipo de fallos que lo vuelven a uno loco ;).

Saludos

judit25
19-05-2006, 16:08:57
Muchas gracias Lepe deja hacerlo con post a ver como me va

Gracias