Problemas para somar coluna de um dbgrid
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
Curtidas 0
Respostas
Emerson Nascimento
07/07/2010
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.
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.
GOSTEI 0
Cleberson Santos
07/07/2010
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.
GOSTEI 0
Emerson Nascimento
07/07/2010
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
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
GOSTEI 0
Cleberson Santos
07/07/2010
mas o campo TOTAL_FATURAMENTO pertence a tabela TB_D_FATURAMENTO.
GOSTEI 0
Cleberson Santos
07/07/2010
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;
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;
GOSTEI 0
Emerson Nascimento
07/07/2010
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.
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.
GOSTEI 0