Jump to content
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.

Share this post


Link to post
Share on other sites

Coloque como dados:

 

$dados['dado']

 

Share this post


Link to post
Share on other 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">

Share this post


Link to post
Share on other 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.

 

Share this post


Link to post
Share on other 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>';

 

Share this post


Link to post
Share on other 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
)

 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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"....

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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);

 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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.
    • By 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 } ?>  
    • By mamotinho
      Olá, pessoal mais uma vez venho pedi a ajuda de vocês estou com um problema ao roda uma query que montei, eu sou iniciante na area e não tenho muito conhecimento então o codigo que fiz foi parte de meu conhecimento básico. bom o que eu quero resolver nessa query é o seguinte, eu quero consultar uma tabela e nela pega todos os registros com a a data vencida e lista ela dentro do while em seguida retornar dentro desse if o valor da coluna de cada uma exemplo de como fiz e ficou com loop infinito.

       
      declare @id int declare @getdate datetime select @id = IDCadastrado, @getdate = RegDate from BancoTeste.dbo.MinhaTabela where RegDate < getdate() while @id is not null begin select * from BancoTeste.dbo.MinhaTabela where IDCadastrado = @id end quando eu executo isso ai ele executa infinitamente o valor do primeiro registro repetidamente.
    • By 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>'; }  
    • By 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 />"; }  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.