Table of Contents

Relatórios

Introdução

É possível desenhar relatórios num editor em separado, gravá-los a um arquivo .RDL e depois importar diretamente no KRATOM o seu conteúdo para geração final da aplicação. O KRATOM ao sincronizar o conteúdo do código API também sincroniza os relatórios de origem das respectivas pastas.

Editor de relatório

O RdlDesigner.exe (FyiReporting Designer) é um editor especial para os relatórios que serão exportados para o KRATOM, ele vem como parte da distribuição padrão do ProtoBase e serve para criar todos os relatórios da aplicação.

Roteiro para criação e instalação de relatório no KRATOM

  1. Abra o editor RdlDesigner e carregue um arquivo de relatório modelo qualquer
  2. Use “Salvar Como” e mude o nome para o novo relatório
  3. Altere o DataSource com a string de conexão e senha (detalhe no próximo tópico)
  4. Remova os DataSets do relatório (Data/Dataset)
  5. Adicione um novo DataSet com a pesquisa do relatório (Data/Dataset/New): Em DataSet e parâmetros da Query use “@”. Em Query Parameters adicione os nomes de parâmetros inseridos na Query com Value apontando para uma variável de filtro vindo da aplicação (Ex. ={?CODEMPRESA) Vide Imagem abaixo.
  6. Clique na area em branco do Body e vá em propriedades, clique Parameters, adicione os parâmetros usados na Query ou outros que necessitar para imprimir no relatório. Estes parâmetros serão recebidos da aplicação KRATOM para uso no gerador de relatório.
  7. Faça as alterações no relatório e teste usando a opção PREVIEW dele.
  8. Depois de tudo ok, remova a string DataSource e coloque no lugar ={?ConnectionString}
  9. Salve o arquivo
  10. No KRATOS adicione um relatório Tupla ao pacote e importe o relatório salvo anteriormente, anote o número da Tupla do relatório
  11. Na Aplicação use a função GerarEAbrirRelatorio para abrir o relatório e passar os parâmetros conforme modelo ao final da página.

Adicionando campos de totais

Para adicionar campos de totais ou de média ao relatório:

  1. Habilite o rodapé da tabela marcando a opção Footer Rows em Table Properties (componente Table).
  2. Na coluna que se deseja a totalização digite Sum(Fields!CAMPO.Value)

Adicionando Filtros no DATASOURCE do relatório

Observação importante: A filtragem será executada localmente (no PC do usuário), ponderar o trade-off entre performance x facilidades.

Diversos

Configurando a conexão com o banco de dados durante o design do relatório

Entre em Data / DataSources e adicione um DataSource de qualquer nome, depois no campo Connection string digite os dados corretos para poder acessar a base de dados. A string correta é a seguinte:

Após digitar a string, clique no botão Test Connection para ver se a conexão foi feita corretamente.

Observação: Este procedimento deve ser feito toda a vez que se quiser acessar uma base para poder formatar um relatório.

Tag: ConnectionString, {?ConnectionString}

Configurando a conexão com o banco de dados após relatório finalizado

Após o relatório estar finalizado em testes e design deve-se trocar o conteúdo de Connection string para a variável que aponta para a string de conexão da aplicação , a janela de DataSources ficará desta forma:

Após fazer isso o relatório estará pronto para ser definitivamente importado pelo KRATOS e usado pela aplicação KRATOM.

Manual do Editor

https://github.com/psoares33/FyiReporting-Docs/wiki

Dica Editor 1

Para criar um relatório 1-N:

Executando um relatório via c#

Para passar parâmetros para um relatório contido na tupla 2622 e executá-lo use o seguinte código.

          CoreApp.RepParametros p = new CoreApp.RepParametros();
          int IdProduto = CoreApp.ParamManager.Instance().GetParamInteiro(2617);     
          if (IdProduto > 0)
          {
              p.AdParam("IdProduto", IdProduto);
              CoreApp.RepManager.Instance().GerarEAbrirRelatorio(2622, p);
          }
          else
              throw new Exception(DefMessages.errNecSelProdGerEstoq);

Obs 1. O relatório tem um parâmetro IdProduto requerido do tipo Inteiro que será usado para o Query interno. Obs 2. O Relatório .rdl deve estar importado no KRATOS e já acondicionado na base de execução.

Passando um Datatable diretamente

Às vezes a complexidade de Querys e variações de relatórios resultantes podem nos obrigar a criar vários relatórios .RDL o que acaba sendo trabalhoso. Uma alternativa é via C# gerar um DataTable e passar para o gerador do relatório, substituindo a Query interna do relatório pela alternativa. Desta forma você só passa parâmetros (caso necessários) para o relatório que não alimentem diretamente as Queries, pois elas estarão sendo supridas de outra forma via Datatable. O resultado é que um único modelo .RDL pode-se emitir um relatório filtrado de infinitas formas, preservando a formatação. Ex.:

    DataTable dt = bo.GetLctosContaCxMov( CoreApp.Global.gl_IDEMP, IdConta, DataIni, DataFin);
    CoreApp.RepManager.Instance().GerarEAbrirRelatorio(idTuplaRelatorio, p, dt , "ExtratoContaCaixa" ); <<--- ExtratoContaCaixa é o nome do DATASET dentro do relatório para ser substituido.
      public DataTable GetLctosContaCxMov(int gl_IDEMP, int idConta, DateTime dataIni, DateTime dataFin)
      {
          var dbc = CoreApp.DBdirect.DBdirectCore.Instance().NovaConexao(true);
          try
          {
              CoreApp.DBdirect.SelecaoComplexa sc = new CoreApp.DBdirect.SelecaoComplexa(dbc, 3014);
              sc.TipoDataFill = TipoDataFill.FillDataTable;
              sc.SetParamInt("@EMP", CoreApp.Global.gl_IDEMP);
              sc.SetParamInt("@IDCONTA", idConta);
              sc.SetParamLogico("@ATIVO", true);
              sc.SetParamData("@dataini", dataIni);
              sc.SetParamData("@datafin", dataFin);
              sc.Exec();
              return sc.GetDataTable();
          }
          finally
          {
              dbc.Close();
          }
      }

Erros Internos (Exceptions)

System.NullReferenceException

Dados adicionais: System.NullReferenceException Message=Referência de objeto não definida para uma instância de um objeto. Source=RdlEngine StackTrace: fyiReporting.RDL.RenderBase.RunPages(Pages pgs)

Motivo: Um Parâmetro string passado como null ou em branco pode disparar este erro.

Resolução: Setar o ALLOW BLANK na configuração do parâmetro dentro do editor CASO A STRING POSSA SER PASSADA SEM CONTEÚDO.