Ir para conteúdo

POWERED BY:

Arquivado

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

Alessandro Almeida

[Resolvido] While

Recommended Posts

Segue código:

$busca_query = mysql_query("SELECT m1.material, m1.quantidade, totalquantidade, m1.minimoestoque
FROM (
   SELECT material, unidades, SUM(quantidade) as totalquantidade, minimoestoque 
   FROM material 
   GROUP BY material
) m1
WHERE m1.material LIKE '%$busca%' AND totalquantidade LIKE '%$busca1%'
ORDER BY m1.material ASC")or die(mysql_error());//faz a busca com as palavras enviadas


if (empty($busca_query)) { //Se não achar nada, lança essa mensagem
    echo "Nenhum registro encontrado.";
}

// quando existir algo em '$busca_query' ele realizará o script abaixo.
while ($dados = mysql_fetch_array($busca_query)) {
?>

	<tr style="<?php
						if ( $dados[quantidade] <= $dados[minimoestoque]){
							echo "background-color:rgba(255,0,0,0.2);" ;
						}
						?>">		

A variável $dados[quantidade] recebe apenas o valor da primeira linha do GROUP BY material.
São 5 linhas para cada material. 

Preciso que interprete o valor de cada linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque como dados:

 

$dados['dado']

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que o @Jesse&Francinete quis dizer é que você deveria estar acessando o índice do array utilizando uma string e não uma constante, bastando colocar aspas ao redor.

De qualquer forma esse não seria o motivo de um erro fatal, apenas de alguns warnings.

 

O problema é que você não está fechando o while. Você precisa inserir <?php } ?> na última linha do código. Isso deve resolver.

 

BÔNUS: sugiro não fechar o php para manter o código mais legível, assim:

while ($dados = mysql_fetch_array( $busca_query ) ) {
    $cor_bg = $dados[ 'quantidade' ] <= $dados[ 'minimoestoque' ] ? 'background-color: rgba(255,0,0,0.2);' : '';
    echo '<tr style="' . $cor_bg . '">';
}

 

E mais uma coisa: você poderia aplicar classes, ao invés de usar estilos.

Exemplo: <tr class="destaque">

Compartilhar este post


Link para o post
Compartilhar em outros sites
16 minutos atrás, Matheus Tavares disse:

O que o @Jesse&Francinete quis dizer é que você deveria estar acessando o índice do array utilizando uma string e não uma constante, bastando colocar aspas ao redor.

De qualquer forma esse não seria o motivo de um erro fatal, apenas de alguns warnings.

 

O problema é que você não está fechando o while. Você precisa inserir <?php } ?> na última linha do código. Isso deve resolver.

 

BÔNUS: sugiro não fechar o php para manter o código mais legível, assim:


while ($dados = mysql_fetch_array( $busca_query ) ) {
    $cor_bg = $dados[ 'quantidade' ] <= $dados[ 'minimoestoque' ] ? 'background-color: rgba(255,0,0,0.2);' : '';
    echo '<tr style="' . $cor_bg . '">';
}

 

E mais uma coisa: você poderia aplicar classes, ao invés de usar estilos.

Exemplo: <tr class="destaque">

Obrigado pela dica!

 

Mas deu no mesmo. A varíavel  $cor_bg retorna o mesmo valor que $dados[' quantidade '].

 

Um exemplo:

equipamento | minimoestoque | quantidade | filial

mouse | 2 | 5 | BR01

mouse | 2 | 3 | BR02

mouse | 2 | 6 | BR03

mouse | 2 | 3 | BR04

mouse | 2 | 2 | BR05

 

No BD tenho 5 linhas com esse equipamento. E retorna só o valor da primeira linha.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi muito bem o que você quis dizer com:

8 minutos atrás, Alessandro Almeida disse:

A varíavel  $cor_bg retorna o mesmo valor que $dados[' quantidade '].

 

De qualquer forma, faça o seguinte:

 

1 - Teste sua consulta. Se eu entendi bem o que está acontecendo, existe uma grande chance de ela ter algum erro... Para isso, basta você jogar no seu phpMyAdmin, adminer, workbench, ou qualquer outra ferramenta e verificar o resultado:

SELECT m1.material, m1.quantidade, totalquantidade, m1.minimoestoque
FROM (
   SELECT material, unidades, SUM(quantidade) as totalquantidade, minimoestoque 
   FROM material 
   GROUP BY material
) m1
ORDER BY m1.material ASC

(Removi o where com o LIKE, pq ele não faz diferença, mas você poderia/deveria testar com ele também).

 

2 - Na linha seguinte do seu while, verifique se os dados das linhas estão como deveriam, assim:

echo '<pre>';
print_r( $dados );
echo '</pre>';

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT m1.material, m1.quantidade, totalquantidade, m1.minimoestoque
FROM (
   SELECT material, unidades, SUM(quantidade) as totalquantidade, minimoestoque 
   FROM material 
   GROUP BY material
) m1
ORDER BY m1.material ASC

Retornou isso:

Mouse 31 48

2

 

Mas tenho 5 linhas com MOUSE em filiais distintas e só retornou o valor da primeira linha, ou seja da primeira filial.

 

 

 

 

echo '<pre>';
print_r( $dados );
echo '</pre>';
retornou isso:
Array
(
    [0] => Mouse
    [material] => Mouse
    [1] => 31
    [quantidade] => 31
    [2] => 48
    [totalquantidade] => 48
    [3] => 2
    [minimoestoque] => 2
)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 minutos atrás, Alessandro Almeida disse:

SELECT m1.material, m1.quantidade, totalquantidade, m1.minimoestoque
FROM (
   SELECT material, unidades, SUM(quantidade) as totalquantidade, minimoestoque 
   FROM material 
   GROUP BY material
) m1
ORDER BY m1.material ASC

Retornou isso:

Mouse 31 48

2

 

Mas tenho 5 linhas com MOUSE em filiais distintas e só retornou o valor da primeira linha, ou seja da primeira filial.

 

 

 

 


echo '<pre>';
print_r( $dados );
echo '</pre>';

retornou isso:
Array
(
    [0] => Mouse
    [material] => Mouse
    [1] => 31
    [quantidade] => 31
    [2] => 48
    [totalquantidade] => 48
    [3] => 2
    [minimoestoque] => 2
)

 

 

 

Entendeu?

Eu quero que o $dados['quantidade'] interprete cada valor das cinco filiais para ter um destaque quando alguma filial está menor ou igual o estoque mínimo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Alessandro Almeida disse:

Retornou isso:

Mouse 31 48

2

 

Mas tenho 5 linhas com MOUSE em filiais distintas e só retornou o valor da primeira linha, ou seja da primeira filial.

É exatamente o que eu disse: o problema não está no while, e sim na sua consulta.

Você quer exibir as várias linhas, mas a consulta só retorna uma, correto? Então precisamos corrigi-la.

Poste suas tabelas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que a consulta que você está querendo fazer é essa:

SELECT m.material, SUM(m.quantidade) totalquantidade, m.minimoestoque
FROM materiais m
GROUP BY m.filial
ORDER BY m.material ASC

 

Sugiro também você rever sua modelagem também. Essa tabela deveria ser desmembrada para resultar nessas 3 (# para chave primária / & para chave estrangeira):

 

materiais ( #id, nome, min_estoque )

filiais ( #id, cod, nome )

materiais_filiais ( #id, &filial_id, &material_id, qtd )

 

Dessa forma você evitaria a repetição de strings "BR04", "BR03", etc.... e "Mouse", "Mouse"....

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, Matheus Tavares disse:

Eu acho que a consulta que você está querendo fazer é essa:


SELECT m.material, SUM(m.quantidade) totalquantidade, m.minimoestoque
FROM materiais m
GROUP BY m.filial
ORDER BY m.material ASC

 

Sugiro também você rever sua modelagem também. Essa tabela deveria ser desmembrada para resultar nessas 3 (# para chave primária / & para chave estrangeira):

 

materiais ( #id, nome, min_estoque )

filiais ( #id, cod, nome )

materiais_filiais ( #id, &filial_id, &material_id, qtd )

 

Dessa forma você evitaria a repetição de strings "BR04", "BR03", etc.... e "Mouse", "Mouse"....

Essa consulta retorna a primeira linha de cada FILIAL.
Será que não encaixa um VIEW e JOIN?

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Alessandro Almeida disse:

Essa consulta retorna a primeira linha de cada FILIAL.

Desculpe, mas pensei que fosse isso que você queria.

O que você está precisando exatamente?

 

2 horas atrás, Alessandro Almeida disse:

Será que não encaixa um VIEW e JOIN?

Talvez, mas ainda acho que há uma forma mais simples de resolver esse problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Alessandro Almeida disse:

Essa consulta retorna a primeira linha de cada FILIAL.

Desculpe, mas pensei que fosse isso que você queria.

O que você está precisando exatamente?

 

2 horas atrás, Alessandro Almeida disse:

Será que não encaixa um VIEW e JOIN?

Talvez, mas ainda acho que há uma forma mais simples de resolver esse problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi a dica de alterar o diagrama do BD, mas já fiz 12mil linha de código seguindo esse diagrama:sweat_smile:

Olha só:

 1. São 428 linhas nessa tabela MATERIAL

 2. Atualmente uso essa consulta:

SELECT m1.material, m1.quantidade, totalquantidade, m1.minimoestoque
FROM (
   SELECT material, unidades, SUM(quantidade) as totalquantidade, minimoestoque 
   FROM material 
   GROUP BY material
) m1
ORDER BY m1.material ASC

3. Perceba que são várias filais para cada material, ou seja, várias linhas cada material.

ID quantidade  minimoestoque filial material
1 31 2 BR01 Mouse
2 0 2 BR02 Mouse
3 0 2 BR03 Mouse
4 0 2 BR04 Mouse
5 17 2 BR05 Mouse
6 5 3 BR01 Cabo VGA
7 3 3 BR02 Cabo VGA
8 2 3 BR03 Cabo VGA
9 2 3 BR04 Cabo VGA
10 2 3 BR05 Cabo VGA

 

 

 

Preciso fazer a variável $dados[quantidade] interpretar a quantidade de cada material em cada filial.

  echo "background-color:rgba(255,0,0,0.2); }
?>

 

No momento só consigo consultar a primeira linha por causa do GROUP BY material.

Então o PHP acima só vai entender se eu alterar a quantidade do material de BR01.

 

Resumindo:

Preciso de uma consulta que se qualquer filial tiver com estoque mínimo,  aconteça isso :

echo "background-color:rgba(255,0,0,0.2);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, entendi agora.

 

Coloque junto ao seu SUM:

MIN( quantidade ) as menor_quantidade_em_estoque

Isso vai trazer a menor quantidade em estoque entre as filiais. Basta usar essa informação no while, como eu disse lá em acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por iguulima
      Bom dia a todos, tenho em meu banco de dados uma tabela de pedidos, onde nesse pedidos estão salvos as id's dos produtos que foram selecionados pelo usuário, gostaria de saber se tem alguma forma utilizando um while que possa selecionar os produtos mais pedidos dessa tabela, não tenho ideia por onde começar. Consigo listar todos apenas mas não sei como selecionar os que são mais pedidos.
    • Por iguulima
      Ola a todos,
      Estou com uma dúvida e ja tentei de tudo que estão dentro das minhas limitações de conhecimento. Tenho um laço de repetição While sendo executado e quero que uma Variavel seja executada apenas uma vez dentro desse laço. Existe essa possibilidade. Obrigado a todos. Segue o código:

       
      <?php $consult = $row['id']; $sql = "SELECT * FROM upload_data WHERE USER_CODE = '$consult' ORDER BY id ASC"; $resultadoimg = mysql_query($sql); $numero_registros = mysql_num_rows($resultadoimg); while($registrosimg = mysql_fetch_array($resultadoimg)) { ?> <li data-target="#carousel-custom" data-slide-to="0" <?php ele precisa ser executado uma unica vez aqui?>><img src="" alt=""></li> <?php } ?>  
    • Por eduardodsilvaq
      Não sei oq tem de errado.
       
      O erro:
      Notice: Undefined index: name in C:\AppServ\www\includes\functions.php on line 105 A linha do erro:
      <td width="106"><div class="fonte">'. $row["name"] .'</div></td> O codigo:
      function mini_ranking (){ $PDO = db_connect_gamedata(); $sql = "SELECT name baselevel FROM u_hero WHERE class <> '80' ORDER BY baselevel Desc Limit 6"; $result = $PDO->query($sql); $guild = $result->fetchAll(PDO::FETCH_ASSOC); $i = 1; echo '<table width="153" height="0" border="0">'; foreach($guild as $row) { echo '<tr> <td width="0" height="0" align="center"><div class="fonte">'. $i++ . '</div></td> <td width="106"><div class="fonte">'. $row["name"] .'</div></td> <td width="20"><div class="fonte">'. $row["baselevel"] .'</div></td> <tr>'; } echo '</table>'; }  
    • Por danilo759
      Estou precisando saber o percentual de imagens que está no diretório e estou com dificuldades. Alguém pode me ajudar dar uma luz?

       
      $qry_canal = $con->query("SELECT * FROM grade, dados WHERE grade.id = dados.id AND grade.canal IN('HBO','GLO','TNT') GROUP BY dados.titulo"); $counter = 0; while($rows = $qry_canal->fetch(PDO::FETCH_ASSOC)){ $id = $rows['id']; $sigla = $rows['canal']; $sk = substr($rows['sk'], 0, 14); // Busca total de programas por canal /* ---------------------------------------------------------------- */ $qry_b = $con->query("SELECT * FROM grade, dados WHERE grade.id = dados.id AND grade.canal LIKE '".$sigla."' GROUP BY dados.titulo"); $total_programas = $qry_b->rowCount(); if(empty($serieskey)) { $prog_id = "$id"; } else{ $prog_id = "$sk"; } // VERIFICA SE EXISTE IMAGEM /* ---------------------------------------------------------------- */ if(file_exists("/imagens/".$prog_id."_epg.jpg")){ $arr_img[] = "".$counter++.""; } $total_fotos = "".count($arr_img).""; echo "".($total_fotos * 100 ) / $total_programas."% <br />"; }  
    • Por Hulkstar
      Possuo um ranking de vitoria/derrota que é trazido através do php com while do banco de dados,tenho dois campos chamados "vencedor" e "perdedor",como posso contar dentro do while os registros iguais que possuem por exemplo "vencedor -> 1" e "perdedor -> 2",caso exista esse registro dessa forma citada 50 vezes,preciso que dentro do while ele me informe que o registro existe 50 vezes.Obrigado pela ajuda.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.