Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diaclau

Somar registros

Recommended Posts

Boa Tarde!A dúvida é a seguinte:Tenho duas tabelas ORCAMENTO e ITENS, queria pergar o somatório do VALOR_TOTAL dos itens da tabela ITENS e salvar na tabela ORCAMENTO no campo TOTAL_PEDIDO. Tem como?Essas duas tabela estão relacionadas através do MestreDestails...Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser pode fazer via SQL mesmo... algo do tipo:

 

update orcamento  set orcamento.total_pedido = (select sum(itens.valor_total)											  from itens											  where itens.cod_orcamento = orcamento.cod_orcamento											  and itens.cod_orcamento = XXX)where orcamento.cod_orcamento = XXX

No XXX precisa passar o código do orçamento que deseja setar...

 

 

Mas se quiser fazer via aplicativo usando comando SQL, pode fazer...

 

qry.Close;qry.SQL.Clear;qry.SQL.Add('select sum(itens.valor_total) as Valor');qry.SQL.Add('from itens');qry.SQL.Add('where itens.cod_orcamento = XXX');qry.Open;tblOrcamento.Edit;tblOrcamentoTOTAL_PEDIDO.Value:=qry.FieldByName('VALOR').Value;tblOrcamento.Post;

Novamente no XXX precisa passar o código do orçamento...

 

Existem outras formas ainda de se fazer, usando while sobre tabelas e tudo, mas depende de como você quer fazer...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Optei pela segunda forma que você me apresentou, mas não está dando certo...Veja o que fiz:Criei uma query no dm com o nome qryValor, com a seguinte sql:

select PRECOTOTAL from ITENSORCwhere ID_ORCAMENTO=:ID_ORCAMENTO

o código q você me passou ficaria assim?

 dm.qryValor.Close;  dm.qryValor.SQL.Clear;  dm.qryValor.SQL.Add('select sum(itensorc.precototal) as Valor');  dm.qryValor.SQL.Add('from itensorc');  dm.qryValor.SQL.Add('where itensorc.id_orcamento = orcamento.id_orcamento');  dm.qryValor.Open;  dm.cdsOrc.Edit;  dm.cdsOrcVALORTOTAL.Value:=dm.qryValor.FieldByName('PRECOTOTAL').Value;  dm.cdsOrc.Post;

Na penúltima linha do código está dando o seguinte erro:[Error] USaida.pas(238): Incompatible types: 'TBcd' and 'Variant'Marcio muito obrigada por está me ajudando...Não sei onde coloco esse código, será q crio uma botão concluir orçamento?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode fazer duas coisas, uma delas seria adicionar o campo PRECOTOTAL na qryValor e iria ficar:

 

dm.cdsOrcVALORTOTAL.Value:=dm.qryValorPRECOTOTAL.Value;

Outra seria forçar para tudo sendo como Float...

 

dm.cdsOrcVALORTOTAL.AsFloat:=dm.qryValor.FieldByName('PRECOTOTAL').AsFloat;

No caso ainda é interessante adicionar algumas validações ai, para não ter problemas com campos nulos...

Algo do tipo...

 

dm.qryValor.Close;dm.qryValor.SQL.Clear;dm.qryValor.SQL.Add('select sum(itensorc.precototal) as Valor');dm.qryValor.SQL.Add('from itensorc');dm.qryValor.SQL.Add('where itensorc.id_orcamento = orcamento.id_orcamento');dm.qryValor.Open;if not dm.qryValor.IsEmpty then	begin	if not dm.qryValor.FieldByName('PRECOTOTAL').IsNull then		begin		dm.cdsOrc.Edit;		dm.cdsOrcVALORTOTAL.Value:=dm.qryValor.FieldByName('PRECOTOTAL').Value;		dm.cdsOrc.Post;		end;	end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando, mas não está dando certo...Acrescente um botão concluir orçamento, e coloquei esse última comando q você me passou nele...Estão sendo inserido noemalmente o registros na tab itensorc, mass quando clico no botão conluir o programa me retorna o seguinte erro:ORCAMENTO.ID_ORCAMENTOcolumn does not belongto referenced table.Que é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, vamos lá:na qry coloquei :

select PRECOTOTAL from ITENSORCwhere ID_ORCAMENTO=:ID_ORCAMENTO

e no código está assim:

procedure TfrmSaida.BtnConcluirClick(Sender: TObject);begin  inherited;  dm.cdsOrc.Open;  dm.cdsItens.First;  while not dm.cdsItens.Eof do begin  dm.qryValor.Close;  dm.qryValor.SQL.Clear;  dm.qryValor.SQL.Add('select sum(itensorc.precototal) as Valor');  dm.qryValor.SQL.Add('from itensorc'); // dm.qryValor.SQL.Add('where itensorc.id_orcamento = orcamento.id_orcamento');  dm.qryValor.Open;  if not dm.qryValor.IsEmpty then    begin    if not dm.qryValor.FieldByName('PRECOTOTAL').IsNull then        begin        dm.cdsOrc.Edit;        dm.cdsOrcVALORTOTAL.AsFloat:=dm.qryValor.FieldByName('PRECOTOTAL').AsFloat;        dm.cdsOrc.Post;        end;    end;  end;   dm.cdsItens.Next;   dm.cdsOrc.Closeend;

COm o código assim ele está me retornando a seguinte mensagem:qry.field PRECOTOTAL not foundDigo,qryValor.fieldPRECOTOTAL not found

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não precisa montar um while para este procedimento, pois o comando SUM já vai somar todos os registros, pode simplesmente fazer:

 

procedure TfrmSaida.BtnConcluirClick(Sender: TObject);begindm.qryValor.Close;dm.qryValor.SQL.Clear;dm.qryValor.SQL.Add('select sum(itensorc.precototal) as Valor');dm.qryValor.SQL.Add('from itensorc');dm.qryValor.SQL.Add('where itensorc.id_orcamento = ' + IntToStr(dm.cdsOrcCODIGO.Value))dm.qryValor.Open;if not dm.qryValor.IsEmpty then	begin	if not dm.qryValor.FieldByName('PRECOTOTAL').IsNull then		begin		dm.cdsOrc.Edit;		dm.cdsOrcVALORTOTAL.AsFloat:=dm.qryValor.FieldByName('PRECOTOTAL').AsFloat;		dm.cdsOrc.Post;		end;	end;end;
Não é necessário dar .Open ou .Close na dm.cdsOrc, pois se estiver posicionado no cadastro com ela aberta, não precisa mexer em mais nada, e ainda, você não estava passando para o SQL o campo codigo da tabela dm.cdsOrc, não teria como o SQL saber de qual orçamento você desejava somar, e ainda, o primeiro sql que você mostrou não sei onde esta colocando, mas se estiver colocando dentro de dm.qryValor não adianta de nada, pois o sql é repassado novamente...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Márcio, sei que é díficil entender desta forma sou iniciante e tem coisas q ainda não compreendo...

 

Por exemplo nem sei se está certa aforma q criei a qry, veja como foi:

 

Coloquei um sqldataset ligado a qry pos um datasource e o comando que te passei primeiro está no sqldataset, entendeu?

Estou perdida... preciso entregar ese trabalho amanhã e não sei oque fazer!

 

Estou enviando o código da unit, espero que possa me ajudar... muito obrigada!

 

 

unit USaida;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, UCadBase, DB, ImgList, ActnList, StdCtrls, Buttons, ExtCtrls,  Mask, DBCtrls, Grids, DBGrids;type  TfrmSaida = class(TfrmBase)    Label1: TLabel;    Label3: TLabel;    DBEdit3: TDBEdit;    Label5: TLabel;    Panel1: TPanel;    btnItens: TBitBtn;    GroupBox1: TGroupBox;    RadioButton1: TRadioButton;    RadioButton2: TRadioButton;    RadioButton3: TRadioButton;    btnOk: TBitBtn;    Panel2: TPanel;    Label8: TLabel;    DBEdit4: TDBEdit;    Label9: TLabel;    DBEdit5: TDBEdit;    Label10: TLabel;    DBEdit8: TDBEdit;    Label11: TLabel;    DBEdit6: TDBEdit;    Label12: TLabel;    DBEdit7: TDBEdit;    Panel3: TPanel;    Label4: TLabel;    Label6: TLabel;    DBEdit9: TDBEdit;    Label7: TLabel;    Label13: TLabel;    DBEdit1: TDBEdit;    DBEdit2: TDBEdit;    Label2: TLabel;    DBEdit10: TDBEdit;    BtnConcluir: TBitBtn;    DataSource2: TDataSource;    DBGrid1: TDBGrid;    DataSource3: TDataSource;    procedure actNovoExecute(Sender: TObject);    procedure actSalvaExecute(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure btnItensClick(Sender: TObject);    procedure btnOkClick(Sender: TObject);    procedure RadioButton2Click(Sender: TObject);    procedure RadioButton3Click(Sender: TObject);    procedure RadioButton1Click(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);    procedure BtnConcluirClick(Sender: TObject);  private    { Private declarations }    valida: integer;    i: integer;    VetCont: array [0..500] of real;  public    { Public declarations }  end;var  frmSaida: TfrmSaida;implementationuses Udm, UdmSearch, UPesqProd2, UPesqCli, UCodigos;{$R *.dfm}procedure TfrmSaida.actNovoExecute(Sender: TObject);begin  valida:= 0;  dm.cdsOrc.Open;  DataSource1.DataSet.Insert;  RadioButton2.Enabled:= true;  inherited;  if DBEdit2.text = '' then begin   DBEdit2.text:= datetostr(date);   DBEdit2.enabled:= false;  end;   btnNovo.Enabled:= false;   btnSalva.Enabled:= true;   btnOk.setfocus;   dm.cdsOrcSTATUS.Value:= 0;   end;procedure TfrmSaida.actSalvaExecute(Sender: TObject);var calcula, soma, icms: real;begin  if (DBEdit1.Text <> '') and (DBEdit2.Text <> '') and (DBEdit3.Text <> '') and  (DBEdit4.Text <> '') and (DBEdit5.Text <> '') and (DBEdit6.Text <> '') and  (DBEdit7.Text <> '') and (DBEdit8.Text <> '') then begin    dm.cdsItens.Open;    {Cálculo do preço de custo do produto acrescido do ICMS}    icms:= StrToFloat(DBEdit7.Text); {Captura valor do icms do DBEdit}    calcula:= StrToFloat(DBEdit6.Text) * icms/100; {Calcula ICMS do produto}    soma:= StrToFloat(DBEdit6.Text) + calcula; {Calcula valor de custo do produto acrescido do ICMS}    DBEdit9.Text:=  FloatToStr(soma * StrTofloat(DBEdit8.Text));    {Recebe o preço total de cada item que está entrando no estoque}    {Soma o valor total do pedido}    VetCont[i]:= (strtofloat(DBEdit9.Text) + VetCont[i - 1]);    Label13.Caption:= floattostr(VetCont[i]);    i:= i + 1;    datasource2.dataset.Post;    dm.cdsItens.First;  while not dm.cdsItens.Eof do begin    with dm.qryProd do    begin      Close;      SQL.Clear;      SQL.Add('UPDATE PRODUTO SET');      SQL.Add('QTDE = QTDE -' + dm.cdsItensQTDE.Text);      SQL.Add('WHERE ID_PROD = ' + dm.cdsItensID_PROD.Text);      ExecSQL;    end;      dm.cdsItens.Next;  end;   end  else begin    showmessage ('Favor preencher todos os campos acima!');  end;  btnSalva.Enabled:= false;  btnItens.Enabled:=true;end;procedure TfrmSaida.FormCreate(Sender: TObject);begin  inherited;  dm.cdsOrc.Close;end;procedure TfrmSaida.btnItensClick(Sender: TObject);begin  inherited;  valida:= 1;  if (DBEdit1.Text <> '') and (DBEdit2.Text <> '') and  (DBEdit3.Text <> '') then begin    DataSource2.DataSet.Insert;    btnItens.Enabled:=false;    RadioButton3.Enabled:= true;    RadioButton2.Enabled:= false;  end  else begin    showmessage ('Favor preencher todos os campos acima!');  end;  btnSalva.Enabled:= true;  dm.cdsItensSTATUS.Value:= 'p';end;procedure TfrmSaida.btnOkClick(Sender: TObject);begin  inherited;if DBEdit1.Text <> '' then begin  if (valida = 0) then begin    try    Application.CreateForm(TfrmPesqCliente, frmPesqCliente);    frmPesqCliente.ShowModal;    if frmPesqCliente.ModalResult = mrOk then begin      if frmPesqCliente.opcao = true then begin        dm.cdsOrcCLIENTE.Value:= dmSearch.cdsClienteRSRAZAOSOCIAL.AsString;      end;      if frmPesqCliente.opcao = false then begin       dm.cdsOrcCLIENTE.Value:= dmSearch.cdsClienteNFRAZAOSOCIAL.AsString;      end;    end;    finally      frmPesqCliente.Free;    end;  end;  inherited;  if (valida = 1) then begin   try    Application.CreateForm(TfrmPesqProd2, frmPesqProd2);    frmPesqProd2.ShowModal;    if frmPesqProd2.ModalResult = mrOk then begin      dm.cdsItensID_PROD.Value:= dmSearch.cdsPreProdID_PROD.Value;      dm.cdsItensNOME.Value:= dmSearch.cdsPreProdNOME.Value;      dm.cdsItensPRECOFINAL.Value:= dmSearch.cdsPreProdPRECOFINAL.Value;      dm.cdsItensICMS.Value:= dmSearch.cdsPreProdICMS.Value;    end;    finally      frmPesqProd2.Free;    end;  end;endelse beginshowmessage ('Favor solicitar uma novo pedido!');end;end;procedure TfrmSaida.RadioButton2Click(Sender: TObject);begin  inherited;  valida:= 0;end;procedure TfrmSaida.RadioButton3Click(Sender: TObject);begin  inherited;  valida:= 1;end;procedure TfrmSaida.RadioButton1Click(Sender: TObject);begin  inherited;  valida:= 2;end;procedure TfrmSaida.FormClose(Sender: TObject; var Action: TCloseAction);begin  inherited;  dm.cdsOrc.Close;end;procedure TfrmSaida.BtnConcluirClick(Sender: TObject);begin  begin  dm.qryValor.Close;  dm.qryValor.SQL.Clear;  dm.qryValor.SQL.Add('select sum(itensorc.precototal) as Valor');  dm.qryValor.SQL.Add('from itensorc');  dm.qryValor.SQL.Add('where itensorc.id_orcamento = ' + IntToStr(dm.cdsOrcID_ORCAMENTO.Value));  dm.qryValor.Open;  if not dm.qryValor.IsEmpty then    begin    if not dm.qryValor.FieldByName('PRECOTOTAL').IsNull then        begin        dm.cdsOrc.Edit;        dm.cdsOrcVALORTOTAL.AsFloat:=dm.qryValor.FieldByName('PRECOTOTAL').AsFloat;        dm.cdsOrc.Post;        end;    end;end;end;end.

Quem sabe você teria uma solução mais simples....

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.