Flavio
Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:09PM
Olá, pessoal!
É o meu primeiro tópico e postagem aqui...
Bom estou precisando de uma ajuda para fazer com o o php faça uma análise entre varias colunas (na horizontal) e coloque o resultado na última coluna com o menor valor... Já vi um tópico aqui parecido, mas não deu certo; onde a execução era feita no sql com o mim()...

Achei algo ao pesquisar na net em arrays e, fazendo alguns teste vi que era o que precisava... no entando, o código somente fazia mensão somente em uma coluna em comparação a um numeral e, quando coloquei vaios campos não funcionou... Segue exemplos:

O que preciso é basicamento igual a formula do Excel | =mínimo(a1:a12).

é praticamente isto que preciso: <? echo min(2, 3, 1, 6, 7); // 1 ?> só que ao envés de colocar numerais ficaria assim: <? echo min($forn01, $forn02, $forn03, $forn04, $forn05); // 0,98 ?> sendo que cada coluna tem um preço 1,10, 0,98, 1,25, 1,45, 1,74...

Como poderia montar isto? Já fiz varios teste e não dá certo...
Chegou perto quando eu coloquei $val = min($forn01,9); aí ele fazia uma comparação entre o valor da coluna e o numeral; se o preço for menor que 9 ele aparece, mas se colocar como menciona acima, não dacerto >>> $val = min($forn01,$forn02); <<<

Desde já agradeço a atenção e ajuda de todos.
Até+
Jayme A. C. Gimenez
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:16PM
Só duas coisinhas antes de tentarmos pensar mais fundo:

1) Já tentou colocar tudo fora do echo, achar o mínimo lá e, só depois dar echo no mínimo achado?

2) Vc está usando ponto como separador da fração? Número, no PHP, tem que ser 1.25 , e não 1,25.
Flavio
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:30PM
Olá, Jayme, obrigado pela resposta!

Estou usando assim: $val = min($forn01,$forn02);
E no banco está com "," e não ".".
Diego R. Mengarda
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:37PM
faça assim

$forn01 = str_replace($forn01, "," ,".");
$forn02 = str_replace($forn02, "," ,".");
$val = min($forn01,$forn02);

echo $val;
Jayme A. C. Gimenez
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:48PM
Se no banco está 1,25 , isso vai trazer problemas. Porque isso é uma string (uma "palavra"), não um número.

Não tem como acertar isso no bd, trocando o campo para float? (um número que permite decimal).

Claro que, mudando isso, talvez tenha, também, que mexer em alguma coisa do código. Mas vale a pena, para evitar dores de cabeça e um mar de gambiarras rsrsrsrsrs futuras.
Flavio
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:48PM
Veja minha estrutura abaixo, pois acho que vai dar conflito porque já está sendo definido o $forn01 e $forn02...

====== meu código =======

$sql = "SELECT * FROM cot_tabela_final ORDER BY descricao ASC";
[...]
$paginacao->__start($banco, $sql, $config);
[...]
while($dados = mysql_fetch_array($paginacao->getResult())){

$codigo = $dados["codigo"];
$desc = $dados["descricao"];
$forn01 = $dados["fornecedor01"];
$forn02 = $dados["fornecedor02"];
$forn03 = $dados["fornecedor03"];
$forn04 = $dados["fornecedor04"];
$forn05 = $dados["fornecedor05"];
$forn06 = $dados["fornecedor06"];
$forn07 = $dados["fornecedor07"];
$forn08 = $dados["fornecedor08"];
$forn09 = $dados["fornecedor09"];
$forn10 = $dados["fornecedor10"];
$forn11 = $dados["fornecedor11"];
$forn12 = $dados["fornecedor12"];
$data = $dados["data"];
$obs = $dados["obs"];

$val = min($forn01,9); // ****** o que estava tentando fazer

<tr onMouseOver="this.style.backgroundColor='#dddddd'"
onMouseOut="this.style.backgroundColor=''">
<td align="center"><?=$codigo;?></td>
<td><?=$desc;?></td>
<td align="right"><?=$forn01;?></td>
<td align="right"><?=$forn02;?></td>
<td align="right"><?=$forn03;?></td>
<td align="right"><?=$forn04;?></td>
<td align="right"><?=$forn05;?></td>
<td align="right"><?=$forn06;?></td>
<td align="right"><?=$forn07;?></td>
<td align="right"><?=$forn08;?></td>
<td align="right"><?=$forn09;?></td>
<td align="right"><?=$forn10;?></td>
<td align="right"><?=$forn11;?></td>
<td align="right"><?=$forn12;?></td>
<td align="right"><?=$val;?></td> // **** onde preciso que aparece o valor mínimo

}
Flavio
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 01:52PM
Jayme A. C. Gimenez Escreveu:
-------------------------------------------------------
> Se no banco está 1,25 , isso vai trazer
> problemas. Porque isso é uma string (uma
> "palavra"), não um número.
>
> Não tem como acertar isso no bd, trocando o campo
> para float? (um número que permite decimal).
>
> Claro que, mudando isso, talvez tenha, também,
> que mexer em alguma coisa do código. Mas vale a
> pena, para evitar dores de cabeça e um mar de
> gambiarras rsrsrsrsrs futuras.

Como poderia mudar para float? É só mudar no banco para float e trocar as "," por "."? E depois disto o que fazer?
Flavio
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 02:25PM
Jayme A. C. Gimenez Escreveu:
-------------------------------------------------------
> Se no banco está 1,25 , isso vai trazer
> problemas. Porque isso é uma string (uma
> "palavra"), não um número.
>
> Não tem como acertar isso no bd, trocando o campo
> para float? (um número que permite decimal).
>
> Claro que, mudando isso, talvez tenha, também,
> que mexer em alguma coisa do código. Mas vale a
> pena, para evitar dores de cabeça e um mar de
> gambiarras rsrsrsrsrs futuras.

Obrigado Jayme e Diego, deu certo agora. Era a "," mesmo no banco; troquei tudo por "." e deu certo. Havia feito um teste com float mas depois voltei para varchar e continuou dando certo.

Agora, não sei se posso prosseguir neste mesmo tópico, pois o segundo passo seria pegar este resultado de mínimo e comparar com as outras colunas e grigar a coluna que estiver igual ao preço mínimo... Poderia fazer isto com IF?

Até+
Diego R. Mengarda
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 05:05PM
Flavio, os campos com valor no banco deixe como float 10,2
Para gravar no banco utilize sempre o padrão americano ex.: R$ 1.520,00 ficaria 1520.00
e para imprimir na tela novamente no padrão real, utilize o number_format($preco,2,",",".");

Para fazer essa alteração na hora de gravar no banco, não tem como fugir no str_replace que te passei ;)
Flavio
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 05:33PM
Diego R. Mengarda Escreveu:
-------------------------------------------------------
> Flavio, os campos com valor no banco deixe como
> float 10,2
> Para gravar no banco utilize sempre o padrão
> americano ex.: R$ 1.520,00 ficaria 1520.00
> e para imprimir na tela novamente no padrão real,
> utilize o number_format($preco,2,",",".");
>
> Para fazer essa alteração na hora de gravar no
> banco, não tem como fugir no str_replace que te
> passei ;)

Olá, Diego!
Realmente esta dúvida surgio. Mas como eu poderia fazer este código, pois já tentei e não deu certo antes. Segue como coloquei:

$forn01 = $dados["fornecedor01"];
$forn01 = str_replace($forn01, "," ,".");

query("update [...]");

Algo mais ou menos assim... Poderia me mostrar como ficaria o código para inserção no banco?
Estou iniciando em php e pretendo entrar na faculdade de TI este ano... Por isto peço um pouco de paciência hehe.

Mais uma vez obrigado.
Até+
Diego R. Mengarda
Re: Função min() para localizar menos preço entre colunas...
16 de February de 2012 às 07:35PM
Após criado o campo do banco como float(tipo) 10,2(tamanho), os camandos seguem os mesmos para inserir.

$forn01 = $dados["fornecedor01"]; // recebe o valor via POST

$forn01 = str_replace(",",".",$forn01); // troca virgula por ponto
$forn01 = str_replace(".","",$forn01); // troca os pontos por nada
$forn01 = number_format($forn01,2,".",""); // coloca no padrão americado de moeda ex.: 1150.00

$sql = mysql_query("INSERT INTO produtos (id, valor) VALUES ('','".$forn01."')");

Somente isso Flavio, qualquer dúvida só postar ai ;)
Flavio
Re: Função min() para localizar menos preço entre colunas...
17 de February de 2012 às 05:40PM
Diego R. Mengarda Escreveu:
-------------------------------------------------------
> Após criado o campo do banco como float(tipo)
> 10,2(tamanho), os camandos seguem os mesmos para
> inserir.
>
> $forn01 = $dados["fornecedor01"]; // recebe o
> valor via POST
>
> $forn01 = str_replace(",",".",$forn01);
> // troca virgula por ponto
> $forn01 = str_replace(".","",$forn01); //
> troca os pontos por nada
> $forn01 = number_format($forn01,2,".","");
> // coloca no padrão americado de moeda ex.:
> 1150.00
>
> $sql = mysql_query("INSERT INTO produtos (id,
> valor) VALUES ('','".$forn01."')");
>
> Somente isso Flavio, qualquer dúvida só postar
> ai ;)


Olá, Diego!
Perdoe-me por não postar antes; precisei dar manutenção na rede de uma ong onde ajuda...

O código funcionou. Fiz testes com cada variável e depois coloquei a >>> str_replace(".","",$forn01 <<< junto com a >>> = number_format($forn01,2,".","") <<< e funcionou bem... mas como sou curioso, deixei somente a variável >>> = number_format($forn01,2,".","") <<< e ela fez todo o trabalho sozinha de converter "," para "." e inserir as casas decimais. Então, posso deixar somente ela mesmo, corerto?

Agora, não fique chateado com minha "teimosia", mas prefiso fazer, me parece ser a última pergunta, pois queira entender o porquê para saber melhor como funciona.

Por que não posso deixar o campo como varchar? Qual seria a razão de trocar para float?
Pergunto pelo motivo dos testes terem dado certo com varchar mesmo...


//// nota

É a primeira vez que participo aqui do forum e fiquei bem impressionado a dedicação e rapidez das respostas... Tenha cadastro há um bom tempo, pegando códigos e postando nova versão no perfil do desenvolvedor...

Quero sinceramente dar os parabens para o pessoal do forum e pessoalmente a você, Diego, e ao Jayme pela excelente ajuda.

Foi procurar frequentar mais o forum e ver no que eu também posso ajudar dentro do que já apredi e estou aprendendo.
Diego R. Mengarda
Re: Função min() para localizar menos preço entre colunas...
18 de February de 2012 às 08:39AM
Flavio, não sou um grande programador em PHP, estou longe disso hehe
Mas pelo que já estudei e já pesquisei sobre tratamento de valores com php e mysql, sempre é indicado usar esse tipo de campo por ser específico para valores.

Acredito que possa dar alguma diferença na hora de somar, subtrair, multiplicar ou até dividir os campos direto no sql, sem a ajuda do php,
mas realmente não saberia te dizer exatamente pq funciona tanto com varchar como float hehe.

É isso ai ;)
E obrigado pelos agradecimentos, tentamos ajudar e tambem queremos ser ajudados da mesma forma ;)

Abraço.
Flavio
Re: Função min() para localizar menos preço entre colunas...
18 de February de 2012 às 11:38AM
Ok, Diego. Mas de qualquer forma vocês me ajudaram bastante. Era algo simples de se resolver e eu achava que seria mais complicado. Agora, na página com a planilha de cotação, está verificando e apresentando qual o menor preço e grifando, usando IF, a coluna que está igual a coluna com o preço mínimo; indicando qual distribuidor tem o menor preços para cada ítem.

Obrigado mesmo pela ajuda e atenção.
Vou pesquisar mais sobre o formato float e, se achar um bom artigo, volto a postar aqui a pesquisa.

No mais, encerro este tópico pelo motivo de ter resolvido a dúvida.
Até+
Flavio
Re: Função min() para localizar menos preço entre colunas...
19 de February de 2012 às 03:07PM
Reabrindo o tópico.

Aconteceu uma erro inesperado e não estou conseguindo acertar...

Tudo acima funcionou perfeito, porém, a função min() está selecionado os campos vazios (varchar) ou os campo com "0" (float) como menor preço; assim, se uma das colunas não for preenchida sempre localiza o "0" zero como menor preço ou campo vazio... como poderia fazer para ignor isto? Exemplo:

// era para ficar assim
$a="1";
$b=""; ou $b="0";
$c="3";
$val="1";

// mais esta ficando assim
$a="1";
$b=""; ou $b="0";
$c="3";
$val=""; ou $val="0";

Obrigado
Até+
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.