duvida em manipulação dos valores de uma tabela

Delphi

01/08/2007

Pessoal,
preciso criar uma tabela semelhante a esta que segue na imagem, no entanto nao estou conseguindo idealizar como devo fazer para obter os valores ´B/A´, ´C/B´, ´D/C´ e ainda a estimativa para o ano de 2007....

aguem tem uns toques para dar??






Barretoee

Barretoee

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

01/08/2007

B/A é exatamente isso: B dividido por A

[size=18:709bd54fb6][b:709bd54fb6]eis as fórmulas:[/b:709bd54fb6][/size:709bd54fb6]
B/A = RoundTo(((B / A) - 1) * 100, -2);
C/B = RoundTo(((C / B) - 1) * 100, -2);
D/C = RoundTo(((D / C) - 1) * 100, -2);

[b:709bd54fb6]a estimativa é calculada pela média obtida nos anos anteriores:[/b:709bd54fb6]
estimativa = RoundTo((B/A + C/B + D/C) / 3, -2);
valor_estimado = D * (1 + (estimativa / 100));

[size=18:709bd54fb6]trabalhando com a primeira linha de dados fornecidos:[/size:709bd54fb6]
B/A = RoundTo(((B / A) - 1) * 100, -2);
B/A = RoundTo(((42836 / 38654) - 1) * 100, -2)
B/A = RoundTo((1,1082 - 1) * 100, -2)
B/A = RoundTo(0,1082 * 100, -2)
[b:709bd54fb6]B/A = 10,82[/b:709bd54fb6]

C/B = RoundTo(((C / B) - 1) * 100, -2);
C/B = RoundTo(((43162 / 42836) - 1) * 100, -2)
C/B = RoundTo((1,0076 - 1) * 100, -2)
C/B = RoundTo(0,0076 * 100, -2)
[b:709bd54fb6]C/B = 0,76[/b:709bd54fb6]

D/C = RoundTo(((D / C) - 1) * 100, -2);
D/C = RoundTo(((45000 / 43162) - 1) * 100, -2)
D/C = RoundTo((1,0426 - 1) * 100, -2)
D/C = RoundTo(0,0426 * 100, -2)
[b:709bd54fb6]D/C = 4,26[/b:709bd54fb6]

estimativa = RoundTo((B/A + C/B + D/C) / 3, -2)
estimativa = RoundTo((10,82 + 0,76 + 4,26) / 3, -2)
estimativa = RoundTo(15,84 / 3, -2)
[b:709bd54fb6]estimativa = 5,28[/b:709bd54fb6]

valor_estimado = D * (1 + (estimativa / 100))
valor_estimado = 45000 * (1 + (5,28 / 100))
valor_estimado = 45000 * 1,0528
[b:709bd54fb6]valor_estimado = 47376[/b:709bd54fb6]
[size=18:709bd54fb6][color=darkred:709bd54fb6]
os valores podem sair diferentes em função do arredondamento, pois eu estou usando duas casas decimais para exibição dos percentuais. se for o caso, utilize apenas uma casa para que o valor saia mais próximo daquele exibido no seu exemplo.[/color:709bd54fb6][/size:709bd54fb6]
[size=18:709bd54fb6]se eu tivesse usado uma casa decimal:[/size:709bd54fb6]
estimativa = RoundTo((B/A + C/B + D/C) / 3, -2)
estimativa = RoundTo(([b:709bd54fb6]10,8[/b:709bd54fb6] + [b:709bd54fb6]0,8[/b:709bd54fb6] + [b:709bd54fb6]4,3[/b:709bd54fb6]) / 3, -2)
estimativa = RoundTo(15,9 / 3, -2)
[b:709bd54fb6]estimativa = 5,3[/b:709bd54fb6]

valor_estimado = D * (1 + (estimativa / 100))
valor_estimado = 45000 * (1 + (5,3 / 100))
valor_estimado = 45000 * 1,053
[b:709bd54fb6]valor_estimado = 47385[/b:709bd54fb6]


obs.: a função RoundTo() está na unit Math;[size=12:709bd54fb6][/size:709bd54fb6]


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Emerson, valew as dicas, vou tentar implementá-las e pelo visto vai dar tudo certo...


no entanto acho que fui confuso na minha pergunta e nao perguntei realmente o que queria saber.... meu problema maior não é com as operações matemáticas... mas sim como construir o banco de dados, relacionar as tabelas e ai sim realizar as operações.....ja tentei algumas opções mas ainda nao consegui fazê-lo.....

ou seja nao estou sabendo como pegar por exemplo o ´tributario´ do ano de 2003 e de 2004 direto do meu banco de dados e realizar a operação e ainda guardar o resultado no banco de dados....

Estou usando o Access e os componentes da paleta ADO para realizar a conexao...


eu consegui operar com os valores referentes ao mesmo ano, por exemplo calcular o subtotal e o totalgeral, mas como disse ainda nao consigo operar com dados referentes a anos distintos.... entao por hora meu problema está em ter acesso aos dados corretos pra efetuar os operações....

Acho que agora consegui explicar melhor o meu problemas...


SDS


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

creio que isso possa ser resolvido com uma instrução SQL.
publique a estrutura das tabelas envolvidas pra que possamos tentar te ajudar de forma mais satisfatória.


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Caro Emerson,

ja que vc tão gentilmente se dispõe a ajudar e como vc sugeriu estou postando o link na qual é possível baixar tudo que consegui fazer ate agora, que nada mais é do que cadastrar os valores e as prefeituras em tabelas...

Como disse estou iniciando no delphi a pouco, entao agradeço d+ a ajuda dos colegas.....

http://www.4shared.com/file/21154443/c31a795c/_2__programa.html


GOSTEI 0
Barretoee

Barretoee

01/08/2007

eu consegui criar uma relação no proprio banco de dados, acho que vai dar certo, no entanto na hra que vou rodar o código para ver se realemnte vai ficar como eu quero dá uma erro dezendo que é necessário criar um relacionamento para poder gravar os dados no banco. Estou me baseando em um código free que achei na net so que nao estou identificando qual parte do código faz isso... alguem pode me ajudar??? estou colocando todo meu código..

criei 3 tabelas: ANO, ORCAMENTO E PREFEITURA. dai no proprio banco de dados relacionei a tabela prefeitura com a tabela orcamento e no código coloquei um DBLookupComboBox para inserir a prefeitura junto com os dados do orçamento...

por via das duvidas ai vai o link de onde é possível baixar o programa
http://www.4shared.com/file/21183386/7fcd2852/Contbil.html

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, StdCtrls, Mask, DBCtrls, ADODB, Buttons, ExtCtrls; type TForm1 = class(TForm) ADOConnection1: TADOConnection; orcamentos: TADOTable; orcamentosCdigo: TAutoIncField; orcamentosAno: TWideStringField; orcamentosPrefeitura: TWideStringField; orcamentosTributario: TIntegerField; orcamentosPatrimonial: TIntegerField; orcamentosTransCorrentes: TIntegerField; orcamentosOutras: TIntegerField; orcamentosDeducaoFundef: TIntegerField; orcamentosSubTotal1: TIntegerField; orcamentosOperCredito: TIntegerField; orcamentosAlienBens: TIntegerField; orcamentosTransCapital: TIntegerField; orcamentosSubTotal2: TIntegerField; orcamentosTotalGeral: TIntegerField; Label1: TLabel; DBEdit1: TDBEdit; DataSource1: TDataSource; Label2: TLabel; DBEdit2: TDBEdit; Label3: TLabel; DBEdit3: TDBEdit; Label4: TLabel; DBEdit4: TDBEdit; Label5: TLabel; DBEdit5: TDBEdit; Label6: TLabel; DBEdit6: TDBEdit; Label7: TLabel; DBEdit7: TDBEdit; Label8: TLabel; DBEdit8: TDBEdit; Label9: TLabel; DBEdit9: TDBEdit; Label10: TLabel; DBEdit10: TDBEdit; pnl_Menu: TPanel; sbtn_Novo: TSpeedButton; sbtn_Salvar: TSpeedButton; sbtn_Alterar: TSpeedButton; sbtn_Cancelar: TSpeedButton; sbtn_Atualizar: TSpeedButton; sbtn_Primeiro: TSpeedButton; sbtn_Anterior: TSpeedButton; sbtn_Proximo: TSpeedButton; sbtn_Ultimo: TSpeedButton; Sbtn_Sair: TSpeedButton; DBLookupComboBox1: TDBLookupComboBox; DBLookupComboBox2: TDBLookupComboBox; ADOConnection2: TADOConnection; ano: TADOTable; anoAno: TWideStringField; DataSource2: TDataSource; ADOConnection3: TADOConnection; prefeitura: TADOTable; prefeituraPrefeitura: TWideStringField; DataSource3: TDataSource; procedure sbtn_NovoClick(Sender: TObject); procedure sbtn_SalvarClick(Sender: TObject); procedure sbtn_AlterarClick(Sender: TObject); procedure sbtn_CancelarClick(Sender: TObject); procedure sbtn_AtualizarClick(Sender: TObject); procedure Sbtn_SairClick(Sender: TObject); procedure sbtn_PrimeiroClick(Sender: TObject); procedure sbtn_AnteriorClick(Sender: TObject); procedure sbtn_ProximoClick(Sender: TObject); procedure sbtn_UltimoClick(Sender: TObject); procedure orcamentosCalcFields(DataSet: TDataSet); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.sbtn_NovoClick(Sender: TObject); begin if orcamentos.State in [dsBrowse] Then begin DBEdit1.SetFocus; orcamentos.Insert; end else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_SalvarClick(Sender: TObject); begin if not(orcamentos.State in [dsBrowse]) Then orcamentos.Post else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_AlterarClick(Sender: TObject); begin if (orcamentos.State in [dsBrowse]) AND (orcamentos.RecordCount > 0) Then begin DBEdit1.SetFocus; orcamentos.Edit; end else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_CancelarClick(Sender: TObject); begin if not(orcamentos.State in [dsBrowse]) Then orcamentos.Cancel else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_AtualizarClick(Sender: TObject); begin if not(orcamentos.State in [dsBrowse]) Then orcamentos.Cancel; orcamentos.Close; orcamentos.Open; end; procedure TForm1.Sbtn_SairClick(Sender: TObject); begin close; end; procedure TForm1.sbtn_PrimeiroClick(Sender: TObject); begin if orcamentos.State in [dsBrowse] Then orcamentos.First else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_AnteriorClick(Sender: TObject); begin if orcamentos.State in [dsBrowse] Then orcamentos.Prior else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_ProximoClick(Sender: TObject); begin if orcamentos.State in [dsBrowse] Then orcamentos.Next else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.sbtn_UltimoClick(Sender: TObject); begin if orcamentos.State in [dsBrowse] Then orcamentos.Last else ShowMessage(´Operação Não Disponível!´); end; procedure TForm1.orcamentosCalcFields(DataSet: TDataSet); begin orcamentosSubTotal1.Value:=orcamentosPatrimonial.Value+orcamentosTransCorrentes.Value+orcamentosOutras.Value+orcamentosDeducaoFundef.Value; orcamentosSubTotal2.Value:=orcamentosOperCredito.Value+orcamentosAlienBens.Value+orcamentosTransCapital.Value; orcamentosTotalGeral.Value:=orcamentosSubTotal1.Value+ orcamentosSubTotal2.Value; end; procedure TForm1.FormCreate(Sender: TObject); begin end; end.



GOSTEI 0
Barretoee

Barretoee

01/08/2007

iai pessoal,

Alguem poderia me ajudar a concluir meu código de modo que eu consiga gravar com sucesso as informações na banco de dados???


SDS


GOSTEI 0
Barretoee

Barretoee

01/08/2007

bom pessoal,

ja consegui criar o relacionamento das tabelas assim como tambem ja consigo gravar todos os dados de interessa no meu banco de dados, essa etapa ja foi cumprida....

agora eu preciso operar com alguns valores, emerson.en ja me deu umas dicas, mas eu preciso saber como iniciar o procediemento, ou seja,
é necessário inserir um componente query??
onde posso salvar os rsultados das operações matemáticas??

preciso de umas dicas...

Ps. todas as operações que preciso realizar ja foram expostas nas primeiras perguntas... como disse o emerson.en ja deu uns toques, mas preciso de algo mais para conseguir dar procem]dimento aos calculos...


SDS


GOSTEI 0
Barretoee

Barretoee

01/08/2007

sobe


GOSTEI 0
Barretoee

Barretoee

01/08/2007

opa pessoal, mais uma vez eu aqui....

ja consegui dar inicio as minhas instruções SQL...no entanto uma nova dúvida surgiu... como eu ja disse eu tenho duas tabela relacionadas... uma delas prefeitura e outra orçamentos..então cada prefeitura tem o seu conjunto de orçamentos como mostrada naquela figura la em cima....

MInha dúvia é como posso filtrar e selecionar corretamente os campos por exemplo, o tributário de cada prefeitura???


GOSTEI 0
Barretoee

Barretoee

01/08/2007

eu pensei em fazer o seguinte: como na tabela orcamentos ha um campo chamado CodPrefeitura onde cada prefeitura tem seu cógido usar um WHERE ficando o código assim
SELECTPatrimonial FROM orcamentos WHERE CodPrefeitura =1;
mas ta dando esse erro:
Instrução SQL inválida ´DELETE´, ´INSERTE´, ´PROCEDURE´, ´SELECT´ OU ´UPDATE´ esperado


mas dessa forma eu teria que fazer a seleção para apenas as prefeituras cadastradas ficando portanto impossível fazer essa operação para todas as prefeituras, inclusive as novas prefeituras que serão cadastradas.... alguem podee me dar uma segestão.....


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

o erro deve ser pela falta de espaço entre select e patrimonial


GOSTEI 0
Barretoee

Barretoee

01/08/2007

ok ok

é isso mesmo, essa eu consegui resolver

Meu problema agora consiste no seguinte: cada prefeitura teu seu conjunto de orçamentos, e cada prefeitura é identificada por um numero ´CodPrefeitura´ dai eu queria fazer de modo que as operações fossem feitas para cada prefeitura.... e se eu fizer como citei nao vou conseguir realizar o pocedimentos para as novas prefeituras cadastrtadas...


alguem tem dicas???
Estou u sando a paleta ADO...

SDS


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

como você identifica os valores tributários, patrimoniais, transferências, etc?


GOSTEI 0
Barretoee

Barretoee

01/08/2007

como você identifica os valores tributários, patrimoniais, transferências, etc?


Emerson, nao entendi sua pergunta...

mas o que desejo fazer é que na condição WHERE eu consiga entrar por exemplo com o nome da prefeitura ou com o código dela, de maneira que eu consiga mostrar os orçamentos de cada prefeitura


SDS


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

se eu entendi a sua necessidade, acho que a solução é:

SELECT Patrimonial FROM orcamentos WHERE CodPrefeitura = :CodPrefeitura

daí você preenche o parâmetro CodPrefeitura com o valor desejado. Não trabalho com ADO, mas se você estiver utilizando ClientDatasets:
1- coloque a instrução ´SELECT Patrimonial FROM orcamentos WHERE CodPrefeitura = :CodPrefeitura´ na propriedade Command do ClientDataset

2- passe o valor desejado para o parâmetro:
//motra os dados da prefeitura 1
ClientDataset.Close;
ClientDataset.Params.ParamByName(´CodPrefeitura´).AsInteger := 1;
ClientDataset.Open;

//motra os dados da prefeitura 2
ClientDataset.Close;
ClientDataset.Params.ParamByName(´CodPrefeitura´).AsInteger := 2;
ClientDataset.Open;


GOSTEI 0
Barretoee

Barretoee

01/08/2007

tudo bem emerson..

mas me diga uma coisa.... se eu entendi certo com o código que vc me passou eu so teria acesso as 2 primeiras prefeituras.... e as demais?? tenho que repetir o código tantas quantas sejam as prefeituras???

Não há a possibilidade de a condição ser estabelecida por meio de um ´combobox´???

SDS


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

sim. há. você preenche o combobox com as prefeituras disponíveis e, no OnChange desse combobox, faz:
ClientDataset.Close;
ClientDataset.Params.ParamByName(´CodPrefeitura´).AsString := combobox.text;
ClientDataset.Open;


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Bom pessoal ja que consegui vou postar aqui como fiz....talvez sirva para alguem....

Usando o ADOQuery na propriedade SQL coloquei o seguinte
SELECT orcamentos.Patrimonial
FROM orcamentos
WHERE (((orcamentos.Prefeitura)=:Prefeitura));


onde ´Prefeitura´ é uma variável

daí Cliando paremeters vc vai observar que ´Prefeitura´ está la... mas não mexi em nada...

Daí botei um DBLookupComboBox1 fiz as devidas ligações com o banco de dados e no evento OnClick coloquei o seguinte:
ADOQUERY1.Active := False;
      ADOQUERY1.Parameters.ParamByName(´Prefeitura´).Value := DBLookupComboBox1.Text;
      ADOQUERY1.Open;
      ADOQUERY1.Active := True;


deu certo....
muito bom...
SDS


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Agora meu problema consiste no seguinte::


como havia dito preciso fazer alguma operações matemáticas com os valores cadastrados....

São varias operações feitas da mesmo forma por exemplo:
Dividir o Patrimonial do ano 2004 pelo patrimonial do ano 2003
Dividir o Patrimonial do ano 2005 pelo patrimonial do ano 2004
.
.
.
.
Dividir o Tributário do ano 2004 pelo Tributário do ano 2003
Dividir o Tributário do ano 2005 pelo Tributário do ano 2004

e assim por diante...

Alguem???


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

Bom pessoal ja que consegui vou postar aqui como fiz....talvez sirva para alguem.... Usando o ADOQuery na propriedade SQL coloquei o seguinte
SELECT orcamentos.Patrimonial
FROM orcamentos
WHERE (((orcamentos.Prefeitura)=:Prefeitura));
onde ´Prefeitura´ é uma variável daí Cliando paremeters vc vai observar que ´Prefeitura´ está la... mas não mexi em nada... Daí botei um DBLookupComboBox1 fiz as devidas ligações com o banco de dados e no evento OnClick coloquei o seguinte:
ADOQUERY1.Active := False;
      ADOQUERY1.Parameters.ParamByName(´Prefeitura´).Value := DBLookupComboBox1.Text;
      ADOQUERY1.Open;
      ADOQUERY1.Active := True;
deu certo.... muito bom... SDS

vamos corrigir algumas redundâncias no seu código:
SELECT Patrimonial
FROM orcamentos
WHERE Prefeitura =:Prefeitura;


ADOQUERY1.Close;
ADOQUERY1.Parameters.ParamByName(´Prefeitura´).Value := DBLookupComboBox1.Text;
ADOQUERY1.Open; // use Active ou Close/Open.


Agora meu problema consiste no seguinte: como havia dito preciso fazer alguma operações matemáticas com os valores cadastrados....

para isso precisamos conhecer suas tabelas: como você identifica os valores patrimoniais, tributários, etc.


GOSTEI 0
Barretoee

Barretoee

01/08/2007

para isso precisamos conhecer suas tabelas: como você identifica os valores patrimoniais, tributários, etc.



emerson, não entendi o que se diz quanda pergunta como identifico os valores.....

Mas, de qualquer forma vou tentar explicar... o que desejo fazer de forma básica é operar com os valores, qualquer um. Preciso fazer uma divisão entre valores de anos diferentes...

Sendo mais claro preciso fazer o seguinte: tributario2004/tributario2003
tributario2005/tributario2004 e assim por diante

mas se for necessário segue um link para baixar minha tabela
http://www.4shared.com/file/21541061/890449ba/Base.html

SDS


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Caso ainda não tenha sido claro, minha tabela está +- assim:


-Ano--------Patrimonial----------Tributario
2003----------5000------------------2500
2004----------6000------------------3500
2005----------7000------------------7000

daí é repciso fazar um estimativa de crescimento anual fazendo o seguinte:

Patrimonial2004/Patrimonial2003
Patrimonial2005/Patrimonial2004

daí meu problema é que não estou conseguindo realizar a operação de divisão........ja procurei em vários sites por exemplos... em outros fóruns tb, mas ainda nao consegui implementar isso...

alguem podia me ajudar ???????


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Simplificando...
minha tabela é essa ai em baixo.... observe que ´B/A´, na quarta coluna, é igual aos valores de ano 2004 sobre os valores 2003.....

Acho que agora olhando para a figura da pra entender o que eu quero...

Sera que da pra fazer??



GOSTEI 0
Barretoee

Barretoee

01/08/2007

Bom pessoal,

Com ajuda dos nobres colegas dos foruns que tratam de delphi, consegui implementar mais essa parrte do meu código e ai vai o código de interessar a alguem

SELECT Ano, (Tributario*100/(SELECT Tributario FROM orcamentos B WHERE B.Ano=A.Ano-1)-100),Patrimonial
FROM orcamentos A
WHERE Prefeitura=:Prefeitura;



GOSTEI 0
Barretoee

Barretoee

01/08/2007

Agora alguem podia me ajudar, a inserir todos esses dados oriundos das operções matemáticas em uma nova tabela???

em que ponto deste código, como e onde eu colocaria a instrução de inserção na tabela????


GOSTEI 0
Barretoee

Barretoee

01/08/2007

up


GOSTEI 0
Barretoee

Barretoee

01/08/2007

INSERT INTO estimativas
SELECT Ano, (Tributario*100/(SELECT Tributario FROM orcamentos B WHERE B.Ano=A.Ano-1)-100),Patrimonial
FROM orcamentos A
WHERE Prefeitura=:Prefeitura;


Tentei fazer assim mas da erro na sintaxe do ´INSERT INTO´ a tabela estimativas tem 3 campos justamente para rececber os valores calulados na instrução SQL acima....


alguem pode me mostra ondee estou errando??

SDS


GOSTEI 0
Barretoee

Barretoee

01/08/2007

bom pessoal, acho que estou evoluindo, mas ainda nao consigo realizar que que desejo, entao fiz o seguinte, como estou usando o ACCESS fui estudar um pouco sobre ele e como fazer as consultas, daí cheguei a seguinte situação:

construi uma consuta com acrescimo direto no ACCESS e o código resultante foi esse:

INSERT INTO estimativas ( Patrimonial )
SELECT (Tributario*100/(SELECT Tributario FROM orcamentos B WHERE B.Ano=A.Ano-1)-100)
FROM orcamentos AS A;


quando eu faço essa consulta direto no ACCESS os dados sao gravados com sucesso na tabela estimativas....

mas quando tento colar esse codigo no delphi da o seguinte erro:
ADOQuery1:CommandText does not return a result set


Alguem pode me dar um help ai.... pq dedpois que conseguir fazer isso, resolvo grande parte dos meus problemas...

cordiais saudações


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

provavelmente você está fazendo ADOQuery1.Open ou ADOQuery1.Active := True.
o correto é fazer ADOQuery1.Execute (ou ExecSQL. não conheço esse componente).

isso ocorre com comandos INSERT, DELETE e UPDATE.
Open/Active deve ser utilizado para retorno de registros, ou seja: SELECT.


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Fiz assim:

Na consulta SQL:
INSERT INTO  estimativas (Expr1000, Patrimonial)
SELECT Patrimonial, (Tributario*100/(SELECT Tributario FROM orcamentos B WHERE B.Ano=A.Ano-1)-100)
FROM orcamentos A
WHERE Prefeitura=:Prefeitura;


No evento OnClick do DbLuckUpComboBox:

procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin
      ADOQUERY1.Active := False;
      ADOQUERY1.Parameters.ParamByName(´Prefeitura´).Value := DBLookupComboBox1.Text;
      //ADOQUERY1.Active := True;
      ADOQUERY1.ExecSQL;
end;


Quando tento colocar o propriedade Active para True da o mesmo erro:
ADOQuery1:CommandText does not return a result set


e quando boto pra rodar nada aparce no dbgrid.....

cara to sem saida geral


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

Open/Active deve ser utilizado para retorno de registros, ou seja: SELECT.


como já havia sido informado, não use Open/Active apra comandos INSERT, DELETE ou UPDATE.

// insere os registros na tabela ESTIMATIVAS
ADOQuery1.CommandText :=
  ´INSERT INTO estimativas ( Patrimonial ) ´+
  ´SELECT (Tributario*100/(SELECT Tributario ´+
  ´FROM orcamentos B WHERE B.Ano=A.Ano-1)-100) ´+
  ´FROM orcamentos AS A´;
ADOQuery1.ExecSQL;

// abre a tabela ESTIMATIVAS
ADOQuery1.CommandText :=
  ´SELECT * ´+
  ´FROM ESTIMATIVAS ´
ADOQuery1.Active := True;

note que para abrir a tabela é preciso alterar novamente a instrução SQL, de modo a ser uma instrução SELECT.
e eu acho que você está complicando algo que aparenta ser bem mais simples...
se você puder passar o banco de dados com dados consistentes eu faço um exemplo pra você.

P.S.: passe dados consistentes, mas não precisam ser dados reais.


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Nobres colegas do fórum, gostaria de expressar meus agradecimentos a todos que contribuiram para o esclarecimento das minhas dúvidas neste tópico que criei para tratar de instruções SQL....

COm a ajuda de vcs consegui implementar o código que eu desejava


SDS


GOSTEI 0
Barretoee

Barretoee

01/08/2007

Olha eu aqui de novo pertubando os colegas, mas é o seguinte:

Como havia dito consegui fazer todas as operações e salvá-las na nova tabela, mas o que está acontecendo é o seguinte.... a cada resultado de uma operação o delphi atribui o nome ´Expr1000´, ´Expr1001´ e assim por diante, entao para que os dados pudessem ser gravados na tabela tive que criar os campos com esses mesmos nomes.... Existe alguma forma de mudar esses nomes atribuídos pelo delphi???

Como os colegas ja estao familiarizados com minha tabela vou explicar a nova situação....

Se vcs observarem na tabela da pagina 1 os valores para o ano de 2007 são estimados atraves dos anos anteriores da seguinte forma: [b:7a88ef0e1d][u:7a88ef0e1d]-exemplo pra o campo tributario-[/u:7a88ef0e1d][/b:7a88ef0e1d] Média aritmética dos Campos B/A, ja calculos como foi explicado, vezes o tributario do ano de 2006..... mas como disse o delphi atribui nomes aos resultados das operações, entao quando tentei fazer :

SELECT AVG(Expr1000)


aparece um erro dizendo que a ´operação de várias etapas gerou erro´

eu acredito que seja pelo fato de o programa estar tentanto atribuir o mesmo nome Expr1000 ao resultado dessa media...

Alguem podee dar uma força...


simmmm..........
Tem como eu pegar apenas o [b:7a88ef0e1d]tributario do ano de 2006[/b:7a88ef0e1d] e multiplicar pela media de [b:7a88ef0e1d]B/A dos ultimos anos[/b:7a88ef0e1d]???????

SDS


GOSTEI 0
POSTAR