{"id":346,"date":"2022-01-07T18:26:37","date_gmt":"2022-01-07T21:26:37","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=346"},"modified":"2024-09-19T17:56:23","modified_gmt":"2024-09-19T20:56:23","slug":"introducao-do-geradores-de-relatorios","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/programacao\/lazarus-ide\/introducao-do-geradores-de-relatorios\/","title":{"rendered":"Introduction of report generators"},"content":{"rendered":"<p>H\u00e1 grandes op\u00e7\u00f5es de relat\u00f3rios: o&nbsp;<a href=\"https:\/\/gladiston.net.br\/en\/?page_id=347\" target=\"_blank\" rel=\"noopener\" title=\"\">Fortes Report(CE)<\/a>, <a href=\"https:\/\/gladiston.net.br\/en\/?page_id=348\" target=\"_blank\" rel=\"noopener\" title=\"\">LazReport&nbsp;<\/a>,&nbsp;<a href=\"https:\/\/gladiston.net.br\/en\/relatorios-com-o-fpreport\/\" target=\"_blank\" rel=\"noopener\" title=\"\">fpReport<\/a> it&#039;s the <a href=\"https:\/\/gladiston.net.br\/en\/?page_id=312\" target=\"_blank\" rel=\"noopener\" title=\"fpSpreadSheet\">fpSpreadSheet<\/a>.<\/p>\n\n\n\n<p>The&nbsp;<strong>strong reports<\/strong>&nbsp;segue o paradigma de programa\u00e7\u00e3o por bandas, isto \u00e9, voc\u00ea desenha relat\u00f3rios no formul\u00e1rio colocando bandas que representam dados, cada banda pode representar um dataset e que pode ser filha de outra banda criando assim um relat\u00f3rio de mestre\/detalhe. Al\u00e9m disso, outras bandas podem representar cabe\u00e7alho, rodap\u00e9, etc&#8230; Geralmente as informa\u00e7\u00f5es podem ser modificadas usando os eventos OnBeforePrint da banda, do label ou qualquer outro componente que o acompanhe. Nele, voc\u00ea esta literalmente programando um relat\u00f3rio com freepascal e as bandas ser\u00e3o um container de sequencia de eventos que apresentar\u00e3o o relat\u00f3rio.<\/p>\n\n\n\n<p>The&nbsp;<strong>lazReport<\/strong>&nbsp;j\u00e1 acompanha a instala\u00e7\u00e3o do Lazarus, mas n\u00e3o \u00e9 previamente instalado. Compor relat\u00f3rios com ele \u00e9 similar ao FastReport do Delphi. Voc\u00ea deposita um ou mais componentes no formul\u00e1rio que identificar\u00e3o o layout e fonte de dados, depois voc\u00ea trabalha o layout do relat\u00f3rio diretamente dentro dele, \u00e9 o modo de design completo com labels, memos, graficos, etc&#8230; O Lazarus \u00e9 apenas um anfitri\u00e3o coadjuvante no processo, o lazReport n\u00e3o usa componentes LCL.<\/p>\n\n\n\n<p>Isso pode ser bom por um lado porque o trabalho \u00e9 mais artistico e menos programa\u00e7\u00e3o, no entanto, torna-o menos flex\u00edvel porque se limita as op\u00e7\u00f5es de design que ele prov\u00ea. Por exemplo, imagine imprimir um CNPJ, mas o banco de dados tem apenas a parte num\u00e9rica, sem a m\u00e1scara, se fosse usando o Fortes, no label do CNPJ voc\u00ea colocaria no evento OnBeforePrint algum c\u00f3digo de programa\u00e7\u00e3o que alteraria o valor colocando a m\u00e1scara, j\u00e1 no LazReport voc\u00ea j\u00e1 tem uma propriedade de m\u00e1scara para realizar essa mesma opera\u00e7\u00e3o, mas voc\u00ea n\u00e3o altera os valores em runtime, o m\u00e1ximo que voc\u00ea consegue fazer \u00e9 antes do seu relat\u00f3rio ser apresentado, enviar valores prontos que ser\u00e3o usados na apresenta\u00e7\u00e3o.<\/p>\n\n\n\n<p>Ent\u00e3o isso \u00e9 um ponto positivo para o Lazreport, certo? N\u00e3o, troque a mascara agora por um codigo onde precise decifr\u00e1-lo antes de imprimir, o LazReport n\u00e3o tem algo para isso ent\u00e3o voc\u00ea ter\u00e1 de trabalhar com variaiveis ou parametros que dever\u00e3o ser calculados antes do processo iniciar-se, algo que \u00e9 bem mais complexo do que apenas colocar um evento no OnBeforePrint como voc\u00ea faria no Fortes Report<\/p>\n\n\n\n<p>Ambos os geradores citados tem um pequeno problema, requerem GUI para process\u00e1-los. Isto acontece porque \u00e9 obrigat\u00f3rio o uso de formul\u00e1rio para seus componentes e heran\u00e7a. Ent\u00e3o se voc\u00ea precisa rodar estes relat\u00f3rios num ambiente Linux desprovido de interface gr\u00e1fica, seus relat\u00f3rios falhar\u00e3o com um &#8220;access violation&#8221;. Existem dois workarounds:  (1) compilar seu projeto com a op\u00e7\u00e3o <strong>-nogui<\/strong>, mas segundo investiguei apenas suprimir\u00e1 exceptions causados pelo ausencia de processar eventos, (2) rodar o programa gerado dentro de um mini servidor X como Xephyr. <\/p>\n\n\n\n<p>The <strong>fpReport<\/strong> \u00e9 um gerador de relat\u00f3rio, similar ao FastReport ou freeReport. Boa parte da documenta\u00e7\u00e3o antiga do freeReport tamb\u00e9m serve para ele. Sua vantagem \u00e9 que seu programa n\u00e3o precisar\u00e1 de interface gr\u00e1fica, na pr\u00e1tica, funcionar\u00e1 num terminal Linux apenas no modo console.<\/p>\n\n\n\n<p>H\u00e1 ainda outra solu\u00e7\u00e3o menos conhecida, o <strong>fpSpreadSheet<\/strong>. O <strong>fpSpreadSheet<\/strong> fornece uma biblioteca de fun\u00e7\u00f5es para gerar planilhas em v\u00e1rios formatos &#8211; opendocument \u00e9 um deles &#8211; com op\u00e7\u00f5es de exporta\u00e7\u00e3o para PDF\/HTML. Similar ao fpReport, ele n\u00e3o depende da LCL ent\u00e3o n\u00e3o requer de interface gr\u00e1fica. A primeira vista voc\u00ea pode achar mais pr\u00e1tico produzir relat\u00f3rios dessa forma, mas n\u00e3o \u00e9 bem assim, o principal problema \u00e9 que voc\u00ea precisa pensar como planilha e n\u00e3o como formul\u00e1rio, isso significa que voc\u00ea ter\u00e1 de pensar em coordenadas A1..Z999 o que limita o layout a ser produzido e depois de ser feito, a inclus\u00e3o de uma nova coluna no meio do que j\u00e1 existe causar\u00e1 um efeito domin\u00f3 de reajuste em todas as colunas adjacentes, portanto, a manutibilidade de relat\u00f3rios que s\u00e3o constantemente alterados \u00e9 penosa.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Qual o melhor?<\/strong><\/h5>\n\n\n\n<p>Deixei mais abaixo links explicando pormenores de cada gerador de relat\u00f3rio. Na pratica, voc\u00ea escolher\u00e1 um e ser\u00e1 feliz. Se voc\u00ea precisa criar relat\u00f3rios que ser\u00e3o fornecidos via API\/REST, provavelmente voc\u00ea ir\u00e1 melhor com o fpReport ou fpSpreadSheet porque n\u00e3o precisar\u00e1 de interface gr\u00e1fica ou ter que incorrer em workarounds.<\/p>\n\n\n\n<p>Segue os links com maiores detalhes sobre estas ferramentas:<\/p>\n\n\n\n<p class=\"has-text-align-right\"><a href=\"https:\/\/gladiston.net.br\/en\/?page_id=347\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Reports with Fortes Report\">Reports with Fortes Report<\/a><\/p>\n\n\n\n<p class=\"has-text-align-right\"><a href=\"https:\/\/gladiston.net.br\/en\/?page_id=348\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Reports with LazReport\"> Reports with LazReport<\/a><\/p>\n\n\n\n<p class=\"has-text-align-right\"><a href=\"https:\/\/gladiston.net.br\/en\/relatorios-com-o-fpreport\/\" target=\"_blank\" rel=\"noopener\" title=\"Relat\u00f3rios com o fpReport\">Relat\u00f3rios com o fpReport<\/a><\/p>\n\n\n\n<p class=\"has-text-align-right\"><a href=\"https:\/\/gladiston.net.br\/en\/?page_id=312\" target=\"_blank\" rel=\"noopener\" title=\"\">Planilhas com fpSpreadSheet<\/a><\/p>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>H\u00e1 grandes op\u00e7\u00f5es de relat\u00f3rios: o&nbsp;Fortes Report(CE), LazReport&nbsp;,&nbsp;fpReport e o fpSpreadSheet. O&nbsp;Fortes report&nbsp;segue o paradigma de programa\u00e7\u00e3o por bandas, isto \u00e9, voc\u00ea desenha relat\u00f3rios no formul\u00e1rio colocando bandas que representam dados, cada banda pode representar um dataset e que pode ser filha de outra banda criando assim um relat\u00f3rio de mestre\/detalhe. Al\u00e9m disso, outras bandas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":159,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/template-full-width.php","meta":{"footnotes":""},"class_list":["post-346","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/comments?post=346"}],"version-history":[{"count":9,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/346\/revisions"}],"predecessor-version":[{"id":2583,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/346\/revisions\/2583"}],"up":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/159"}],"wp:attachment":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/media?parent=346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}