Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Actualizar tabla buscando desde un dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=31810)

judit25 18-05-2006 16:44:42

Actualizar tabla buscando desde un dbgrid
 
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.
Código Delphi [-]
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

Cita:

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:
Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 17:01:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi