Jump to content


Photo

Separando Notas Por Trimestre/Bimestre/Semestre


  • Faça o login para participar
21 replies to this topic

#1 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 23/12/2009, 19:04

Boa noite pessoal!
Estou fazendo um sistema de gerenciamento escolar, e me deparei com um problema no boletim, que não encontro saida.
Preciso exibir para o usuário, como se fosse um boletim impresso, estou fazendo em uma tabela, deu tudo certo na parte do lay-out, porém, não sei como diferenciar as notas dos bimestres/trimestres/semestres.

Meu banco esta da seguinte forma:

Matricula | Materia | Nota | Epoca
| | |

Sendo:
•Matricula: o numero de matricula do aluno
•Materia: Nome da materia
•Nota: A nota do aluno nessa X matéria
•Epoca: o trimestre/bimestre/semestre desse registro

agora a parte em php que exibe as notas:
$aluno = $_GET['mat'];
$aluno = decodifica($aluno);
$total = mysql_num_rows("SELECT * FROM notas WHERE matricula ='" . $aluno . "'";
if($total==0){
	echo"Aluno desconhecido";
}elseif($total == 1){
$sql=mysql_query("SELECT * FROM notas WHERE matricula = " . $aluno . "order by materia");
echo"
<table width=\"820\" border=\"1\" cellpadding=\"1\" cellspacing=\"2\">
  <tr>
    <td width=\"191\" style=\"text-align: center\">Mat&eacute;ria</td>
    <td colspan=\"3\" style=\"text-align: center\">1° Bimestre</td>
    <td colspan=\"3\" style=\"text-align: center\">2°Bimestre</td>
    <td colspan=\"3\" style=\"text-align: center\">3°Bimestre</td>
    <td colspan=\"3\" style=\"text-align: center\">4°Bimestre</td>
  </tr>
  <tr>
    <td width=\"191\">&nbsp;</td>
    <td width=\"31\">Nota</td>
    <td width=\"26\">AD</td>
    <td width=\"30\">Faltas</td>
    <td width=\"35\">Nota </td>
    <td width=\"23\">AD</td>
    <td width=\"30\">Faltas</td>
    <td width=\"36\">Nota</td>
    <td width=\"33\">AD</td>
    <td width=\"30\">Faltas</td>
    <td width=\"35\">Nota</td>
    <td width=\"24\">AD</td>
    <td width=\"30\">Faltas</td>
  </tr>"
  while($linha = mysql_fetch_array($sql)){
	  echo"
  <tr>
    <td>{$linha['materia']}</td>
    <td>n1b</td>
    <td>ad</td>
    <td>f</td>
    <td>n2b</td>
    <td>ad</td>
    <td>f</td>
    <td>n3b</td>
    <td>ad</td>
    <td>f</td>
    <td>n4b</td>
    <td>ad</td>
    <td>f</td>
  </tr>";
  }
  echo"</table>";
}

Não sei se consegui explicar direito minha duvida, mas qualquer luz ja ajuda =)
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#2 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 23/12/2009, 19:18

Faltou o principal: a estrutura do banco de dados propriamente dita.
Uma representação visual do que deseja também seria bom - eu sei que o código está aí, mas eu particularmente não tenho tempo pra isso. :assobio:

[]’s Até mais

#3 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 23/12/2009, 19:34

éé... esqueci disso...

Estrutura:

CREATE TABLE `notas` (
  `matricula` int(6) NOT NULL,
  `materia` varchar(20) collate utf8_unicode_ci NOT NULL,
  `nota` float NOT NULL,
  `epoca` varchar(2) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`matricula`),
  KEY `materia` (`materia`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Representação grafica:
Posted Image

(y)

Edit-----

A Representação a cima eu fiz a mão e utilizando apenas uma matéria, preciso que ele pegue todas as matérias e va montando a tabela

Edição feita por: dddidan, 23/12/2009, 19:35.

Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#4 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 23/12/2009, 19:38

Erm, não entendi o campo epoca. O que é inserido nele? :ponder:

Outra coisa... de onde vem as faltas e o AD (a propósito, o que é isso? :P)?

[]’sAté mais

#5 FelipeGabriel

FelipeGabriel

    Normal

  • Usuários
  • 66 posts
  • Sexo:Masculino
  • Localidade:Patrocínio - MG

Posted 23/12/2009, 19:39

Acredito, que você deve dar um while nas materias, e dentro do while chamar as notas, e em ordem os bimestres e não chamar direto as notas?

pelo que consegui entender,

obrigado.

#6 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 23/12/2009, 19:58

Erm, não entendi o campo epoca. O que é inserido nele? :ponder:

Outra coisa... de onde vem as faltas e o AD (a propósito, o que é isso? :P)?

[]’s


no campo epoca é inserido, diagmos que em um regime bimestral: 1b (primeiro bimestre) 2b (segundo bimestre) etc...
As faltas e AD (AD seria a abreviação de Aulas Dadas) vem da tabela "diario" :D

Acredito, que você deve dar um while nas materias, e dentro do while chamar as notas, e em ordem os bimestres e não chamar direto as notas?

pelo que consegui entender,

obrigado.


Isso é basicamente o que eu faço ali encima "$sql=mysql_query("SELECT * FROM notas WHERE matricula = " . $aluno . " order by materia");" mas é exatamente a parte de ordenar os bimestres que não consigo fazer, até pensei em fazer varios ifs mas nem deu certo tambem...
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#7 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 23/12/2009, 20:03

Nos diga exatamente o relacionamento da tabela diario. Você pode resolver todos os problemas na própria consulta. :)

[]’sAté mais

#8 FelipeGabriel

FelipeGabriel

    Normal

  • Usuários
  • 66 posts
  • Sexo:Masculino
  • Localidade:Patrocínio - MG

Posted 23/12/2009, 20:15

Mais a coluna materia existe outra tabela para alimentar ela? ou esta tudo na tabela notas?

obrigado.

#9 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 23/12/2009, 20:19

Estrutura da tabela diario:

CREATE TABLE `diario` (
`Materia` VARCHAR( 20 ) NOT NULL ,
`ad` INT( 3 ) NOT NULL ,
`Epoca` VARCHAR( 2 ) NOT NULL ,
PRIMARY KEY ( `Materia` ) ,
INDEX ( `Professor` )
) ENGINE = innodb;

O relacionamento dela é simples, ela não tem nenhuma ligação externa. o php apenas puxa o valor de AD e insere na tabela, e no caso seria montado com um array e depois exibido, que na verdade é o que eu quero fazer com as notas... mas é ai que esta o problema... diferenciar os bimestres

Mais a coluna materia existe outra tabela para alimentar ela? ou esta tudo na tabela notas?

obrigado.

A coluna matéria não existe, as matérias são informadas diretamente na hora que as notas são enviadas, por meio de uma combo box.

Edição feita por: dddidan, 23/12/2009, 20:22.

Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#10 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 23/12/2009, 21:00

Hey, matricula não pode ser chave primária aqui:

CREATE TABLE `notas` (
  `matricula` int(6) NOT NULL,
  `materia` varchar(20) collate utf8_unicode_ci NOT NULL,
  `nota` float NOT NULL,
  `epoca` varchar(2) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`matricula`),
  KEY `materia` (`materia`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
E aqui Materia também não pode ser chave primária. Em tempo, que é Professor se o campo não existe? Cadê a referência da matrícula? Cadê as faltas? :wacko:

CREATE TABLE `diario` (
`Materia` VARCHAR( 20 ) NOT NULL ,
`ad` INT( 3 ) NOT NULL ,
`Epoca` VARCHAR( 2 ) NOT NULL ,
PRIMARY KEY ( `Materia` ) ,
INDEX ( `Professor` )
) ENGINE = innodb;
Tudo está muito confuso, do jeito que está não há consulta que se faça. :huh:

[]’sAté mais

#11 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 23/12/2009, 22:57

desculpe, esqueci de falar sobre a alteração que fiz.

mas assim, a lógica desse banco é basica, em diário, só vai ter as aulas dadas por professor x na materia x, e dele será puxado as informações necessárias.
e Faltas, vai entrar junto do perfil do aluno, fica mais facil depois do que varias coisas "flutuantes" por ai.

Edição feita por: dddidan, 23/12/2009, 23:00.

Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#12 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 24/12/2009, 01:00

Estou falando da estrutura do banco de dados apresentada. Com ela você não irá a lugar algum.
Você não pode ter matricula como chave primária nem materia como chave na tabela notas. Você precisa de um campo id qualquer para as notas e este sim deve ser chave primária. Mesma coisa para a tabela diario: você não pode ter materia como chave primária. Além disso, falta um campo para as faltas e o índice Professor não possui nenhum campo relacionado.

Arrumado isto esta é a consulta que você vai precisar:

SELECT     n.materia materia,
           GROUP_CONCAT(n.nota ORDER BY n.epoca) nota,
           GROUP_CONCAT(d.ad ORDER BY n.epoca) ad,
           GROUP_CONCAT(d.faltas ORDER BY n.epoca) faltas
FROM       notas n
INNER JOIN diario d
               ON  n.matricula = d.matricula
               AND n.epoca = d.epoca
GROUP BY   n.materia
ORDER BY   n.materia
Ela retornará os dados desta forma:

'Português', '7.5,8.5,6,7.5', '50,45,39,52', '2,4,10,10'
Dentro do while() você vai precisar fazer simplesmente isto:

print '<tr>';
print "<td>{$linha['materia']}</td>";

$nota   = explode(',', $linha['nota']);
$ad     = explode(',', $linha['ad']);
$faltas = explode(',', $linha['faltas']);

for ($pos = 0; $pos < count($nota); $pos++) {
    print "<td>{$nota[$pos]}</td>";
    print "<td>{$ad[$pos]}</td>";
    print "<td>{$faltas[$pos]}</td>";
}

print '</tr>';
O resto é contigo. ;-)

[]’sAté mais

#13 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 24/12/2009, 19:51

ceeerto, vou tentar aqui e volto com a resposta =)

Obrigado pela ajuda (y)
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#14 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 01/01/2010, 17:52

Fiz todas as alterações recomendadas, usei a query, alterei o while, etc, etc.. porém, não consigo exibir o boletim ainda.
coloquei um or die(mysql_error()) no fim da query, e o mysql acusava o seguinte erro: "Unknown column 'd.faltas' in 'field list'"
Pesquisei sobre, tentei encontrar uma solução com o cara que tudo sabe, porém não consegui nenhum avanço...
Tentei até re-fazer a query, mas também não deu certo <_<

Alguem pode me dar mais uma luz? :P
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||

#15 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 01/01/2010, 17:55

É o que eu havia dito:

Estou falando da estrutura do banco de dados apresentada. Com ela você não irá a lugar algum.
Você não pode ter matricula como chave primária nem materia como chave na tabela notas. Você precisa de um campo id qualquer para as notas e este sim deve ser chave primária. Mesma coisa para a tabela diario: você não pode ter materia como chave primária. Além disso, falta um campo para as faltas e o índice Professor não possui nenhum campo relacionado.

Tu está querendo obter as faltas de um campo que sequer existe ainda, dentre outros problemas. :wacko:

[]’sAté mais




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq