Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 materialif (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.**>
26 minutos atrás, Jesse&Francinete disse:
Coloque como dados:
$dados['dado']
Não entendi
O que o /profile/231938-jessefrancinete/?do=hovercard" data-mentionid="231938" href="/profile/231938-jessefrancinete/" rel="">@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">>
16 minutos atrás, Matheus Tavares disse:
O que o /profile/231938-jessefrancinete/?do=hovercard" data-mentionid="231938" href="/profile/231938-jessefrancinete/" rel="">@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.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(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>';SELECT m1.material, m1.quantidade, totalquantidade, m1.minimoestoque
FROM (
SELECT material, unidades, SUM(quantidade) as totalquantidade, minimoestoque
FROM material
GROUP BY materialRetornou 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>
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 materialRetornou 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] => 2Entendeu?
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.
>
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...
TABELA 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
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"....
>
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?
>
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.
>
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.
Entendi a dica de alterar o diagrama do BD, mas já fiz 12mil linha de código seguindo esse diagrama
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 material3. 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);"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.
Barbaridade!
Obrigado por sua simplicidade e genialidade!
Perfeito a solução cara! eu estava a 3 dias estudando e a exaustão não me deixou chegar nessa objetividade! Muito Obrigado!
Hehe, acontece... legal que tenha resolvido :)
Coloque como dados:
$dados['dado']