Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, boa tarde!
Bem, tenho uma dúvida, ao menos para mim, complexa, mais lá vai:
Tenho um bd com os seguintes campos:
Nome, preco1, preco2, preco3, preco4, preco5, preco6, preco7, cod_p. Entre esses campos, o que mais interessa aqui é o preco1, pois ele refere ao preco a vista de um produto. Mas enfim, quando preciso atualizar a fórmula de cálculo de determinado produto, mudarão todos os preços desses campos certo? Aí que vem o problema, eu queria que calculasse baseado no valor à vista de cada produto, mas o que ocorre, é o cálculo a partir do primeiro valor a vista do primeiro registro da tabela, e ele calcula esse valor, para todos os outros produtos, causando o erro. Já tentei com Do until, For, enfim, nada conseguiu resolver meu problema. Como proceder?
http://forum.imasters.com.br/public/style_emoticons/default/blush.gif
Olá Mário.
É que seria o seguinte, todos os preços deverão estar no BD pois, serão mostrados todos eles numa página de consulta de preço. Bom, vou tentar explicar um pouco melhor minha dúvida.
Suponha que eu tenho dois produtos:
Produto A:
Preço a vista: 120,00
Produto B:
Preço a vista: 230,00
O problema é que está calculando o 120,00 tanto pro produto A quanto para o produto B. Gostaria que calculasse o 120,00 pro produto A e 230,00 para o B.
Melhor você armazenar o valor apenas à vista, já que tem uma fórmula para calcular os demais valores. Por exemplo, valor à vista é 100 reais, você vai armazenar somente 100 reais. Quando for exibir os demais valores, você utiliza a fórmula para calcular.
Agora se você quiser mesmo fazer da forma que está gerando erro, posta o código dessa parte do cálculo...
Olá hargon, obrigado pela resposta.
Mas, se eu armazenar somente o valor a vista, nas páginas que necessitam aparecer as formas de pagamentos calculadas, teria que alterar uma por uma, fazendo o cálculo em cada página. Eu gostaria somente alterar no banco, pois como essas páginas chamam através de recordset o campo da tabela. Ficaria mais fácil "manipular" isto. Mas, senão houver jeito...
Segue parte do código:
<%
preco2 = Request.Form("preco2")
preco3 = Request.Form("preco3")
preco4 = Request.Form("preco4")
preco5 = Request.Form("preco5")
preco6 = Request.Form("preco6")
preco7 = Request.Form("preco7")
tac = Request.Form("tac")
'AQUI EU FIZ A CONEXÃO COM O BD, SOMENTE TIREI ESTA PARTE AGORA..
atualizar = "update formulas set preco2 ='" & preco2 & "', preco3 ='" &preco3& "', preco4 ='" &preco4& "', preco5 ='" &preco5& "', preco6 ='" &preco6& "', preco7 ='" &preco7& "', tac ='" &tac& "' where id =" & 1
set rsatualizar = conexao.execute(atualizar)
%>
<%
selecionadois = "select * from tb_produtos"
set rsteste = conexao.execute(selecionadois)
selecionarum = "select * from formulas"
set rsselecionarum = conexao.execute(selecionarum)
Do until rsteste.eof
formula1 = rsselecionarum("preco2")
umamaisduas = (rsteste("preco1") * formula1)/3
formula2 = rsselecionarum("preco3")
seisvezes = (rsteste("preco1") * formula2)/6
formula3 = rsselecionarum("preco4")
dezvezes = (rsteste("preco1") * formula3)/10
tac = rsselecionarum("tac")
formula4 = rsselecionarum("preco5")
dozevezes = (rsteste("preco1")+tac)* formula4
formula5 = rsselecionarum("preco6")
vintequatrovezes = (rsteste("preco1") + tac )* formula5
formula6 = rsselecionarum("preco7")
trintaseisvezes = (rsteste("preco1") + tac )* formula6
atualizarprecos = "update tb_produtos set preco2 ='" &umamaisduas& "', preco3='"& seisvezes &"', preco4= '"&dezvezes&"', preco5='"&dozevezes&"', preco6= '"&vintequatrovezes&"', preco7 = '"&trintaseisvezes&"' where cod_p =" & 1
set atualizap = conexao.execute(atualizarprecos)
rsteste.movenext
loop
%>
Lembrando que todos os produtos possuem cod_p = 1. Isto foi uma "gambiarra" minha para poder alterar todos os preços de uma vez http://forum.imasters.com.br/public/style_emoticons/default/blush.gif
Hum..posso dar uma sugestão.
Porque você não faz uma Procedure ???
Utilize o Case no Select para fazer os cálculos.
:: Exemplo ::
Update from minha_tabela
Set Formula_1 Case =
When (Preco_1 * Formula1) / 3 then '3X' Else 'Formula_1' End,
Formula_2 Case =
When (Preco_2 * Formula2) / 6 then '6X' Else 'Formula_6' End
*
*
*
*
*
e assim por diante.
Você disse que todos os produtos possuem o mesmo ID, que é um.
O erro provavelmente está aí, pois você calcula preços novos e quando faz o UPDATE, atualiza em todos o valor novo. Por coincidência quando você realizar o cálculo do último produto, o resultado está sendo o preço à vista.
Para você fazer isso, cada produto terá que ter seu ID.
Bem, na verdade ele não é um ID, o formato de auto-numeração é o campo cod_produto, onde não coloco em questão pois eu quero alterar todos os registros. Para tal, utilizei um campo o cod_p, que contém o número 1, por padrão. Assim, fará a atualização de todos os produtos, e não de um só, caso usasse where cod_produto = " &Request(id), por exemplo.
Continuo com o mesmo problema, quero atualizar todos os registros de uma só vez (para isso tenho que descartar o código de auto-numeração), e que, em cada produto, calcule o sua fórmula de pagamento, com o seu respectivo preço a vista.
Olá Morpheus#2005, obrigado pela ajuda,
Mas, através da sua fórmula, continuaria com o problema, pois o preco1, que é o preço a vista, me dá somente o primeiro registro.
Se você colorar um valor padrão para identificar os produtos, não adianta você colocar dentro de um FOR, um DO WHILE... etc.. Só para você entender o que estou dizendo, faça o seguinte:
Troque essa linha:
set atualizap = conexao.execute(atualizarprecos)
Por essa:
**response.write atualizarprecos & "<br />"**
Veja o resultado. Se eu não estiver errado, você vai executar o update várias vezes até sair o LOOP. E cada vez que ele for executado, serão valores direferentes.Hum....Ok tem nas tabelas..
tb_produtos
Id - tp_produto -
tb_formulas
id - frm1 - frm2 - frm3 - frm4 - frm5 - frm6
Me explica uma coisa :
você quer jogar o preco em 5 forms e ele RE-calcular com Update ??
Mais ou Menos Assim ::
----------------------------------------------------------------------
Preço á vista | x2 | x3 |x4
100,00 200,00 300,00 400,00
150,00 300,00 450,00 600,00
50,00 100,00 150,00 200,00
----------------------------------------------------------------------
Tendo em vista que a tbl de formulas será o lugar aonde voce irá mudar os Percentuais % é claro.
Bom o q você pode fazer é uma trigger AFTER UPDATE ( SQL Server )
Fica então assim ::
Create Trigger [atualiza_preco] ON [dbo.tbl_produto]
FOR UPDATE
AS
Update From tbl_produto
Set
Preco_1 = Case
When (Select frm1 from tbl_formulas) * prc1 then prc1 else 'verificar' end
Preco_2 = Case
When (Select frm2 from tbl_formulas) * prc2 then prc2 else 'verificar' end
Preco_3 = Case
When (Select frm3 from tbl_formulas) * prc3 then prc3 else 'verificar' end
Depois faça o request.form normalmente ...
Good Luck !!!
o problema é que voce começou errado desde a estrutura do db por isso está se complicando agora pois tem que manter o erro até o fim
mas se quer assim vamos para o problema dos valores repetidos pois provavelemnte está faltando um move next ou algo assim para mudar o registro ou entao voce que nao ta mudando o valor a cada passagem do loop
Fala rapazes, dei uma alterada e funcionou corretamente!
Obrigado a todos. Mas só uma dúvida, se não for correto perguntar aqui, podem excluir este post, mas como seria a forma correta de montar o BD nestes casos. Somente jogar o preço a vista no BD, e o cálculo ser efetuado em cada página?
entao alebae
quando trabalhamos com DB, nao qeu seja proibido é que nao se faz necessario mesmo, nao armazenamos dados que podem ser obtidos atraves de outros campos
No seu caso voce armazena preços que poderiam ser obtidos do a vista ou entao se armazer idade se tem a data de nascimento
Isso é uma regra de normalização de banco de dados, existem varias outras
Isso mesmo... é claro que cada caso tem que ser analisado, mas na maioria das vezes é como o Mario falou.
Um exemplo a ser analisado são os posts dos usuários do Fórum. Através de uma consulta você consegue contar todos os posts do usuário. Agora é viável toda vez contar os posts ou manter um campo na tabela de usuários já com a contagem? Lembrando que existem vários usuários, cada um com centenas de post... o ideal é manter um campo e atualizar sempre que postado algo.
num caso como este do forum é realmente armazenado este numero mesmo sendo possivel conta-lo, mas mesmo assim nao é a mesma coisa pois nao é um campo que pode ser obtido de outro
Pra que ter valores armazenados no db que podem ser obtidos usando outro campo? isso fere regras de normalização de banco
Se os outros preços podem ser calculados a partir do preço a vista voce so precisaria armazenar este no db