Ir para conteúdo

POWERED BY:

Arquivado

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

villas2

Update de campo - Reajuste de preços em percentual

Recommended Posts

Pessoal eu sei que pode parecer simples mas estou apanhando aqui feito cachorro e não consegui fazer.

 

Preciso reajustar uma tabela de preços com indices em percentual diferentes dependendo de outro campo.

 

tenho a seguinte tabela de exemplo:

 

ID | produto | hierarquia | valor

 

1 | produto1 | 1 | 100.00

2 | produto2 | 2 | 50.00

3 | produto3 | 2 | 20.00

 

Nos produtos que tem hierarquia = 1 , o reajuste tem que ser de 2,6% e nos de hierarquia = 2, será de 4,5%

 

O campo ID é a chave (interger) e o campo valor é decimal 13,2 - o resto é varchar OK ?!

 

Na tabela real eu tenho mais de 1500 registros e as hierarquias que tiveram reajuste de 2,6% são 40. As que tiverão reajuste de 4,5% tem umas 200 mais ou menos.

 

Estou usando o DW +PHP5 + MySQL.

 

Agradeço desde já uma boa alma que possa me explicar isso !

 

Muito Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso não esteja bem explicito, vou dizer no ponto que estou

 

Emperrei ai no LOOP E no calculo. antes disso tem um "SELECT * FROM reajuste" onde reajuste é o nome da tabela.

 

do { 
	$atualiza_rsTABNOVA = "
	UPDATE 
	reajuste 
	SET
	valor = valor + ((valor * 2.6)/100)
	WHERE hier = '1'
	";
	mysql_query($atualiza_rsTABNOVA);
} while ($row_rsTEST = mysql_fetch_assoc($rsTEST));

O lance é que tenho que varrer os registros da tabela e checando o que é hierarquia 1 e o que não é. Então teria que ter um LOOP ai certo ?!?!?!?

 

Valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos avançando. Estou fazendo alguma confu nos loops eu acho:

 

$reajuste1 = 2.6;
$reajuste2 = 4.5;
do {

IF ($row_rsTEST['hier'] = '1') {
 
	$atualiza_rsTABNOVA = "
	UPDATE 
	reajuste 
	SET
	valor = valor + ((valor * $reajuste1)/100)
	WHERE hier = '1'
	";
	mysql_query($atualiza_rsTABNOVA);
} ELSE {
	$atualiza_rsTABNOVA = "
	UPDATE 
	reajuste 
	SET
	valor = valor + ((valor * $reajuste2)/100)
	WHERE hier = '2'
	";
	mysql_query($atualiza_rsTABNOVA);
}

} while ($row_rsTEST = mysql_fetch_assoc($rsTEST));
mysql_free_result($rsTEST);

O resultado disso é um reajuste só na hierarquia = 1 e errado: 108.01 no lugar de 102.60

 

Brigadu

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom eu acho que tá quase ... inseri mais um registro para ficar mais interessante e modifiquei os valores para resultar sempre com 102,60 e 104,50:

 

ID | produto | hierarquia | valor

 

1 | produto1 | 1 | 100.00

2 | produto2 | 2 | 100.00

3 | produto3 | 2 | 100.00

4 | produto4 | 1 | 100.00

 

O IF anterior não funfou ai lendo alguns posts aqui do forum decidi que a melhor maneira é fazer seria com 2 UPDATES para este caso mas lembrando que são mais de 300 hierarquias no total e que sómente umas 40 (e isso tem que ir na condiçional) é que sofreram o reajuste de 2,6% - o resto 4,5%

 

O seguinte código altera os registros mas o calculo sai errado= para 2,6% está resultando 110,82 e para 4,5% retorna 119,24 ???

 

 

$reajuste1 = 2.6;
$reajuste2 = 4.5;
do {

	$atualiza_hier1 = "
	UPDATE 
	reajuste 
	SET
	valor = valor + ((valor * $reajuste1)/100)
	WHERE hier = '1'
	";
	mysql_query($atualiza_hier1);

	$atualiza_hier2 = "
	UPDATE 
	reajuste 
	SET
	valor = valor + ((valor * $reajuste2)/100)
	WHERE hier = '2'
	";
	mysql_query($atualiza_hier2);

} while ($row_rsTEST = mysql_fetch_assoc($rsTEST));
mysql_free_result($rsTEST);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que Bacalhau dos Infernos!!!

 

UPDATE reajuste SET

valor = valor *

CASE hier

When '1' Then '1.026'

When '1' Then '1.045'

Else '1'

end

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que Bacalhau dos Infernos!!!

 

UPDATE reajuste SET

valor = valor *

CASE hier

When '1' Then '1.026'

When '1' Then '1.045'

Else '1'

end

Amigo agradeço muito mas daria pra explicar um pouco melhor ? ... nunca vi esse 'end' ai num UPDATE. Isso tudo vai dentro de uma variável?

 

Presumo que seja um exemplo correto? ... então o When teria valores diferentes certo ??

 

Me desculpe a burrice mas nunca vi usar CASE, then, When ou end em um UPDATE em mysql.

Muito Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

UIA ... funcionou belezinha (por agora hehe) ... tenho que conferir registro po registro.

 

Como eu disse anteriormente, tenho mais de 300 hierarquia e apenas um grupo de umas 40, teriam o reajuste menor de 2,6% então eu inseri uma flag na tabela onde flag = 1 seriam os registros com reajuste menor.

 

Aqui vai o caso real pra quem quiser ver:

 

//  insere '1' onde o reajuste é 2,6%

$atualiza_flag = "
UPDATE 
TABELA 
SET
flag = '1'
WHERE 
tab_hier = '1784' OR
tab_hier = '1791' OR 
tab_hier = '1782' OR 
tab_hier = '1783' OR 
tab_hier = '6037' OR 
tab_hier = '1785' OR 
tab_hier = '1915' OR 
tab_hier = '1814' OR 
tab_hier = '2719' OR 
tab_hier = '2718' OR 
tab_hier = '2717' OR 
tab_hier = '1813' OR 
tab_hier = '2905' OR 
tab_hier = '2906' OR 
tab_hier = '2721' OR 
tab_hier = '2722' OR 
tab_hier = '6086' OR 
tab_hier = '2654' OR 
tab_hier = '2655' OR 
tab_hier = '2076' OR 
tab_hier = '2262' OR 
tab_hier = '2261' OR 
tab_hier = '2077' OR 
tab_hier = '2964' OR 
tab_hier = '3276' OR 
tab_hier = '2955' OR 
tab_hier = '2956' OR 
tab_hier = '2957' OR 
tab_hier = '2958' OR 
tab_hier = '2961' OR 
tab_hier = '2962' OR 
tab_hier = '2963' OR 
tab_hier = '2964' OR 
tab_hier = '2974' OR 
tab_hier = '2975' OR 
tab_hier = '2976' OR 
tab_hier = '2978' OR 
tab_hier = '2992' OR 
tab_hier = '2993' OR 
tab_hier = '2994' OR 
tab_hier = '2996' OR 
tab_hier = '3050' OR 
tab_hier = '3060' OR 
tab_hier = '3062' OR 
tab_hier = '3064' OR 
tab_hier = '3069' OR 
tab_hier = '3120' OR 
tab_hier = '3121' OR 
tab_hier = '3122' OR 
tab_hier = '3123' OR 
tab_hier = '3125' OR 
tab_hier = '3126' OR 
tab_hier = '3127' OR 
tab_hier = '3138' OR 
tab_hier = '3139' OR 
tab_hier = '3249' OR 
tab_hier = '3250' OR 
tab_hier = '3251' OR 
tab_hier = '3276' OR 
tab_hier = '3302' OR 
tab_hier = '4112' OR 
tab_hier = '4113' OR 
tab_hier = '4114' OR 
tab_hier = '4115' OR 
tab_hier = '4116' OR 
tab_hier = '4117' OR 
tab_hier = '4118' OR 
tab_hier = '4119' OR 
tab_hier = '4120' OR 
tab_hier = '4121' OR 
tab_hier = '4122' OR 
tab_hier = '4123' OR 
tab_hier = '4127' OR 
tab_hier = '4128' 
";
mysql_query($atualiza_flag);

E DEPOIS para o que não for das hierarquias acima flag = '2' e está NULL pois eu criei o campo agora:

 

$atualiza_flag = "
UPDATE 
TABELA
SET
flag = '2'
WHERE 
flag IS NULL
";
mysql_query($atualiza_flag);

então usei o script acima do amigo giesta:

$sql = "
UPDATE norton01032008_n SET
tab_vlr = tab_vlr * 
CASE flag
When '1' Then '1.026'
When '2' Then '1.045'
Else '1'
end
";
mysql_query($sql);

Funcionou mas não achei documentação desse CASE dentro de UPDATE e gostaria de saber.

 

Muito obrigado giesta ...

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.