Ir para conteúdo

POWERED BY:

Arquivado

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

alebae

Atualizar todos os dados de uma vez

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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.