Skip to Content
Author's profile photo DIEGO LOTHER

Relatórios Crystal – Dicas e Truques: Criando agrupador dinâmico.

Olá pessoal, venho a partir de hoje tentar iniciar uma série de dicas sobre o crystal, e para iniciar irei mostrar uma forma bem bacana de deixar o agrupamento de seus relatórios dinâmicos para que o usuário possa ter mais possibilidades de agrupamento.

Para exemplificar essa dica, irei fazer uma consulta que me retorna as notas fiscais de entrada.


SELECT
  T0.DocEntry,
  T0.DocNum,
  T0.CardCode,
  T0.CardName,
  T2.GroupName,
  T0.DocDate,
  T0.DocTotal
FROM
  OPCH T0
  INNER JOIN OCRD T1 ON T1.CardCode = T0.CardCode
  INNER JOIN OCRG T2 ON T2.GroupCode = T1.GroupCode

No meu relatório quero dar a possibilidade do usuário poder ver as notas agrupadas por Data do documento, Nome do Fornecedor e Grupo do Fornecedor.

Para isso primeiramente vamos criar o filtro para o usuário:

Vá até em campos de parâmetro -> Clique com o botão direito e selecione a opção Novo…

/wp-content/uploads/2016/05/img1_952303.png

Coloque o nome de Agrup@ para o campo, crie as opções de agrupamento que o usuário poderá selecionar e especifique um texto de descrição que será exibido ao usuário. Veja as configurações definidas na imagem abaixo.

/wp-content/uploads/2016/05/img2_952437.png

Agora vamos criar uma formula que define qual campo será usado para agrupar, de acordo com a opção selecionada pelo usuário.

Vá até em campos de formula -> Clique com o botão direito e selecione a opção Novo…

/wp-content/uploads/2016/05/img3_952438.png

Defina o nome como “agrupamento”. A sua formula será a seguinte :


if {?Agrup@} = '0' then
  {Comando.CardName}
else if {?Agrup@} = '1' then
  CStr({Comando.DocDate})
else if {?Agrup@} = '2' then
  {Comando.GroupName}

Nessa formula dizemos que de acordo com a opção selecionada pelo usuário, essa formula retornará um campo diferente. Lembrando que os valores utilizados 0, 1, 2 foram definidos lá no filtro de usuário.

img4.PNG

Agora vamos criar o nosso agrupamento efetivamente.

Vá até Inserir -> Grupo

/wp-content/uploads/2016/05/img5_952443.png

Escolha como agrupamento a formula que criamos no passo anterior.

/wp-content/uploads/2016/05/img6_952444.png

E pronto, está formado nosso agrupador dinâmico.

/wp-content/uploads/2016/05/img7_952448.png

/wp-content/uploads/2016/05/img10_952449.png

/wp-content/uploads/2016/05/img8_952447.png

/wp-content/uploads/2016/05/img9_952450.png

Espero que tenham gostado.

Não esqueçam de deixar seu feedback, dúvidas ou sugestões.


Atenciosamente,

Diego Lother


View Diego Lother's profile on LinkedIn

Assigned Tags

      10 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Former Member
      Former Member

      Top Diego!! Parabéns!

      Author's profile photo DIEGO LOTHER
      DIEGO LOTHER
      Blog Post Author

      Obrigado Yuri.


      Atenciosamente,

      Diego Lother


      View Diego Lother's profile on LinkedIn

      Author's profile photo Former Member
      Former Member

      Muito Obrigado pelo Compartilhamento!

      Author's profile photo Rudá Gonçalves
      Rudá Gonçalves

      Muito bom cara! Existe algum jeito de tirar a hora quando o agrupamento (group header) for DateTime?

      Author's profile photo DIEGO LOTHER
      DIEGO LOTHER
      Blog Post Author

      Olá Rudá,

      Obrigado pelo feedback. Referente a sua dúvida, é possível sim. Uma abordagem que atende a sua necessidade é a seguinte:

      Na variável Agrupamento você pode substituir o seguinte comando

      CStr({Comando.DocDate})

      por

      ToText({Comando.DocDate}, "dd/MM/yyyy")


      Atenciosamente,

      Diego Lother


      View Diego Lother's profile on LinkedIn

      Author's profile photo José Silva
      José Silva

      Prezado Diego, boa tarde!

      Modificando o parametro e incluindo o “CardCode”, (pois o usuario poderia executar este relatório para um PN específico) meu relatório no SAP agora permite preencher o parametro CardCode:

      Porém quando deixo vazio o CardCode, o sistema retorna a seguinte mensagem de erro:

      O Parametro [Código do PN] é Obrigatório.

      Pergunta: Como eu poderia retirar esta obrigatoriedade?

       

      Segue abaixo o select pronto:

      SELECT
      T0.DocEntry
      , T0.DocNum
      , T0.CardCode
      , T0.CardName
      , T2.GroupName
      , T0.DocDate
      , T0.DocTotal
      , T0.Serial [Nº NF]
      FROM OPCH T0
      INNER JOIN OCRD T1 ON T1.CardCode = T0.CardCode
      INNER JOIN OCRG T2 ON T2.GroupCode = T1.GroupCode
      WHERE T0.CANCELED = ‘N’
      AND T0.CardCode = ‘{?%CardCode}’ OR ‘{?%CardCode}’ = ”
      AND T0.DocDate >= {?0-DataDe} AND T0.DocDate <= {?1-DataAte}
      ORDER BY T0.DocNum ASC

      Author's profile photo DIEGO LOTHER
      DIEGO LOTHER
      Blog Post Author

      Olá José,

      Até onde tenho conhecimento, todos os parâmetros solicitados no Crystal são de preenchimento obrigatório.

      Neste seu caso por exemplo, você poderia criar uma caixa de seleção, onde liste todos os PNs do banco e que você inclua uma opção Todos no inicio dessa lista.

      Para criação de filtros mais elaborados no crystal você pode ver este documento:

      https://www.vision33.com/media/519875/how-to-work-with-crystal-reports-88.pdf

      Esta um pouco desatualizado, mas ainda é válido. Pode verificar a partir da página 19.

      Att,

      Diego Lother

       

      Author's profile photo José Silva
      José Silva

      Olá Diego,

      Verifiquei a documentação, conseguí resolver a questão da forma que voce mencionou.

      Obrigado pela  atenção

      Att.

      José Silva

       

      Author's profile photo MARCELO VICTOR MELO BEZERRA
      MARCELO VICTOR MELO BEZERRA

      Muito bom Diego, me ajudou bastante, obrigadão.

      Author's profile photo Former Member
      Former Member

      Interessantíssimo!