Jump to content
Fórum Script Brasil
  • 0

Exibir sem repetir o mês


Nelma

Question

estou tentando montar um pg q traga os dados da seguinte forma:

receita Mês1 Mês2 Mês3

nome_receita vlr1 vlr2 vlr3

nome_receita2 vlr1 vlr3

O meu select está da seguinte forma:

$qry = mysql_query("SELECT SUM(valor_credito),r.receita,c.data FROM credito c,receita r WHERE r.cod_receita=c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY c.data");
        while($credito = mysql_fetch_array($qry)){
                                         print $credito[2]."<br />\n";
                             print $credito[1]."<br />\n";
                             print $credito[0]."<br />\n";
        }

Está agrupando por data, mas tanto elas quanto a receita estão repetindo.

Alguém tem alguma dica como exibir dessa maneira?

Valeu

Link to comment
Share on other sites

20 answers to this question

Recommended Posts

  • 0

Mesmo acrescentando esse campo no group by, ainda ele repete o mês, se houver receitas diferentes.

Não sei se é no select, mas talves seje preciso melhorar a lógica para exibir.

porque ele traz os dados corretos..mas na hora de exibir!!!

eu ainda não consegui visualizar como não deixar repetir o mês, caso haja receitas diferentes.

Mas valeu pela dica!

Link to comment
Share on other sites

  • 0

então nelma, as datas vao repetir sim. imagina q você tenha a receita x e y na mesma data. vao aparecer as duas no select sim.

ai você tem q ver a logica na hora de exibir. acho q se você mandar ordenar (Order By) por receita e data vai ficar melhor.

mas tipo, não entendi direito como você quer. você quer uma linha de cabecalho com todos os meses, e embaixo a soma pra cada mes de cada receita??

se for acho melhor você fazer primeiro um select de todos os meses pra montar o cabecalho.

e depois selecionar as receitas e ir preenchendo a tabela.

Link to comment
Share on other sites

  • 0
mas tipo, não entendi direito como você quer. você quer uma linha de cabecalho com todos os meses, e embaixo a soma pra cada mes de cada receita??

Seria para isso...o cabeçalho (mês) na primeira linha e abaixo as receitas e seus valores por mês. Caso a haja duas entradas para a mesma receita em um mês, então soma esse valor. Mas isso o select já está fazendo.

Bom eu vou seguir sua dica...primeiro o cabeçalho e depois o restante do conteúdo.

Valeu

Link to comment
Share on other sites

  • 0

acho melhor fazer o cabecalho antes, já q os meses valem pra todas as receitas não??

mas você pode ter problemas se alguma receita não aparecer em algum mes, isso ocorre no seu banco??

outra coisa, esse agrupamente só vai agrupar por mes se todas as datas forem do mesmo dia. porque por exemplo, se você tem a data 01/01/2000 e a data 02/01/2000 as duas são do mesmo mes, mas como são dias diferentes, vai ser agrupadas separadamente. ai nesse caso você teria q adaptar seu select.

Link to comment
Share on other sites

  • 0

Todas as receitas estão relacionadas a uma data.

Com relação ao agrupamento das daas, eu acabei de ver esse problema..pois os dias são diferentes..e ele não agrupa

Então eu agrupei por receita...porque todo mês tem pelo menos uma receita. Sendo assim aparece os meses do período escolhido.

E esse relatório será gerado a cada 3 meses.

Link to comment
Share on other sites

  • 0

hum, mas se você agrupou só por receita, e vai somar todos os meses do select (de acordo com o Where), ele vai somar os tres meses juntos. como você vai fazer pra mostrar a soma de cada um dos tres meses??

acho q o melhor seria você usar as funcoes de data e fazer um campo calculado q considerasse somente mes e ano. o MySql tem a funcao Last_Day() q vai selecionar todas as datas com o ultimo dia do mes. assim você poderia agrupar mensalmente.

Link to comment
Share on other sites

  • 0

Desculpa, mas não entendi muito bem o q você falou.

O primeiro Select (p/ o cabeçalho), está assim:

$qry = mysql_query("SELECT data FROM credito WHERE data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY cod_receita");
O resultado é: Janeiro Fevereiro Março Agora para buscar o coneúdo eu fiz assim:
$qry0 = mysql_query("SELECT SUM(valor_credito),r.receita FROM credito c,receita r WHERE r.cod_receita=c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY c.data,r.receita");

Se houver a mesma receita no mesmo mês ele soma esses valores, senão ele mostra cada receita e seu valor dentro do período.

Onde eu usaria a função Last_day()?

Link to comment
Share on other sites

  • 0
O primeiro Select (p/ o cabeçalho), está assim:

$qry = mysql_query("SELECT data FROM credito WHERE data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY cod_receita");
O resultado é: Janeiro Fevereiro Março
e você conseguiu montar o cabecalho?? os dados apareceram certinho??
Agora para buscar o coneúdo eu fiz assim:
$qry0 = mysql_query("SELECT SUM(valor_credito),r.receita FROM credito c,receita r WHERE r.cod_receita=c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY c.data,r.receita");

Se houver a mesma receita no mesmo mês ele soma esses valores, senão ele mostra cada receita e seu valor dentro do período.

tipo, onde você chama essa funcao?? você chama ela pra cada mes??

note q você não deveria agrupar pela data, senao ele vai somar pra cada dia (exemplo, você vai ter a soma do dia 01/01, depois a soma de 02/01 e assim por dianta). acho q você devia tirar a data do Group By.

mas tipo, queria saber... o q você passa nos parametros $dt_inicio e $dt_fim??

você passa apenas o mes ou o trimestre todo?? porque se você passar de janeiro a marco por exemplo, ele vai somar o periodo todo, não vai agrupar por mes. ai você não vai ter como mostrar janeiro, feveiro e marco. por isso, sugeri o Last_Day().

nossa acho q eu to mais complicando do q ajudando, mas é tb não to entendendo direito como você ta fazendo.

Link to comment
Share on other sites

  • 0

Tranquilo...você tá ajudando sim...eu q não tenho todo esse conhecimento..mas vamos lá

Tem um form onde escolhe-se o mês e ano de inicio e fim ($dt_inicio e $dt_fim). Para não escolher o dia, eu estipulei para o inicio 01 e para o fim 30 (Se bem q tem c/ 31 e 28).

$dt_inicio = "$sel_ano_in-$sel_mes_in-1";
    $dt_fim = "$sel_ano_fim-$sel_mes_fim-30";
Para o cabeçalho eu fiz isso:
<?php
$qry = mysql_query("SELECT Last_Day(data) FROM credito WHERE data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY cod_receita");
while($data = mysql_fetch_row($qry)){
$mes_a = substr($data[0],5,2);
switch($mes_a){
    case "1":
    print "<td width=\"95\" align=\"center\" valign=\"middle\" class=\"titulo\">JANEIRO </td>";
    break;
    case "2":
    print "<td width=\"95\" align=\"center\" valign=\"middle\" class=\"titulo\">Fevereiro</td>";
    break;
    case "3":
    print "<td width=\"95\" align=\"center\" valign=\"middle\" class=\"titulo\">Março</td>";
    break;
}
 } 
?>
Isso retorna : Janeiro Fevereiro Março porque tem receita cadastrada nos três meses...mas é tanta mão de obra..porque...eu teria q fazer um case para cada mês, e não sei se seria o correto. Agora para trazer o restante em cada coluna certinho...não consegui fazer Eu tentei usar esse select:
$qry0 = mysql_query("SELECT SUM(valor_credito),r.receita FROM credito c,receita r WHERE r.cod_receita=c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY c.data,r.receita");

Ele traz os resultado certo...soma os valores de receitas iguais no mesmo mês e traz separado por mês.

Mas para exibir nas colunas certas..não consigo

Valeu pela sua ajuda

Link to comment
Share on other sites

  • 0
porque tem receita cadastrada nos três meses...mas é tanta mão de obra..porque...eu teria q fazer um case para cada mês, e não sei se seria o correto.

você pode fazer uma function pra isso. tipo assim:

function NomeMes($mes)
{
    if ($mes == 1) return "janeiro";
    if ($mes == 2) return "fevereiro";
    ....
    ....
    if ($mes == 12) return "dezembro";
}[/code] ai pra mostrar você pega da funcao. tipo assim:
[code]print "<td width=\"95\" align=\"center\" valign=\"middle\" class=\"titulo\">" . NomeMes($mes_a) . "</td>";
Agora para trazer o restante em cada coluna certinho...não consegui fazer Eu tentei usar esse select:
$qry0 = mysql_query("SELECT SUM(valor_credito),r.receita FROM credito c,receita r WHERE r.cod_receita=c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY c.data,r.receita");
Ele traz os resultado certo...soma os valores de receitas iguais no mesmo mês e traz separado por mês. Mas para exibir nas colunas certas..não consigo
como não sei direito como esta seu banco de dados, isso q eu vou passar pode não dar muito certo, mas acho q você devia fazer tipo assim:
$qry0 = mysql_query("SELECT SUM(valor_credito), r.receita Last_Day(c.data) As MesAno FROM credito c, receita r WHERE r.cod_receita = c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY r.receita, Last_Day(c.data) ORDER BY r.receita, Last_Day(c.data)");

dessa forma, você vai ter tres colunas no seu select. a primeira tras a soma, a segunda tras a receita e a terceira tras a data considerando apenas mes e ano (sendo q o dia vai ser o ultimo do mes, mas isso não vai fazer a minima diferenca pro seu codigo).

ai levando em conta q cada receita aparece todo mes, você simplesmente faz um for de 1 a 3 e vai pondo os valores no td. quando chegar em tres, você abre e fecha o tr e reseta o contador (pra 1 de novo, ate chegar em 3 e assim por diante).

mas caso algumas receitas não tenham lancamentos em todos os meses, então você vai ter q checar os meses pra exibir nas colunas certas. nesse caso de um toque q eu te passo umas ideias de codigos.

veja se entendeu ai, qualquer coisa poste.

Link to comment
Share on other sites

  • 0

kuroi...a parte do cabeçalho está correto..valeu pela dica.

Agora, o problema está aqui.

mas caso algumas receitas não tenham lancamentos em todos os meses, então você vai ter q checar os meses pra exibir nas colunas certas. nesse caso de um toque q eu te passo umas ideias de codigos.

Há pelo menos uma receitas por mês, mas ex: a receita x pode ter 2 entradas em jan e depois só em fev.

Sendo assim teria q fazer o q você falou, checar os meses.

Para ler os meses q estão retornando:

$qry0 = mysql_query("SELECT SUM(c.valor_credito), r.receita, Last_Day(c.data) As MesAno FROM credito c, receita r WHERE r.cod_receita = c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY r.receita, Last_Day(c.data) ORDER BY  r.receita, Last_Day(c.data)");
    while($result = mysql_fetch_row($qry0)){
        $mes = substr($result[2],5,2);
                }

Os resultados estão vindo corretos, só falta checar os meses para colocar cada valor na coluna do mês correspondente.

As receitas eu já consegui colocar na coluna certa (coluna receita), mas os valores não.

Link to comment
Share on other sites

  • 0

você pode fazer um while pra ir lendo os registros. e um contador para as colunas. ai você ve quando mudar a receita, você reseta o contador.

ai você compara o $qry0 com o $qry. quando for pra mostrar janeiro, se não tiver a receita desse mes, você poe um td em branco.

Link to comment
Share on other sites

  • 0

Eu ainda não consegui acertar a lógina...

O que eu tenho é isso:

<?php
function NomeMes($mes){
    if($mes == 1) return "JANEIRO";
    if($mes == 2) return "FEVEREIRO";
    if($mes == 3) return "MARÇO";
    if($mes == 4) return "ABRIL";
    if($mes == 5) return "MAIO";
    if($mes == 6) return "JUNHO";
    if($mes == 7) return "JULHO";
    if($mes == 8) return "AGOSTO";
    if($mes == 9) return "SETEMBRO";
    if($mes == 10) return "OUTUBRO";
    if($mes == 11) return "NOVEMBRO";
    if($mes == 12) return "DEZEMBRO";

}
$cont=0;
        $qry = mysql_query("SELECT Last_Day(data) FROM credito WHERE data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY cod_receita");
        while($data = mysql_fetch_row($qry)){
            $mes = substr($data[0],5,2);
            $cont++;
            print "<td width=\"95\" align=\"center\" valign=\"middle\" class=\"titulo\">" . NomeMes($mes) . "$cont</td>";    

         } 
            print "</tr>";
              print "<tr>";
            
$qry0 = mysql_query("SELECT r.receita, Last_Day(c.data) As MesAno FROM credito c, receita r WHERE r.cod_receita = c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY Last_Day(c.data) ORDER BY  r.receita, Last_Day(c.data)");
    while($result = mysql_fetch_row($qry0)){
           print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";    
            print "</tr>";
              print "<tr>";               
               
                }                 




        
        ?>

Os mês estão aparecendo e para aparecer as receitas, sem repetir, eu usei o 2º select. Assim não repete, mesmo q seja em meses diferentes.

Mas eu não entendi como fazer

ai você ve quando mudar a receita, você reseta o contador. ai você compara o $qry0 com o $qry. quando for pra mostrar janeiro, se não tiver a receita desse mes, você poe um td em branco.

Tem mais alguma dica? Desculpe pela insistência...

Link to comment
Share on other sites

  • 0

nelma, tenta fazer um contador aqui (não abra o tr antes do while):

$qry0 = mysql_query("SELECT r.receita, Last_Day(c.data) As MesAno FROM credito c, receita r WHERE r.cod_receita = c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY Last_Day(c.data) ORDER BY  r.receita, Last_Day(c.data)");
    $i = 1;
    while($result = mysql_fetch_row($qry0)){
           print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";    
           if ($i == 1)   print "<tr>";              
           $i++;
            if ($i == 3)
            {
                 print "</tr>";
                 $i = 1;
             }
              
              }[/code]

veja se funciona.

Link to comment
Share on other sites

  • 0

Bom..obrigada pela ajuda!

Isso q você passou funcionou sim...Eu cheguei a fazer isso tb, listar as receitas(descricao) em uma coluna.

Agora o layouy esta da seguinte forma:

Descrição Receitas ------------------ MêsA------MêsB--------MêsC

ReceitaA

ReceitaB

ReceitaC

O meu problema esta na hora de distribuir os valores das respecivas receitas separados por mÊs. Isso ainda não entrou na minha cabeça.

O select eu já fiz (somar as receitas repetidas/mês).

Como eu vou comparar a $qry0 e a $qry??

Mais uma vez...valeu mesmo pela ajuda

Link to comment
Share on other sites

  • 0

opa, no meu codigo de antes tinha um erro, o certo é abrir o tr antes do tb.

mas tenta, na hora de escrever os titulos, jogar os meses num array. tipo assim:

while($data = mysql_fetch_row($qry)){
            $mes = substr($data[0],5,2);
            $a[cont] = $mes;
            $cont++;
            print "<td width=\"95\" align=\"center\" valign=\"middle\" class=\"titulo\">" . NomeMes($mes) . "$cont</td>";    

         }[/code] ai na hora de mostrar os titulos, você pode adaptar no codigo q eu passei. tipo assim:
[code]$qry0 = mysql_query("SELECT r.receita, Last_Day(c.data) As MesAno FROM credito c, receita r WHERE r.cod_receita = c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY Last_Day(c.data) ORDER BY  r.receita, Last_Day(c.data)");
    $i = 1;
    while($result = mysql_fetch_row($qry0)){
           $mes = substr($result[1],5,2);
           if ($i == 1)   print "<tr>";
           if ($mes == $a[$i - 1])
           {
                  print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";    
           }
           else
           {
                 print "<td>&nbsp;</td>";
                 if ($i == 1)
                 {
                      if ($mes == $a[$i])
                     {
                          print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";
                      }
                      else
                      {
                          print "<td>&nbsp;</td>";
                      }
                      $i++;
                 }
                 if ($i == 2)
                 {
                      if ($mes == $a[$i])
                     {
                          print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";    
                      }
                      else
                      {
                          print "<td>&nbsp;</td>";
                      }
                 }
           }
           $i++;
            if ($i == 3)
            {
                 print "</tr>";
                 $i = 1;
             }
              
              }

veja se resolve ai pra você.

Link to comment
Share on other sites

  • 0

Olha..resolveu quase tudo, mas ainda falata uma coisa.

você poderia me explicar o q você desenvolveu para que eu possa entender melhor?

O q está acontecendo é o seguinte:

Receita------------------Mes1---------------Mes2---------------Mes3

Receita a-----------------vlr1a---------------vlr2a

vlr3a

Receitab-----------------------------------------------------------vlr3b

Receita c------------------vlr1c--------------vlr2c

vlr3c

Ou seja...as receitas a e c tem lancto no três meses, mas sempre no último mes ela não aparece na mesma linha das demais.

E a receita b possui lancto só no último mes...nesse caso está certo.

Falta acertar o último lancto das receitas a e b.

Teria como você explicar o código..porque eu analisei, mas não sei se fiz correto

Se não fosse sua ajuda...eu não teria chegado até aqui!!..obrigada

Link to comment
Share on other sites

  • 0

é, não da pra eu testar o codigo aqui então não da pra ter certeza se vai funcionar direitinho, mas pelo q você mostrou, parece q ta quase la.

basicamente o q faz o código é o seguinte. no array $a estao gravados quais são os tres meses em cada um de seus indices.

e a variavel $i é um contador. ai, essa linha if ($mes == $a[$i - 1]) checa se o mes do registro atual é o mesmo mes da coluna atual. se não for é porque essa receita não tem lancamento esse mes. ai se não for ele vai pro else pra escrever um td em branco.

mas o erro acredito q era porque ele tava quebrando o tr quando o contador chegava a 3 e tinha q ser quando chegava a 4, porque a coluna 3 tb tem q ser impressa. o novo codigo deve ficar mais ou menos assim, veja se da certo. senao me fala q quando der eu tento fazer u teste em casa porque aqui no trampo não tem php.

$qry0 = mysql_query("SELECT r.receita, Last_Day(c.data) As MesAno FROM credito c, receita r WHERE r.cod_receita = c.cod_receita AND c.data BETWEEN '$dt_inicio' AND '$dt_fim' GROUP BY Last_Day(c.data) ORDER BY  r.receita, Last_Day(c.data)");
    $i = 1;
    while($result = mysql_fetch_row($qry0)){
           $mes = substr($result[1],5,2);
           if ($i == 1)   print "<tr>";
           if ($mes == $a[$i - 1])
           {
                  print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";    
           }
           else
           {
                 print "<td>&nbsp;</td>";
                 if ($i == 1)
                 {
                      if ($mes == $a[$i])
                     {
                          print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";
                      }
                      else
                      {
                          print "<td>&nbsp;</td>";
                      }
                      $i++;
                 }
                 if ($i == 2)
                 {
                      if ($mes == $a[$i])
                     {
                          print "<td width=\"300\" align=\"left\" valign=\"middle\" class=\"fonte\">" .$result[0] . "</td>";    
                      }
                      else
                      {
                          print "<td>&nbsp;</td>";
                      }
                      $i++;
                 }
           }
           $i++;
            if ($i == 4)
            {
                 print "</tr>";
                 $i = 1;
             }
              
              }[/code]

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...