Bueno, no soy un "maestro", pero intentaré lo que pueda.
Algunos detallitos:
- Si un campo es numérico (leasé integer, float, currency, BCD) hay que quitar el "QuotedStr" ya que a un número no se le puede restar un string (cadena de texto).
- Al pasar cantidades con decimales a un sql, hay que tener especial cuidado con formato, (leasé separador de miles y separador decimal), porque el SQL es un Standard y espera un número
sin separador de miles y como
separador decimal el punto.
- Además es un bucle, hay que "agilizar esa ejecución sea como sea"
Vamos a pasar del tema:
- Usaremos un sql con parámetros, así nos quitamos el problema del separador decimal y de millar (que delphi haga las conversiones).
- Usaremos una consulta compilada (Prepare), ésto hace indicar a delphi que su SQL no ha sido modificada, y por tanto en cada ciclo del bucle, no es necesario chequear la sintaxis de la misma (ahorramos algunos milisegundos).
- Haremos un disableControls de la consulta, así delphi no actualiza el grid (recordemos que los mensajes de pintado del grid, el registro activo y demás consume tiempo).
Código Delphi
[-]
query1.Close;
query1.SQL.Text:='update stock set prostkact = prostkact - :prCantidad where procod = :prProcod';
query1.Prepare;
frmfactura.MDtemporal.First; frmfactura.MDtemporal.DisableControls; try
while not frmfactura.MDtemporal.Eof do
begin
query1.parambyname('prCantidad').Asinteger := frmfactura.MDtemporal.fieldbyname('cantidad').AsInteger;
query1.parambyname('prProcod').AsInteger := frmfactura.MDtemporal.fieldbyname('codigo').AsString;
query1.ExecSQL;
frmfactura.MDtemporal.Next; end;
finally
frmfactura.MDtemporal.First;
frmfactura.MDtemporal.EnableControls;
end;
Otra cosa: Si en frmfactura tienes los campos persistentes, sería mejor usar:
Código Delphi
[-]
frmfactura.MDtemporalcantidad.AsInteger;
usando Fieldbyname, se tiene que perder tiempo en averiguar si ese campo está en la tabla o no. Teniendo el campo persistente, se accede directamente a él.
sALUDOS