Antes de começar o artigo, queria dizer que nesse mês irei responder muitas das questões que recebo por e-mail (calma que um dia sempre respondo) em forma de artigo, então muitos deles serão curtos e rápidos. Uma das respostas será nesse artigo.
Bem, como calculo o saldo, linha a linha, de entradas e saídas no Crystal Reports? De forma bem simples: uso de variáveis globais. Um bom artigo que sempre recomendo é o de Vince Varallo: não tem erro!
Supondo que você tenha o seguinte relatório e com os respectivos campos:
Esses dados já devem ser puxados do DataSet utilizado (na dúvida, veja o post de criar relatórios). Agora adicionamos um Formula Field com o nome SALDO.
Clique em Use Editor e escreva a seguinte fórmula:
Global NumberVar SALDO_FINAL;
if (RECORDNUMBER = 1) then
SALDO_FINAL := @ENTRADA - @SAIDA
else
SALDO_FINAL := SALDO_FINAL + @ENTRADA - @SAIDA
Ou seja, na primeira linha obtenho o saldo inicial diminuindo a ENTRADA da SAIDA. Nos demais já adiciono o saldo anterior. Tranquilo? Agora basta adicionar no relatório esse campo criado.
Mostrando postagens com marcador crystal reports. Mostrar todas as postagens
Mostrando postagens com marcador crystal reports. Mostrar todas as postagens
Calculando saldo final no Crystal Reports
Postado por
Thiago Marçal
on sábado, 3 de setembro de 2011
/
Marcadores:
crystal reports,
dicas
/
Comments: (0)
Mega Post de Erros
Postado por
Thiago Marçal
on sábado, 9 de abril de 2011
/
Marcadores:
banco de dados,
cloud server,
crystal reports,
dll,
erros,
iis,
locaweb,
plesk,
sql server,
windows
/
Comments: (0)
Lidar com erros é algo realmente muito chato... Chato demais! Esses dias fui convocado para fazer um certo trabalho de migração entre servidores. Um desses servidores era um Cloud Server Pro da Locaweb. Em muitos posts que aqui escrevi tem um pouco retratando sobre a Locaweb. Trabalho e já trabalhei muito com ela e sei de todos os seus passos e "artimanhas" de atendimento... O antigo Cloud Server foi até tranquilo de trabalhar, mas esse novo... Vamos aos problemas!
Uma dica que dou sempre quando alguém quer contratar um servidor: leiam muito sobre os prós e contras. Os prós vejam no próprio site do prestador, os contras vejam nos relatos de usuários. No post a seguir não estou jogando a Locaweb contra a parede, apenas estou expondo erros que podem ser sanados de forma fácil mas que burocraticamente é jogado para o cliente se virar (nos 30!).
Nesse Cloud Server vem embutido o Plesk. Em poucas palavras serve para gerenciar a hospedagem através de uma interface web. É uma boa ferramenta de gerência, tem tudo para gerenciar sua hospedagem. Só que esse demais gera ocupação demais (redundância) de espaço em disco. Dos 50 Gb que você contrata, 40Gb é para o sistema operacional e 10Gb para seus arquivos. Sendo que dos 10Gb é para todos os seus arquivos, e-mails, banco de dados, etc. Ou seja, apenas usufrui dos 10Gb um pouco menos que 9Gb e olhe lá.
Bem, dizem que vem tudo preparado e instalado para usar... Verdade até certa parte! Quem está usando e é iniciante vai ver que é mil maravilhas. Dá para fazer o básico de tudo. O problema vem a seguir...
Um cliente contratou o Cloud Server gerenciado pelo cliente (ou seja, sobrou para o usuário final) e me passou para configurar e deixar no ponto de uso fazendo toda a migração e instalação. Em um passe de mágica surgem os problemas...
Os bancos de dados que vem são o MS SQL Server 2008 e o MySQL. Não há interface para dump e recovery das bases forçando a usar o Plesk para isso, mas não queria. Onde está o Management Studio 2008? Onde está o MySQL Workbench? Como vou fazer para migrar as bases? Gerar script de bancos gigantes? Nem pensar! Preciso instalar!
Mas como instalar esses aplicativos? Se fazer download, gera tráfego. Se pedir para a Locaweb tem que pagar e se pedir, de graça, não instala! Lembrando que esses aplicativos, no mínimo, são gratuitos e deveriam estar em uma zona em que os usuários pudessem obtê-los de forma fácil e sem cobrança. Pois bem, feito o download, hora de instalar. Abrindo o executável (lembrando que tem que ser a da versão 64bits) dá aviso de incompatibilidade. É preciso instalar o Service Pack 1 do SQL Server 2008 (mais tráfego). Baixado o SP1 é preciso instalá-lo. Tranquilo e instalado sem problemas. Hora de instalar o Management Studio...
Ao tentar abrir, outro problema?!?! É preciso do Framework 3.5! Incrivel... No Cloud Server vem instalado a versão 2.0 e 4.0 do Framework ASP.NET mas não tem a 3.5 ativado. Menos mal, porque no Windows Server 2008 é nativo, basta ativar. Realize os seguintes passos (retirado do Wiki):
Agora sim, tudo pronto! Vamos instalar o Management Studio. Clica no instalador e... Erro! Caramba... de novo!
TITLE: SQL Server Setup failure.
-------------------------------
SQL Server Setup has encountered the following error:
Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
A dica é: feche o Windows Explorer! Por algum motivo, a instalação do Management Studio não inicia quando o Windows Explorer estiver em aberto. Copie para a Área de Trabalho e abra o instalador... Agora sim! Depois de tanta malemolência pelo menos iniciemos a instalação. Para quem tem dúvidas e um passo-a-passo bem explicativo de como instalar o Management Studio, acesse aqui o post de Marcos dell Antonio. Há uma dica bem interessante que pode confundir o usuário na hora da instalação. Terminado a instalação, menos um item da lista de afazeres.
Consegui conectar ao SQL Server local, criei as bases, usuários, fiz restores, configurei o backup, providenciei tudo o que tinha que fazer onde o Plesk jamais pensaria em um dia ser. Agora o principal, testar um website. Publiquei o site no IIS e abri o navegador para visualizar. Erro!
Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Sabe o porquê disso? Eu instalei o ASP.NET 3.5 depois que eu já tinha a versão 4.0 instalada por causa do Management Studio então gerou conflito nas DLL's. Para resolver, faça o seguinte:
Agora vamos testar! Abri o navegador e digitei o endereço e... Mais erro!
There is a duplicate 'system.web.extensions/scripting/scriptResourceHandler' section defined
Mais conflitos! Se você tiver outra versão do System.Web.Extensions instalado, devido ao ASP.NET AJAX por exemplo, a versão que está no GAC do sistema difere da que você quer chamar ocorrendo ambiguidade. O correto seria alterar os assemblys mas como isso é muito trabalhoso e pode acontecer algum imprevisto para aqueles que não sabem manuseá-las, então aconselho o seguinte: remova toda a sectionGroup do seu web.config ou comente-as:
<!--
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
-->
No caso comentei o sectionGroup do System.Web.Extension que pode estar na versão 1.0, 2.0 ou 3.5 que for.
Agora vamos lá! De pés juntos e mãos dadas: Abre o navegador e... e... e... Funcionou! Depois de um árduo trabalho aparentemente tudo estava normal. Vamos testar outros sites e... e... e... Mais erros!
Quem ainda não está acostumado a trabalhar com Windows Server 2008 e IIS 7 terá que aprender muito sobre permissões e tratamento de erros. Incontestavelmente a tela do erro 500 irá aparecer e muito se sua aplicação não estiver configurada adequadamente para o IIS 7. Nem sempre a mesma aplicação que está no IIS 6 irá funcionar no IIS 7. Então eis que surge a tela do Erro 500 Erro Interno do Servidor ou Error 500 Internal Server Error:
Ou então:
Dá para descobrir o que é? Vou dar a dica: revise seu web.config. "Ah, mas está tudo certo, não sei porque não funciona...". Engano, está errado. Já disse que o IIS 7 é chato, muito chato. O parser dele é muito minucioso e se não estiver nos padrões vai dar problema.
Se você não sabe utilizar bem o IIS e tem medo de alterar uma coisinha ali e outra acolá vou dar a maior dica: saia abrindo cada opção do painel da aplicação até que uma delas acuse um erro de configuração.
Por exemplo, abra o item Documento Padrão. Se ele estiver configurado corretamente então abrirá a próxima tela normalmente. Se tiver algum erro, aparecerá um alerta. Então no web.config você deve corrigir a sessão correspondente. Ficou claro? Saia clicando um a um até que um deles se denuncie podendo então fazer a correção.
O que ocorreu comigo foi que um site que estava no IIS 6 podia colocar a mesma página (index.aspx) como padrão, duas vezes, e não tinha problema. Quando foi para o IIS 7, na qual estava herdando a configuração pai, e foi adicionar a página index.aspx como padrão novamente, ele dava erro e não sabia porquê. Então removi a entrada do web.config e funcionou. Desabilitar a mensagem de erro amigável no navegador vai funcionar (encontrar o erro)? Não. Desabilitar as páginas de erros personalizáveis do IIS vai funcionar (encontrar o erro)? Talvez ou não. Depende muito do ambiente que está configurado e quem está manipulando.
Pronto! Mais um problema solucionado... Vamos testar outro site e... e... e... Erro! Agora aconteceu um erro 404. Mas como? Erro 404 de página não encontrada mas se o caminho está lá? Incrivelmente no IIS do Cloud Server possuem dois Applications Pools do Plesk (e mais outros nativos): Plesk(default)(2.0) e Plesk(default)(4.0). O pool do 2.0 quase nem sempre funciona. E um comportamento anormal é que se você tem um site pai em 2.0 e um filho em 2.0 às vezes pára de funcionar. O "correto" é ter um pai 2.0 ou 4.0 com filho sempre 4.0. Estranho? Pode crer! E onde está o pool do 3.5? Tem que criar na mão mesmo.
Nota: Se você reiniciar o IIS o Plesk pára de vez e não volta:
Você terá que iniciá-lo manualmente. Mas antes terá que iniciar seu pool também (que é muito suspeito):
Ajeitado uma coisinha ali, outra aqui, vamos testar mais algumas coisas e... e... e... Quase tudo certo. Em questão de funcionalidade (que deveria ser) está quase tudo certo a não ser o funcionamento do bom e velho Crystal Reports. Quem já leu o post de erros do Crystal aqui e aqui nos deparamos com o erro:
O inicializador de tipo de 'CrystalDecisions.CrystalReports.Engine.ReportDocument' acionou uma exceção
ou
The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' threw an exception
Cuidado! Esse não é o descritivo do erro. Só com isso não dá para saber o motivo. Faça o debug, log, exibição da pilha ou na própria tela exiba o erro (sem ter AJAX) que teremos o erro completo. No link dos dois posts anteriores que fiz explica o problema do Crystal na plataforma 64bits e como pode resolver. Só que o problema no meu caso era permissão.
Server Error in '/virtual_directory_name' Application.
Error in File UNKNOWN.RPT:
The request could not be submitted for background processing.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Runtime.InteropServices.COMException: Error in File UNKNOWN.RPT: The request could not be submitted for background processing.
Os usuários listados abaixo, não tinham permissão na execução de scripts DCOM e gravação em algumas pastas (principalmente as que estão na unidade C):
Esses são os usuários que devem ter privilégio (descritos abaixo) nas pastas listadas abaixo:
Obs: Para alguns servidores é preciso aplicar o Replace permission entries on all child objects nessas pastas.
Lembrando de reiniciar o IIS e/ou o servidor para recarregar as configurações.
Se estiver trabalhando com Windows Service ou Windows Form e ocorra o erro:
System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {5FF57840-5172-4482-9CA3-541C7878AE0F} failed due to the following error: 8007007e
Basta compilar sua aplicação em x86.
E agora, tudo certo? Até o momento sim. Porque não dizer que está tudo OK? Depois de ter ocorrido todos esses problemas, fica-se receoso com o futuro. Pode ser que ocorra outro problema posteriormente? Sim e irá.
Conforme disse anteriormente, o post não é para dizer mal sobre a Locaweb e/ou Plesk. Acho que eles prestam um serviço adequado para o nível nacional (até uso) contudo são coisas que acontecem que simplesmente poderiam ser sanadas antes de jogar o pepino para o cliente. Se você tiver algum problema desses e sua gerência for pelo cliente, nem adianta pedir que eles vão lhe informar: "o gerenciamento é por conta do cliente e não nos responsabilizamos" ou "a ferramenta (Plesk) é terceirizada e não prestamos suporte.". Enfim, espero que o post ajude a você, cliente e usuário, a corrigir seus problemas/pepinos que ocorrerem. Isso me lembra quando lançou o plug-and-play... a velha piadinha do plug-and-pray (ligar e rezar) não some da cabeça quando ocorre esse tipo de problema. Porque será?
Uma dica que dou sempre quando alguém quer contratar um servidor: leiam muito sobre os prós e contras. Os prós vejam no próprio site do prestador, os contras vejam nos relatos de usuários. No post a seguir não estou jogando a Locaweb contra a parede, apenas estou expondo erros que podem ser sanados de forma fácil mas que burocraticamente é jogado para o cliente se virar (nos 30!).
Nesse Cloud Server vem embutido o Plesk. Em poucas palavras serve para gerenciar a hospedagem através de uma interface web. É uma boa ferramenta de gerência, tem tudo para gerenciar sua hospedagem. Só que esse demais gera ocupação demais (redundância) de espaço em disco. Dos 50 Gb que você contrata, 40Gb é para o sistema operacional e 10Gb para seus arquivos. Sendo que dos 10Gb é para todos os seus arquivos, e-mails, banco de dados, etc. Ou seja, apenas usufrui dos 10Gb um pouco menos que 9Gb e olhe lá.
Bem, dizem que vem tudo preparado e instalado para usar... Verdade até certa parte! Quem está usando e é iniciante vai ver que é mil maravilhas. Dá para fazer o básico de tudo. O problema vem a seguir...
Um cliente contratou o Cloud Server gerenciado pelo cliente (ou seja, sobrou para o usuário final) e me passou para configurar e deixar no ponto de uso fazendo toda a migração e instalação. Em um passe de mágica surgem os problemas...
Os bancos de dados que vem são o MS SQL Server 2008 e o MySQL. Não há interface para dump e recovery das bases forçando a usar o Plesk para isso, mas não queria. Onde está o Management Studio 2008? Onde está o MySQL Workbench? Como vou fazer para migrar as bases? Gerar script de bancos gigantes? Nem pensar! Preciso instalar!
Mas como instalar esses aplicativos? Se fazer download, gera tráfego. Se pedir para a Locaweb tem que pagar e se pedir, de graça, não instala! Lembrando que esses aplicativos, no mínimo, são gratuitos e deveriam estar em uma zona em que os usuários pudessem obtê-los de forma fácil e sem cobrança. Pois bem, feito o download, hora de instalar. Abrindo o executável (lembrando que tem que ser a da versão 64bits) dá aviso de incompatibilidade. É preciso instalar o Service Pack 1 do SQL Server 2008 (mais tráfego). Baixado o SP1 é preciso instalá-lo. Tranquilo e instalado sem problemas. Hora de instalar o Management Studio...
Ao tentar abrir, outro problema?!?! É preciso do Framework 3.5! Incrivel... No Cloud Server vem instalado a versão 2.0 e 4.0 do Framework ASP.NET mas não tem a 3.5 ativado. Menos mal, porque no Windows Server 2008 é nativo, basta ativar. Realize os seguintes passos (retirado do Wiki):
- Clique em Start, Administrative Tools e selecione Server Manager;
- Na interface, clique em Features e clique em Add Features;
- Selecione a primeira opção .NET Framework 3.5.1 Features e adicione todos seus dependentes;
- Conclua a instalação do Framework.
Agora sim, tudo pronto! Vamos instalar o Management Studio. Clica no instalador e... Erro! Caramba... de novo!
TITLE: SQL Server Setup failure.
-------------------------------
SQL Server Setup has encountered the following error:
Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
A dica é: feche o Windows Explorer! Por algum motivo, a instalação do Management Studio não inicia quando o Windows Explorer estiver em aberto. Copie para a Área de Trabalho e abra o instalador... Agora sim! Depois de tanta malemolência pelo menos iniciemos a instalação. Para quem tem dúvidas e um passo-a-passo bem explicativo de como instalar o Management Studio, acesse aqui o post de Marcos dell Antonio. Há uma dica bem interessante que pode confundir o usuário na hora da instalação. Terminado a instalação, menos um item da lista de afazeres.
Consegui conectar ao SQL Server local, criei as bases, usuários, fiz restores, configurei o backup, providenciei tudo o que tinha que fazer onde o Plesk jamais pensaria em um dia ser. Agora o principal, testar um website. Publiquei o site no IIS e abri o navegador para visualizar. Erro!
Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Sabe o porquê disso? Eu instalei o ASP.NET 3.5 depois que eu já tinha a versão 4.0 instalada por causa do Management Studio então gerou conflito nas DLL's. Para resolver, faça o seguinte:
- Vá para a pasta C:\Windows\Microsoft.NET\Framework64\v4.0.30319;
- Execute o comando aspnet_regiis.exe -iru
Agora vamos testar! Abri o navegador e digitei o endereço e... Mais erro!
There is a duplicate 'system.web.extensions/scripting/scriptResourceHandler' section defined
Mais conflitos! Se você tiver outra versão do System.Web.Extensions instalado, devido ao ASP.NET AJAX por exemplo, a versão que está no GAC do sistema difere da que você quer chamar ocorrendo ambiguidade. O correto seria alterar os assemblys mas como isso é muito trabalhoso e pode acontecer algum imprevisto para aqueles que não sabem manuseá-las, então aconselho o seguinte: remova toda a sectionGroup do seu web.config ou comente-as:
<!--
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
-->
No caso comentei o sectionGroup do System.Web.Extension que pode estar na versão 1.0, 2.0 ou 3.5 que for.
Agora vamos lá! De pés juntos e mãos dadas: Abre o navegador e... e... e... Funcionou! Depois de um árduo trabalho aparentemente tudo estava normal. Vamos testar outros sites e... e... e... Mais erros!
Quem ainda não está acostumado a trabalhar com Windows Server 2008 e IIS 7 terá que aprender muito sobre permissões e tratamento de erros. Incontestavelmente a tela do erro 500 irá aparecer e muito se sua aplicação não estiver configurada adequadamente para o IIS 7. Nem sempre a mesma aplicação que está no IIS 6 irá funcionar no IIS 7. Então eis que surge a tela do Erro 500 Erro Interno do Servidor ou Error 500 Internal Server Error:
Ou então:
Dá para descobrir o que é? Vou dar a dica: revise seu web.config. "Ah, mas está tudo certo, não sei porque não funciona...". Engano, está errado. Já disse que o IIS 7 é chato, muito chato. O parser dele é muito minucioso e se não estiver nos padrões vai dar problema.
Se você não sabe utilizar bem o IIS e tem medo de alterar uma coisinha ali e outra acolá vou dar a maior dica: saia abrindo cada opção do painel da aplicação até que uma delas acuse um erro de configuração.
Por exemplo, abra o item Documento Padrão. Se ele estiver configurado corretamente então abrirá a próxima tela normalmente. Se tiver algum erro, aparecerá um alerta. Então no web.config você deve corrigir a sessão correspondente. Ficou claro? Saia clicando um a um até que um deles se denuncie podendo então fazer a correção.
O que ocorreu comigo foi que um site que estava no IIS 6 podia colocar a mesma página (index.aspx) como padrão, duas vezes, e não tinha problema. Quando foi para o IIS 7, na qual estava herdando a configuração pai, e foi adicionar a página index.aspx como padrão novamente, ele dava erro e não sabia porquê. Então removi a entrada do web.config e funcionou. Desabilitar a mensagem de erro amigável no navegador vai funcionar (encontrar o erro)? Não. Desabilitar as páginas de erros personalizáveis do IIS vai funcionar (encontrar o erro)? Talvez ou não. Depende muito do ambiente que está configurado e quem está manipulando.
Pronto! Mais um problema solucionado... Vamos testar outro site e... e... e... Erro! Agora aconteceu um erro 404. Mas como? Erro 404 de página não encontrada mas se o caminho está lá? Incrivelmente no IIS do Cloud Server possuem dois Applications Pools do Plesk (e mais outros nativos): Plesk(default)(2.0) e Plesk(default)(4.0). O pool do 2.0 quase nem sempre funciona. E um comportamento anormal é que se você tem um site pai em 2.0 e um filho em 2.0 às vezes pára de funcionar. O "correto" é ter um pai 2.0 ou 4.0 com filho sempre 4.0. Estranho? Pode crer! E onde está o pool do 3.5? Tem que criar na mão mesmo.
Nota: Se você reiniciar o IIS o Plesk pára de vez e não volta:
Você terá que iniciá-lo manualmente. Mas antes terá que iniciar seu pool também (que é muito suspeito):
Ajeitado uma coisinha ali, outra aqui, vamos testar mais algumas coisas e... e... e... Quase tudo certo. Em questão de funcionalidade (que deveria ser) está quase tudo certo a não ser o funcionamento do bom e velho Crystal Reports. Quem já leu o post de erros do Crystal aqui e aqui nos deparamos com o erro:
O inicializador de tipo de 'CrystalDecisions.CrystalReports.Engine.ReportDocument' acionou uma exceção
ou
The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' threw an exception
Cuidado! Esse não é o descritivo do erro. Só com isso não dá para saber o motivo. Faça o debug, log, exibição da pilha ou na própria tela exiba o erro (sem ter AJAX) que teremos o erro completo. No link dos dois posts anteriores que fiz explica o problema do Crystal na plataforma 64bits e como pode resolver. Só que o problema no meu caso era permissão.
Server Error in '/virtual_directory_name' Application.
Error in File UNKNOWN.RPT:
The request could not be submitted for background processing.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Runtime.InteropServices.COMException: Error in File UNKNOWN.RPT: The request could not be submitted for background processing.
Os usuários listados abaixo, não tinham permissão na execução de scripts DCOM e gravação em algumas pastas (principalmente as que estão na unidade C):
- IWAN_plesk(default)
- IUSR
- IIS_IUSR
- NETWORK SERVICE
- INTERACTIVE
Esses são os usuários que devem ter privilégio (descritos abaixo) nas pastas listadas abaixo:
- C:\Windows\Temp\ : leitura \ escrita
- C:\Program Files (x86)\Business Objects\Common\2.8\bin\ : leitura
- C:\ : leitura
Obs: Para alguns servidores é preciso aplicar o Replace permission entries on all child objects nessas pastas.
Lembrando de reiniciar o IIS e/ou o servidor para recarregar as configurações.
Se estiver trabalhando com Windows Service ou Windows Form e ocorra o erro:
System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {5FF57840-5172-4482-9CA3-541C7878AE0F} failed due to the following error: 8007007e
Basta compilar sua aplicação em x86.
E agora, tudo certo? Até o momento sim. Porque não dizer que está tudo OK? Depois de ter ocorrido todos esses problemas, fica-se receoso com o futuro. Pode ser que ocorra outro problema posteriormente? Sim e irá.
Conforme disse anteriormente, o post não é para dizer mal sobre a Locaweb e/ou Plesk. Acho que eles prestam um serviço adequado para o nível nacional (até uso) contudo são coisas que acontecem que simplesmente poderiam ser sanadas antes de jogar o pepino para o cliente. Se você tiver algum problema desses e sua gerência for pelo cliente, nem adianta pedir que eles vão lhe informar: "o gerenciamento é por conta do cliente e não nos responsabilizamos" ou "a ferramenta (Plesk) é terceirizada e não prestamos suporte.". Enfim, espero que o post ajude a você, cliente e usuário, a corrigir seus problemas/pepinos que ocorrerem. Isso me lembra quando lançou o plug-and-play... a velha piadinha do plug-and-pray (ligar e rezar) não some da cabeça quando ocorre esse tipo de problema. Porque será?
Gerando relatórios com o Crystal Reports
Postado por
Thiago Marçal
on sábado, 18 de setembro de 2010
/
Marcadores:
crystal reports,
relatório
/
Comments: (5)
O Crystal Reports é um componente que permite a criação de relatórios personalizados de alto nível. Em substituto de relatórios em HTML puro, ele fornece uma assistência inovadora desde a criação até exportação. Para quem utiliza Java, há também uma versão específica para a linguagem. Mostraremos abaixo como gerar um simples relatório buscando dados de uma tabela em banco usando C#.
Abra/Crie um projeto do tipo Web Site no Visual Studio e no Solution Explorer clique com o direito no diretório onde deseja criar o relatório. Escolha Add New Item e opte pelo template Crystal Reports (note que a extensão de relatório do Crystal é .rtp). Nessa primeira tela escolha a primeira opção conforme a figura abaixo:
Clique em OK. Expanda o nó do Create New Connection e novamente expanda o OLE DB (ADO) para configuração de conexão (essa é a primeira conexão com o banco para início, depois mostraremos como usar para outro banco). Na configuração do ADO, escolha o tipo de provider a ser utilizado (no caso optei pelo SQL Server, então SQL Native Client) e dê Next.
Agora, em Connection Information, informe os dados de conexão.
Clique em Next e na última tela revise os dados. Se estiver tudo certo, clique em Finish. Você voltará à tela anterior já com a configuração realizada e o banco estará apto a selecionar os objetos. Procure qual objeto irá ser manipulado e exibido seus dados, podendo ser: uma tabela, um schema, uma view ou stored procedure. Clique no objeto desejado e, em seguida, clique no botão com a seta para direita conforme figura abaixo:
Clique em Next. Agora informe quais campos irão ser exibidos e escolha Next.
Na próxima tela, se precisar agrupar alguns campos, informe quais são. Se não precisar dê apenas Next. Se o Crystal identificar que está trabalhando com números, ele cria um passo adicional que é a opção de inserir gráficos. Outra tela que é exibida é a de Filtros. Se for ter filtros, informe-os. Caso contrário dê apenas Next. Ou seja, as duas últimas telas são parâmetros opcionais logo, se não desejar configurá-los, dê Next duas vezes. O último passo é escolher o estilo. Opte pelo mais parecido que quer e dê Finish.
Basicamente seu relatório está pronto, bastando ajustes da posição dos campos, design, cabeçalho, etc. Em Field Explorer, contêm as principais funcionalidades para fórmulas e cálculos avançados bem como a adição de novos campos. Como estamos elaborando um relatório simples, vamos parar por aí. Para ver um preview de como estará seu relatório com os dados, clique em Main Report Preview. Agora vamos ver como chamar pelo ASP.NET (C#).
Adicione uma página Impressao.aspx e nele adicione um objeto CrystalReportViewer que automaticamente irá ser registrado o assembly na página (puxando do ToolBox ele insere automaticamente). Se preferível configure alguns atributos do objeto como remoção da logo da BO, tema, etc. No code-behind, adicione os seguintes namespaces:
using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
E para exibir os dados do relatório utilize o seguinte código:
DataSet ds = new DataSet();
// Antes, faço uma consulta no banco e jogo no DataSet para ser usado logo abaixo
ReportDocument relatorio = new ReportDocument();
relatorio.Load(Server.MapPath("Relatorio.rpt"));
relatorio.Database.Tables[0].SetDataSource(ds.Tables[0]);
// Esse é Viewer que puxamos antes
CrystalReportViewerRelatorio.ReportSource = relatorio;
CrystalReportViewerRelatorio.DataBind();
Pronto! Seu relatório será exibido...
Agora vamos aos problemas:
1) Fiz todo o processo mas ao exibir o relatório está pedindo login e senha do SQL Server
Se estiver usando DataSet, veja que só pude passar uma tabela por vez usando ds.Tables[0] e não apenas ds. Se quiser passar várias tabelas crie um DataSet tipado no App_Code ou informe uma a uma no atributo Database.
2) As imagens dos botões do relatório não estão aparecendo e ao clicar não funciona nada
Ao ser colocado em produção, verifique se o Crystal Reports está instalado corretamente na máquina. Veja se a pasta wwwroot\aspnet_client\system_web\ contêm a pasta CrystalReportWebFormViewer (depois da pasta system_web vem a versão do framework - exemplo 2_0_50727 - e em seguida vem ela). Copie a pasta aspnet_client e adicione na raiz de sua aplicação.
3) Ao exibir o relatório está aparecendo o erro: Não foi possível carregar arquivo ou assembly 'System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ou uma de suas dependências. A definição do manifesto do assembly localizado não corresponde à referência do assembly. (Exceção de HRESULT: 0x80131040)
Faça os procedimentos informados nesse post.
4) Depois que é exibido o relatório, ao clicar no botão de imprimir ou exportar ou qualquer outro botão, não executa nenhum dos processos que deveria fazer
Se estiver usando ASP.NET AJAX e o CrystalReportViewer estiver dentro de um UpdatePanel, remova-o. Pois, ao clicar em desses botões, é feito um PostBack na página (além de tentar abrir uma janela pop-up) e o Crystal não funciona adequadamente quando utiliza o AJAX.
5) Ao tentar exibir o relatório, ocorre o seguinte erro: O inicializador de tipo de 'CrystalDecisions.CrystalReports.Engine.ReportDocument' acionou uma exceção
Reinstale o Crystal Reports ou tente as soluções sugeridas nesse post.
6) Minhas imagens e/ou gráficos não estão aparendo ao exibir o relatório (fica aquele X de imagem não carregada) ou ficam distorcidas/baixa resolução
Se for uma imagem que está sendo inserida do disco (que você tem no computador e está inserindo através de Insert > Picture) verifique o formato dessa imagem (preferível JPG ou BMP) e as cores utilizadas bem como efeitos (fundo transparente, camadas). Quanto mais simples a imagem for, melhor será sua visualização. Se apesar de tudo ainda não estiver aparecendo, verifique no web.config se há as seguintes entradas:
Coloque todo o processo de geração do relatório dentro de Page_Init ou invés de Page_Load.
8) Meu relatório não exibe, a princípio, a quantidade total de páginas. Fica exibindo 1/1+...
O Crystal faz isso para não ter de renderizar todo o relatório e sobrecarregar, então faça o seguinte artifício depois de dar o Bind():
CrystalReportViewerRelatorio.ShowLastPage();
CrystalReportViewerRelatorio.ShowFirstPage();
Ou seja, vou rapidamente para a última página e volto apenas para o Crystal renderizar a última página e saber quantas temos ao todo.
Abra/Crie um projeto do tipo Web Site no Visual Studio e no Solution Explorer clique com o direito no diretório onde deseja criar o relatório. Escolha Add New Item e opte pelo template Crystal Reports (note que a extensão de relatório do Crystal é .rtp). Nessa primeira tela escolha a primeira opção conforme a figura abaixo:
Clique em OK. Expanda o nó do Create New Connection e novamente expanda o OLE DB (ADO) para configuração de conexão (essa é a primeira conexão com o banco para início, depois mostraremos como usar para outro banco). Na configuração do ADO, escolha o tipo de provider a ser utilizado (no caso optei pelo SQL Server, então SQL Native Client) e dê Next.
Agora, em Connection Information, informe os dados de conexão.
Clique em Next e na última tela revise os dados. Se estiver tudo certo, clique em Finish. Você voltará à tela anterior já com a configuração realizada e o banco estará apto a selecionar os objetos. Procure qual objeto irá ser manipulado e exibido seus dados, podendo ser: uma tabela, um schema, uma view ou stored procedure. Clique no objeto desejado e, em seguida, clique no botão com a seta para direita conforme figura abaixo:
Clique em Next. Agora informe quais campos irão ser exibidos e escolha Next.
Na próxima tela, se precisar agrupar alguns campos, informe quais são. Se não precisar dê apenas Next. Se o Crystal identificar que está trabalhando com números, ele cria um passo adicional que é a opção de inserir gráficos. Outra tela que é exibida é a de Filtros. Se for ter filtros, informe-os. Caso contrário dê apenas Next. Ou seja, as duas últimas telas são parâmetros opcionais logo, se não desejar configurá-los, dê Next duas vezes. O último passo é escolher o estilo. Opte pelo mais parecido que quer e dê Finish.
Basicamente seu relatório está pronto, bastando ajustes da posição dos campos, design, cabeçalho, etc. Em Field Explorer, contêm as principais funcionalidades para fórmulas e cálculos avançados bem como a adição de novos campos. Como estamos elaborando um relatório simples, vamos parar por aí. Para ver um preview de como estará seu relatório com os dados, clique em Main Report Preview. Agora vamos ver como chamar pelo ASP.NET (C#).
Adicione uma página Impressao.aspx e nele adicione um objeto CrystalReportViewer que automaticamente irá ser registrado o assembly na página (puxando do ToolBox ele insere automaticamente). Se preferível configure alguns atributos do objeto como remoção da logo da BO, tema, etc. No code-behind, adicione os seguintes namespaces:
using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
E para exibir os dados do relatório utilize o seguinte código:
DataSet ds = new DataSet();
// Antes, faço uma consulta no banco e jogo no DataSet para ser usado logo abaixo
ReportDocument relatorio = new ReportDocument();
relatorio.Load(Server.MapPath("Relatorio.rpt"));
relatorio.Database.Tables[0].SetDataSource(ds.Tables[0]);
// Esse é Viewer que puxamos antes
CrystalReportViewerRelatorio.ReportSource = relatorio;
CrystalReportViewerRelatorio.DataBind();
Pronto! Seu relatório será exibido...
Agora vamos aos problemas:
1) Fiz todo o processo mas ao exibir o relatório está pedindo login e senha do SQL Server
Se estiver usando DataSet, veja que só pude passar uma tabela por vez usando ds.Tables[0] e não apenas ds. Se quiser passar várias tabelas crie um DataSet tipado no App_Code ou informe uma a uma no atributo Database.
2) As imagens dos botões do relatório não estão aparecendo e ao clicar não funciona nada
Ao ser colocado em produção, verifique se o Crystal Reports está instalado corretamente na máquina. Veja se a pasta wwwroot\aspnet_client\system_web\ contêm a pasta CrystalReportWebFormViewer (depois da pasta system_web vem a versão do framework - exemplo 2_0_50727 - e em seguida vem ela). Copie a pasta aspnet_client e adicione na raiz de sua aplicação.
3) Ao exibir o relatório está aparecendo o erro: Não foi possível carregar arquivo ou assembly 'System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ou uma de suas dependências. A definição do manifesto do assembly localizado não corresponde à referência do assembly. (Exceção de HRESULT: 0x80131040)
Faça os procedimentos informados nesse post.
4) Depois que é exibido o relatório, ao clicar no botão de imprimir ou exportar ou qualquer outro botão, não executa nenhum dos processos que deveria fazer
Se estiver usando ASP.NET AJAX e o CrystalReportViewer estiver dentro de um UpdatePanel, remova-o. Pois, ao clicar em desses botões, é feito um PostBack na página (além de tentar abrir uma janela pop-up) e o Crystal não funciona adequadamente quando utiliza o AJAX.
5) Ao tentar exibir o relatório, ocorre o seguinte erro: O inicializador de tipo de 'CrystalDecisions.CrystalReports.Engine.ReportDocument' acionou uma exceção
Reinstale o Crystal Reports ou tente as soluções sugeridas nesse post.
6) Minhas imagens e/ou gráficos não estão aparendo ao exibir o relatório (fica aquele X de imagem não carregada) ou ficam distorcidas/baixa resolução
Se for uma imagem que está sendo inserida do disco (que você tem no computador e está inserindo através de Insert > Picture) verifique o formato dessa imagem (preferível JPG ou BMP) e as cores utilizadas bem como efeitos (fundo transparente, camadas). Quanto mais simples a imagem for, melhor será sua visualização. Se apesar de tudo ainda não estiver aparecendo, verifique no web.config se há as seguintes entradas:
- Em system.web > httpHandlers:
<add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add verb="*" path="GenerateImage.ashx" type="GenerateDynamicImage"/>
- E em system.webServer > handlers:
<add name="CrystalImageHandler.aspx_GET" verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" preCondition="integratedMode"/>
Coloque todo o processo de geração do relatório dentro de Page_Init ou invés de Page_Load.
8) Meu relatório não exibe, a princípio, a quantidade total de páginas. Fica exibindo 1/1+...
O Crystal faz isso para não ter de renderizar todo o relatório e sobrecarregar, então faça o seguinte artifício depois de dar o Bind():
CrystalReportViewerRelatorio.ShowLastPage();
CrystalReportViewerRelatorio.ShowFirstPage();
Ou seja, vou rapidamente para a última página e volto apenas para o Crystal renderizar a última página e saber quantas temos ao todo.
Não foi possível carregar arquivo ou assembly System.Web.Extensions, Version=2.0.0.0
Postado por
Thiago Marçal
on quarta-feira, 18 de agosto de 2010
/
Marcadores:
crystal reports,
dicas,
dll
/
Comments: (29)
Dica rápida para quem tiver esse erro...
Acontece quando está utilizando uma versão do ASP.NET Ajax diferente do Framework da aplicação. Muitas vezes, também, acontece quando está utilizando o Crystal Report ao renderizar um relatório. Então é exibido a seguinte mensagem:
A solução é simples: basta remover a System.Web.Extensions.dll e/ou System.Web.Extensions.Design.dll do projeto (na pasta Bin).
Acontece quando está utilizando uma versão do ASP.NET Ajax diferente do Framework da aplicação. Muitas vezes, também, acontece quando está utilizando o Crystal Report ao renderizar um relatório. Então é exibido a seguinte mensagem:
A solução é simples: basta remover a System.Web.Extensions.dll e/ou System.Web.Extensions.Design.dll do projeto (na pasta Bin).
Não foi possível carregar arquivo ou assembly 'System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ou uma de suas dependências. A definição do manifesto do assembly localizado não corresponde à referência do assembly. (Exceção de HRESULT: 0x80131040)
















