Posts Tagged ‘Crystal Reports’

Crystal Reports 10 & MySQL

Monday, August 24th, 2009

Las grandes dificultades que uno se encuentra al hacer un proyecto.
Como comentaba en una entrada anterior estamos en un proyecto que necesita generar a través de CR10 unos PDF’s y XLS’s. Todo marcha a la perfección, los archivos se generan ok pero el único detalle es que ahora en vez de funcionar con MS-SQL Server funcionarán con MySQL. La muda de base es transparente, no hay problemas de ningún tipo y los script de ABC funcionan correctamente. El problema viene al conectar los reportes de CR!
Qué sucede? bueno primero CR no soporta MySQL de manera directa así que se conecta a través del ODBC de MySQL que se puede descargar de aquí:

http://dev.mysql.com/downloads/connector/

Aparentemente todo funciona ok con este odbc pero oh sorpresa, en caso de que el SQL generado por CR10 sea más complicado y utilice Outer Joins entra en escena una pesadilla!
Sucede que CR10 cuando utiliza Outer Joins genera un script con una sintáxis que el ODBC de MySQL no entiende!, son unas pocas letras en cuestión:
{oj …… }
Aquí truena el query y CR10 es incapaz de traer un registro.
Cómo solucionarlo?! me estaba generando una cantidad enorme de canas verdes, lo que debería de ser una adecuación transparente se estaba convirtiendo en mi peor pesadilla.
No encontré manera alguna de desactivar eso!
Gracias a dios en Google encontré la respuesta adecuada y los caminos por los que me llevó eran totalmente sorprendentes.
El string de búsqueda fue:
“{oj” mysql crystal reports
Tal cual con dobles comillas y todo. en fin el primer y segundo resultado de la búsqueda me llevaron a la solución. La lectura no fue del todo sencilla, decenas de colegas tenían el mismo problema y a pesar de que lo resolvieron de repente dejaban semanas sin reportar nada jajaja pero aquí mi determinación por encontrar una respuesta me llevó por el camino correcto.
Caí en esta página:
http://bugs.mysql.com/bug.php?id=18563
Como bien lo hace notar MySQL NO es un error/bug de ellos, más bien es un asunto de CR10.
El chiste es que después de leer encontré esta liga:

http://technicalsupport.businessobjects.com/KanisaSupportSite/search.do?cmd=displayKC&docType=kc&externalId=c2016114&sliceId=&dialogID=16742671&stateId=1%200%2016744519

En pocas palabras es el tema en cuestión y la respuesta que da es que hay que agregar un registro a CR para que omita esa sintáxis al usar el MyODBC.
Hay que seleccionar entre varias opciones:

Para Crystal Reports 10:
------------------------

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Crystal Decisions\10.0\
Crystal Reports\Database\QueryBuilder\OuterJoinEscSeq]
"NoOuterJoinEscSeq"="MyODBC3"

Para Crystal Reports XI Release 1:
-----------------------------------

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Business Objects\Suite 11.0\
Crystal Reports\Database\Querybuilder\OuterJoinEscSeq]
"NoOuterJoinEscSeq"="MYODBC3, libmyodbc3"

Para Crystal Reports XI Release 2:
-----------------------------------

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Business Objects\Suite 11.5\
Crystal Reports\Database\Querybuilder\OuterJoinEscSeq]
"NoOuterJoinEscSeq"="MYODBC3, libmyodbc3"

Cualquiera ingresarla en un block de notas y guardarla con la extensión .reg, darle doble click y esperar que se agregue el registro.
Ahora bien, hice lo anterior y seguía apareciendo la sintáxis!!!! bueno ya un poco más tranquilo decidí revisar si acaso el registro estaba bien agregado… sorpresa!!! no estaba bien así que lo agregué a manita.

Cerré y ejecuté de nuevo CR10 y voilá! todo ok!
Ahora sí, a continuar con mi trabajo y terminarlo rápidamente. Espero que quien lea esto solucione su problema.
Saludos & happy coding!

Crystal Reports & PHP

Sunday, August 23rd, 2009

Just a few months from now the company I work for accepted to migrate a client-server application to a web environment.
It didn’t look so hard till we got to the reports issue. The client uses Crystal Reports to generate several reports needed for its processes. To be even more precise the client didnt even know he was using CR since the application just displays a screen where the client selects wether he wanted the report in PDF or XLS format.
The first approach was to migrate this reports to web and generate the through the pdf and xls libs that exist for PHP.
As time went by and there was less time for us to migrate the reports we became aware that if we were to migrate the reports from CR to pure PHP scripts it would take us a lot of time we didnt have anymore.
So we decided to use COM object in PHP to interact with the rpts files.
The first challenge was to set everything so that PHP may connect with CR.
The firs obstacle we found is that, for reasons unknown CR 2008 no longer supports COM. Shit! trying to buy a license for a Xi, 9 or 8 version was a real pain in the ass. We finally got our hands in a X distro and installed it on the server.
By the way everything is on WAMP plataform.
Now to the scripts. We tried to find example codes that show us how the hell to use PHP COM objects to interact with CR. Nothing!!!!! we found like 3 examples with 2 or 3 lines of code like this:

$ObjectFactory = new COM (“CrystalReports10.ObjectFactory.1”) or die (“Error on load”);
$crapp = $ObjectFactory->CreateObject(“CrystalDesignRunTime.Application”);

Even these 2 lines of code didnt run becase the second line should read:

$crapp = $ObjectFactory->CreateObject(“CrystalRunTime.Application”);

To be honest it was a real PITA, all doc was for ASP or VB.
So when we finally accomplished our goal we decided this info shouldnt be kept for just a few and here are som code lines that may help you in your coding.

Be aware that this code is for CR 10.

//Create the object, if theres an error catch it and display message
try {
$ObjectFactory = new COM (“CrystalReports10.ObjectFactory.1”) or die (“Error on load”);
$crapp = $ObjectFactory->CreateObject(“CrystalRunTime.Application”);
} catch (Exception $e) {
echo “Error message”;
exit;
}

$ruta = dirname( __FILE__ );
$archivo = $ruta . “/crrpts/CEAnalisisUnUSD.rpt”; //be aware that here goes your rpt file
//Open an rpt file if fail, display an error message
try {
$creport = $crapp->OpenReport($archivo, 1);
} catch (Exception $e) {
echo “File not found”;
exit;
}

//store formula object
$formulas = $creport->FormulaFields;

foreach ($formulas as $CRXFormulaField ) {
//display each formula name=value
/*if need to set a formulafield then u should type something like this:
if ($CRXFormulaField->name == “{@formulaname}”) {
$CRXFormulaField->text = “\”” . $_POST[‘ID_Cotizacion’] . “\””;
}
*/
//Notice that when assigning text you must escape the double quotes.
echo $CRXFormulaField->name . ” = ” . $CRXFormulaField->text . ”
“;
}

//Script to export to a pdf file
$creport->ExportOptions->DiskFileName=”c:/path/fp.pdf”;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1;
$creport->ExportOptions->FormatType=31;
$creport->Export(false);

//finally close resources
$creport = null;
$crapp = null;

That was about it. Some important things to take in consideration:
1. Get your hands on the infamous “Crystal Reports Developers Help.chm” to have pretty guidelines as to where to start.
2. Get yourself a copy of CR10 and run it on the server.
3. Make the proper modifications to the rpt files in case you change your database source or other significant changes have occur.