Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Suma de un campo (https://www.clubdelphi.com/foros/showthread.php?t=11189)

silviodp 08-06-2004 14:18:54

Suma de un campo
 
Existe alguna función que sume todos los valores de un campo numérico de una tabla y me arroge el resultado?
Gracias, saludos.

Silvio.-

Sirkius 08-06-2004 14:21:23

Cita:

Empezado por silviodp
Existe alguna función que sume todos los valores de un campo numérico de una tabla y me arroge el resultado?
Gracias, saludos.

Silvio.-

Pues creo que segun la base de datos es SUM(campo) o COUNT(campo).

Saludos

cbrrr 08-06-2004 14:29:56

Puedes hacer una sentencia SQL de suma

Código SQL [-]
 select sum(campo) as suma
 from tabla
 where condiciones
y desde Delphi luego recuperar el valor
Código Delphi [-]
 var
   i: integer;
 begin
 .....
   Query.Open;
   i := Query.FieldByName('Suma').AsInteger;

Espero que te sirva

Sirkius 08-06-2004 16:05:21

Cita:

Empezado por Sirkius
Pues creo que segun la base de datos es SUM(campo) o COUNT(campo).

Saludos

Ups... vaya error que metí: COUNT no suma solo cuenta...

silviodp 08-06-2004 22:54:33

Suma de un campo
 
Estoy utilizando Paradox 7, con el BDE, y creo que esa funcion no la tiene, me parece...
Saben si alguna otra?
Gracias.

Silvio.-

cbrrr 08-06-2004 22:58:01

Pues el Local SQL (que es lo que usa el BDE) sí que incorpora el SUM (de hecho, cualquier motor de bases de datos que se precie mínimamente lo incorpora, es casi básico)

Quizás es que no lo estás haciendo correctamente

Por qué no explicas que estás haciendo exactamente?

silviodp 09-06-2004 23:29:51

Suma de un campo
 
Lo que quiero hacer es que cuando cargo el detalle de una factura (Tabla Detproducto), me vaya sumando el total de cada producto en otro campo que pertenece a la tabla Consumos, que seria el total de la factura.
Me explico?, estoy trabajando con el BDE con tablas Paradox 7, en Delphi 5.
Muchas gracias.

Silvio.-

cbrrr 10-06-2004 00:04:51

Lo siento silviodp, quizás estoy algo espeso, pero no termino de entenderte

Por que no miras de ponernos la estructura de las tablas y la relación que hay entre ellas? A ver si así lo entiendo mejor

silviodp 10-06-2004 14:09:48

Suma de un campo
 
Ok, no hay problema, la estructura de las tablas es la siguiente:

TblConsumo:

IDConsumo (Numerico)
Facturan (N)
Fecha (Date)
Seccion (N)
Vehiculo (N)
Observacion (Memo)
Totalfactu (N)

TblDetproducto: (tabla detalle, es el detalle de la factura cargada, donde se cargan los productos, y se calcula el precio y el iva de cada uno, segun la cantidad)

Consumo (N)
IDDetal (N)
Producto (Alpha)
Cantidad (N)
Precunit (N)
Ivaunit (N)
Precneto (N)
Netoiva (N)
Precfinal (N)

Las dos tablas están relacionadas por la relación Maestro-Detalle mediante el campo IDConsumo en la primera (que es la Maestro) y Consumo de la segunda (Detalle).
Y bueno, a medida que voy cargando los productos en la tabla Detalle, quiero que me vaya Sumando en el campo Totalfactu de la Maestro el precio de cada producto cargado (es decir del campo Precfinal), que es el precio final de la factura...
Yo lo estoy haciendo así:
en el boton Grabar del form que me permite cargar un Producto
Código:

procedure TForm16.GrabarClick(Sender: TObject);
begin
  ModuloDatos.TblDetproducto.Post;
  Modulodatos.DSDetproducto.Enabled:=True;
  Form4.Modificar.Enabled:=True;
  Form4.Quitar.Enabled:=True;
  Close;
end;

y en el BeforePost de la tabla TblDetproducto hago
Código:

procedure TModuloDatos.TblDetproductoAfterPost(DataSet: TDataSet);
var
 x,y:Currency;
 n,m:Integer;
begin
 m:=ModuloDatos.TblDetproducto.RecordCount;
 For n:=1 To m Do
  begin
  x:=ModuloDatos.TblDetproducto.FieldValues['PRECFINAL'];
  y:=y+x;
  end;
  ModuloDatos.TblConsumos.FieldValues['TOTALFACTU']:=y;
end;

pero no funciona, es decir lo hace la primer vez pero cuando cargo otro producto, me arroja el resultado de sumar dos veces el último.
Haber si me pueden dar una idea.
Espero haber sido mas claro. Haaa, me olvidaba uso Paradox 7, y trabajo con Delphi 5.
Gracias.

Silvio.-

cbrrr 10-06-2004 14:30:28

Vale, ahora sí lo entiendo. Puedes hacer una cosa así:

En el AfterPost (que no BeforePost) puedes hacer.....

Código Delphi [-]
  procedure TForm1.Table1AfterPost(DataSet: TDataSet);
  var
    Q: TQuery;
  begin
    Q := TQuery.Create(Selft);
    Q.Database := 'la que sea';
    try
      Q.SQL.Text := 'select sum(Cantidad*Precunit) suma from TblDetproducto where Consumo = ' +
          Table1.FieldByName('IDConsumo ').AsString;
      Q.Open;
      if Q.IsEmpty then
        Table1.FieldByName('Totalfactu').AsFloat := 0
      else
        Table1.FieldByName('Totalfactu').AsFloat := Q.FieldByName('suma').AsFloat;
    finally
      FreeAndNil(Q);
    end;
  end;
Donde Table2 será tu tabla maestra

Espero que te sirva

silviodp 10-06-2004 21:30:11

Suma de un campo
 
Cbrrr:
Mirando el código que me escribiste,yo lo traté de hacer de ésta forma
Inserté en el Modulo de datos una Query, que se llama Consulta1, en su propiedad SQL escribi lo siguiente:
Código:

select sum(Precfinal) As Suma
From Det_producto Inner Join Consumos On Det_producto.Consumo=Consumos.IdConsumo;

Y en el evento AfterPost de la tabla TblDetProducto lo siguiente:
Código:

procedure TModuloDatos.TblDetproductoAfterPost(DataSet: TDataSet);
Var
 x:Variant;
begin
  ModuloDatos.Consulta1.Close;
  ModuloDatos.Consulta1.Open;
  If ModuloDatos.Consulta1.IsEmpty Then
    ModuloDatos.TblConsumos.FieldByName('Totalfactu').AsFloat:=0
  Else
    X:=Modulodatos.Consulta1.FieldByName('Suma').AsFloat;
    ModuloDatos.TblConsumos.FieldByName('Totalfactu').AsFloat:=x;

end;

Pero no me funciona, el tema está en como asigno 'SUMA' o el valor que tengo en ella al campo 'Totalfactu', de la tabla TblConsumos, ya que me parece que es eso lo que hago mal.
Igual antes probé con tu código pero no me ejecuta el programa ya que me dice que 'No puedo asignar la base de datos porque es de sólo lectura (o algo así) a Q.database:=DB Control (que es el nombre de mi base)

cbrrr 10-06-2004 23:11:49

se supone que precfinal = Cantidad*Precunit, no?

Pues bien, a ese SQL está algo "mal"
1.- Lo sobra la unión (join) con la tabla maestra (teniendo el campo por el que buscar en la tabla detalle, es una tontería consumir recursos para hacer una join)
2.- Al quitar la join, le falta un parámetro, que es Consumo del cual quieres calcular la suma, sino te lo calculará de todo (cláusula where)

por lo que te podría quedar algo así:
Código SQL [-]
   select sum(Precfinal) as suma
   from det_producto
   where consumo = :consumo
y desde código hacer algo así:
Código Delphi [-]
    procedure TModuloDatos.TblDetproductoAfterPost(DataSet: TDataSet);
  Var
   x: Float;
  begin
     Consulta1.Close;
     Consulta1.ParamByName('consumo').AsInteger:=TblConsumos.FieldByName('IDConsumo').AsInteger;
     Consulta1.Open;
     If Consulta1.IsEmpty Then
       x := 0
     Else
       x := Consulta1.FieldByName('Suma').AsFloat;
     
     TblConsumos.Edit;
     TblConsumos.FieldByName('Totalfactu').AsFloat := x;
     TblConsumos.Post;
  end;
Consejo: acostúmbrate a no usar variables de tipo Variant cuando sabes, de entrada, el tipo de dato que será
Consejo2: dentro de un mismo formulario/módulo de datos, no hace falta que hagas referencia a éste

Espero que te sirva

silviodp 11-06-2004 15:46:13

Suma de un campo
 
Muchas gracias Cbrrr, anduvo perfecto!!!, lo unico que no me reconoce es cuando defino x como Float, tuve que definirla como Currency.
Saludos.

Silvio.-

cbrrr 11-06-2004 16:51:23

Perdón, sí, estaba yo pensando en bases de datos. El Float debería haber sido un Real (o un Currency como tu dices)


La franja horaria es GMT +2. Ahora son las 20:36:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi