Login / Register  search  syndication  about

          Ryan Farley's Blog

Ryan Farley on .NET Development with a focus on CRM Development for SalesLogix

Extracting Reports from the SalesLogix Plugin Table from External Applications

There are many reasons why extracting a SalesLogix Report from the SalesLogix database might be useful. There are possibilities of integration, automated running of reports, as well as the need to generate a PDF from some code on a server using a SalesLogix Crystal report.

SalesLogix stores reports in the DATA field, which is a binary (BLOB) field in the PLUGIN table. Not just the report, but the SalesLogix report plugin, which contains not only the report itself but also the plugin info for the report. All together in a single BLOB field. This BLOB field is the serialized Delphi class named TCRWReportWrapper with the report file bytes appended to the end of the serialized class bytes.

Luckily, a serialized Delphi class will always end in two consecutive NULL bytes (0x00, 0x00) and will never contain two consecutive NULL bytes internally. This makes out job a bit easier in knowing where the serialized Delphi class ends and the bytes making up the report file begin. We can read out the bytes from PLUGIN.DATA for the report record and then read through them until we find the two consecutive NULL bytes, when write out everything following to a file and we'll have the report itself.

Here is some C# code to do just that:

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;

namespace FX.SalesLogix.Utility
{
public class ReportExtractor
{
public ReportExtractor(string ConnectionString)
{
this.ConnectionString = ConnectionString;
}

public string ConnectionString { get; set; }

public void GetReport(string PluginID, string DestinationFile)
{
using (OleDbConnection conn = new OleDbConnection(this.ConnectionString))
{
conn.Open();
using (OleDbCommand cmd = new OleDbCommand("SELECT DATA FROM PLUGIN WHERE PLUGINID = ?", conn))
{
cmd.Parameters.Add(new OleDbParameter("PLUGINID", PluginID));

// Get the plugin byte array
byte[] data = (byte[])cmd.ExecuteScalar();

// Look for the two consecutive null bytes
int idx = 0;
for (int i = 0; i < data.Length; i++)
{
if ((int)data[ i ] == 0 && (int)data[i + 1] == 0)
{
idx = i + 2;
break;
}
}

// Get everything after the two consecutive bytes
byte[] rpt = new byte[data.Length];
Array.Copy(data, idx, rpt, 0, data.Length - idx);

// Write out to an RPT file
using (FileStream f = new FileStream(DestinationFile, FileMode.CreateNew))
{
f.Write(rpt, 0, rpt.Length);
f.Close();
}
}
}
}
}
}

To use the code you'd do something like the following:

// Extract report to C:\MyReportFile.rpt
ReportExtractor rptextractor = new ReportExtractor(MyConnectionString);
rptextractor.GetReport("pDEMOA0000HQ", @"C:\MyReportFile.rpt");

Now you can do whatever you'd like with the report such as open it in an RDC object and generate a PDF from it.

What's This?
  
Bookmark and Share

About Ryan Farley

   Ryan Farley is the Director of Development for Customer FX and creator of slxdeveloper.com. He's been blogging regularly about SalesLogix since 2001 and believes in sharing with the community. He loves C#, Javascript, Python, web development, open source, and Linux. He also loves his hobby as an amateur filmmaker.

View the SalesLogix Mobile Seveloper Series
View the SalesLogix SData Developer Series
View the Git for the SalesLogix Developer series



Related Content
   Problem Showing All Area, Category, and Issue Values in Infor CRM (Saleslogix) Mobile And How to Fix
There is an issue with the Infor CRM (Saleslogix) Mobile client where, if you have a large list of Area,
Posted on Apr 24, 2015 by Ryan Farley to Ryan Farley's Blog
 
   InforCRM 8.1 (formerly SalesLogix) SpeedSearch Repair
If the Speedsearch Server is returning an error "Unable to locate the SpeedSearch Directory" a
Posted on Apr 24, 2015 by Mark Duthoy to SalesLogix Support
 
   Determining User Rights in the Infor CRM (Formerly Saleslogix) LAN Client
I recently had a client ask how to get a query to tell which users have rights to add, edit, and delete v
Posted on Apr 03, 2015 by Kris Halsrud to Kris Halsrud's Blog
 
   How do I wrap text in Textboxes in Infor CRM (formerly Saleslogix)?
Recently an Infor CRM administrator contacted me in regards to many of their textboxes for Notes in the I
Posted on Apr 01, 2015 by Dale Richter to Infor CRM Questions & Answers
 
   InforCRM (formerly Saleslogix) Mobile - Clearing Out Earlier Customizations
If you started with an earlier version of SalesLogix Mobile, let's say version 7.5.4, and customized
Posted on Mar 30, 2015 by Mark Duthoy to SalesLogix Support
 
Comments

 

Twitted by 4SalesLogix said:

Pingback from  Twitted by 4SalesLogix

May 30, 2009 2:49 PM
 

karim said:

nice & very helpful article

June 26, 2009 5:11 AM
 

Sonal said:

I am trying to set up access to the SSRS reports through saleslogix. When ever I click on the links on the custom aspx page the following error pops up.  I am new at this. So I would appreciate your guidance in the matter.

"

The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. Details: Error parsing near '

"

December 18, 2012 9:51 AM

Leave a Comment

(required)  
(optional)
(required)  
Add
All contents Copyright © 2015 Customer FX Corporation
Customer FX Corporation
2324 University Avenue West, Suite 115
Saint Paul, Minnesota 55114
Tel: 800.728.5783

  Follow @CustomerFX on twitter
Follow the best news, tips, and articles
  Subscribe to Customer FX on youtube
Watch SalesLogix tutorial videos from Customer FX
Login / Register