forny 0 Denunciar post Postado Setembro 24, 2011 Olá, Tenho um select em três tabelas com join que retorna nome, cadastro (tabela 1), data da presença e tipo presença (tabela 2) e tipo de reunião (tabela 3). Preciso fazer uma tabela dinâmica, como a que se encontra abaixo. Para isso, me corrijam se eu estiver errado, 1)seria preciso fazer um array, Com os dados armazenados no array, provenientes de um select? 2)como fazer para criar os campos da tabela a medida que a quantidade das datas forem aumentando, expandindo a tabela para a direita? Sendo que os campos e marrom são fixos, os campos em azul são variáveis que devem vir do array e os campos em vermelho são cálculos. se compareceu -> presença = 1; falta = 0; % = divisão da quantidade das presenças (1)/quantidade total de datas. Obrigado |-----------------------------------------------------------------------------------------------------------------------------| |////////////////////////////////////|data 1///////|data 2///////|...|data n//////|freqüência///////////////////| |item|nome//|cadastro//////|tipo 1///////| tipo 2////////|....|tipo n//////|/qde////|////////%/////////| |----+------+----------+----------+----------+---+----------+------+--------------------------------------------------| |1///|nome 1|cadastro 1////|presenca 1|presenca 1|...|presenca n|soma 1|soma 1/total data| |2///|nome 2|cadastro 2////|presenca 2|presenca 2|...|presenca 2|soma 2|soma 2/total data| |......|..........|................|................|................|...|................|..........|..........................| |n///|nome n|cadastro n////|presenca n|presenca n|...|presenca n|soma n|soma n/total data| ------------------------------------------------------------------------------------------------------------------------------- Compartilhar este post Link para o post Compartilhar em outros sites
Jonatã Cioni 9 Denunciar post Postado Setembro 25, 2011 depois que tu faz o select, use o mysql_fetch_array... ele transforma o retorno em array... ou tb mysql_fetch_assoc... os dois retornam a msma coisa... mais acho que o fetch_assoc eh mais rapido... Compartilhar este post Link para o post Compartilhar em outros sites
forny 0 Denunciar post Postado Setembro 29, 2011 Oi Jonatã, Como fazer para alimentar um array multidimensional com os dados vindos do select? A minha consulta com join retorna: nome1, cadastro1, data1, presença1, tipo de reunião. Só que para cada nome e cadastro tem várias datas, presenças (1 ou 0) e tipo de reunião. Ex.: JOSÉ, 13333, 2011-04-01, 1, GR1 JOSÉ, 13333, 2011-04-08, 1, GR2 JOSÉ, 13333, 2011-04-15, 0, GR1 JOSÉ, 13333, 2011-04-22, 1, GR2 MAURO, 13344, 2011-04-01, 0, GR1 MAURO, 13344, 2011-04-08, 1, GR2 ..... LUIZ, 13555, 2011-04-01, 1, GR1 .... Depois, como colocar na posição correta da tabela? usando array[0][0][0], onde o número entre colchetes dependerá do valor a utilizar? Obrigado pela ajuda. abs, Compartilhar este post Link para o post Compartilhar em outros sites
Jonatã Cioni 9 Denunciar post Postado Setembro 29, 2011 pow, meu amigo... ai tu jah quer que eu faça pra voce, praticamente, neh... aprenda o funcionamento do array, e como fazer para usar array multidimensional... o objetivo do forum eh tirar duvida, e não fazer o trabalho pra você... pesquise... aprenda... voce consegue... Compartilhar este post Link para o post Compartilhar em outros sites
forny 0 Denunciar post Postado Outubro 1, 2011 Jonatã, De forma alguma desejo que você faça o trabalho para mim. O que preciso é da ajuda de quem sabe, para que possa me informar como faço para alimentar o array multidimensional com os dados do select efetuado ao BD. O resultado do select abaixo retorna os dados da seguinte forma: id1 - nome1 - cadastro1 - presenca1 - data1 - tipo1 id1 - nome1 - cadastro1 - presenca2 - data2 - tipo2 ... id1 - nome1 - cadastro1 - presencan - datan - tipon id2 - nome2 - cadastro2 - presenca1 - data1 - tipo1 id2 - nome2 - cadastro2 - presenca2 - data2 - tipo2 ... id2 - nome2 - cadastro2 - presencan - datan - tipon O array abaixo com a tabela, retornam os dados no formato que preciso, conforme postado no tópico anterior. O que preciso saber, por isso procurei esse fórum, é como alimentar o array com os dados provenientes do select. Para que eu possa ter a saída como preciso. Se não souber, de qualquer forma muito obrigado. Segue o código: include "config.php"; $datainicial="2011-04-01"; $datafinal="2011-08-31"; //array tipos de eventos $sqlt = mysql_query( "SELECT * FROM `reuniao` LIMIT 0 , 30") or die (mysql_error()); $linhast = mysql_num_rows($sqlt); for($num = 0; $num < $linhast; $num++){ $itemt = $num + 1; $registrot = mysql_fetch_array($sqlt); $tipo[$num] = $registrot['tipo_reuniao']; } //array datas $sqlt = mysql_query( "SELECT DISTINCT `detalhe_presenca`.`data_presenca` FROM `detalhe_presenca` LIMIT 0 , 30") or die (mysql_error()); $linhast = mysql_num_rows($sqlt); for($num = 0; $num < $linhast; $num++){ $itemt = $num + 1; $registrot = mysql_fetch_array($sqlt); $datas[$num]=$registrot['data_presenca']; } //tabela presença $sqlp = mysql_query("SELECT `dados_maconicos`.`id_maconico`,`dados_maconicos`.`nome_obreiro` , `dados_maconicos`.`cadastro` , `presenca`.`presenca` , `detalhe_presenca`.`data_presenca` , `reuniao`.`tipo_reuniao` FROM `dados_maconicos` INNER JOIN `presenca` ON `presenca`.`id_dadosmaconicos` = `dados_maconicos`.`id_maconico` INNER JOIN `detalhe_presenca`ON `detalhe_presenca`.`id_detalhe_presenca` = `presenca`.`id_detalhe_presenca` INNER JOIN `reuniao` ON `reuniao`.`id_reuniao` = `presenca`.`id_reuniao` WHERE data_presenca BETWEEN '".$datainicial."' AND '".$datafinal."' ORDER BY nome_obreiro, data_presenca asc")or die (mysql_error()); $linhasp = mysql_num_rows($sqlp); for($nump = 0; $nump < $linhasp; $nump++){ $itemp = $nump + 1; $registrop = mysql_fetch_array($sqlp); //$datas[$num]=$registrop['data_presenca']; //array e tabela que funcionam como preciso $userList = array("joão" => array( "cadastro" => "13000", "presenca1" => "1", "presenca2" => "1"), "José" => array( "cadastro" => "14000", "presenca1" => "1", "presenca2" => "1"), "Fulano" => array( "cadastro" => "15000", "presenca1" => "1", "presenca2" => "1"), "Ciclano" => array( "cadastro"=> "16000", "presenca1" => "1", "presenca2" => "0"), ); } $qde=count($userList); echo "<table class='nome' width=100% cellpading=2 cellspacing=2 border='2' bordercolor=#000000>"; echo "<tr><td rowspan=2>item</td><td rowspan=2 >nome</td><td rowspan=2>cadastro</td><td>".$datas[0]."</td> <td>".$datas[1]."</tr><tr><td>".$tipo[0]."</td><td>".$tipo[1]."</td>"; $n=0; foreach ($userList as $key=>$value) { $n=$n+1; echo "<tr><td>".$n."</td><td>$key</td>"; foreach ($value as $iKey => $iValue) { echo "<td>$iValue</td>"; } echo "</tr>"; } echo "</table>"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
off-road 0 Denunciar post Postado Outubro 1, 2011 Forny, Não sei se entendi bem o que você quer mas me parece muito simples. Supondo que este select $sqlp = mysql_query("SELECT `dados_maconicos`.`id_maconico`,`dados_maconicos`.`nome_obreiro` , `dados_maconicos`.`cadastro` , `presenca`.`presenca` , `detalhe_presenca`.`data_presenca` , `reuniao`.`tipo_reuniao` FROM `dados_maconicos` INNER JOIN `presenca` ON `presenca`.`id_dadosmaconicos` = `dados_maconicos`.`id_maconico` INNER JOIN `detalhe_presenca`ON `detalhe_presenca`.`id_detalhe_presenca` = `presenca`.`id_detalhe_presenca` INNER JOIN `reuniao` ON `reuniao`.`id_reuniao` = `presenca`.`id_reuniao` WHERE data_presenca BETWEEN '".$datainicial."' AND '".$datafinal."' ORDER BY nome_obreiro, data_presenca asc")or die (mysql_error()); Retorne isso id1 - nome1 - cadastro1 - presenca1 - data1 - tipo1 id1 - nome1 - cadastro1 - presenca2 - data2 - tipo2 Você pode fazer com um While $dados = array(); while ($row = mysql_fetch_array($sqlp, MYSQL_ASSOC)) { $dados[$row['nome_obreiro']] = array($row['cadastro'],$row['presenca'],$row['data_presenca'],$row['tipo_reuniao']); } O importante é você saber que com arrays o PHP aceita índices de string e numéricos, e os dados associados podem ser de qualquer tipo. Associando um array a um índice de outro array você já estará usando arrays multidimensionais. Não tem mistério. Espero ter ajudado! Abraço. Compartilhar este post Link para o post Compartilhar em outros sites
forny 0 Denunciar post Postado Outubro 1, 2011 Jair, Obrigado pela resposta. Ainda não tentei a sua opção. Estou quebrando a cabeça e fiz uma gambiarra que está funcionando quase que completo. Só falta um detalhe. Abaixo postarei o código. Está funcionando o cabeçalho da tabela de forma dinâmica (tenho atualmente 21 datas)(modelo informado anteriormente). Está funcionando a quantidade de linhas (36 pessoas). Imprime na tela correto os dados das datas, tipo, item, nome e cadastro. Quanto à presença, imprime correto a primeira linha, só que os dados da primeira linha se repetem em todas as outras linhas. Provavelmente o problema é no loop. Não encontrei a solução. A presença é extraída do select e alimenta um array. Total de 754 dados. O que preciso é que a primeira linha imprima x colunas de presença (atualmente com 21 datas, seriam 21 colunas de presença) e quebrasse, passando da 22º posição para a primeira coluna da segunda linha, e assim por diante. Qualquer ajuda será benvinda. abs, forny Segue código atual: <?php include "config.php"; $datainicial="2011-04-01"; $datafinal="2011-08-31"; //array tipos de eventos $sqlt = mysql_query( "SELECT * FROM `reuniao` LIMIT 0 , 30") or die (mysql_error()); $linhast = mysql_num_rows($sqlt); for($num = 0; $num < $linhast; $num++){ $itemt = $num + 1; $registrot = mysql_fetch_array($sqlt); $tipo[$num] = $registrot['tipo_reuniao']; } //array datas $sqlt = mysql_query( "SELECT DISTINCT `detalhe_presenca`.`data_presenca` FROM `detalhe_presenca` LIMIT 0 , 30") or die (mysql_error()); $linhast = mysql_num_rows($sqlt); for($num = 0; $num < $linhast; $num++){ $itemt = $num + 1; $registrot = mysql_fetch_array($sqlt); $datas[$num]=$registrot['data_presenca']; } //array nome cadastro $sqln = mysql_query("SELECT DISTINCT `dados_maconicos`.`nome_obreiro`, `dados_maconicos`. `cadastro` FROM `dados_maconicos`")or die (mysql_error()); $linhasn = mysql_num_rows($sqln); for($numn = 0; $numn < $linhasn; $numn++){ $itemn = $numn + 1; $registron = mysql_fetch_array($sqln); $nome[$numn]=$registron['nome_obreiro']; $cadastro[$numn]=$registron['cadastro']; } //array presença data tipo $sqlpdt = mysql_query("SELECT `dados_maconicos`.`nome_obreiro` , `presenca`.`presenca` , `detalhe_presenca`.`data_presenca` , `reuniao`.`tipo_reuniao` FROM `dados_maconicos` INNER JOIN `presenca` ON `presenca`.`id_dadosmaconicos` = `dados_maconicos`.`id_maconico` INNER JOIN `detalhe_presenca`ON `detalhe_presenca`.`id_detalhe_presenca` = `presenca`.`id_detalhe_presenca` INNER JOIN `reuniao` ON `reuniao`.`id_reuniao` = `presenca`.`id_reuniao` WHERE data_presenca BETWEEN '2011-04-01' AND '2011-08-31' ORDER BY nome_obreiro, data_presenca asc")or die (mysql_error()); $linhaspdt = mysql_num_rows($sqlpdt); for($numpdt = 0; $numpdt < $linhaspdt; $numpdt++){ $itempdt = $numpdt + 1; $registropdt = mysql_fetch_array($sqlpdt); $presenca[$numpdt]=$registropdt['presenca']; $data[$numpdt]=$registropdt['data']; $tipo2[$numpdt]=$registropdt['tipo_reuniao']; } echo "<table class='nome' width=100% cellpading=2 cellspacing=2 border='2' bordercolor=#000000>"; echo "<tr><td rowspan=2>item</td><td rowspan=2 >nome</td><td rowspan=2>cadastro</td>"; for($c = 0; $c < $linhast; $c++){ echo "<td>".$datas[$c]."</td>"; } echo "</tr><tr>"; for($c2 = 0; $c2 < $linhast; $c2++){ echo "<td>".$tipo2[$c2]."</td>"; } $n=0; for($n = 0; $n < $linhasn; $n++){ $n1=$n+1; echo "<tr><td>".$n1."</td><td>".$nome[$n]."</td><td>".$cadastro[$n]."</td>"; for($p = 0; $p < $linhast; $p++){ echo "<td>".$presenca[$p]."</td>\n"; } //echo "<br/>"; echo "</tr>\n"; } echo "</table>"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Outubro 2, 2011 use o mysql_fetch_array... ou tb mysql_fetch_assoc... os dois retornam a msma coisa... Certo! A grosso modo, ambas retornam os mesmos dados Errado! mysql_fetch_array — Obtém uma linha como uma matriz associativa, uma matriz numérica, ou ambas. mysql_fetch_assoc — Obtém um linha do resultado como uma matriz associativa. Compartilhar este post Link para o post Compartilhar em outros sites
forny 0 Denunciar post Postado Outubro 3, 2011 Prezados, o cabeçalho das colunas e das linhas está funcionando como necessito, mas o conteúdo das células, relativo às presenças se repete em todas as linhas. a imagem da tabela está no link a seguirtabela Se alguém puder me ajudar, fico agradecido. abs, forny include "config.php"; $datainicial="2011-04-01"; $datafinal="2011-08-31"; //array tipos de eventos $sqlt = mysql_query( "SELECT * FROM `reuniao` LIMIT 0 , 30") or die (mysql_error()); $linhast = mysql_num_rows($sqlt); for($num = 0; $num < $linhast; $num++){ $itemt = $num + 1; $registrot = mysql_fetch_array($sqlt); $tipo[$num] = $registrot['tipo_reuniao']; } //array datas $sqlt = mysql_query( "SELECT DISTINCT `detalhe_presenca`.`data_presenca` FROM `detalhe_presenca` LIMIT 0 , 30") or die (mysql_error()); $linhast = mysql_num_rows($sqlt); for($num = 0; $num < $linhast; $num++){ $itemt = $num + 1; $registrot = mysql_fetch_array($sqlt); $datas[$num]=$registrot['data_presenca']; } //array nome cadastro $sqln = mysql_query("SELECT DISTINCT `dados_maconicos`.`nome_obreiro`, `dados_maconicos`. `cadastro` FROM `dados_maconicos`")or die (mysql_error()); $linhasn = mysql_num_rows($sqln); for($numn = 0; $numn < $linhasn; $numn++){ $itemn = $numn + 1; $registron = mysql_fetch_array($sqln); $nome[$numn]=$registron['nome_obreiro']; $cadastro[$numn]=$registron['cadastro']; } //array presença data tipo $sqlpdt = mysql_query("SELECT `dados_maconicos`.`nome_obreiro` , `presenca`.`presenca` , `detalhe_presenca`.`data_presenca` , `reuniao`.`tipo_reuniao` FROM `dados_maconicos` INNER JOIN `presenca` ON `presenca`.`id_dadosmaconicos` = `dados_maconicos`.`id_maconico` INNER JOIN `detalhe_presenca`ON `detalhe_presenca`.`id_detalhe_presenca` = `presenca`.`id_detalhe_presenca` INNER JOIN `reuniao` ON `reuniao`.`id_reuniao` = `presenca`.`id_reuniao` WHERE data_presenca BETWEEN '2011-04-01' AND '2011-08-31' ORDER BY nome_obreiro, data_presenca asc")or die (mysql_error()); $linhaspdt = mysql_num_rows($sqlpdt); for($numpdt = 0; $numpdt < $linhaspdt; $numpdt++){ $itempdt = $numpdt + 1; $registropdt = mysql_fetch_array($sqlpdt); $presenca[$numpdt]=$registropdt['presenca']; $data[$numpdt]=$registropdt['data']; $tipo2[$numpdt]=$registropdt['tipo_reuniao']; } echo "<table class='nome' width=100% cellpading=2 cellspacing=2 border='2' bordercolor=#000000>"; echo "<tr><td rowspan=2>item</td><td rowspan=2 >nome</td><td rowspan=2>cadastro</td>"; for($c = 0; $c < $linhast; $c++){ echo "<td>".$datas[$c]."</td>"; } echo "</tr><tr>"; for($c2 = 0; $c2 < $linhast; $c2++){ echo "<td>".$tipo2[$c2]."</td>"; } $n=0; for($n = 0; $n < $linhasn; $n++){ $n1=$n+1; echo "<tr><td>".$n1."</td><td>".$nome[$n]."</td><td>".$cadastro[$n]."</td>"; //foreach ($value as $iKey => $iValue) { for($p = 0; $p < $linhast; $p++){ echo "<td>".$presenca[$p]."</td>\n"; } echo "</tr>\n"; } echo "</table>"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
forny 0 Denunciar post Postado Outubro 5, 2011 Resolvido. abs, Compartilhar este post Link para o post Compartilhar em outros sites
ldsantosld 0 Denunciar post Postado Outubro 9, 2011 Resolvido. abs, forny, por favor, poderia informar como resolveu? Estou com o mesmo problema. Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
forny 0 Denunciar post Postado Outubro 9, 2011 ldsantosld, Os dados da presença estão em um array. Dividi este grande array em um array composto de (quantidade de pessoas), onde cada pessoa terá quantidades iguais à quantidade de datas, através do array_chunk. A frequencia, após quebrar a cabeça, pois o array_sum, só soma valores não NULL. Usei o foreach. Para o percentual, já que era = frequencia/nº de datas, usei um if. Se freq = 0 -> percentual = 0; else percentual = frequencia/nº datas. OK? abs, forny Compartilhar este post Link para o post Compartilhar em outros sites