duvida em manipulação dos valores de uma tabela
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
Respostas
Emerson Nascimento
01/08/2007
[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]
Barretoee
01/08/2007
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
Emerson Nascimento
01/08/2007
publique a estrutura das tabelas envolvidas pra que possamos tentar te ajudar de forma mais satisfatória.
Barretoee
01/08/2007
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
Barretoee
01/08/2007
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
Barretoee
01/08/2007
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
Barretoee
01/08/2007
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
Barretoee
01/08/2007
Barretoee
01/08/2007
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???
Barretoee
01/08/2007
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.....
Emerson Nascimento
01/08/2007
Barretoee
01/08/2007
é 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
Emerson Nascimento
01/08/2007
Barretoee
01/08/2007
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
Emerson Nascimento
01/08/2007
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;
Barretoee
01/08/2007
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
Emerson Nascimento
01/08/2007
ClientDataset.Close;
ClientDataset.Params.ParamByName(´CodPrefeitura´).AsString := combobox.text;
ClientDataset.Open;
Barretoee
01/08/2007
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
Barretoee
01/08/2007
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???
Emerson Nascimento
01/08/2007
SELECT orcamentos.Patrimonial FROM orcamentos WHERE (((orcamentos.Prefeitura)=:Prefeitura));
ADOQUERY1.Active := False; ADOQUERY1.Parameters.ParamByName(´Prefeitura´).Value := DBLookupComboBox1.Text; ADOQUERY1.Open; ADOQUERY1.Active := True;
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.
para isso precisamos conhecer suas tabelas: como você identifica os valores patrimoniais, tributários, etc.
Barretoee
01/08/2007
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
Barretoee
01/08/2007
-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 ???????
Barretoee
01/08/2007
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??
Barretoee
01/08/2007
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;
Barretoee
01/08/2007
em que ponto deste código, como e onde eu colocaria a instrução de inserção na tabela????
Barretoee
01/08/2007
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
Barretoee
01/08/2007
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:
Alguem pode me dar um help ai.... pq dedpois que conseguir fazer isso, resolvo grande parte dos meus problemas...
cordiais saudações
Emerson Nascimento
01/08/2007
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.
Barretoee
01/08/2007
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:
e quando boto pra rodar nada aparce no dbgrid.....
cara to sem saida geral
Emerson Nascimento
01/08/2007
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.
Barretoee
01/08/2007
COm a ajuda de vcs consegui implementar o código que eu desejava
SDS
Barretoee
01/08/2007
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