Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Recorrer base de datos registro por registro (https://www.clubdelphi.com/foros/showthread.php?t=35208)

Goyo 04-09-2006 18:15:12

Recorrer base de datos registro por registro
 
Un saludo estimados amigos programadores tengo un problema :confused: para actualizar registros, el problema es el siguiente:

tengo una tabla con los siguientes campos:
NumeroVehiculo, FechadeServicio, concepto1, concepto2, importe, importetotal.

lo que quiero es recorrer la tabla para actualizar los datos de manera que tome un registro y el importegasto (siempre y cuando corresponda con el numerovehiculo, y a la vez este registro se almacene en su campo importetotal:
por ejemplo:

NumeroVehiculo FechaServicio Concepto1 Concepto2 Importe ImporteTotal
--------------- ------------- ---------- ---------- ------- -------------
001 01/05/2006 llantas 500.00 500.00
001 16/05/2006 balatas 180.00 680.00
002 04/04/2006 pintura 5000.00 500.00
002 25/05/2006 llantas 500.00 5500.00
001 25/06/2006 afinacion 750.00 1430.00

osea que cuando se introduzca un nuevo registro (y este corresponda al NumeroVehiculo=001 o cualquiera que corresponda con el numero del vehiculo, se vaya autosumando en el campo ImporteTotal. De hecho de esta manera ya me lo hace, el problema es que al actualizar algun dato de un registro ya existente, me da la suma total en el campo importetotal de este registro, y lo que quiero es que la suma total del campo Importe en el ultimo registro que corresponda con el numerovehiculo.

por ejemplo si modifico el registro 2:
001 16/05/2006 balatas 200.00 680.00 en el campo importe (180.00) ahora 200.00 la suma del campo importetotal sera la suma del primero mas el segundo registro, entonces el total el ImporteTotal sera: 700.00 y el ultimo registro contendra el total de todos los registros: 1450.00

NumeroVehiculo FechaServicio Concepto1 Concepto2 Importe ImporteTotal
--------------- ------------- ---------- ---------- ------- -------------
001 01/05/2006 llantas 500.00 500.00
001 16/05/2006 balatas 200.00 700.00
001 25/06/2006 afinacion 750.00 1450.00

lo que pretendo es tomar la tabla y recorrer registro por registro (siempre y cuando el NumeroVehiculo=NumeroVehiculo) e ir tomando la informacion existente del campo Importe y esta se autosume el campo ImporteTotal tal como lo muestro en el ejemplo anterior. pero para hacer debo pulsar un Boton para Actualizar Datos, y de esta manera actualizar la tabla.

Código Delphi [-]
procedure TFrmBitacora.Button2Click(Sender: TObject);
var importe1:double;
    importeT:variant;
begin
importeT:=edit1.Text;
   dm.TbBitacora.First;//nos colocamos en el 1 registro
   while  not dm.TbBitacora.Eof do
      begin
      importe1:= dm.TbBitacora.FieldByName('importe').AsFloat;       importeT := importeT + importe1;
      edit1.Text := (importeT);
  
dm.TbBitacora.Next; //pasar al siguiente registro
 
end;

este el codigo que pretendo ejecutar, solo que me marca error y no se como hacerlo.... le agradecere su atencion... muchas gracias y espero me haya explicado BIEN!!!

marcoszorrilla 04-09-2006 23:40:21

Sin entrar en detalles has inicializado el "edit1" convenientemente.
Código Delphi [-]
 procedure TFrmBitacora.Button2Click(Sender: TObject);
var importe1:double;
    importeT:variant;
begin

Edit1.Text:='0';

importeT:=edit1.Text;
   dm.TbBitacora.First;//nos colocamos en el 1 registro
   while  not dm.TbBitacora.Eof do
      begin
      importe1:= dm.TbBitacora.FieldByName('importe').AsFloat;       importeT := importeT + importe1;
      edit1.Text := (importeT);
  
dm.TbBitacora.Next; //pasar al siguiente registro
 
end;

Un Saludo.

Goyo 06-09-2006 20:44:59

ya lo hice como me dijiste que me faltaba solo igualar a cero "0" el Edit1.text, ahora el problemilla que tengo es que ahora la suma me la hace de todos los registros que hay en la tabla, para lo cual te muestro el procedimiento que aplico.. con la logica de hacerlo mientras no sea fin de archivo y NumeroVehiculo=NumeroVehiculo para que lo haga solo con aquellas claves que sean iguales...

Código Delphi [-]
procedure TFrmBitacora.Button2Click(Sender: TObject);
var importe1:variant;
    importeT:variant;
begin
  Edit1.Text:='0';
  Edit2.Text:='0';
  importeT:=edit1.Text;
  importe1:=edit2.text;
  dm.TbBitacora.First;   //nos colocamos en el 1 registro
  while  ((not dm.TbBitacora.Eof) and (dm.TbBitacoraNumeroVehiculo.Text = dm.TbBitacoraNumeroVehiculo.Text)) do
      begin
      importe1:= DM.TbBitacora.FieldByName('importe').AsFloat;
      importeT := importeT + importe1;
      edit1.Text := (importeT);
      edit2.Text := (importe1);
      dm.TbBitacora.Edit;
      dm.TbBitacoraImporteTotal.AsFloat := importeT;
      dm.TbBitacora.Next; // brincamos al siguiente registro
  end;
end;

marcoszorrilla 06-09-2006 21:40:47

Este método con un archivo muy grande sería totalmente ineficiente, lo lógico sería tener un índice por el campo en cuestion.
1.- Activar el índice.
2.- Buscar la primera ocurrencia
3.- Comenzar un ciclo mientras las siguientes ocurrencias coincidan.

Al estar indexado cuando no coincidan es que no hay más y así solo se recorren los registros que hay que sumar.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 03:13:31.

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