villas2 0 Denunciar post Postado Março 8, 2008 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
villas2 0 Denunciar post Postado Março 8, 2008 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
villas2 0 Denunciar post Postado Março 8, 2008 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
villas2 0 Denunciar post Postado Março 8, 2008 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
giesta 29 Denunciar post Postado Março 9, 2008 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
villas2 0 Denunciar post Postado Março 9, 2008 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
villas2 0 Denunciar post Postado Março 9, 2008 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
giesta 29 Denunciar post Postado Março 9, 2008 CASE é igual o CASE/SWITCH de programaçao normal http://dev.mysql.com/doc/refman/5.0/en/case-statement.html Soh que la eles dizem q termina com "END CASE", Na verdade eh soh "END". Compartilhar este post Link para o post Compartilhar em outros sites