Agrupar informações QuickReport - Mesma Query

Delphi

13/04/2015

Bom dia!

É o seguinte, eu tenho uma query que eu entro com o parâmetro de código de algum produto e ele me traz as informações referentes a aquele produto (Óbvio).
Tenho um LISTBOX onde tenho mais ou menos 10 códigos, fiz uma rotina onde um CONTADOR passa de código em código, manda pra query e gera um relatório de cada através do QuickReport.

Mas agora estou precisando que essas consultas fiquem no mesmo relatório, deixando de ser individuais :(

Ou seja, estou com dificuldade de fazer várias consultas numa única query e ir acumulando no QuickReport a cada consulta.

Eu pesquisei bastante antes de pedir ajuda aqui, mas não achei nenhuma solução/ideia que se enquadra no meu problema.



Obrigado desde já *-*
Mateus Ribeiro

Mateus Ribeiro

Curtidas 0

Respostas

Thiago Santana

Thiago Santana

13/04/2015

Mateus posta o código da sua query!
Fica mais fácil
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

13/04/2015

Mateus posta o código da sua query!
Fica mais fácil


Certo, a query traz o total faturado até hoje de determinado produto:

Select p.Descricao, Sum(i.Valor_Total) as Valor_Total
From Produtos p, Notas n, Notas_Itens i
Where p.Codigo = i.Codigo_Produto
           and n.Chave = i.Chave_Nota
           and p.Codigo = :pCodigoProduto 
Group by p.Descricao
GOSTEI 0
Marcos P

Marcos P

13/04/2015

Mateus,

Seu problema é na query ou no report ?

Se for no report, tentou fazer isso criando um relatório com agrupamento simples ( considerando essa mesma query ) ?
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

13/04/2015

Mateus,

Seu problema é na query ou no report ?

Se for no report, tentou fazer isso criando um relatório com agrupamento simples ( considerando essa mesma query ) ?


A query está funcionando perfeitamente, eu coloco o parâmetro do produto e as informações chegam. O problema é que vou entrar com vários parametros e queria que o Report guardasse cada um, acumulando sabe.
Bom eu fiz um agrupamento simples e vários outros que vi na internet rs
Poderia me dizer como seria esse seu método?
GOSTEI 0
Marcos P

Marcos P

13/04/2015

Esses agrupamentos que você fez, não funcionaram ?

O que você precisa é chamar a query várias vezes com parâmetros diferentes, juntando tudo no mesmo relatório ?

Se for isso, existem alternativas :

1. Criar uma stored procedure passando TODOS os parâmetros para a procedure e fazendo com que ela devolva todos os dados de uma única vez, tratando o agrupamento ( simples ) no QRP

ou

2. Passar TODOS os parâmetros para o QRP e rodando a query ( recursivamente ) nos eventos de quebra dos grupos do relatório ( BeforePrint em rbDetail ou rbColumnHeader )
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

13/04/2015

Esses agrupamentos que você fez, não funcionaram ?

O que você precisa é chamar a query várias vezes com parâmetros diferentes, juntando tudo no mesmo relatório ?

Se for isso, existem alternativas :

1. Criar uma stored procedure passando TODOS os parâmetros para a procedure e fazendo com que ela devolva todos os dados de uma única vez, tratando o agrupamento ( simples ) no QRP

ou

2. Passar TODOS os parâmetros para o QRP e rodando a query ( recursivamente ) nos eventos de quebra dos grupos do relatório ( BeforePrint em rbDetail ou rbColumnHeader )


Cara vc definiu em poucas palavras o que eu quero: "chamar a query várias vezes com parâmetros diferentes, juntando tudo no mesmo relatório"

Desconheço essas opções alternativas citadas mas vou pesquisar direitinho aqui pra ver se consigo algo... Mas se por acaso vc tiver um site de exemplo de uso só pra dar aquele adianto, eu agradeceria rs mas já foi de grande ajuda com as alternativas :p


Grato
GOSTEI 0
Marcos P

Marcos P

13/04/2015

Tenho exemplos, sim... mas são bem extensos e em contextos que não seria trivial repassar ( por conta dos bancos de dados associados ).

Vou pesquisar algum material complementar na WEB e se achar, te aviso...

Boa sorte !
GOSTEI 0
Marcos P

Marcos P

13/04/2015

Mateus,

Achei um trecho de código que pode lhe ajudar...

procedure TFrmrepRelSintFat2.QRGroup2BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
var i : integer;
begin
  stTotal.Close;
  for i := 1 to stTotal.ParamCount - 1 do
    stTotal.Params[i].Clear;
  stTotal.ParamByName('@Query').asinteger := 2;
  if (DEIni > 0) then begin
    stTotal.ParamByName('@DEIni').asdatetime := DEIni;
    stTotal.ParamByName('@DEFim').asdatetime := DEFim;
  end;
  if (DVIni > 0) then begin
    stTotal.ParamByName('@DVIni').asdatetime := DVIni;
    stTotal.ParamByName('@DVFim').asdatetime := DVFim;
  end;
  stTotal.ParamByName('@TipoDoc').asinteger := stRelatorio.fieldbyname('Tipodoc').asinteger;
  stTotal.ParamByName('@Cidade').asinteger := stRelatorio.fieldbyname('codcidade').asinteger;
  if (FatIni > 0) then begin
    stTotal.ParamByName('@FatIni').asinteger := FatIni;
    stTotal.ParamByName('@FatFim').asinteger := FatFim;
  end;
  if(NFIni > 0) then begin
    stTotal.ParamByName('@NFIni').asinteger := NFIni;
    stTotal.ParamByName('@NFFim').asinteger := NFFim;
  end;
  stTotal.ParamByName('@Empr').asboolean := true;

  stTotal.ParamByName('@Empresa').AsAnsiString := stRelatorio.fieldbyname('empresa').AsAnsiString;

  if not stTotal.Prepared then
    stTotal.Prepare;
  stTotal.Open;

end;


Esse código faz o seguinte... para cada quebra do grupo de dados do relatório ( nesse caso um master / detail ) e antes de imprimir o grupo ( por isso o código foi colocado em QRGroup2BeforePrint), o quickreport executa a stored procedure "stTotal" que totaliza as informações daquele grupo e as armazena para impressão no rodapé do grupo corrente.

Repare que os parâmetros setados para a execução da procedure de totalização, são os parâmetros correntes da procedure principal do relatório ( ... := stRelatorio.fieldbyname... ).

O que você precisa é algo parecido com isso, mas baseado em queries e não em procedures, o que não muda muito o contexto de programação.

Espero que não tenha ficado muito confuso...
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

13/04/2015

Bom dia!

Obrigado por disponibilizar essa rotina! Estou agora estudando como trabalhar com "Stored Procedure" pq eu desconhecia rs

Muito obrigado mesmo, jaja posto qualquer avanço.


Grato
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

13/04/2015

Boa Tarde Marcos!

Fui obrigado a abandonar temporariamente essa questão por motivos mais urgentes.
Mas estou retomando rs

Marcos, poderia me dar uma luz referente a segunda opção que vc deu?
2. Passar TODOS os parâmetros para o QRP e rodando a query ( recursivamente ) nos eventos de quebra dos grupos do relatório ( BeforePrint em rbDetail ou rbColumnHeader )


Obrigado desde já ^^
GOSTEI 0
Marcos P

Marcos P

13/04/2015

Se você rodar a query sem nenhum parâmetro de item, não resolve seu problema ?

Senão rolar, crie uma query dinâmica que gere os parâmetros do listbox em um "in" no where do lado do QRP...

Sobre query dinâmica, dê uma olhada nesse post.
GOSTEI 0
POSTAR