Diaclau 0 Denunciar post Postado Julho 11, 2007 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
marcio.theis 3 Denunciar post Postado Julho 12, 2007 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
Diaclau 0 Denunciar post Postado Julho 12, 2007 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
marcio.theis 3 Denunciar post Postado Julho 12, 2007 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
Diaclau 0 Denunciar post Postado Julho 12, 2007 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
marcio.theis 3 Denunciar post Postado Julho 12, 2007 Teria como mostrar a forma que esta o seu fonte neste procedimento ? Compartilhar este post Link para o post Compartilhar em outros sites
Diaclau 0 Denunciar post Postado Julho 12, 2007 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
marcio.theis 3 Denunciar post Postado Julho 12, 2007 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
Diaclau 0 Denunciar post Postado Julho 12, 2007 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