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)
-   -   Refrescar Campo Calculado (TOTAL) de Dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=87891)

mramos65 13-03-2015 19:38:30

Refrescar Campo Calculado (TOTAL) de Dbgrid
 
Uso Delphi 7 y tablas *.dbf, consultas Sql, Dataset; tengo dos tablas

produccion (maestro)
OP
PRODUCTO

entregas (detalle)
OP
SALIDA
ENTRADAS

La tabla detalle se actualiza cuando maestro cambia de OP
Calcule la suma de la columna ENTRADAS pasandolo a Edit1, no encuentro la forma de actualizarlo cada que se actualize el GRID detalle, algo asi como afterscroll? o como sería, espero explicarme bien y dar los datos suficientes.

SALUDOS

Casimiro Notevi 13-03-2015 20:00:54

En el change del dataset.
Pero si es calculado, donde siempre, en el onCalculate

mramos65 15-03-2015 20:50:32

Refrescar Campo Calculado (TOTAL) de Dbgrid
 
Hola:

de las dos opciones posibles acoto que la PRIMERA no logro ubicarla y es la que me serviría supongo,
ya que la SEGUNDA la he ultilizado para sumar campos calculados agregados en una columna del Dbgrid, aqui lo que realice es sumar una columna del Dbgrid detalle y pasarlo a Dbedit1, pero quiero que se actualice cada que cambie el Grid detalle, se podria?


GRACIAS Y SALUDOS:confused:

ecfisa 15-03-2015 21:47:35

Hola mramos65.

Tal como lo planteaste, para obtener la sumatoria de la columna ENTRADAS resultante de la relacion master-detail, vas a necesitar un query adicional para obtener ese resultado.

Suponiendo que tus queries se llamen "qyProduccion" y "qyEntregas", tendrías que hacer algo similar a este ejemplo:
Código Delphi [-]
procedure TForm1.qyEntregasAfterScroll(DataSet: TDataSet);
begin
  with TQuery.Create(nil) do
  try
    DataBaseName:= 'TU_ALIAS_O_RUTA_A_BD'; // (ruta o alias a tu base de datos)
    SQL.Text:= 'SELECT SUM(ENTRADAS)AS SUMA FROM ENTREGAS WHERE OP = :OP';
    ParamByName('OP').Value:= qyEntregas.FieldByName('OP').Value;
    Open;
    if not IsEmpty then
      Edit1.Text:= FieldByName('SUMA').AsString;
    Close;
  finally
    Free;
  end;
end;

Saludos :)

mramos65 16-03-2015 01:03:35

Hola ecfisa:
Gracias por tu ayuda:

[code]Tal como lo planteaste, para obtener la sumatoria de la columna ENTRADAS resultante de la relacion master-detail, vas a necesitar un query adicional para obtener ese resultado.

Suponiendo que tus queries se llamen "qyProduccion" y "qyEntregas", tendrías que hacer algo similar a este ejemplo:
Código Delphi [-]
procedure TForm1.qyEntregasAfterScroll(DataSet: TDataSet);
begin
  with TQuery.Create(nil) do
  try
    DataBaseName:= 'TU_ALIAS_O_RUTA_A_BD'; // (ruta o alias a tu base de datos)
    SQL.Text:= 'SELECT SUM(ENTRADAS)AS SUMA FROM ENTREGAS WHERE OP = :OP';
    ParamByName('OP').Value:= qyEntregas.FieldByName('OP').Value;
    Open;
    if not IsEmpty then
      Edit1.Text:= FieldByName('SUMA').AsString;
    Close;
  finally
    Free;
  end;
end;
Ya tengo los Dbgrid Maestro y Detalle, con las columnas correspondientes:

produccion (maestro)
OP
PRODUCTO

entregas (detalle)
OP
SALIDA
ENTRADAS

y ya sume la columna "ENTRADAS" del Dbgrid Detalle

Se creo un Dbedit1 al cual le asigne el valor de la suma de la columna "ENTRADAS"

La pregunta es como hago que el Dbedit1 se actualice al cambiar la OP de la tabla Maestro y por consiguiente el valor de la suma en la columna "ENTRADAS" de la tabla detalle?

Espero haberme explicado bien y MUCHAS GRACIAS.

ecfisa 16-03-2015 05:43:46

Hola mramos65.
Cita:

La pregunta es como hago que el Dbedit1 se actualice al cambiar la OP de la tabla Maestro y por consiguiente el valor de la suma en la columna "ENTRADAS" de la tabla detalle?
Si utilizas un TEdit como mencionaste en tu primer mensaje, usando el código del mensaje #4 en el evento AfterScroll de la tabla detalle (ENTREGAS).

Pero como ahora has cambiado el TEdit por un TDBEdit... la cosa cambia. Agrega otro componente Query y otro DataSource, es decir que tendrías 3 TQuery y 3 TDataSource:
Código:

qyProduccion <- dsProduccion
qyEntregas  <- dsEntregas
qySumatoria  <- dsSumatoria

Luego este código en el evento OnCreate del form:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
const
  DBNAME = 'TU_ALIAS_O_RUTA_A_BD';
begin
  // DataSources
  dsProduccion.DataSet:= qyProduccion;
  dsEntregas.DataSet  := qyEntregas;
  dsSumatoria.DataSet := qySumatoria;

  // Queries
  with qyProduccion do
  begin
    Close;
    DatabaseName:= DBNAME;
    SQL.Text:= 'SELECT OP, PRODUCTO FROM PRODUCCION';
    Open;  
  end;

  with qyEntregas do
  begin
    Close;
    DataBaseName:= DBNAME;
    DataSource  := dsProduccion;
    SQL.Clear;
    SQL.Add('SELECT OP, ENTRADAS, SALIDAS');
    SQL.ADD('FROM ENTREGAS WHERE OP = :OP');
    Open;
  end;

  with qySumatoria do
  begin
    Close;
    DatabaseName:= DBNAME;
    DataSource  := dsProduccion;
    SQL.Clear;
    SQL.Add('SELECT SUM(ENTRADAS) AS SUMA');
    SQL.Add('FROM ENTREGAS WHERE OP= :OP');
    Open;
  end;
  // DBEdit
  DBEdit1.DataSource:= dsSumatoria;
  DBEdit1.DataField := 'SUMA';
end;
Todo esto lo realicé en tiempo de ejecución a efectos de clarificar y evitar equívocos, pero podes hacerlo desde el Object Inspector en tiempo de diseño.

Saludos :)


La franja horaria es GMT +2. Ahora son las 19:10:58.

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