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

(Resolvido) Quebra + Banda QRGroup + Expression do Quick Report


DanielR

Pergunta

Boa tarde pessoal.

Bem fiz o relatorio no quick report a partir de um ClientDataSet utilizando uma banda de grupo para quebrar as informações.

os dados do relatorio deveriam sair assim:

Cliente X (quebra)

Produto A

Produto B

Cliente Y (quebra)

Produto C

Produto D

porém estão saindo assim:

Cliente X (quebra)

Produto A

Produto B

Produto C

Produto D

já pesquisei na net e parece que estou repetindo os mesmos erros de outros, mas sinceramente (posso estar esquecendo de algo) chequei as possibilidades.

o relatorio tem como dataset o clientedataset que falei la em cima.

o clientedataset esta populado e indexado desta forma

ID|NOME|ITEM|NOME_PRODUTO|VALOR_TOTAL|DATA com order by na coluna 'NOME'

as bandas usadas são

qrgroupHeader (TQRGroup) ( aqui a property expression esta setada para 'NOME')

detail (TQRBand)

grGroupFooter (TQRBand)

Basicamente é isso e simplesmente não funciona nesse relatorio, o que é estranho é que o relatório de produtos por grupo_familia funciona. Uso herança visual e o relatorio é exatamente o mesmo, apenas populo o clientdataser com outros dados, modifico a property expression e coloco obviamente os outros dbtexts.

o que posso estar fazendo de errado. Obrigado pela ajuda!

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

o raciocínio está correto ... para testar se a tabela está ordenada corretamente, use um dbgrid para visualizar os dados

na tabela voce devera encontrar o campo NOME repetido para cada um dos produtos que estiverem indexados a ele

se ele aparecer corretamente, então o erro é somente na configuração das bandas do quick report

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

oi Jonas, obrigado pela resposta.

sobre:

"o raciocínio está correto ... para testar se a tabela está ordenada corretamente, use um dbgrid para visualizar os dados"

já estou usando um dbgrid, e esta ordenado de forma correta.

''na tabela voce devera encontrar o campo NOME repetido para cada um dos produtos que estiverem indexados a ele''

isso mesmo, confere!

''se ele aparecer corretamente, então o erro é somente na configuração das bandas do quick report''

penso que o erro esta aqui, mas ai que entra minha questão, pois uso herança visual e a configuração é a mesma do outro relatorio apenas passo para a classe a lista de filtros e indices e os metodos Indexar e Filtrar fazem sua parte.

Exemplo

RelBase (propery Filtros: StringList; Indices:StringList - Metodos: Indexar:string; filtrar:string; AbreDados(ele pega um cds e da o open depois filtra e indexa) ; doPreview; doPrint (esses dois metodos tem a função de verificar se tem registro no cds e preparar o rel para exibir ou imprimir) basicamente isso.

RelProdutos = filho de RelBase (tenho um constructor que pega os qrdbtex e seta os dataset deles) pronto

RelClientes = filho de RelBase (tenho um constructor que pega os qrdbtex e seta os dataset deles) pronto

oRelBase tem as bandas pageheader e pagefooter.

oRelClientes e RelProdutos tem as bandas citadas acima com as mesma configurações em relação a altura, tamanho, fonte etc, porém a banda qrGroup tem a propriedade expression, que faz a diferença e essa mudo em tempo de execução cfe o que o usuario escolheu, a propriedade Master recebe por padrão main que é o meu relatorio, a propriedade LinkBand recebe o valor de detailband1 e a property footerband recebe recebe o qrgroupfooter, pronto funciona beleza a listagem e a quebra no relProdutos e no relClientes não funciona a quebra;

já olhei uma a uma das propriedades, já chquei se esta chegando ordenado como quero e tudo ta certo, porém no relClientes não acontece a quebra.

Obrigado por enquanto qualquer novidade postarei e se puderem me ajudar agradeço

Daniel

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas obrigado pela ajuda ate então, mas lamentavelmente nada feito, observei cada detalhe. 1. criei um novo relclientes copiando as bandas do relprodutos 2. no create setei os data sets 3. antes de imprimir o rel me certifiquei de que o estaria abrindo, filtrando e indexando o cds 4. passei para a qrgroup.expression o nome escolhido pelo usuario no caso 'NOME' e por fim 5. abri a visualização do rel e nada, houve apenas a impressão da lista , porém a quebra negativo, pode ser um bug no quick report, vi num video aula acontecer o mesmo caso e o cara teve que se ajeitar la para contornar.

Daniel

ps. se for um bug do quick report ele ta me devendo uma, pois criei minha classe base pensando nessa banda e principalmente nessa funcionalidade da property expression, agora tenho que repensar o processo.

*2. setei os dataset dos qrdbtex.

Link para o comentário
Compartilhar em outros sites

  • 0

eu uso o QR sem problemas e fazendo quebras usando o qrgroupHeader, detail e qrGroupFooter

em relatorios desse tipo, prefiro usar os componentes de acesso ao banco de dados , dentro do proprio QR

então siga os passos:

1 - colocar os componentes TQuery, TDataSetProvider, TClientDataSet e TDataSource no QR

2 - Indexar a tabela usando a propriedade SQL do TQuery

3 - Na propriedade DataSet do QR colocar o nome do TDataSource

4 - Na propriedade Expression do QRGroup1 da banda qrgroupHeader colocar o nome do campo ( NOME ) que fara a quebra

5 - Na banda Detail coloque os campos da tabela que serão exibidos em sequencia

6 - Na Banda qrGroupFooter não coloque nada

7 - Ative a query no evento AfterPreview ou antes da chamada do preview do QR

como exemplo, a sua DBGrid deveria apresentar os dados mais ou menos assim

NOME...................DESC_PROD

CONSUMIDOR1.....PRODUTOA

CONSUMIDOR1.....PRODUTOC

CONSUMIDOR1.....PRODUTOE

CONSUMIDOR2.....PRODUTOA

CONSUMIDOR2.....PRODUTOD

CONSUMIDOR2.....PRODUTOJ

se o campo NOME estiver na banda qrgroupHeader e o campo DESC_PROD estiver na banda Detail não há como errar

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado mais uma vez pelo desprendimento em me ajudar! mas...

ok. como disse, você prefere colocar os componentes de acesso ao banco dentro do proprio QR, mas nada impede de não colocar tb certo?

eu já prefiro alimentar no QR um clientdataset e apartir dele fazer bom uso dos recursos do proprio clientdaset e das bandas e etc...

No meu software tenho as classe de persistencia e nelas que faço a busca dos dados. As pesquisas sempre trago em formato olevariant que pode ser populado tranquilamente dentro de um clientdataset, depois desse ponto é so brincar de visualizar e imprimir se for o caso, mas o qr não esta fazendo a parte dele (eu acho) ou eu não estou enxergando o meu erro.

Faço Assim:

tenho um form padrão que traz num lisbox a lista de campo do recem populado clientdaset.

e mais sugestões de filtros que são aplicados no CDS ao invés de ir novamente ao banco.

porém esses filtros e indexações que o usuario vai escolhendo é gravado em listas respectivas sempre que ele clica em um determinado botão.

quando o usuario resolve visualizar os dados filtrados e ordenados passo então esses dados para o relatorio base que recebe a tabela obviamente com todos os dados

e passo os filtros e indices escolhidos, la volto a filtrar e indexar deixando a tabela do mesmo jeito que ele escolheu.

A partir dai é visualizar ou imprimir.

veja a chamada do relatorio:

loFaturamentoProduto := TfrmFaturamentoClienteReport.Create(nil);

try

loFaturamentoProduto.filtro := self.filtrocds;

loFaturamentoProduto.indice := self.indicecds;

loFaturamentoProduto.dadosole := cds_lista.Data;

loFaturamentoProduto.QRGroup1.Expression := TutilCDS.ExtrairGrupo( Self.indicecds);

loFaturamentoProduto.doPreview;

except on E: Exception do

Tutil.doTrataException('Não foi possivel visualizar o Relatório de faturamento,' + #13#10 + 'verifique os dados escolhidos ou reporte o erro ao suporte' + #13#10,e);

end;

metodo doPreview

procedure TfrmBaseReport.doPreview;

begin

Screen.Cursor := crHourGlass;

DoConfigHeader;

if doAbreDados > 0 then

begin

main.Prepare;

Screen.Cursor := crDefault;

main.Preview;

end

else if doAbreDados = 0 then

begin

ShowMessage('Não há registros para listar!');

Screen.Cursor := crDefault;

exit;

end;

end;

metodo doAbredados

function TfrmBaseReport.doAbreDados : integer;

var

loutil : TutilCDS;

begin

loutil := TutilCDS.create;

try

loutil.cds := cdsDados;

loutil.filtro := self.filtro;

loutil.indice:= self.indice;

result := 0;

cdsDados.Close;

cdsDados.Data := self.dadosole;

cdsDados.Open;

loutil.Executar;

result := cdsDados.RecordCount;

finally

loutil.free;

end;

end;

metodo executar

procedure TutilCDS.Executar;

begin

Filtrar;

Indexar;

end;

metodo filtrar

procedure TutilCDS.Filtrar;

begin

try

TClientDataSet(FCDS).Filtered := false;

TClientDataSet(FCDS).Filter := ExtrairFiltro(FFiltro);

TClientDataSet(FCDS).Filtered := true;

except on E: Exception do

Tutil.doTrataException('Erro ao Filtrar os dados solicitados ' , E);

end;

end;

metodo indexar

procedure TutilCDS.Indexar;

begin

try

TClientDataSet(FCDS).IndexFieldNames := ExtrairIndice(FIndice);

except on E: Exception do

Tutil.doTrataException('Erro ao Indexar a Grade solicitada' , E);

end;

end;

seguindo esses passos todos os dados são passados corretamente para o relatorio com os filtros e indice escolhido e consigo visualizar tranquilamente, porém não quebra, já no relatorio de produtos que faço uso da mesma estrutura funciona.

veja somente a chamada pois o restante é igual.

loFaturamentoProduto := TfrmFaturamentoProdutoReport.Create(nil);

try

loFaturamentoProduto.filtro := self.filtrocds;

loFaturamentoProduto.indice := self.indicecds;

loFaturamentoProduto.dadosole := cds_lista.Data;

loFaturamentoProduto.agrupamento := self.agrupamento;

loFaturamentoProduto.QRGroup1.Expression := TutilCDS.ExtrairGrupo( Self.indicecds);

loFaturamentoProduto.doPreview;

except on E: Exception do

Tutil.doTrataException('Não foi possivel visualizar o Relatório de faturamento,' + #13#10 + 'verifique os dados escolhidos ou reporte o erro ao suporte' + #13#10,e);

end;

end;

pronto é isso, agora que raios que o outro relatorio não quer quebrar nem que a vaca tussa!

só uma duvida o fato de ter populado o CDS do relcliente com dados provindos de 3 tabelas faz a diferença? essa é a unica diferença do relproduto para o relcliente.

Link para o comentário
Compartilhar em outros sites

  • 0

Resolvido em partes o problema.

O problema estava no select vejam:

esse é o select com o problema.

SELECT

PESSOAS.NOME,

PESSOAS.ID,

DOCUMENTOS_ITENS.ITEM,

ITENS.NOME as NOME_PRODUTO,

DOCUMENTOS_ITENS.VALOR_TOTAL,

DOCUMENTOS.DATA_INCLUSAO

FROM ...

esse é o select com a solucao.

SELECT

PESSOAS.NOME as NOME_CLIENTE,

PESSOAS.ID,

DOCUMENTOS_ITENS.ITEM,

ITENS.NOME as NOME_PRODUTO,

DOCUMENTOS_ITENS.VALOR_TOTAL,

DOCUMENTOS.DATA_INCLUSAO

FROM ...

depois que mudei o nome da coluna 'pessoas.nome' para 'NOME_CLIENTE' o QR quebrou as linhas, porém acho que o primeiro select tb esta correto, mais ai é outra historia que tenho mais tempo para pesquisar.

de qualquer forma obrigado a todos e até proxima.

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,5k
×
×
  • Criar Novo...