Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, me ajudem aqui que já tentei de tudo e não consegui
No meu MySQL tem um campo com casa decimal para digitar um valor
nota decimal(4,2) NOT NULL,
Se eu não gravar nada nele, beleza, o campo fica vazio, porém se por exemplo eu no cadastro digitar qualquer valor e depois vier a limpar esse valor, ele grava 0,00
Qual a forma de quando eu limpar o campo, deixar em branco, ele não gravar valor algum, não quero que ele fique gravando o 0,00.
Já tentei nota decimal(4,2) DEFAULT NOT NULL, OU nota decimal(4,2) DEFAULT NULL, ou ainda nota decimal(4,2) DEFAULT, mas sem resultados.
Conforme post #2, pode fazer direto no SQL:
ALTER TABLE NomeDaTabela CHANGE nomeDoCampo nomeDoCampo DECIMAL(4,2) NULL;
Isso ajustará a coluna da tabela para aceitar valor nulo.
Vamos lá,
O exemplo do Roberto não resultou em nada, continua gravando o 0.00
Já o seu hinom, só não assimilei como implementar na tabela. Ela está como abaixo no exemplo.
CREATE TABLE IF NOT EXISTS `notas` (
`id` int(10) NOT NULL,
`nota` decimal(4,2) NOT NULL,''(vazio) não é um valor correto para decimal, provavelmente gerará um erro...
Uma solução, se não gosta do 0,00 seria você setar ele para null => preço = null, do contrário, é isso.
Bom dia Roger, também não entendi como implementar isso aonde você fala para null => preço = null
Ali é um campo de nota, então não seria eu gostar, pois eu posso atribuir uma nota 0.00 a quem a mereceu, porém a quem eu não atribuí nenhuma nota vai ser dado 0.00 também, ficando como essa pessoa tivesse recebido nota zero também. Então não tem critério. Se a pessoa não recebeu uma avaliação, o campo deveria receber o resultado null,
No caso se eu não lançar nenhum valor, ele fica padrão null, porém se eu lançar por acidente e depois apagar, ele grava o 0.00, fazendo se entender que foi atribuído uma nota 0.00 como valor.
No caso tenho de avaliar esse campo como possíveis lançamentos por acidente ou mesmo caso eu queira retirar uma nota e deixar o campo como vazio. se deixar 0.00 fica como se eu tivesse dado nota zero
É como falei, o banco ajusta para 0.00 pois '' não é um valor válido para o campo...
Sempre que você precisar manipular esse campo e deixá-lo "vazio", set ele para null, como falei... Ex.:
UPDATE tabela SET preco = NULL...
*É importante que na criação do campo você tenha configurado para que ele aceite valores nulo
>
É como falei, o banco ajusta para 0.00 pois '' não é um valor válido para o campo...
Sempre que você precisar manipular esse campo e deixá-lo "vazio", set ele para null, como falei... Ex.:
UPDATE tabela SET preco = NULL...
*É importante que na criação do campo você tenha configurado para que ele aceite valores nulo
Exatamente o que eu falei...
bom meninos, vou tentar por aqui a dica de vocês.
Pegando carona, sabem como eu consigo somar 4 notas, dividir por 4 e gerar o resultado pelo mysql?
Estou projetando um sistema de notas, e quando gero um boletim eu já consegui fazer essa matemática, porém para quem lança visualizar é complicado, pois ele apenas tem os campos do input, então não consegue ver o resultado final, tendo que fazer as contas por fora.
"Pegando carona" o quê?
Evite estender o tópico com multiplos assuntos pois isso aqui não é suporte técnico, valeu?
nada pessoal..
Se ainda não entendeu, isso é caracterizado como "tópico camaleão":
origem do termo (inglês)
http://meta.stackoverflow.com/questions/43478/exit-strategies-for-chameleon-questions
discussão em português:
http://meta.pt.stackoverflow.com/questions/1115/sera-que-esta-e-uma-pergunta-camaleao
>
bom meninos, vou tentar por aqui a dica de vocês.
Pegando carona, sabem como eu consigo somar 4 notas, dividir por 4 e gerar o resultado pelo mysql?
Estou projetando um sistema de notas, e quando gero um boletim eu já consegui fazer essa matemática, porém para quem lança visualizar é complicado, pois ele apenas tem os campos do input, então não consegue ver o resultado final, tendo que fazer as contas por fora.
Algo assim ...
Select aluno,avg(nota) media
From notas
Group by aluno
Desculpe hinom, não foi minha intenção.
Oi Motta, obrigada, tentei algo assim, até deu certo, mas ele só está listando agora o primeiro cliente. Vou verificar o erro que pode ser. Não vou estender aqui para não haver problemas
só está listando agora o primeiro cliente
Deve haver alguma coisa no WHERE
Então mota, eu usei essa lógica
<?php
$sql = "SELECT * FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]";
$media = mysql_query($sql);
while($linha=mysql_fetch_array($media))
{
$media = ($linha["n1"] + $linha["n2"] + $linha["n3"] + $linha["n4"])/4;
echo $media;
}
?>
Usei essa lógica acima, mas nesse caso por exemplo ele só trás o primeiro aluno da lista. A média está sendo inserida certinha no campo destinado.
WHERE id_aluno=$coluna[id_aluno]
faz com que só pegue o id passado em $coluna[id_aluno]
Tá, só tinha esquecido de postar o que traz o valor do banco.
<?=@mysql_result(mysql_query("SELECT n1 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n1)?>
No caso o da média não traz valor de banco, por isso não sei o que pode ser
Tentei passar só o ID do aluno, mas só volta o resultado de um
Tentei de tudo mas ele só retorna o resultado de um aluno, se eu retirar a operação para resultado da média volta ao normal e lista todos
Tire só a condição de um id.
Tira tudo
$sql = "SELECT * FROM notas ";
Já tentei também e nada
<?=@mysql_result(mysql_query("SELECT n1 FROM notas WHERE id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n1)?>
Tente
Mas esta sql nao trata a media
>
Tá, só tinha esquecido de postar o que traz o valor do banco.
<?=@mysql_result(mysql_query("SELECT n1 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n1)?>
No caso o da média não traz valor de banco, por isso não sei o que pode ser
Tentei passar só o ID do aluno, mas só volta o resultado de um
Não entendi Motta, o que vc me passou é o que eu já tenho no original como tinha postado lá atrás, e funciona perfeitamente, o problema é justamente a média.
Quando não trato a média lista todos normais, mas quando faço o tratamento da média é que só lista 1
<?=@mysql_result(mysql_query("SELECT n1 FROM notas WHERE id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n1)?>
Editar em tablet ....
Mas continuo sem entender. Meu problema não está em trazer os dados do banco e sim na média.
O que vc está me postando é para trazer os valores do banco, e isso ele faz perfeitamente. Somente quando tento fazer a média é que da o problema e ele só lista 1 nome, se eu tirar o cálculo da média ele fica normal e lista todos
E eu também não posso implementar isso na média, pois ainda tem o n2, n3, n4. O problema é implementar algo que faça a média que não interfira nos selects que trazem os dados
Como o Motta falou, é só tirar o aluno da condição pra retornar todos os alunos.
Se você quiser retornar todas as notas e a média no comando SQL usa o comando abaixo.
SELECT aluno_id, nota, 1 seq
FROM notas
UNION ALL
SELECT aluno_id, avg(nota) nota, 2 seq
FROM notas
GROUP BY aluno_id
ORDER BY aluno_id, seq
Olha o resultado aqui: http://www.sqlfiddle.com/#!2/65fb86/4/0
Mas eu já tirei e permaneceu o erro. Acho que ainda não entenderam. Vamos lá.
Tenho as funções abaixo que trazem os valores do banco das notas dadas:
<td align="center">
<?=@mysql_result(mysql_query("SELECT n1 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n1)?>
</td>
<td align="center">
<?=@mysql_result(mysql_query("SELECT n2 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n2)?>
</td>
<td align="center">
<?=@mysql_result(mysql_query("SELECT n3 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n3)?>
</td>
<td align="center">
<?=@mysql_result(mysql_query("SELECT n4 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n4)?>
</td>
Até aí está tranquilo, e lista todos os alunos. Mas agora criei um campo e criei uma função para fazer a média dessas 4 notas que estão no banco. A função abaixo:
<?php
$sql = "SELECT * FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]";
$media = mysql_query($sql);
while($linha=mysql_fetch_array($media))
{
$media = ($linha["n1"] + $linha["n2"] + $linha["n3"] + $linha["n4"])/4.00;
echo $media;
}
?>
Quando eu coloco essa função ele faz o cálculo e insere a média no campo criado, mas ele passa a listar somente um aluno.
Já retirei a condição do aluno como falado, porém continua a listar somente 1 aluno.
O problema está nessa função, já tentei as seguintes formas como abaixo:
<?php
$sql = "SELECT * FROM notas";
$media = mysql_query($sql);
while($linha=mysql_fetch_array($media))
{
$media = ($linha["n1"] + $linha["n2"] + $linha["n3"] + $linha["n4"])/4.00;
echo $media;
}
?>
Ou:
<?php
$sql = "SELECT * FROM notas WHERE id_aluno=$coluna[id_aluno] ";
$media = mysql_query($sql);
while($linha=mysql_fetch_array($media))
{
$media = ($linha["n1"] + $linha["n2"] + $linha["n3"] + $linha["n4"])/4.00;
echo $media;
}
?>
Ou ainda:
<?php
$sql = "SELECT * FROM notas WHERE id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]";
$media = mysql_query($sql);
while($linha=mysql_fetch_array($media))
{
$media = ($linha["n1"] + $linha["n2"] + $linha["n3"] + $linha["n4"])/4;
echo $media;
}
?>
Então o problema está unicamente na função que cria a média. Ou se tem outro método de se criar a média ou tenho de achar uma solução para esse problema.
Ah, ficou mais claro, você devia postar a estrutura exata da sua tabela no tópico, achei que havia uma nota por registro, e não 4 colunas com cada nota.
Isso já é um problema com a lógica de programação, não é mais MySQL.
<?php
$sql = "SELECT n1, n2, n3, n4 FROM notas WHERE id_aluno=$coluna[id_aluno] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]";
$res = mysql_query($sql);
$rs = mysql_fetch_row($res);
?>
<td align="center"><?= $rs[0] ?></td><!-- Nota 1 -->
<td align="center"><?= $rs[1] ?></td><!-- Nota 2 -->
<td align="center"><?= $rs[2] ?></td><!-- Nota 3 -->
<td align="center"><?= $rs[3] ?></td><!-- Nota 4 -->
<td align="center"><?= ($rs[0] + $rs[1] + $rs[2] + $rs[3]) / 4 ?></td><!-- Media -->
Eu não quero extender muito no PHP, se tiver mais dúvidas posta no fórum de PHP e só coloca um link aqui.
1. Ajuste o formato da média com number_format
2. NUNCA use funções mysql_*, sempre use as Classes MySQLi ou PDO_MYSQL.
tira o default coloca só decimal(4,2)
e quando for alterar vc faz ele receber null