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 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
[-]
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!