Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido)Enviar para QReport separando por mês


João Paulo Taraciuk

Pergunta

Olá pessoal, estou realizando uma pesquisa de aniversariantes e preciso que ele seja enviado para o QReport separando por mês, eu fiz uma Procedure enviando para txt, o resultado seria mais ou menos o mesmo, mas queria enviar para o QReport ao invés de txt, o código está assim

procedure Tfrm_niver.Pesquisa_Mensal;
var
  a: TextFile;
  Linha1, campo1, campo2, campo3 : string;
begin
AssignFile(a, 'C:\'+Edit1.Text+'.txt');
Rewrite(a);
Writeln(a, 'Codigo'+'  '+'Nome'+'                    '+'Data Nascimento');
Writeln(a,);
//=============================================================================\\   
//-------------------------------JANEIRO---------------------------------------\\   
  ZQuery_niver.Active:= False;                                                      
  ZQuery_niver.SQL.Clear;                                                           
  ZQuery_niver.SQL.Add('select id_cliente, nome, telefone, email, nascimento ');    
  ZQuery_niver.SQL.Add('from clientes where extract(month from nascimento)=1');     
  ZQuery_niver.Active:=True;                                                        
if(ZQuery_niver.RecordCount>0)then begin                                            
    Writeln(a);                                                                    
    Writeln(a,('=========================JANEIRO=============================='));  
    Writeln(a);                                                                     
  while not ZQuery_niver.Eof do begin                                              
     campo1 := AjustaStr(ZQuery_niver.FieldByName('id_cliente').AsString,6);       
     campo2 := AjustaStr(ZQuery_niver.FieldByName('nome').AsString,23);             
     campo3 := ZQuery_niver.FieldByName('nascimento').AsString;                  
     Linha1 := campo1+'  '+campo2+' '+campo3;                                       
     Writeln(a, Linha1);                                                            
     ZQuery_niver.Next;                                                             
     end                                                                            
     end                                                                            
else begin                                                                          
    Writeln(a);
    Writeln(a);                                                                     
    Writeln(a,('                         JANEIRO                              '));  
    Writeln(a,('Nenhum aniversariante cadastrado para o mês de Janeiro'));
    Writeln(a);                                                                    
end;                                                                                
//=============================================================================\\  
//-------------------------------FEVEREIRO-------------------------------------\\
  ZQuery_niver.Active:= False;
  ZQuery_niver.SQL.Clear;
  ZQuery_niver.SQL.Add('select id_cliente, nome, telefone, email, nascimento ');
  ZQuery_niver.SQL.Add('from clientes where extract(month from nascimento)=2');
  ZQuery_niver.Active:=True;
if(ZQuery_niver.RecordCount>0)then begin
    Writeln(a);
    Writeln(a);
    Writeln(a,('=========================FEVEREIRO============================'));
    Writeln(a);
  while not ZQuery_niver.Eof do begin
     campo1 := AjustaStr(ZQuery_niver.FieldByName('id_cliente').AsString,6);
     campo2 := AjustaStr(ZQuery_niver.FieldByName('nome').AsString,23);
     campo3 := ZQuery_niver.FieldByName('nascimento').AsString;
     Linha1 := campo1+'  '+campo2+' '+campo3;
     Writeln(a, Linha1);
     ZQuery_niver.Next;
     end;
     end
     else begin
    Writeln(a);
    Writeln(a);
    Writeln(a,('                       FEVEREIRO                              '));
    Writeln(a,('Nenhum aniversariante cadastrado para o mês de Fevereiro'));
    Writeln(a);
     end;

E por aí vai, até Dezembro, Não sei como fazer este procedimento, de separar mês a mês, colocando a descrição do mês e passando um traço, o que sai no txt é assim

Codigo Nome Data Nascimento

=========================JANEIRO==============================

4 JOAO PAULO 01/01/2004

10 AMADEU SILVÉRIO 01/01/2001

11 HENRIQUE MARINHO 02/01/1999

=========================FEVEREIRO============================

5 MARCELO ANTUNES 02/02/1995

MARCO

Nenhum aniversariante cadastrado para o mês de Março

=========================ABRIL===============================

3 CARLOS 01/04/1979

Se alguém puder me dar uma dica, eu agradeço!!

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0
Se alguém puder me dar uma dica, eu agradeço!!

a primeira dica é mudar sua consulta. Voce deve trazer a informação de modo que o mês fique agrupado com facilidade e seja utilizado no quick:

select extract(month from nascimento) as mes, id_cliente, nome, telefone, email, nascimento
from clientes order by 1, extract(day from nascimento)

veja que incluímos a coluna MES, que será utilizado para a quebra no quick (numa banda group) e ordenamos o resultado pelo mês (campo 1) e pelo dia para que a listagem fique ordenada corretamente por Mês e Dia.

Voce precisará de uma banda qrGroup e um qrDetail. Na group você define o expression para o campo MES e na detail, você coloca os campos que você quer mostrar.

Deve ficar parecido com outro relatório que já lhe dei umas dicas neste outro tópico: http://scriptbrasil.com.br/forum/index.php...st&p=468172

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Então Micheus, é exatamente no momento de fazer esta relação do qrGroup que eu estou perdido, coloquei o selet exatamente como você indicou aí saiu em ordem crescente por mês, agora só falta separá-los para ficar cada cada mês em um qrGroup, eu tentei olhei os exemplos Demo do Delphi, mas não consegui compreendê-los, bom eu fiz assim no QReport:

O QuickReport no DataSet eu coloquei a ZQuery_niver(Que estou utilizando), aí eu coloquei um QRGroup, que ficou como Group Header, e coloquei uma DetailBand, aí, eu estou perdido no expression, como eu devo colocá-lo?coloco apena mes ou deve ser entre parenteses?

Eu tentei até fazer no RichEdit, mas não consegui deixá-lo tabulado

Valeu!!

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

  • 0
(...) agora só falta separá-los para ficar cada cada mês em um qrGroup, eu tentei olhei os exemplos Demo do Delphi, mas não consegui compreendê-los, bom eu fiz assim no QReport:

O QuickReport no DataSet eu coloquei a ZQuery_niver(Que estou utilizando), aí eu coloquei um QRGroup, que ficou como Group Header, e coloquei uma DetailBand, aí, eu estou perdido no expression, como eu devo colocá-lo?coloco apena mes ou deve ser entre parenteses?

João Paulo Taraciuk, é muito fácil fazer isto porque a propriedade Expression tem uma espécie de wizard.

Selecione o QRGroup e localize ela na janela Object Inspector; Depois clique no botãozinho [...] e na tela que aparece, você terá um botão Database Field (campo da base de dados); na tela que aparece, você selecionar à esquerda o dataset em questão (no seu caso deverá haver apenas um - ZQuery_niver) e à direita seleciona o campo que, pelo exemplo que dei, deverá ser o Mês.

Nesta banda group você provavelmente vai querem mostra o nome do mês e há várias formas de fazer isso. Mas eu creio que a mais simples, neste caso, seria adicionar um TQRLabel (QRLabelMes) na banda Group e escrever no evento BeforePrint:

procedure TRelNiver.QRGroup1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
  QRLabelMes.Caption := FormateDateTime('mmmm', ZQuery_niverNacimento.AsDateTime);
end;

O que é importante neste tipo de relatório é que os dados já estejam ordenados de forma que o quick possa fazer a quebra correta através da banda group.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, lá vamos nós de novo, eu fiz o select como está na dica

select extract(month from nascimento) as mes, id_cliente, nome, telefone, email, nascimento
from clientes order by 1, extract(day from nascimento)
Aí no QReport saiu apenas um cliente e o Mês no QRLabel, mas eu coloquei o Record count, que retornou o número dos clientes, que no caso é 14, o que eu estou fazendo errado? Minha consulta está assim
procedure Tfrm_niver.novapesquisa;
begin
Form3.ZQuery_niver.Active:=False;
Form3.ZQuery_niver.SQL.Clear;
Form3.ZQuery_niver.SQL.Add('Select extract(month from nascimento) as mes, id_cliente, nome, telefone, email, nascimento ');
Form3.ZQuery_niver.SQL.Add(' from clientes order by 1, extract(day from nascimento)');
Form3.ZQuery_niver.Active:=True;
end;

No caso o QuickReport está no Form3, o que eu tenho que colocar neste código para ele continuar escrevendo a consulta?

AH, consegui colocar o QRGroup e setar na ZQuery, Valeu Micheus!!!

Link para o comentário
Compartilhar em outros sites

  • 0

João Paulo Taraciuk, pelo que você disse na MP, parece-me que você não setou a propriedade DataSet do QuickRep com o dataset ZQuery_niver.

Quando isso ocorre, ele não movimenta o dataset e por consequência, apenas o registro atual é impresso.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá agora saiu todos os clientes,mas ainda não consegui separá-los por mês vou colocar as propriedades dos componentes que estão no form:

ZQuery_niver

SQL: select extract(month from nascimento) as MES, id_cliente, nome, nascimento

from clientes order by 1, extract(day from nascimento)

QuickRep1

DataSet:ZQuery_niver

QRGroup1

Expression: ZQuery_niver.MES

FooterBand: ''

LinkBand: QRBand2

Master: QuickRep1

QRBand=QRBand2

BandType :rbDetail

LinkBand:''

aí tem um QRLabel no QRGroup onde está o código indicado

QRLabelMes.Caption := UpperCase(FormatDateTime('mmmm', ZQuery_nivernascimento.AsDateTime));

e na QRBand estão os QRDBText, cada qual setado no campo desejado, aí, agora saiu todos os clientes em ordem cerscente por mês e dia respectivamente, mas só sai um QRGroup em cima impresso 'JANEIRO', o que eu estou fazendo errado?

Tenho que colocar mais algum componente no form, ou mudar a propriedade de algum destes componentes?

Link para o comentário
Compartilhar em outros sites

  • 0
o que eu estou fazendo errado?

(...), ou mudar a propriedade de algum destes componentes?

João Paulo Taraciuk, ao que me parece a única coisa "fora do lugar" é esta configuração no QRGroup:

LinkBand: QRBand2

você não tem que linkar nada - deixe esta propriedade vazia.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
(...), mas só sai um QRGroup em cima impresso 'JANEIRO', o que eu estou fazendo errado?

Tenho que colocar mais algum componente no form, ou mudar a propriedade de algum destes componentes?

Vamos nós denovo. :)

Veja este exemplo anexo - é o básico do básico.

Compare com o que você tem, porque tem que funcionar.

Abraços

Relatorio_Aniversario.zip

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus, antes de mais nada, obrigado pela atenção.

No exemplo que você criou, sai exatamente como eu quero, mas se eu troco a Query da paleta BDE que está no relatóriozinho pela ZQuery do Zeos que é a que estou utilizando no projeto, coloco todos os dados e as propriedades da mesma maneira, mas com a ZQuery não sai igual, não sei porque, mas não sai. Se tivesse como ligar a Query da paleta BDE ao MySql...

Valeu.

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

  • 0
(...), coloco todos os dados e as propriedades da mesma maneira, mas com a ZQuery não sai igual, não sei porque, mas não sai. Se tivesse como ligar a Query da paleta BDE ao MySql...
Não seria este o caso.

Há algo errado sem dúvidas. Vou tentar pensar em algo mais que possamos verificar.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

João Paulo Taraciuk, com essa, aprendi mais uma. :D

Esta "limitação" com o QRExpr eu não tinha pego.

Como eu estava imaginando, por algum motivo a banda group não estava sendo reprocessada, ou seja, ela era impressa a primeira vez e não era reavaliada quando da mudança de Mes.

O que ocorreu é que o tipo de dados retornado pelo uso da função extract com o MySQL, ou reconhecido pelo Zeos (TLargeIntField), não é reconhecido pela rotina de avaliação da expressão no QRExpr. Digo "com o MySQL", porque ainda não tinha passado por isto com o FireBird (com o Zeos, seria um TSmallField) e Paradox (o exemplo no meu post anterior - TFloatField) - ver figura anexa.

Fica a dica, de quando adicionar um campo ou expressão, na propriedade Expression, utilizar o botão Validate para verificar se está tudo ok mesmo. ;)

A solução então é usar outra abordagem e fazer uso de funções que você encontra no MySQL (isto minimiza a portabilidade). No caso, passaremos a usar um campo tipo varchar ao usar a função de formatação de data: date_format (ref. documentação MySQL)

%m = mês formatado com duas casas (ex.: 01, 04, ...)

%d = dia formatado com duas casas (ex.: 02, 09, ...)

esta formatação(com duas casas) é necessária para a correta ordenação, do contrário 12 viria antes de 2.

Assim, a consulta SQL deverá ficar assim:

select date_format(nascimento, "%m") as Mes, date_format(nascimento, "%d") as Dia, nome, nascimento 
from clientes order by 1, 2

Voce deve substituí-la no seu código e, principalmente, no componente. Inclusive, faz-se necessário que você remova os campos do seu componente e os adicione novamente para que o tipo dos fields seja alterado.

Da forma como está esta consulta (sem parametrização), não seria necessário você inicializar a propriedade SQL via código (como você faz), porque ela não mudará em relação a que você adicionou em design-time na propriedade SQL.

Abraços

post-12746-1209028638_thumb.png

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...