Ver Mensaje Individual
  #11  
Antiguo 15-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 28
Lepe Va por buen camino
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; // no sé donde andará el registro activo, me aseguro
frmfactura.MDtemporal.DisableControls; // dejamos de actualizar los controles data-Aware
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; // <<<<<<<<<< ¿esto no estaba en tu código?
  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; // asinteger, asfloat lo que sea
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 15-11-2007 a las 20:48:58.
Responder Con Cita