<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wikido.isoftdata.com//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ckaup</id>
	<title>ISoft Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wikido.isoftdata.com//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ckaup"/>
	<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Special:Contributions/Ckaup"/>
	<updated>2026-04-28T21:21:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15190</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15190"/>
		<updated>2026-04-21T18:31:40Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, connecting to the database with ODBC. The PDF is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why aren&amp;#039;t reports updated automatically in the web? ===&lt;br /&gt;
&lt;br /&gt;
Report updates were historically done by ITrack/Presage desktop, and there is currently no system for automatically updating reports without using desktop. One is in progress, but as of 2/4/2026, it is not ready for primetime.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== How is Report Queue, the Python application, involved in this? ===&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not. Crystal Server and Report Queue are completely separate applications. Crystal Server only generates PDF previews. Report Queue handles printing and emailing reports. Crystal Server is written in Node.js, Report Queue is written in Python. Their main similarity is that they both invoke Report Commander to generate the PDF file, and log to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
=== Why don&amp;#039;t Chromium customers need to be set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Since Chromium users are on one of three servers, (except for dev, demo, etc.) all Chromium instances can just use the config for their regional server&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;quot;Invalid Report&amp;quot; or &amp;quot;No report found of type &amp;lt;type&amp;gt; and name &amp;lt;name&amp;gt;&amp;quot; || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report. If some parameters are missing or blank, there could have been an issue running a report parameter query, and omitting those parameters could have caused a syntax error (1064)&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15164</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15164"/>
		<updated>2026-03-26T18:50:28Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, connecting to the database with ODBC. The PDF is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why aren&amp;#039;t reports updated automatically in the web? ===&lt;br /&gt;
&lt;br /&gt;
Report updates were historically done by ITrack/Presage desktop, and there is currently no system for automatically updating reports without using desktop. One is in progress, but as of 2/4/2026, it is not ready for primetime.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== How is Report Queue, the Python application, involved in this? ===&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not. Crystal Server and Report Queue are completely separate applications. Crystal Server only generates PDF previews. Report Queue handles printing and emailing reports. Crystal Server is written in Node.js, Report Queue is written in Python. Their main similarity is that they both invoke Report Commander to generate the PDF file, and log to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
=== Why don&amp;#039;t Chromium customers need to be set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Since Chromium users are on one of three servers, (except for dev, demo, etc.) all Chromium instances can just use the config for their regional server&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report. If some parameters are missing or blank, there could have been an issue running a report parameter query, and omitting those parameters could have caused a syntax error (1064)&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15153</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15153"/>
		<updated>2026-02-12T22:40:29Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* How is Report Queue, the Python application, involved in this? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, connecting to the database with ODBC. The PDF is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why aren&amp;#039;t reports updated automatically in the web? ===&lt;br /&gt;
&lt;br /&gt;
Report updates were historically done by ITrack/Presage desktop, and there is currently no system for automatically updating reports without using desktop. One is in progress, but as of 2/4/2026, it is not ready for primetime.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== How is Report Queue, the Python application, involved in this? ===&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not. Crystal Server and Report Queue are completely separate applications. Crystal Server only generates PDF previews. Report Queue handles printing and emailing reports. Crystal Server is written in Node.js, Report Queue is written in Python. Their main similarity is that they both invoke Report Commander to generate the PDF file, and log to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
=== Why don&amp;#039;t Chromium customers need to be set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Since Chromium users are on one of three servers, (except for dev, demo, etc.) all Chromium instances can just use the config for their regional server&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15151</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15151"/>
		<updated>2026-02-04T18:09:10Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, connecting to the database with ODBC. The PDF is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why aren&amp;#039;t reports updated automatically in the web? ===&lt;br /&gt;
&lt;br /&gt;
Report updates were historically done by ITrack/Presage desktop, and there is currently no system for automatically updating reports without using desktop. One is in progress, but as of 2/4/2026, it is not ready for primetime.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== How is Report Queue, the Python application, involved in this? ===&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not. Crystal Server and Report Queue are completely separate applications. Crystal Server only generates PDF previews. Report Queue handles printing and emailing reports. Crystal Server is written in Node.js, Report Queue is written in Python. Their main similarity is that they both invoke Report Commander to generate the PDF file.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
=== Why don&amp;#039;t Chromium customers need to be set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Since Chromium users are on one of three servers, (except for dev, demo, etc.) all Chromium instances can just use the config for their regional server&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15150</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15150"/>
		<updated>2026-02-04T18:07:51Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, connecting to the database with ODBC. The PDF is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== How is Report Queue, the Python application, involved in this? ===&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not. Crystal Server and Report Queue are completely separate applications. Crystal Server only generates PDF previews. Report Queue handles printing and emailing reports. Crystal Server is written in Node.js, Report Queue is written in Python. Their main similarity is that they both invoke Report Commander to generate the PDF file.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
=== Why don&amp;#039;t Chromium customers need to be set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Since Chromium users are on one of three servers, (except for dev, demo, etc.) all Chromium instances can just use the config for their regional server&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15149</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15149"/>
		<updated>2026-02-04T18:03:58Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, connecting to the database with ODBC. The PDF is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== How is Report Queue, the Python application, involved in this? ===&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s not. Crystal Server and Report Queue are completely separate applications. Crystal Server only generates PDF previews. Report Queue handles printing and emailing reports. Crystal Server is written in Node.js, Report Queue is written in Python. Their main similarity is that they both invoke Report Commander to generate the PDF file.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15148</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15148"/>
		<updated>2026-02-04T18:00:29Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, which is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
==== How is that different from desktop? ====&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why do I sometimes get &amp;quot;504 Gateway Timeout&amp;quot; when running a report in web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, there are multiple web servers involved in the process of generating a PDF from a Crystal Report in the web, and each one of them has their own server-level timeouts. The web server connecting you to the application API (Chromium, Presage API, EE API) might time you out, and so might the web server connecting the application API to the Crystal Server. &lt;br /&gt;
&lt;br /&gt;
==== Can we make the timeouts longer? ====&lt;br /&gt;
&lt;br /&gt;
The short answer is &amp;quot;not really&amp;quot;. Since the timeouts are at the web server level (i.e., nginx/Apache) all requests to that server have the same timeout. We could decide not to time any request out until several minutes have passed, but if a request is taking that long, it &amp;#039;&amp;#039;should&amp;#039;&amp;#039; time out.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15147</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15147"/>
		<updated>2026-02-04T17:52:22Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Why does this report run on desktop, but not on web? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, which is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
=== How is that different from desktop? ===&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, but it seems to be more tolerant to being passed extra parameters, or missing parameters. Report Commander is pickier so it will throw when you give it an extra parameter not found in the report, or if you are missing a required parameter value. As a result, basically every error in this Wiki article is web-exclusive.&lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15146</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15146"/>
		<updated>2026-02-04T17:50:15Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== FAQ == &lt;br /&gt;
&lt;br /&gt;
=== How does the web report viewer work? ===&lt;br /&gt;
&lt;br /&gt;
Since we can&amp;#039;t run crystal reports directly in the browser, we need to run them on a central server and send them back to the web browser. There are multiple servers involved in this process, which I&amp;#039;ll outline below&lt;br /&gt;
&lt;br /&gt;
* The report and parameter list are loaded from the application&amp;#039;s API (Chromium, Presage API, EE API)&lt;br /&gt;
* The user selects a report, fills out parameters, and clicks &amp;quot;Preview&amp;quot;&lt;br /&gt;
* A request is sent to the application backend (Chromium, Presage API, EE API)&lt;br /&gt;
* Application backend sends a request to Crystal Server, running on Bunnahabhain, or a customer server if relevant. This requests includes details of the report to run, which database to run it on, and a valid session token for that database.&lt;br /&gt;
* Bunnahabhain takes this request, and attempts to validate the given session token in the given database. If this fails, such as if the token is invalid or it can&amp;#039;t connect to the database, an &amp;quot;Invalid Session&amp;quot; error is thrown.&lt;br /&gt;
* After the session is validated, Crystal Server will download the report file from the customer&amp;#039;s database, and run default parameter queries. The report is saved to the &amp;quot;cache directory&amp;quot; specified in the config, with the file&amp;#039;s hash as the file name.&lt;br /&gt;
* Then, Crystal Server creates a command line string to run Report Commander for the given report and parameters&lt;br /&gt;
* Report Commander is then invoked to generate the PDF, which is saved to a folder in the Crystal Server&amp;#039;s &amp;quot;cache directory&amp;quot;. If Report Commander throws an error, it is forwarded to the application API (Chromium, Presage API, EE API), which saves it to the &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt; table and forwards that error to the client, where it is displayed.&lt;br /&gt;
* If it succeeds, the report file is base64 encoded and sent back to the application API (Chromium, Presage API, EE API), along with the time it took to execute the report.&lt;br /&gt;
* The application API receives the request, saves the details to &amp;lt;code&amp;gt;reportqueue&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reportqueueparameter&amp;lt;/code&amp;gt;, and returns the base64 encoded PDF to the client&lt;br /&gt;
* The client receives the response from its backend, and displays the base64 encoded PDF in the browser using an &amp;lt;code&amp;gt;&amp;lt;object/&amp;gt;&amp;lt;/code&amp;gt; tag&lt;br /&gt;
&lt;br /&gt;
=== How is that different from desktop? ===&lt;br /&gt;
&lt;br /&gt;
ITrack desktop talks directly to the Crystal Reports SDK on the individual workstation, instead of sending report jobs to a central server (Bunnahabhain) running Crystal Server.&lt;br /&gt;
&lt;br /&gt;
=== Why can&amp;#039;t web work the same way as desktop? ===&lt;br /&gt;
&lt;br /&gt;
Chromium, Presage Web, and Enterprise Web run inside of a web browser, and can therefore be used on multiple operating systems without installing anything. Crystal Reports SDK is Windows-only and requires installation. Therefore, we need a central server to generate the pdf and send it back to the web browser (with some extra steps in between)&lt;br /&gt;
&lt;br /&gt;
=== Why does this report run on desktop, but not on web? ===&lt;br /&gt;
&lt;br /&gt;
As outlined above, web and desktop have entirely different stacks for running crystal reports. In short, web uses Report Commander instead of the Crystal SDK. I don&amp;#039;t know exactly how the official Crystal SDK works, &lt;br /&gt;
&lt;br /&gt;
=== Why do Presage customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Presage customers (generally) are on their own VM, and therefore database server. Therefore, they need their own entries in the Crystal Server config file.&lt;br /&gt;
&lt;br /&gt;
Theoretically SMB customers, since they&amp;#039;re on the same server, could share a config, but that hasn&amp;#039;t been explored as of 2/4/2026.&lt;br /&gt;
&lt;br /&gt;
=== Why do Enterprise customers need set up manually? ===&lt;br /&gt;
&lt;br /&gt;
Enterprise customers are generally on their own VM or server. Additionally, EE customers might not want to use our central server, and might want to host their own. Therefore, they need their own entries in the Crystal Server config file, or their own Crystal Server instance entirely.&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode) ==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15145</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15145"/>
		<updated>2026-02-02T22:07:04Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the type the report expects to receive&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15144</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15144"/>
		<updated>2026-02-02T22:05:47Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;The types of the parameter field and parameter field current values are not compatible&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that Crystal was passed a parameter value of the wrong type for that parameter. For example, a string instead of a number || Make sure ITrack is sending parameters of the same type as the report&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15135</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15135"/>
		<updated>2026-01-09T18:36:07Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15124</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15124"/>
		<updated>2025-12-05T20:57:26Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Terms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain. &amp;#039;&amp;#039;&amp;#039;This application is not the same as Report Queue.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15122</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15122"/>
		<updated>2025-12-05T20:50:34Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
This table will hold the answers to (probably) any error you will encounter running reports in Presage Web&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15121</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15121"/>
		<updated>2025-12-05T20:47:02Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| Database logon failed || ODBC could not connect to the database || Ask Brian (or maybe someone else from @Systems) to double check the ODBC connection on Bunnahabhain for that customer&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15026</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=15026"/>
		<updated>2025-09-03T15:24:48Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally, you just need to set the host, user, password, and odbc data sources for a new connection. However, host MUST be unique, and MUST match the ITrack/Presage server config, as that&amp;#039;s what&amp;#039;s used to look up the rest of the connection info. Most of the time you can just add another entry to the JSON, like so&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&lt;br /&gt;
	&amp;quot;host&amp;quot;: &amp;quot;HOST&amp;quot;,&lt;br /&gt;
	&amp;quot;user&amp;quot;: &amp;quot;USER&amp;quot;,&lt;br /&gt;
	&amp;quot;password&amp;quot;: &amp;quot;PASSWORD&amp;quot;,&lt;br /&gt;
	&amp;quot;odbcDataSource&amp;quot;: &amp;quot;ODBC DATA SOURCE NAME&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In some cases you might also need to set the &amp;lt;code&amp;gt;caPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;certPath&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyPath&amp;lt;/code&amp;gt; properties depending on the SSL config. See other configured hosts for examples.&lt;br /&gt;
&lt;br /&gt;
After adding to the JSON, restart the &amp;lt;code&amp;gt;CrystalServer&amp;lt;/code&amp;gt; service to apply any changes. See below for more product-specific details.&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14995</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14995"/>
		<updated>2025-07-08T19:53:10Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Enterprise Web/API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG, UT&amp;amp;W, &amp;amp; QBT are currently (07/08/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14974</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14974"/>
		<updated>2025-06-12T18:36:24Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Enterprise Web/API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG and UT&amp;amp;W are currently (6/12/25) the only EE customers with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14973</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14973"/>
		<updated>2025-06-12T18:35:05Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Internal Server Error&amp;lt;/code&amp;gt; || You&amp;#039;re probably on a version of EEW that doesn&amp;#039;t forward the error to the client properly. || Check Report Viewer &amp;gt; History to see the actual error&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG is currently (3/11/25) the only EE customer with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Configuring_a_barcode_scanner&amp;diff=14913</id>
		<title>Configuring a barcode scanner</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Configuring_a_barcode_scanner&amp;diff=14913"/>
		<updated>2025-06-06T17:29:28Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Windows 11 Industrial Rugged Tablet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Zebra DS2278=&lt;br /&gt;
&lt;br /&gt;
This page will cover how to setup a Zebra DS2278 Bluetooth Barcode Scanner to work with iSoft products on mobile devices.&lt;br /&gt;
&lt;br /&gt;
==Scanner Info==&lt;br /&gt;
* Approx Cost: $190-$280 depending on accessories and support&lt;br /&gt;
* Important Features: Bluetooth, 14 hour+ battery life, 5ft drop, 36 month warranty, 123Scan app, SDKs for iOS, Android, Windows&lt;br /&gt;
&lt;br /&gt;
==Quick Start Guide==&lt;br /&gt;
===Android using Chrome===&lt;br /&gt;
* The fastest way to get started is to scan the appropriate barcode for your device type. **Make sure your device is fully charged!&lt;br /&gt;
* This model of scanner can scan from a high resolution monitor or screen &lt;br /&gt;
* Each of the barcodes below will change the defaults on your scanner.  You will need to &amp;quot;forget&amp;quot; or &amp;quot;remove&amp;quot; the device in your Bluetooth settings and reconnect&lt;br /&gt;
* The below barcodes have the following settings: &amp;#039;&amp;#039;&amp;#039;Prefix : Suffix $&amp;#039;&amp;#039;&amp;#039;, HID features for iOS, Host: HID BT Classic&lt;br /&gt;
[[Image:AndroidBarcode.JPG]]&lt;br /&gt;
&lt;br /&gt;
===iOS using ITrack LX App===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tip: You do not need to set up this device as a keyboard wedge&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
1. You first need to install the Zebra iOS app https://apps.apple.com/us/app/zebra-scanner-control/id1034012069&lt;br /&gt;
&lt;br /&gt;
2. Open that app and go to Connection Help &amp;gt; Pair DS2278&lt;br /&gt;
&lt;br /&gt;
[[Image:Zebra-DS2278-setup-barcodes.PNG|400px]]&lt;br /&gt;
&lt;br /&gt;
3. Follow the onscreen instructions&lt;br /&gt;
&lt;br /&gt;
4. Go back to the main screen and choose Connect&lt;br /&gt;
&lt;br /&gt;
5. Tap on the DS2278 and choose Disconnect(this will disconnect it from the Zebra app so we can connect it to the ITrack LX app)&lt;br /&gt;
&lt;br /&gt;
[[Image:Zebra-DS2278-disconnect-screen.PNG|400px]]&lt;br /&gt;
&lt;br /&gt;
6. Go to the ITrack LX app and after a few seconds you should hear a connection beep from the scanner. Scanning in the ITrack LX app with the DS2278 should now work.&lt;br /&gt;
&lt;br /&gt;
==Charging the Scanner==&lt;br /&gt;
* The charging circuit on the scanner is capable of using as much current as possible based on the power source&lt;br /&gt;
* Preferred Method: use a BC1.2 Compliant Micro USB adapter to a wall outlet (higher current charging capability above 900 mA)&lt;br /&gt;
&lt;br /&gt;
[[Image:Zebra_battery.JPG]]&lt;br /&gt;
&lt;br /&gt;
==123Scan Software==&lt;br /&gt;
&lt;br /&gt;
==Explanation of Settings==&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
* Zebra Support Page [https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/ds2200-series.html link]&lt;br /&gt;
* 123Scan Software Download [https://www.zebra.com/us/en/products/software/scanning-systems/123scan.html link]&lt;br /&gt;
* Full Manual Download [https://www.zebra.com/content/dam/zebra_new_ia/en-us/manuals/barcode-scanners/ds2278-prg-en.pdf link]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Honeywell=&lt;br /&gt;
&lt;br /&gt;
== Compatibility Notes ==&lt;br /&gt;
Please update the Chrome browser on the Honeywell to Chrome v101 so that the Teardown app is sized correctly. It currently ships with Chrome v70. -JW 2022-05-18&lt;br /&gt;
&lt;br /&gt;
== Setting up a Honeywell Scanner ==&lt;br /&gt;
ScanPal EDA71  &lt;br /&gt;
https://www.honeywellaidc.com/products/computer-devices/tablet/scanpaleda71&lt;br /&gt;
&lt;br /&gt;
These are the screens you set through to set up the honeywell device&lt;br /&gt;
&lt;br /&gt;
Settings -&amp;gt; Honeywell Settings -&amp;gt; Scan Settings -&amp;gt; Internal Scanner -&amp;gt; Default profile -&amp;gt; Data Processing Settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wedge = checked&lt;br /&gt;
&lt;br /&gt;
Wedge Method = Keyboard&lt;br /&gt;
&lt;br /&gt;
no Prefix&lt;br /&gt;
&lt;br /&gt;
no Suffix&lt;br /&gt;
&lt;br /&gt;
Wedge as keys = empty input&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchart_of_settings.jpg|800px|thumb|center|Honeywell Setting Flowchart]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Enterprise LX Honeywell config info ==&lt;br /&gt;
&lt;br /&gt;
A global database setting &amp;quot;Scanner Mode (ambleMode,honeywell)&amp;quot; needs to be set to &amp;quot;honeywell&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The current default is ambleMode which may change in the near future.&lt;br /&gt;
The following query will let you check on the setting.   Note: A user has to have logged into an lx app before the default settings are present. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
   `globalsettingvalue`.`settingid`&lt;br /&gt;
    , `setting`.`location`&lt;br /&gt;
    , `setting`.`name`&lt;br /&gt;
    , `globalsettingvalue`.`value`&lt;br /&gt;
    , `setting`.`defaultvalue`&lt;br /&gt;
    , `setting`.`scope`&lt;br /&gt;
    , `setting`.`settingtype`&lt;br /&gt;
    , `value`=`defaultvalue` AS isdefault&lt;br /&gt;
FROM&lt;br /&gt;
    `globalsettingvalue`&lt;br /&gt;
    INNER JOIN `setting` &lt;br /&gt;
        ON (`globalsettingvalue`.`settingid` = `setting`.`settingid`)&lt;br /&gt;
WHERE (`setting`.`name` = &amp;#039;Scanner Mode (ambleMode,honeywell)&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Munbyn=&lt;br /&gt;
&lt;br /&gt;
== Setting up a Munbyn Scanner ==&lt;br /&gt;
This is for the MUNBYN IPDA081/IPDA086 Mobile Data Terminal: https://pos.munbyn.com/munbyn-ipda081-rfid-handheld-computer/&amp;lt;br&amp;gt;&lt;br /&gt;
To set up:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Swipe up to see apps, then tap on &amp;quot;keyboardemulator&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
On the &amp;quot;Function&amp;quot; page, make sure &amp;quot;Enable Scanner&amp;quot; is on.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:scanner1.png|200px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On the &amp;quot;AppSettings&amp;quot; page, turn on &amp;quot;Release key off scan&amp;quot; (if it is not already enabled).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:scanner2.png|200px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Then scroll down to &amp;quot;Process mode&amp;quot;. Make sure it is set to &amp;quot;keyboard input&amp;quot;. Under &amp;quot;End mark&amp;quot;, none of the options should be checked.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:scanner3.png|200px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Prefix/preamble and suffix/postamble for the device can be edited under &amp;quot;Data Format&amp;quot;. If using a test program that uses prefix/suffix, be sure that the prefix/suffix in the program and in the scanner setting app (keyboardemulator) are the same.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:scanner4.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tera Scanner =&lt;br /&gt;
[[File:Tera_config.png|200px]]&lt;br /&gt;
&lt;br /&gt;
To enable the trigger on the Tera scanner handle:&lt;br /&gt;
&lt;br /&gt;
1. Get to the Scanner Config Page. &lt;br /&gt;
&lt;br /&gt;
2. Disable the scanner.&lt;br /&gt;
&lt;br /&gt;
3. Key in 293 on the scanner keypad.&lt;br /&gt;
&lt;br /&gt;
4. Re-enable the scanner.&lt;br /&gt;
&lt;br /&gt;
5. The scanner config page should look like the image above if it&amp;#039;s set correctly.&lt;br /&gt;
&lt;br /&gt;
== Windows 11 Industrial Rugged Tablet ==&lt;br /&gt;
Two additional applications are required to use the scanner features: Honeywell Download manager tool (which will manage any subsequent Honeywell software downloads), then an EZConfig for Scanning software for the configuration of scanner itself. Both parts can be downloaded from the same portal: https://hsmftp.honeywell.com/&lt;br /&gt;
&lt;br /&gt;
To download the zip file containing the Honeywell Download manager tool, select &amp;quot;here&amp;quot; marked by the first arrow. When finished, right-click the zip file selecting &amp;quot;Extract all...&amp;quot; then select a home/path for this installer.&lt;br /&gt;
&lt;br /&gt;
To download the EZConfig for Scanning, in the file system on the left: Software -&amp;gt; Barcode Scanner -&amp;gt; Software -&amp;gt; Tools and Utilities -&amp;gt; EZConfig for Scanning -&amp;gt; Current.&lt;br /&gt;
&lt;br /&gt;
# Open the EZConfig for Scanning software when it&amp;#039;s finished downloading. &lt;br /&gt;
# Open the file &amp;quot;EZConfig-Scanning v4_msedge&amp;quot;&lt;br /&gt;
# select &amp;quot;Connected Device&amp;quot;&lt;br /&gt;
# select &amp;quot;Configure Device&amp;quot;&lt;br /&gt;
# select &amp;quot;Data Formatting&amp;quot;&lt;br /&gt;
# in Data Formatting, verify that you are on the &amp;quot;Prefix/Suffix&amp;quot; tab&lt;br /&gt;
# enter &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; as the Prefix&lt;br /&gt;
# enter &amp;lt;code&amp;gt;{  CR}&amp;lt;/code&amp;gt; as the Suffix&lt;br /&gt;
&lt;br /&gt;
== NOTE on ENTERPRISE LX setup ==&lt;br /&gt;
enterpise lx  default pre/postable&lt;br /&gt;
preamble = &amp;quot;126&amp;quot;    = &amp;quot;~&amp;quot;&lt;br /&gt;
postamble = &amp;quot;13&amp;quot; = &amp;quot;Enter&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
For munbyn scanner,   the postamble/suffix  does not allow you to use &amp;quot;Enter&amp;quot;  so you need to leave that blank and instead check the box under EndMark  that says &amp;quot;Enter&amp;quot;&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14902</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14902"/>
		<updated>2025-06-04T19:27:43Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG is currently (3/11/25) the only EE customer with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14901</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14901"/>
		<updated>2025-06-04T19:27:16Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
||-&lt;br /&gt;
|| &amp;lt;code&amp;gt;Database Vendor Code (code)&amp;lt;/code&amp;gt; || There was some MySQL error. Look up the error code. || Might depend on the error code, but it&amp;#039;s probably because of a bad query in the report. Reupload report.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG is currently (3/11/25) the only EE customer with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14831</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14831"/>
		<updated>2025-03-11T19:09:03Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Enterprise Web/API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WG is currently (3/11/25) the only EE customer with the web report viewer on, and they also had to have the caPath set in the crystal server config to the old/not-2024 ca cert. Not sure if that&amp;#039;ll be true for other EE customers, but it was for them.&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14830</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14830"/>
		<updated>2025-03-11T19:02:12Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Enterprise Web/API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, and don&amp;#039;t want to use our Crystal Server, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14829</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14829"/>
		<updated>2025-03-11T19:01:57Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Enterprise Web/API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
If we host the customer, we should just set them up on our Crystal Server. Follow the general steps for configuring them in the Crystal Server config.json, then set some ENV variables in Portainer:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;REPORT_SERVER_URI: http://print.itrackchromium.com&amp;lt;/code&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;EXTERNAL_DB_HOST: example-url.itrackenterprise.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re self hosted, follow the steps under &amp;quot;Deployment&amp;quot;, then set the above ENV variables to the proper values for their setup.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14810</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14810"/>
		<updated>2025-02-18T22:14:39Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Self-Hosted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI. Presage API will have to be able to reach &amp;lt;code&amp;gt;&amp;lt;The Server URL&amp;gt;/process_report&amp;lt;/code&amp;gt; in order to generate the reports&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14809</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14809"/>
		<updated>2025-02-18T22:13:11Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* SMB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did. I think they&amp;#039;re also set up slightly differently than Culligan GI&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14792</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14792"/>
		<updated>2025-02-05T17:16:13Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. Sometimes it&amp;#039;ll give you a &amp;quot;database vendor code&amp;quot; just like ITrack desktop. || Depending on the error code, Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct. But some error codes like 1064 are unrelated to the odbc setup&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14791</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14791"/>
		<updated>2025-02-03T17:19:25Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* SMB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
As of 02/03/2025, there&amp;#039;s also Bartlett, which had some issues setting it up related to SSL. Brian fixed it, I&amp;#039;m not sure what he did.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14782</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14782"/>
		<updated>2025-01-16T18:11:00Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Deployment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable from wherever the Presage API is running&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14781</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14781"/>
		<updated>2025-01-16T18:10:09Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Deployment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
* Locate a Windows Server&lt;br /&gt;
* Install Report Commander on it&lt;br /&gt;
* Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
* Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
* Restart the CrystalServer service&lt;br /&gt;
* Make sure the service is reachable by the Presage API&lt;br /&gt;
* At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14780</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14780"/>
		<updated>2025-01-16T18:09:10Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
If they&amp;#039;re okay hitting our Crystal Server, we just need to make sure that their database can be reached on Bunnahabhain, then the setup is the same as a hosted yard. &lt;br /&gt;
&lt;br /&gt;
If not, we&amp;#039;ll have to deploy it to a Windows server they control, and set the &amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; ENV variable in the API to the proper URI&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Deployment == &lt;br /&gt;
&lt;br /&gt;
For 99% of customers, this section will not apply. But in the event that a self-hosted customer wants to host their own Crystal Server, this is probably how.&lt;br /&gt;
&lt;br /&gt;
- Locate a Windows Server&lt;br /&gt;
- Install Report Commander on it&lt;br /&gt;
- Run CrystalServerSetup.exe from dl.isoftdata.com, I think this sets up the service to make it run in the background and on startup?&lt;br /&gt;
- Get the latest EXE or build a new one from https://github.com/ISoft-Data-Systems/crystal-reports-server and replace the old EXE from the installer&lt;br /&gt;
- Restart the CrystalServer service&lt;br /&gt;
- Make sure the service is reachable by the Presage API&lt;br /&gt;
- At this point, they should be able to make a request to &amp;lt;code&amp;gt;serveruri&amp;lt;/code&amp;gt;/process_report and get a report back.&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14779</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14779"/>
		<updated>2025-01-14T17:48:54Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type, and a valid &amp;lt;code&amp;gt;report.fileid&amp;lt;/code&amp;gt;. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14778</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14778"/>
		<updated>2025-01-14T17:48:21Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Invalid Report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. Or, the report is missing its corresponding &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; data.&lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14773</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14773"/>
		<updated>2024-12-19T22:56:19Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. &lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain. Maybe reupload the report if it persists after that.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14772</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14772"/>
		<updated>2024-12-19T20:47:04Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Common Errors (Table Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. &lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || This would come up every so often because the D drive on Bunnahabhain was failing. It shouldn&amp;#039;t happen anymore. || It shouldn&amp;#039;t happen again, but if it does, delete the cached report file from &amp;lt;code&amp;gt;M:\report_cache&amp;lt;/code&amp;gt; on Bunnahabhain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14771</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14771"/>
		<updated>2024-12-19T20:42:28Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* The file or directory is corrupted and unreadable */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. &lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s possible it was because the D drive was failing. Cache has been moved to M:\report_cache&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || Every so often this comes up, and I&amp;#039;m not sure why. Maybe it&amp;#039;s the .rpt being corrupt, or maybe the output file? || Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14749</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14749"/>
		<updated>2024-12-10T20:09:47Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Logs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. &lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || Every so often this comes up, and I&amp;#039;m not sure why. Maybe it&amp;#039;s the .rpt being corrupt, or maybe the output file? || Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it. The logged request body should have the db host sent from the application, which can be compared to the valid hosts in the config file&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14748</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14748"/>
		<updated>2024-12-10T20:07:37Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: /* Misc / Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. &lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || Every so often this comes up, and I&amp;#039;m not sure why. Maybe it&amp;#039;s the .rpt being corrupt, or maybe the output file? || Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed to generate invoice PDFs for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
	<entry>
		<id>https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14747</id>
		<title>Web Report Viewer Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wikido.isoftdata.com//index.php?title=Web_Report_Viewer_Troubleshooting&amp;diff=14747"/>
		<updated>2024-12-10T19:37:06Z</updated>

		<summary type="html">&lt;p&gt;Ckaup: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article applies to Presage Web and ITrack Chromium. The web Report Viewer will give a general error, error details are logged to the reportqueue table and can be viewed in the &amp;quot;History&amp;quot; (web) or &amp;quot;Print Queue&amp;quot; (desktop) tab of the Report Viewer screen.&lt;br /&gt;
&lt;br /&gt;
== Terms ==&lt;br /&gt;
&lt;br /&gt;
* Crystal Server - the Node.JS application that uses Report Commander to generate the report PDF. Runs on Bunnahabhain&lt;br /&gt;
* Report Commander - command line application used to generate report PDFs by the Crystal Server (and Report Queue)&lt;br /&gt;
* Report Queue - python application that reads from reportqueue table to send emails and print to a printer. &amp;#039;&amp;#039;&amp;#039;Report Queue is separate from Crystal Server, and the two systems do not interact.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* reportqueue - a table in the database that logs report runs.&lt;br /&gt;
* reportparameter - a table in the database that associates parameters to reports&lt;br /&gt;
&lt;br /&gt;
== Common Errors ==&lt;br /&gt;
&lt;br /&gt;
=== Error Running Report ===&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander encountered an error running the report. If you get this error, check the reportqueue error for a more detailed error message. Listed below are some common ones.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Missing parameter values&amp;quot; or &amp;quot;Double check the parameters...&amp;quot;====&lt;br /&gt;
&lt;br /&gt;
This means that Report Commander did not receive all required parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot;, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Since this is caused by missing rows in the reportparameter table, re-running the adder scripts will generally fix the issue.&lt;br /&gt;
&lt;br /&gt;
If it doesn&amp;#039;t, the adder script could be out of date or otherwise missing parameters.&lt;br /&gt;
&lt;br /&gt;
==== Parameter not found in report: &amp;lt;parametername&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
This means that a report was passed a parameter it doesn&amp;#039;t expect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Make sure the report is up to date&lt;br /&gt;
&lt;br /&gt;
==== (I can&amp;#039;t remember the error message) ====&lt;br /&gt;
&lt;br /&gt;
Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect.&lt;br /&gt;
&lt;br /&gt;
===== Solution =====&lt;br /&gt;
&lt;br /&gt;
Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
&lt;br /&gt;
==== Invalid Value for &amp;lt;parameter&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Report Commander received an invalid value for the specified parameter&lt;br /&gt;
&lt;br /&gt;
=== Invalid Session ===&lt;br /&gt;
&lt;br /&gt;
This error is caused by the Crystal Server failing to verify the session token it was passed. &lt;br /&gt;
&lt;br /&gt;
==== Solution ====&lt;br /&gt;
&lt;br /&gt;
Most likely, if logging out and back in doesn&amp;#039;t fix it, this means that the Crystal Server configuration is either missing, or configured with a different database host URL than the API. Charles can check the logs to double check, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
&lt;br /&gt;
=== Invalid Report ===&lt;br /&gt;
&lt;br /&gt;
The Crystal Server failed to find the report with the specified name/type. &lt;br /&gt;
&lt;br /&gt;
=== The file or directory is corrupted and unreadable ===&lt;br /&gt;
&lt;br /&gt;
Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other Errors ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Error: WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.&amp;lt;/code&amp;gt; - Disable &amp;quot;Auto Reconnect&amp;quot; on ODBC. Presents as &amp;quot;Unkown Error&amp;quot; or &amp;quot;Internal Server Error&amp;quot; in the UI&lt;br /&gt;
&lt;br /&gt;
== Common Errors (Table Mode)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|+ Common Errors&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 100px;&amp;quot;| Error !! Description !! How to Fix&lt;br /&gt;
|-&lt;br /&gt;
| Invalid Session. Try logging out and logging back in. || This means that the report server was not able to verify your session. Either your session has expired, or the Crystal Server is not configured for that database. The most likely cause of this is, if logging out and back in doesn&amp;#039;t fix it, is that the (generally Presage) customer hasn&amp;#039;t been set up on the Crystal Server, or some configuration has changed. || If the config for that customer is missing, then add it matching the template. If it is present, make sure that the Crystal Server and Chromium/Presage API are configured with the same DB URL. Otherwise, check the ODBC connection and DB credentials. Charles can check the logs to double check the URLs are good, as well as update the config file. Brian can then restart the Crystal Server service to load the updated configuration.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Error running report. Double check the report parameters and try again. || This means that Report Commander did not receive the correct amount of parameters for the report. Often times, the report will run fine on desktop, because the Crystal SDK can &amp;quot;fill in the gaps&amp;quot; or ignore extra parameters, while the web Report Viewer cannot, and needs a row in reportparameter for every parameter. Check the &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; tab for more error details || Generally, update the report and re-run adders, but &amp;#039;&amp;#039;&amp;#039;See Below&amp;#039;&amp;#039;&amp;#039; for more details, and check &amp;lt;code&amp;gt;Report Viewer &amp;gt; History&amp;lt;/code&amp;gt; for more parameter and error details. If updating the report and adder doesn&amp;#039;t fix it, it&amp;#039;s possible that they are out of date and need fixed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Invalid value for &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means Report Commander received an invalid value for the listed parameter. Usually this just means you forgot to fill a parameter out, but could be caused by by an outdated report / adders. || Make sure all parameters are filled out.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Parameter not found in report: &amp;lt;parameter&amp;gt;&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that a parameter was passed to the report that the report doesn&amp;#039;t expect. || If caused by an out-of-date report (more common), update the report. If caused by out-of-date adders, re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;quot;Missing parameter values&amp;quot;&amp;#039;&amp;#039;&amp;#039; means that the report was not passed all expected parameters. Normally, this is because a parameter was added to the report, and the adders are out of date. || Re-run adders.&lt;br /&gt;
|-&lt;br /&gt;
|| (I can&amp;#039;t remember the error message) || Missing / invalid ODBC configuration. I think this presents as &amp;quot;could not connect to the database&amp;quot; or something to that effect. || Brian can make sure the ODBC connection is valid, and give Charles the name to check that the ODBC connection name in the Crystal Server config is correct.&lt;br /&gt;
|-&lt;br /&gt;
|| Invalid Report || The Crystal Server failed to find the report with the specified name/type. || Make sure the report exists in the customer database with the given name and type. In Presage, there used to be a bug where running reports with a non-English language selected would fail with this error.&lt;br /&gt;
|-&lt;br /&gt;
|| The file or directory is corrupted and unreadable || Every so often this comes up, and I&amp;#039;m not sure why. Maybe it&amp;#039;s the .rpt being corrupt, or maybe the output file? || Once or twice the cached .rpt file on Bunnahabhain was corrupted or something. We fixed it by reuploading the report to the customer&amp;#039;s db and deleting the cached .rpt file from &amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\cache&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
The log file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\crystalserverservice.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A normal log entry for a report job looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connection created for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
args [&lt;br /&gt;
  &amp;#039;-report=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\A95AC82D42C7A2A9AFF9F720DA5F3159.rpt&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-login!={server:reporting_hosted_southeast}{database:373487}&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportfile=&amp;quot;D:\\Node\\crystal-reports-server\\cache\\output\\default_invoice_2024-12-03T19-20-25.872Z.pdf&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-exportformat=&amp;quot;PDF&amp;quot;&amp;#039;,&lt;br /&gt;
  &amp;#039;-namedparameters invoicenum=&amp;quot;5150&amp;quot;&amp;#039;&lt;br /&gt;
]&lt;br /&gt;
Destroying connection for &amp;#039;hosteddb-southeast.isoftdata.com.373487&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you see a message like this, then the Crystal Server (not ODBC) failed to connect to the database, and there will probably be a logged request body right below it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Destroying connection for &amp;#039;iceriver.presageanalytics.com.UNKNOWN DATABASE&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most common errors you&amp;#039;ll see start like this and will show the command used to run Report Commander as well as a more-detailed error message in a mess of JSON.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ReportError: A Report Commander error has occurred&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
This will go over how to configure a customer on the Crystal Server, not so much how to deploy and configure a new Crystal Server.&lt;br /&gt;
&lt;br /&gt;
The config file lives at:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\\192.168.5.18\Node\crystal-reports-server\config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chromium ===&lt;br /&gt;
&lt;br /&gt;
Does not have to be configured per-customer. One config per VM. The users have more security and so they use more of the SSL options than other users&lt;br /&gt;
&lt;br /&gt;
=== Presage Web/API ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REPORT_SERVER_URI&amp;lt;/code&amp;gt; specifies the report server URI used by the server, and &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; specifies the DB host. &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; will be sent to the Crystal Server instead of &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt;, if specified. &amp;#039;&amp;#039;&amp;#039;Either &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXTERNAL_DB_HOST&amp;lt;/code&amp;gt; MUST match the &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; in the Crystal Server config file or it will not work!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== SMB ====&lt;br /&gt;
&lt;br /&gt;
Currently (12/04/2024), Culligan GI is the only Presage SMB customer, and was configured individually. Maybe in the future, Presage SMB will work like Chromium and just have one config per VM, but that&amp;#039;s not currently the case.&lt;br /&gt;
&lt;br /&gt;
Since the setup for SMB clients is slightly different, the &amp;lt;code&amp;gt;MYSQL_HOST&amp;lt;/code&amp;gt; is an &amp;quot;internal&amp;quot; IP, but we need an external host that matches what the Crystal Server knows. To get around this, specify this ENV variable:&amp;lt;code&amp;gt;EXTERNAL_DB_HOST: &amp;lt;customername&amp;gt;-database.presageanalytics.com&amp;lt;/code&amp;gt;. Make sure the URL matches the one in the Crystal Server config. Apparently, SMB DB URLs will always have &amp;lt;code&amp;gt;-database&amp;lt;/code&amp;gt; in them since the SMB docker containers don&amp;#039;t run on the same iron as MySQL.&lt;br /&gt;
&lt;br /&gt;
==== Self-Hosted ====&lt;br /&gt;
&lt;br /&gt;
TBD! Nobody who&amp;#039;s self hosted has Web right now. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
=== Enterprise Web/API ===&lt;br /&gt;
&lt;br /&gt;
TBD! But we probably aren&amp;#039;t going to have anyone configured with a print server URL by default, since each customer will have to be set up manually. In theory if they open a port to us, they can be configured to use our Crystal Server, but they might not want to. In that case, we&amp;#039;ll have to deploy Crystal Server to a Windows server that they control.&lt;br /&gt;
&lt;br /&gt;
== Updating ==&lt;br /&gt;
&lt;br /&gt;
Not 100% sure since it&amp;#039;s been awhile, but I&amp;#039;m pretty sure the process is basically:&lt;br /&gt;
1. Build the Crystal Server to an exe again&lt;br /&gt;
2. Replace the old exe on BH&lt;br /&gt;
3. Restart CrystalServer service&lt;br /&gt;
&lt;br /&gt;
== Misc / Notes ==&lt;br /&gt;
&lt;br /&gt;
Housby has Crystal Server deployed for an ecommerce integration. They&amp;#039;re using a version before we compiled it to an exe, so if they ever run into bugs or need an update it will be a little different&lt;/div&gt;</summary>
		<author><name>Ckaup</name></author>
	</entry>
</feed>