Ver Mensaje Individual
  #4  
Antiguo 13-10-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Perfecto bueno mira, te comento como lo trabajo yo en mis sistemas para que sea menos engorroso.

La idea es que la tabla que tenés ahora sea para consultar como fue variando el stock de los productos en los diversos almacenes, sería un registro o historial de movimientos. Luego yo manejo otra tabla en la cual se tiene la cantidad del stock actual, por cada almacén. En mi caso opte por la mala idea (más difícil de extender, pero más cómoda y eficiente de trabajar) de definir una tabla más o menos así

Código:
 
IdProducto int,
Stock1 int,
StockMin1 int,
StockN int,
StockMinN int
Lo más perfecto creo yo sería tener tres tablas, productos, stock (idProd, IdAlmacen, stock) y la tabla de almacenes, e ir construyendo las relaciones.

Bueno, siguiendo con mi diseño, cada ves que se realiza uno de los movimientos de stock, no solo doy de alta el registro en la tabla de movimientos, sino que también en ese momento actualizo el stock del producto correspondiente, esto lo hago con un query similar a esto

Código SQL [-]
UPDATE Stock SET StockN + :Cantidad WHERE IdProducto = :Id
UPDATE Stock SET StockN - :Cantidad WHERE IdProducto = :Id

También es posible usar triggers, pero a mi particularmente no me gusta la programación en BD, prefiero hacer todo en mi código delphi

De esta forma tenés tu stock al día sin preocuparte de correr un proceso grande.

Si aún así fuera necesario el proceso que describís entonces asumiendo que tengas que recorrer todos los productos podes hacer algo parecido a esto

Código Delphi [-]
Function StockProducto(codProducto, almacén integer): integer
begin
  select * from tabla where a = codProd and b = almacén        // todos los movimientos del producto en un almacén
  Result:= 0
  while not EoF do
  begin
       If sumar then
          Result:= result + c
       else 
          Result:= result - c;    
  end;
   Next
end;

No estoy seguro pero esta última solución, mucho más fácil de leer y encarar, sea menos eficiente por andar lanzando queries a lo loco, podrías modificarla un poco para que te retorne en ves de solo el stock de un almacén el de todos en un array

Entonces todo se reduce a

Código Delphi [-]
// procesando productos
While not fin productos do
Begin
    ArrayStock:= StockProducto(fieldByName('a').asInteger);
   With tabla do
   Begin
       Edit;
       fieldByName (codProd).value:= a
       fieldByName(almacen1).value:= arrayStock[0]
       Etc
       Post
   End
   Next
End

Saludos!
Responder Con Cita