Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
campo calculado no existe

Buenas,

sigo peleando con los campos de las bases de datos.

Tengo una base de datos en sqlite usando lazarus y este codigo:
Código Delphi [-]
procedure TForm1.ACEITESCalcFields(DataSet: TDataSet);

begin
 aceites.FieldByName('calculo').asinteger:=aceites.fieldbyname('precio').asinteger * aceites.fieldbyname('cantidad').asinteger;
 aceites.Active:=false;
 ACEITES.SQL.Clear;
  ACEITES.SQL.Text:='SELECT SUM(CALCULO) from aceites';
  aceites.ExecSQL;
  aceites.Active:=true;

end;

le meti un campo calculado al query y la primera parte, que multiplica la cantidad por el precio me lo hace bien, pero queria sumar toda la columna calculada y me dice que el campo calculo no existe.


alguna idea?

saludos y gracias
Responder Con Cita
  #2  
Antiguo 14-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Hola,
Perdonad que escriba como respuesta pero no me deja editar el post.

Si algo aprendi, creo, es que el campo calculado no existe porque no está directamente en la tabla de ahí que me de error, asi que lo he tenido que hacer de esta forma:

Código Delphi [-]
aceites.close;
 ACEITES.SQL.Clear;
  ACEITES.SQL.Text:='SELECT SUM(PRECIO*cantidad) as sumatorio from aceites';
 ACEITES.OPEN;
    LABEL8.CAPTION:='$'+INTToStr(ACEITES.Fieldbyname('sumatorio').asINTEGER);
    ACEITES.SQL.CLEAR;
    ACEITES.SQL.TEXT:='SELECT * FROM ACEITES';
  aceites.Active:=true;

Esto funciona, pero como estoy trabajando con dbgrid, cada vez que se actualiza la suma, al ir llenando las celdas, el cursor vuelve al principio de la columna, si, esto seria normal porque cierro y abro la tabla, pero en otros programas comerciales no pasa eso, el total se actualiza de forma transparente para el usuario puesto que no cambia de celda volviendo al principio.

El código anterior es así o hay otra forma de hacerlo, si es lo primero, como puedo evitar que vuelva al principio.

Ya puestos, el total lo he puesto en un label, sería mas correcto meterlo en un stringgrid o un dbgrid?.

Saludos y gracias

Para actualizar el dbgrid uso DBGrid3EditingDone, aunque he probado otros.

Última edición por anubis fecha: 14-08-2012 a las 05:30:06.
Responder Con Cita
  #3  
Antiguo 14-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.079
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hola, amigo, creo que estás hecho un lio
Explica exactamente qué estás haciendo, qué quieres hacer, etc. porque siguiendo tu comentario, la verdad, no está muy claro.
Responder Con Cita
  #4  
Antiguo 14-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias Casimiro por contestar.

Mira, tengo una tabla llamada aceites que tiene:

clave. autoincrement
nombre, string
precio, integer
cantidad, integer

tengo un dbgrid que apunta a esa tabla de aceites que contiene:

nombre,
precio,
cantidad
y un campo calculado que añadi al query que multiplica el precio x cantidad.

a medida que voy metiendo cantidad en cada celda, el campo calculado me resuelve el total por fila.

La idea es que a medida que voy metiendo la cantidad y me resuelve el total por fila, queria que se fuera actualizando la suma de todas las cantidades del campo calculado para lo cual tuve que meter otro campo en el query para resolver esto, campo sumatorio.
Código Delphi [-]
aceites.close;  
ACEITES.SQL.Clear;   
ACEITES.SQL.Text:='SELECT SUM(PRECIO*cantidad) as sumatorio from aceites';  
ACEITES.OPEN;     
LABEL8.CAPTION:='$'+INTToStr(ACEITES.Fieldbyname('sumatorio').asINTEGER);     
ACEITES.SQL.CLEAR;     
ACEITES.SQL.TEXT:='SELECT * FROM ACEITES';   
aceites.Active:=true;

el único problema que veo, es que cada vez que meto una cantidad y salgo de la celda, me actualiza el sum anterior, pero me regresa al principio del dbgrid, y esto sería lógico porque cierro y abro el query (creo que no hay otra forma)

No se si esto debe ser asi o, como he visto en otros post, en vez de hacer un sum global (que nose si esta bien) debo de ir acumulandolo en una variable integer como:

Código Delphi [-]
sum:=sum+calculado;

Saludos y gracias
Responder Con Cita
  #5  
Antiguo 14-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.079
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo tendría un query aparte para calcular la suma de la columna.
Un simple:
Código SQL [-]
select sum(precio*cantidad) from tbAceites where codigo= :codigo;  // se supone que tienes un campo clave para identificar el pedido/factura/loquesea
Lo puedes ejecutar en el onExit de la celda cantidad.
Responder Con Cita
  #6  
Antiguo 21-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Si así lo tengo como tu lo has puesto

Código Delphi [-]
aceites.close;   
ACEITES.SQL.Clear;   
 ACEITES.SQL.Text:='SELECT SUM(PRECIO*cantidad) as sumatorio from aceites';   
ACEITES.OPEN;      
LABEL8.CAPTION:='$'+INTToStr(ACEITES.Fieldbyname('sumatorio').asINTEGER);      
ACEITES.SQL.CLEAR;      
ACEITES.SQL.TEXT:='SELECT * FROM ACEITES';   
 aceites.Active:=true;

Pero como comento, para aplicar la suma de toda la columna, cada vez que meto una cantidad y aplico el onexit se ejecuta el codigo anterior volviendo al comienzo de la columna.

Lo que no entiendo es si ese codigo se aplica asi o hay otras opciones en el que no tenga que cerrar el query.

Última edición por anubis fecha: 21-08-2012 a las 02:25:27.
Responder Con Cita
  #7  
Antiguo 21-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.079
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Te copio lo que he puesto antes:
Cita:
Yo tendría un query aparte para calcular la suma de la columna.
Responder Con Cita
  #8  
Antiguo 21-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Perdon Casimiro, no lo leí bien.

De todas formas no entiendo muy bien lo del query aparte para calcular la suma.

Seria por ejemplo un query en memoria que contenga 2 columnas 1 de primary key y la otra donde se vayan añadiendo las cantidades por fila y de ahi, como ese query no es visible, actualizar la suma?.

Esto se podria hacer en el evento oncolexit del dbgrid o mejor en el onupdaterecord del query principal?.

Uso, de momento, sqlite3 y autocommit.

gracias de nuevo.
Responder Con Cita
  #9  
Antiguo 21-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.079
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Veamos, entiendo que estás dando de alta unos registros en alguna tabla de la base de datos.
Creo que quieres la suma de un campo en particular.
Pues entonces añade a tu proyecto un nuevo query y le pones la sentencia que corresponda.
Código SQL [-]
select sum(campo) from tabla where campoclave= loquesea
Responder Con Cita
  #10  
Antiguo 22-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Perdoname pero no lo entiendo, tal y como me pones la referencia, no se como aplicarla tal asi.

Le meto un query igual a ese.

Perdon me perdi.

saludos y gracias
Responder Con Cita
  #11  
Antiguo 22-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.079
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bueno, antes de seguir responde a esto:

Cita:
Empezado por Casimiro Notevi
1. Veamos, entiendo que estás dando de alta unos registros en alguna tabla de la base de datos. ¿Sí/No?
2. Creo que quieres la suma de un campo en particular. ¿Sí/No?
Responder Con Cita
  #12  
Antiguo 22-08-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Creo que lo que te sugiere Casimiro, es algo similar a esto:
Código Delphi [-]
procedure TForm1.aceitesCalcFields(DataSet: TDataSet);
var
  Sumatoria: Double;
begin
  // Campo calculado
  with aceites do
    FieldByName('CALCULADO').AsFloat := FieldByName('PRECIO').AsFloat *
      FieldByName('CANTIDAD').AsFloat;

  // Mostrar sumatoria de: PRECIO*cantidad(columna del cpo calculado) en un Edit
  with OtroQuery do
  begin
    Close;
    SQL.Text:= 'SELECT SUM(PRECIO*CANTIDAD) AS SUMATORIA FROM TU_TABLA';
    Open;
    Sumatoria:= FieldByName('SUMATORIA').AsFloat;
    Close;
    Edit1.Text:= FloatToStr(Sumatoria);
  end;
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 22-08-2012 a las 08:57:01.
Responder Con Cita
  #13  
Antiguo 22-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Si Casimiro,

Estoy dando de alta unos registros, cada vez que en la celda cantidad meto un valor, el total de esa fila se actualiza:

- Cantidad* precio, actualiza total.

en la segunda parte, cada vez que meto una cantidad, tiene que actualizarse el total de toda la columna total, de ahi la suma

ecfisa, no entiendo muy bien el ejemplo, como relaciono el primer query con el segundo, por el tema del campo calculado.
Y del segundo query, de donde extrae el precio y la cantidad para ir acumulando en sumatoria.
saludos y gracias
Responder Con Cita
  #14  
Antiguo 22-08-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Anubis.

Cita:
de donde extrae el precio y la cantidad para ir acumulando en sumatoria.
Según tu código el valor del campo calculado se obtiene multiplicando el campo PRECIO por el campo CANTIDAD (msg #1):
Código Delphi [-]
  aceites.FieldByName('calculo').asinteger:=aceites.fieldbyname('precio').asinteger *
   aceites.fieldbyname('cantidad').asinteger;
Entonces la sumatoria de los campos PRECIO * CANTIDAD:
Código SQL [-]
SELECT SUM(PRECIO*CANTIDAD) AS SUMATORIA FROM TU_TABLA
Es igual a la suma de los campos de la columna correspondiente al campo calculado calculo.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #15  
Antiguo 22-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Si gracias, pero la cuestion, con perdon, es como enlazas eso con el nuevo query.
Responder Con Cita
  #16  
Antiguo 22-08-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por anubis Ver Mensaje
Si gracias, pero la cuestion, con perdon, es como enlazas eso con el nuevo query.
Hola anubis.

Realmente no entiendo que es lo que deseas enlazar entre los queries...

La sumatoria de una columna es la suma de determinado campo (calculado o no) presente en todos los registros de un DataSet. Esa acumulación de multiplicaciones, en este caso (PRECIO * CANTIDAD) arroja un resultado, que se vá actualizando en el evento OnCalcFields del query 'aceites'.

Cita:
pero queria sumar toda la columna calculada...
Precisamente de eso se encargaría el segundo query: Hacer la suma de los productos por los cuales se conforma el valor del campo calculado.

Por ejemplo, mostrar la sumatoria del campo calculado cuando se presiona un TButton:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Suma: Double;
begin
  with Segundo_Query do
  begin
    Close;
    SQL.Text := 'SELECT SUM(PRECIO*CANTIDAD) AS TOTAL FROM TU_TABLA';
    Open;
    ShowMessage(FloatToStr(FieldByName('TOTAL').AsFloat));
    Close;
  end;
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #17  
Antiguo 22-08-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias, ya lo entendí.

hice un mini programa de prueba y funciona, y para actualizar la suma total lo he puesto en el query en el evento queryafterpost.

Me despiste con el query, pense que habia que crear otra tabla con sus campos y no que se podría hacer asi.

Muchas gracias de nuevo a los dos, se que a veces no me se explicar como debiera y por eso andamos dando vueltas.

saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
campo calculado (sum) no existe anubis Varios 7 18-10-2011 20:59:02
Campo Calculado novato_erick SQL 1 14-06-2011 23:06:02
Pasar un campo calculado a un campo del mismo DbGrid maravert Conexión con bases de datos 3 12-05-2006 00:31:30
Campo calculado sercornejov MySQL 3 09-08-2005 02:54:35
Campo de bd calculado davidgaldo MS SQL Server 3 20-05-2005 15:50:22


La franja horaria es GMT +2. Ahora son las 07:59:45.


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
Copyright 1996-2007 Club Delphi