Fórum Problemas para somar coluna de um dbgrid #380946

07/07/2010

0

Caros colegas, Estou com um problema em um formulário mestre-detalhe tenho um campo chamado Total_Frete e outro campo chamado Total_faturamento onde o tota_faturamento deve receber a soma dos valores de Total_frete fiz isso em uma Stored Procedure no firebird mas nao esta somando segue abaixo o codigo na SP utilizada no delphi chamo esta SP atraves de uma IBSP da palheta Interbase: begin select sum(TOTAL_FRETE) from tb_d_faturamento where ID_FATURAMENTO=:codigo INTO :soma; update tb_d_faturamento set TOTAL_FATURAMENTO=:soma where ID_FATURAMENTO=:CODIGO; suspend; end
Cleberson Santos

Cleberson Santos

Responder

Posts

08/07/2010

Emerson Nascimento

begin
  select sum(TOTAL_FRETE) from tb_d_faturamento
  where ID_FATURAMENTO=:codigo INTO :soma;

  update tb_d_faturamento set TOTAL_FATURAMENTO=:soma
  where ID_FATURAMENTO=:CODIGO;
end


analisando a stored procedure, creio que não há soma a fazer mesmo.

pelo que eu entendi acontecerá o seguinte, tento em mente os seguintes registros, E SUPONDO QUE ID_FATURAMENTO seja primary key:

tb_d_faturamento
----------------
id_faturamento    total_frete    total_faturamento
1                       25.00                    0
2                       14.00                    0
3                      145.80                    0
4                       67.32                    0


o que está sendo feito na stored procedure?
ela soma a coluna total_frete e coloca o valor na coluna total_faturamento. imagine que eu passei como codigo o valor 3

a variável soma receberá o valor 145.80 (porque você está mandando somar somente 1 registro, o de id_faturamento=3)

depois a SP pega esse valor obtido e coloca na coluna total_faturamento.

era melhor fazer somente:
update tb_d_faturamento set TOTAL_FATURAMENTO = TOTAL_FRETE
where ID_FATURAMENTO=:CODIGO;

se você publicar a estrutura da sua tabela talvez possamos dar uma melhor solução.

para obter o resultado desejado talvez devam ser necessárias outras tabelas ou ainda utilizar outro campo no filtro, que não o id_faturamento.

Responder

Gostei + 0

08/07/2010

Cleberson Santos

Certo então vamos lá o ID_FATURAMENTO é a chave primaria da tabela TB_Faturamento que está ligada com a TB_D_FATURAMENTO, onde TB_FATURAMENTO é o "cabeçalho"do faturamento e a TB_D_FATURAMENTO são os "detalhes", sendo o relacionamento mestre-detalhe controlado pelo ID_FATURAMENTO, então para cada registro de ID_FATURAMENTO podem existir varios itens nos detalhes do faturamento com se fosse uma venda onde temos um valor unitario que é multiplicado pela quantidade e temos o TOTAL_FRETE e no final o TOTAL_FATURAMENTO recebe o valor que esta no parametro de saída :soma. Fiz este mesmo procedimento e deu certo como na tela abaixo:   Usei uma SP semelhante e ela me joga o total despesa, na tela abaixo segue a parte em que eu estou tentando e não esta dando certo:   Se houver outra forma de jogar a soma do total do frete em total geral. Desde já agradeço.
Responder

Gostei + 0

08/07/2010

Emerson Nascimento

então talvez a atualização esteja sendo feita na tabela errada.


begin
  select sum(TOTAL_FRETE) from tb_d_faturamento
  where ID_FATURAMENTO=:codigo INTO :soma;

  update tb_faturamento set TOTAL_FATURAMENTO=:soma
  where ID_FATURAMENTO=:CODIGO;
end
Responder

Gostei + 0

08/07/2010

Cleberson Santos

mas o campo TOTAL_FATURAMENTO pertence a tabela TB_D_FATURAMENTO.
Responder

Gostei + 0

08/07/2010

Cleberson Santos

No delphi estou chamando a SP da seguinte forma:
PROCEDURE TF_FATURAMENTO.SOMA_FATURAMENTO;

BEGIN
     DM_PRINCIPAL.IBSP_SOMA_FATURAMENTO.Params.ParamByName('CODIGO').Value:=DM_PRINCIPAL.IBQ_C_FATURAMENTOID_FATURAMENTO.Value;
DM_PRINCIPAL.IBSP_SOMA_FATURAMENTO.ExecProc;
END;


e no evento ONCALCFIELDS da query eu chamo a procedure:

procedure TDM_PRINCIPAL.IBQ_D_FATURAMENTOCalcFields(DataSet: TDataSet);
begin

    F_FATURAMENTO.SOMA_FATURAMENTO;
end;
Responder

Gostei + 0

09/07/2010

Emerson Nascimento

se você já tem o campo com o total do frete de cada linha, crie um campo Aggregate para obter o total geral.

para criar o campo aggregate, vá em Fields Editor > New Field > Aggregate e, na propriedade expression desse novo campo, digite sum(campo_a_ser_somado). no seu caso, ficaria sum(total_frete).

daí basta colocar um dbtext ligado ao campo para exibir o resultado.

lembre-se que o campo aggregate não é um campo físico.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar