Fórum Agrupar informações QuickReport - Mesma Query #516554
13/04/2015
0
É 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
Curtir tópico
+ 0Posts
13/04/2015
Thiago Santana
Fica mais fácil
Gostei + 0
13/04/2015
Mateus Ribeiro
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.DescricaoGostei + 0
13/04/2015
Marcos P
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
13/04/2015
Mateus Ribeiro
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
13/04/2015
Marcos P
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
13/04/2015
Mateus Ribeiro
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
13/04/2015
Marcos P
Vou pesquisar algum material complementar na WEB e se achar, te aviso...
Boa sorte !
Gostei + 0
13/04/2015
Marcos P
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
14/04/2015
Mateus Ribeiro
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
22/04/2015
Mateus Ribeiro
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?
Obrigado desde já ^^
Gostei + 0
23/04/2015
Marcos P
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
Clique aqui para fazer login e interagir na Comunidade :)