mai
2010
Vu que je me retrouve embarquer là dedans pour des raisons professionnelles, et que j’ai galéré à trouver des infos, voilà comment faire pour utiliser Business Objects XI R2 dans une application C#.
Première étape, et non des moindres, installer BO.
Je ne vais pas détailler le processus ici, je préfère me concentrer sur du technique. Et puis c’est pas bien compliqué :p
Une fois l’installation finie, des dlls ont été installés dans le dossier System32, d’autres se retrouvent dans le GAC (C:\WINDOWS\assembly), tandis que d’autres encore sont présentes dans un des dossiers du dossier d’installation de BO, qui est par défaut « C:\Program Files\Business Objects\BusinessObjects Enterprise 11.5\win32_x86\ ».
[Update] D’autres dlls (pour les types de fichiers par exemple), sont présentes dans le dossier « C:\Program Files\Business Objects\common\3.5\managed ».
Parmi les dlls présentes dans le GAC, trois vont nous intéresser :
- CrystalDecisions.Enterprise.dll
- CrystalDecisions.Enterprise.Framework.dll
- CrystalDecisions.Enterprise.InfoStore.dll
Ce sont celles qui vont nous permettre de faire des requêtes dans l’InfoStore de BO et ainsi récupérer, modifier ou supprimer divers objets BO.
Pour tester tout ça, il suffit maintenant de créer une application C#. Une application console fera l’affaire.
Ne pas oublier de référencer les trois dlls citées précédemment.
Et maintenant place au code :
SessionMgr boSessionMgr = new SessionMgr();
try
{
// Connexion à un serveur BO et récupération de la session [login] [mot de passe] [CMS name] [type d'authentification]
EnterpriseSession boEnterpriseSession = boSessionMgr.Logon("administrator", string.Empty, "VMSqlServer05", "Enterprise");
// Récupération d'un InfoStore afin de faire des requêtes
InfoStore boInfoStore = new InfoStore(boEnterpriseSession.GetService(SERVICE_INFOSTORE));
// Récupération d'une liste d'objets BO grâce à une requête dans l'InfoStore
InfoObjects boObjects = boInfoStore.Query("Select * From CI_INFOOBJECTS WHERE SI_KIND != 'Inbox' AND SI_KIND != 'PersonalCategory' ORDER BY SI_ID");
// Affichage des CUID et ID des objets
foreach (InfoObject infoObject in boObjects)
{
Console.WriteLine(infoObject.CUID + " : " + infoObject.ID);
}
Console.WriteLine();
Console.WriteLine("Modification d'un objet");
// Modification du titre du premier objet récupéré
// Attention, dans BO les listes d'objets (InfoObjects) commencent à 1 et non à 0
boObjects[1].Title = newTitle;
// Enregistrement des modifications dans l'InfoStore de BO
boInfoStore.Commit(boObjects);
Console.WriteLine();
Console.WriteLine("Objet modifié");
}
catch (COMException COMEx)
{
Console.WriteLine("ErrorCode: " + COMEx.ErrorCode);
Console.WriteLine("Message: " + COMEx.Message);
Console.WriteLine("StackTrace: " + COMEx.StackTrace);
}
Console.ReadLine();
Ce code détaillé permet donc de se connecter à BO, de récupérer une liste d’objet et de modifier l’un d’entre eux. Histoire de connaître les bases des relations entre BO et C#
Si une erreur survient lors de l’instanciation du SessionMgr, c’est que la dll EnterpriseFramework.dll, qui est présente dans le dossier « win32_x86″ du dossier d’installation de BO, n’a pas été installée. Il faut donc le faire via la ligne de commande « regsvr32 EnterpriseFramework.dll ».
Et pour finir, voici quelques bons liens :
- Pro Crystal Enterprise/Business Objects XI programming Par Carl Ganz : aperçu d’un très bon livre sur la programmation avec BO
- Querying the Busines Objects XI CMS InfoStore Database Tables : un très bon tips sur les requêtages des tables de l’InfoStore
- La doc officielle de Business Objects XI R2
- La doc officielle chez SAP avec deux sections intéressantes :
- .NET SDK Developer Guides and API References
- Object Model Diagrams
J’espère qu’avec ceci vous ne perdrez pas autant de temps que moi à trouver des informations sur comment utiliser BO via une application C# !
Je rencontre sur un autre poste de développement :
impossible d’incorporer le type interop utiliser l’interface applicable
J’ai donc décocher dans les propriétés l’incorporation des types d’interopérabilité et lors de l’éxecution, j’ai le message :
La récupération de la fabrique de classe COM pour le composant avec le CLSID {} a échoué en raison de l’erreur suivante : 8007007f la procédure spécifiée est introuvable. (Exception de HRESULT : 0×8007007f)
Merci pour cet article, je rencontre justement des problèmes lors de l’exécution de la ligne :
SessionMgr session = new SessionMgr();
J’ai l’exception suivante :
System.Runtime.InteropServices.COMException
La récupération de la fabrique de classe COM pour le composant avec le CLSID {} a échoué en raison de l’erreur suivante : 80040154 classe non enregistrée. (Exception de HRESULT : 0x80040154 (REGDB_E_CLASSNOTREG)) à CrystalDecisions.Enterprise.SessionMgr..ctor().
Est-ce bien de ce problème dont vous parlez ?
Pour ma part cette dll est présente dans le GAC mais pas dans le dossier « win32_x86″.
Auriez-vous une piste de résolution ?