IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDK Discussion :

[XI R2] Un petit guide ? [Fait] [JAVA]


Sujet :

SDK

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Points : 15
    Points
    15
    Par défaut [XI R2] Un petit guide ?
    Bonjour à tous,

    Voilà, je souhaite utiliser la possibilité d'exporter un programme JAVA sur le référentiel.
    Sachant que le programme doit pouvoir :
    • Exécuter une procédure PL/SQL
    • Fixer des variables d'un document BO
    • Actualiser le document
    • Publier le document sur le référentiel


    QuestionS :
    Quel SDK utiliser ?
    Quelle variables d'environnement je dois fixer ? (s'il y a lieu)
    Est-ce que quelqu'un peut me donner une trame d'application, peu importe l'appli, mais que je puisse m'appuyer dessus.

    J'ai beau avoir lu la doc, je galère un peu... Le tout étant orienté web...
    http://devlibrary.businessobjects.co...n/devsuite.htm

    Merci !!

    ___________________

    Après quelques jours de recherches et de boulot (et oui je ne sis pas expert BO..) j'ai enfin réussi ce que je voulais.
    Consulter le 5ème post

  2. #2
    Membre averti Avatar de eryk71
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 322
    Points : 323
    Points
    323
    Par défaut
    Bonsoir,


    Voici un lien que j'ai trouvé, je ne sais pas si cela peut t'aider.

    URL

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Merci

    Mais ça m'a l'air assez spécifique.

    Néanmoins j'ai finalement réussi à faire ce que je voulais (du moins je commence), une fois que j'aurais fini, je posterais le source commenté et j'expliquerai les fondements, vu que le forum n'en parle pas... Je dois bien ça aux participants du forum

  4. #4
    Nouveau membre du Club
    Profil pro
    pilote falcon
    Inscrit en
    Septembre 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : pilote falcon

    Informations forums :
    Inscription : Septembre 2004
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    Salut,

    le post que tu viens de lancer me passionne aussi et tu viens de me faire découvrir cette possibilité.

    En attendant ton code pour voir l'application je vais me plonger dans les 2 liens qui ont été fourni.

    merci à vous

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Bonjour à tous,

    Me voilà donc tout content.

    Je vais donc comme dit plus haut expliquer comment structurer un programme JAVA qu'on souhaite faire exécuter par BO (et donc panifiable), et au passage faire quelques interactions avec le référentiel.

    Comprenez bien, il ne s'agit en aucun cas d'une appli web en JSP, mais bien d'un programme codé en JAVA que j'exporte sur le référentiel depuis la CMC :
    Objets -> Nouvel Objet -> Programme -> Type de programme : JAVA.

    Commençons par le commencement :
    J'avais besoin de :
    • Pouvoir exécuter une procédure stockée sur un serveur Oracle
    • Exécuter un requête de consultation (en fait sur une séquence)
    • Fixer une invite sur un rapport présent sur le référentiel
    • Passer des paramètres à ce programme JAVA
    • Exécuter le rafraichissment du rapport dans la foulée
    • Nommer cette instance comme je le souhaite


    Je pars donc d'un rapport DesktopIntelligence de base (un fichier .rep) ayant une invite : un numéro de demande
    (Je fais toute cette moulinette car je n'ai pas le choix...)

    Il faut dans un premier temps exporter le rapport qu'on souhaite actualiser sur le référentiel, celui-ci ce nomme ici "Bilan_Activité_Service".

    Une fois fait on peut se lancer dans la programmation JAVA en partant du principe que la procédure stockée est déjà codée et présente sur le serveur Oracle.

    J 'ai utilisé Eclipse pour faire le tout, utilisez ce que vous voulez...

    Créer donc un nouveau projet sans oublier de préciser l'utilisation de JAVA 1.4.2 (dans le cas de BO Xi SP2) :
    Lors de la définition du projet : Utiliser une compatibilité propre au projet : 1.4

    Intégrer ensuite le JRE 1.4.2 au projet afin d'avoir l'auto-complétion.
    Faites de même avec les fichier JARs du dossier
    C:\Program Files\Business Objects\common\3.5\java\lib
    en utilisant ajouter des fichiers JAR externes.
    Cela permet d'avoir également une assistance lors de la programmation.
    Tous les fichiers ne sont évidemment pas utilisé, mais j'ai vu large... et cela n'a pas posé de problème.

    Créer ensuite un nouveau fichier dans votre projet : une classe

    Et là je vais paraître bourrin mais voilà le code source que je commente :

    Les importations nécessaires, je ne m'attarde pas dessus si vous êtes déjà perdu abandonnez....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Calendar;
    import java.util.Enumeration;
    
    Ces importations permettent d'utiliser les méthodes d'intéractions avec les rapports et le référentiel
    import com.businessobjects.sdk.plugin.desktop.fullclient.IFullClient;
    import com.businessobjects.sdk.plugin.desktop.fullclient.IFullClientPrompt;
    import com.businessobjects.sdk.plugin.desktop.fullclient.IFullClientPrompts;
    import com.crystaldecisions.sdk.exception.SDKException;
    import com.crystaldecisions.sdk.framework.IEnterpriseSession;
    import com.crystaldecisions.sdk.occa.infostore.IInfoObject;
    import com.crystaldecisions.sdk.occa.infostore.IInfoObjects;
    import com.crystaldecisions.sdk.occa.infostore.IInfoStore;
    import com.crystaldecisions.sdk.occa.infostore.ISchedulingInfo;
    import com.crystaldecisions.sdk.plugin.desktop.program.IProgramBase;
    Lorsque vous planifiez le programme java (l'objet) il faudra préciser dans l'onglet Processus -> Paramètres la classe à éxecuter. J'ai nommé ma classe Bas, je taperai donc Bas... (Attention sensible à la casse)
    Nom de la classe à préciser lors de la planification
    Processus -> Paramètres -> Classe a exécuter (ici Bas)

    La classe doit implémenter l'interface IProgramBase, ainsi le Program Job Server (en charge d'exécuter les programmes exportés sur le référentiel) pourra faire son boulot...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public class Bas implements IProgramBase
    {
    Implémentation de la procédure run
    Les parametres sont passés par le Program Job server :
    • enterpriseSession = session de connexion BO (par défaut sont utilisés les identifiants de la personne ayant planifiée le programme)
    • infoStore = Référentiel d'objets BO
    • args = Arguments passés par l'utilisateur depuis la ligne "Processus -> Parametres -> Arguments" lors de la planification


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    	public void run(IEnterpriseSession enterpriseSession, IInfoStore infoStore, java.lang.String[] args)
    	{
    		String messageErreur = ""; // Message d erreur renvoyé en cas d Exception
    		String nudem = ""; // Numéro de demande
    		String codhop = ""; // Code hôpital
    		String dateDeb = ""; // Date début de période
    		String dateFin = ""; // Date fin de période
    		String services = ""; // Liste des services (3000;4000)
    		String[] tabServices = null; // Services sous forme de tableau
    		String nomDriver = ""; // Nom du driver BDD utilisé
    		String url = ""; // Url de connexion au serveur SGBD
    		String login = ""; // Login de connexion au serveur SGBD
    		String password = ""; // Mot de passe de connexion au serveur
    		Connection connection = null; // Interface de connexion
    		String requete = ""; // Requete
    		Statement statement = null; // Instanciation de la requete
    		ResultSet resultSet = null; // Résultat de requête
    		boolean rsRenvoye = false; // Récupération d un resultSet (true) ou aucun résultat (false)
    		String userBO = ""; // Login utilisateur sous BO
    		String rapport = ""; // Nom du rapport
    		IInfoObjects result = null; // Résultats de requete sur le référentiel BO
    		IInfoObject objet = null; // Objet BO
    		IFullClient rapportDeski = null; // Rapport Deski
    		IFullClientPrompts allPrompts = null; // Liste d invites BO
    		IFullClientPrompt prompt = null; // Invite BO
    		ISchedulingInfo scheduleInfo = null; // Planification BO
    Ce qui suit n'est pas spécialement intéressant pour vous, il s'agit de la récupération d'arguments passé par la ligne "Arguments" lors de la planification.
    Les vérifications pourraient être améliorées....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    		// #### Récupération des arguments ####
    		if (args.length == 3)
    		{
    			dateDeb = args[0];
    			dateFin = args[1];
    			services = args[2];
     
    			tabServices = services.split(";");
     
    			System.out.println("Arguments recuperes : ");
    			System.out.println(dateDeb);
    			System.out.println(dateFin);
    			System.out.println(services);
     
    			// Si les dates ne sont pas formatées jj/mm/aaaa
    			if (dateDeb.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d") == false
    					|| dateFin.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d") == false)
    			{
    				messageErreur = "Les dates ne sont pas correctement renseignees\n";
    				messageErreur += "La syntaxe est : DateDeb(jj/mm/aaaa) DateFin(jj/mm/aaaa) Service(numero)\n";
    				messageErreur += "Exemple : 01/01/2007 31/12/2007 3000;4000\n";
    				System.out.println(messageErreur);
    			}
    			else
    			{
    				System.out.println("Format des dates valide");
     
    				// On vérifie l antériorité de la premiere date par rapport a la deuxieme
    				String[] tabDateDeb = dateDeb.split("/");
    				String[] tabDateFin = dateFin.split("/");
     
    				// On doit utiliser la classe Calendar pour comparer les 2 dates
    				Calendar calDateDeb = Calendar.getInstance();
    				Calendar calDateFin = Calendar.getInstance();
     
    				calDateDeb.set(Calendar.DATE, Integer.parseInt(tabDateDeb[0]));
    				calDateDeb.set(Calendar.MONTH, Integer.parseInt(tabDateDeb[1]));
    				calDateDeb.set(Calendar.YEAR, Integer.parseInt(tabDateDeb[2]));
     
    				calDateFin.set(Calendar.DATE, Integer.parseInt(tabDateFin[0]));
    				calDateFin.set(Calendar.MONTH, Integer.parseInt(tabDateFin[1]));
    				calDateFin.set(Calendar.YEAR, Integer.parseInt(tabDateFin[2]));
     
    				if (!calDateDeb.before(calDateFin))
    				{
    					messageErreur = "La premiere date (" + dateDeb
    							+ ") n'est pas anterieure a la deuxieme ("
    							+ dateFin + ")\n";
    					messageErreur += "Aucune donnee ne pourra etre renvoyee par le rapport";
     
    					System.out.println(messageErreur);
    				}
    				else
    				{
    					System.out.println("Anteriorite des dates valides");
    				}
    			}
     
    		}
    		else
    		{
    			messageErreur = "Le nombre d'arguments renseigne n'est pas egal a 3\n";
    			messageErreur += "La syntaxe est : DateDeb(jj/mm/aaaa) DateFin(jj/mm/aaaa) Service(numero)\n";
    			messageErreur += "Exemple : 01/01/2007 31/12/2007 3000;4000\n";
    			System.out.println(messageErreur);
    		}
    A présent cela devient à nouveau intéressant
    Comme je l'ai expliqué je souhaitait lancer des requêtes et exécuter une procédure, le tout étant stockées sur une base de donnée, qui est en réalité la même que celle utilisée par BO, mais l'implémentation qui suit fonctionnerait pour n'importe quelle base de données auquel le serveur BO peut avoir accès.

    La base en question est sur un serveur Oracle.
    J'avais alors besoin de l'implémentation du driver permettant l'accès au serveur.
    Le fichier étant une bibliothèque sous forme de .jar.
    Sachez que vous devez rajouter ces nouvelles bibliothèques dans le répertoire :
    C:\Program Files\Business Objects\common\3.5\java\lib

    C'est dans ce répertoire que le Program Job Server va taper pour chercher les .class nécessaire à l'exécution du JAVA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    		// #### Connexion a la base de donnees TPVX ####
                    // Chargement du driver
    		nomDriver = "oracle.jdbc.driver.OracleDriver";
    		try
    		{
    			System.out.println("Instanciation du Driver...");
    			Class.forName(nomDriver).newInstance();
    			System.out.println("Driver instancie");
    		}
    		catch (ClassNotFoundException cnfe)
    		{
    			messageErreur = "La classe " + nomDriver + " n'a pas ete trouvee\n";
    			messageErreur += "Verifiez que la classe " + nomDriver
    					+ " existe et qu'elle est presente sur le serveur BO\n";
    			System.out.println(messageErreur);
    			cnfe.printStackTrace();
    		}
    		catch (Exception ex)
    		{
    			messageErreur = "Erreur lors du chargement du driver\n";
    			System.out.println(messageErreur);
    			ex.printStackTrace();
    		}
     
    		for (Enumeration e = DriverManager.getDrivers(); e.hasMoreElements();)
    		{
    			Driver driver = (Driver) e.nextElement();
    			int majorVersion = driver.getMajorVersion();
    			int minorVersion = driver.getMinorVersion();
    			System.out.println("Driver = " + driver.getClass() + " v"
    					+ majorVersion + "." + minorVersion);
    		}
     
    		// Parametres de connexion
    		url = "XXXX";
    		login = "XXX";
    		password = "XXXX";
     
    		try
    		{
    			// interaction avec la base
    			connection = DriverManager.getConnection(url, login, password);
    			System.out.println("Connexion a " + url + " en tant que " + login
    					+ " effectuee");
    		}
    		catch (SQLException ex)
    		{
    			messageErreur = "La connexion a la base de donnees " + url
    					+ " a echoue\n";
    			messageErreur += "Verifiez la validite de l'url, du login et du mot de passe de connexion\n";
     
    			System.out.println(messageErreur);
    			ex.printStackTrace();
    		}
     
    		try
    		{
    			statement = connection.createStatement();
    			System.out.println("Creation du statement effectuee");
    		}
    		catch (SQLException ex)
    		{
    			messageErreur = "La creation du Statement a echoue\n";
    			System.out.println(messageErreur);
    			ex.printStackTrace();
    		}
    Donc jusque là du java classique pour se connecter à une base. (Je ne suis pas un pro du JAVA, on peut faire mieux je pense...)

    A présent quelques interactions avec BO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		// #### Recuperation du code hôpital CODHOP #####
    		try
    		{
    			userBO = enterpriseSession.getUserInfo().getUserName(); // on recupere l'identifiant BO du l'utilisateur ayant planifié le travail
    			System.out.println("Identifiant utilisateur BO recupere : "
    					+ userBO);
    		}
    Les Exceptions renvoyées par les méthodes du SDK sont des .... SDKException

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		catch (SDKException ex)
    		{
    			messageErreur = "La recuperation de l'identifiant BO a echoue";
     
    			System.out.println(messageErreur);
    			ex.printStackTrace();
    		}
    Cette partie n'est pas intéressante pour vous...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    		requete = "SELECT MEDI.MUBO.CDHOP ";
    		requete += "FROM MEDI.MUBO ";
    		requete += "WHERE MEDI.MUBO.CDUTIL='";
    		requete += userBO;
    		requete += "'";
     
    		try
    		{
    			rsRenvoye = statement.execute(requete);
    			System.out.println("Requête " + requete + "\nexecutee");
    		}
    		catch (SQLException ex)
    		{
    			messageErreur = "Erreur d'execution de la requete : \n" + requete;
    			System.out.println(messageErreur);
    			ex.printStackTrace();
    		}
     
    		if (rsRenvoye)
    		{
    			System.out.println("Un resultSet est recupere depuis : \n"
    					+ requete);
     
    			try
    			{
    				resultSet = statement.getResultSet();
    				System.out.println("Nombre de lignes renvoyees  = "
    						+ resultSet.getRow());
    				while (resultSet.next())
    				{
    					codhop = resultSet.getString(1);
    					System.out.println(resultSet.getString(1));
    				}
    			}
    			catch (SQLException ex)
    			{
    				messageErreur = "La recuperation des resultats de la requête \n"
    						+ requete + "\na echoue";
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
    		}
    		else
    		{
    			System.out.println("La requete " + requete
    					+ " n'a renvoyee aucune donnee");
    			System.out
    					.println("Verifiez que l'utilisateur Bo est enregistre dans la table MUBO");
    		}
    Donc ici je fais une boucle.
    Pourquoi :
    Les rapports que je rafraîchi concernent un et un seul service.
    Néanmoins l'utilisateur pourra par les arguments créer les instances de rapport pour plusieurs services.
    Par exemple pour avoir un rapport sur les activités des services 0800 4000 et 6700 entre le 1er janvier 07 et le 31 décembre 07 on tapera :
    01/01/2007 31/12/2007 0800;4000;6700
    Vous l'avez peut être compris précédemment j'extrais les numéros de services dans un tableau. Je boucle donc pour créer un rapport par service.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    		// On boucle pour creer un rapport pour chaque service
    		for (int i = 0; i < tabServices.length; i++)
    		{
    			System.out
    					.println("Tentative de creation du rapport sur le service "
    							+ tabServices[i]);
     
    			// #### Recuperation du numero de demande (NUDEM) ####
    			requete = "SELECT s_dgs.nextval ";
    			requete += "FROM DUAL";
     
    			try
    			{
    				rsRenvoye = statement.execute(requete);
    				System.out.println("Requête " + requete + " executee");
    			}
    			catch (SQLException ex)
    			{
    				messageErreur = "Erreur d'execution de la requete " + requete;
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
     
    			if (rsRenvoye)
    			{
    				System.out.println("Un resultSet est recupere depuis : "
    						+ requete);
     
    				try
    				{
    					resultSet = statement.getResultSet();
    					System.out.println("Nombre de lignes renvoyees  = "
    							+ resultSet.getRow());
    					while (resultSet.next())
    					{
    						nudem = resultSet.getString(1);
    						System.out.println("Numero de demande recupere = " + resultSet.getString(1));
    					}
    				}
    				catch (SQLException ex)
    				{
    					messageErreur = "La recuperation des resultats de la requête "
    							+ requete + " a echoue";
    					System.out.println(messageErreur);
    					ex.printStackTrace();
    				}
    			}
    			else
    			{
    				System.out.println("La requete " + requete
    						+ " n'a renvoyee aucune donnee");
    			}
    J'ai ici récupéré un numéro de demande, grâce à une séquence présente sur le serveur Oracle.

    J'appelle à présent la procédure PL/SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    			// #### Execution procedure BAS ####
     
    			requete = "{call INFOBO.proc_bas('" + codhop + "', '" + userBO + "', '"
    					+ tabServices[i] + "', '" + dateDeb + "', '" + dateFin + "', "
    					+ nudem + ")}";
     
    			try
    			{
    				System.out.println("Execution de la procedure stockee :");
    				System.out.println(requete);
    				CallableStatement statementProcStockee = connection
    						.prepareCall(requete);
    				statementProcStockee.execute();
    				System.out.println("Procedure stockee executee");
    			}
    			catch (SQLException ex)
    			{
    				messageErreur = "L'execution de la procedure stockee BAS a echouee\n";
    				messageErreur += "Verifiez la validite des parametres (typage et format)";
     
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
    Cette procédure est une moulinette assez complexe que je n'ai pas créer moi-même.
    Elle met environ 5 minutes à s'exécuter. Durant cette période la procédure garde la main.

    A présent que du lourd

    Le rapport Deski de base (qui n'est donc pas une instance) est donc sur le référentiel, celui-ci étant nommé Bilan_Activité_Service

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    			// #### Creation du rapport ####
     
    			// Recuperation du rapport sous forme d objet BO
    			rapport = "Bilan_Activité_Service";
     
    			requete = "SELECT * ";
    			requete += "FROM CI_INFOOBJECTS "; // Tables des objets du referentiel BO
    			requete += "WHERE SI_INSTANCE = 0 "; // L objet n est pas une  instance de rapport
    			requete += "AND SI_NAME = '" + rapport + "'"; // Rapport de  base
     
    			try
    			{
    				result = infoStore.query(requete); //IInfoStore implemente les methodes propres a BO de requêtes sur le referentiel 
    				System.out
    						.println("Requête de recuperation du rapport effectuee");
    			}
    			catch (SDKException ex)
    			{
    				messageErreur = "La requête sur le referentiel a echouee\n";
    				messageErreur += "Verifiez que le rapport " + rapport
    						+ " est bien present sur le referentiel\n";
     
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
     
    			try
    			{
    				// L objet de classe Object est caste en Objet BO
    				objet = (IInfoObject) result.get(0); 
    				System.out.println("L'objet " + objet.getTitle()
    						+ " a ete recupere");
    			}
    			catch (Exception ex)
    			{
    				messageErreur = "Le rapport " + rapport
    						+ " n'a pas pu être recupere\n";
    				messageErreur += "Verifiez que le rapport " + rapport
    						+ " est bien present sur le referentiel\n";
     
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
    J'ai ici récupéré un Objet BO, or je souhaite manipuler un rapport Deski.
    La classe correspondante est IFullClient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    			/*
    			 * IFullClient est la classe qui correspond aux rapports 
    			 * DesktopIntelligence
    			 * On cast l'objet en IFullClient
    			 */			
    			rapportDeski = (IFullClient) objet;
    			System.out.println("Cast en IFullCLient reussi");
     
    			infosDeski(rapportDeski); // Méthode créée plus bas
    A présent j'ai mon rapport Deski.
    Il faut maintenant que je fixe l'invite comme je le souhaite.
    Donc je la récupère pour affichage test puis je la fixe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    			try
    			{
    				// Recuperation de l ensemble des invites du rapport 
    				allPrompts = rapportDeski.getPrompts();
    				System.out.println("Invites du rapport recuperees");
     
    				// Recuperation de la premiere (et seule) invite du rapport (NUDEM)
    				prompt = (IFullClientPrompt) allPrompts.get(0);
    				System.out.println("Invite " + prompt.getName() + " recuperee");
    				System.out.println("Valeur = " + prompt.getValues().get(0));
    			}
    			catch (SDKException ex)
    			{
    				messageErreur = "La recuperation de l'invite du rapport "
    						+ rapport + " a echoue\n";
    				messageErreur += "Verifiez que le rapport a bien une invite";
     
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
     
    			// On fixe la valeur de l invite au bon nudem
    			try
    			{
    				prompt.getValues().set(0, nudem);
    				System.out.println("Nouvelle valeur fixee = "
    						+ prompt.getValues().get(0));
    			}
    			catch (SDKException ex)
    			{
    				messageErreur = "L'attribution du parametre a l'invite a echoue";
     
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
    A présent j'ai configuré le rapport comme il le faut (simplement l'invite).
    Maintenant nous allons planifier le rafraîchissement du rapport.
    Planifier n'est pas vraiment le bon mot...
    En fait l'utilisateur au lieu de planifier le rafraîchissement du rapport planifiera le lancement du programme JAVA.
    C'est pourquoi les paramètres de planification qui suivent font en sorte de lancer la création de l'instance lorsque le programme JAVA est lancé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    			// #### Planification ####
    			try
    			{
    				// Mise en place de l interface avec la planification
    				scheduleInfo = objet.getSchedulingInfo();
    				System.out.println("Interface de planification instanciee");
     
    				// Nommage de l instance
    				objet.setTitle(rapport + "_Du_" + dateDeb + "_au_" + dateFin
    						+ "_Serv_" + tabServices[i]);
     
    				// Le rafraîchissement du rapport ne sera lance qu une seule fois
    				scheduleInfo.setType(0);
    				System.out.println("Le rapport sera rafraichi une seule fois");
     
    				// Le rapport sera rafraîchi immediatement
    				scheduleInfo.setRightNow(true);
    				System.out.println("Le rapport est planifie");
     
    				// Planifie le rapport avec les parametres
    				infoStore.schedule(result);
    				System.out.println("Rapport planifie avec succes");
    				System.out.println("Consulter l'historique de l'objet "
    						+ rapport + " pour visualiser le rapport");
    				System.out.println("Rapport sur le service " + tabServices[i]);
    				System.out
    						.println("En cas de rapport sans donnees, verifiez que le service etudie existe bien");
    			}
    			catch (SDKException ex)
    			{
    				messageErreur = "La planification du rapport a echoue\n";
     
    				System.out.println(messageErreur);
    				ex.printStackTrace();
    			}
    		} // Fin boucle pour creer un rapport pour chaque service
    		// for (int i = 0; i < tabServices.length; i++)
     
    	}
    Ayééééé !! C'est fini et ça fonctionne !

    Ici une petite méthode que j'avais mis en place pour afficher des infos sur un rapport Deski. (Plus trop utile)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    	public static void infosDeski(IFullClient rapportDeski)
    	{
    		try
    		{
    			System.out.println("Titre : " + rapportDeski.getTitle());
    			System.out
    					.println("Est un instance : " + rapportDeski.isInstance());
    			System.out.println("Auteur : " + rapportDeski.getAuthor());
    			System.out.println("CUID : " + rapportDeski.getCUID());
    			System.out.println("Kind : " + rapportDeski.getKind());
    			System.out.println("ToString : " + rapportDeski.toString());
    			System.out.println("A des prompts : " + rapportDeski.hasPrompts());
    		}
    		catch (Exception ex)
    		{
    			System.out.println(ex);
    		}
    	}
     
    }
    Voilà là c'est vraiment fini.

    Comme vous avez pu le voir, j'ai tracé le code comme un taré grâce à des System.out..... cela permet de repérer où cela plante (ben oui l'utilisateur est bête.... il arrivera à faire planter le tout...)
    Ces affichages seront lisibles dans l'instance du programme JAVA créée sur le référentiel.

    Le rapport sera consultable dans l'historique de l'objet Bilan_Activité_Service !

    On a donc 2 instances crées : une de programme JAVA et une de rapport Deski.

    Si vous avez des questions n'hésitez pas !!!!
    J'ai codé le tout donc je le comprend...
    L'ensemble du programme a été posté.
    Par contre rdv dans la doc Bo pour explorer un peu plus les interactions possible !

  6. #6
    Membre averti Avatar de eryk71
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 322
    Points : 323
    Points
    323
    Par défaut
    Merci de nous avoir fait profiter de tes recherches.

  7. #7
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Génial !
    Enfin on apprend quelque chose

  8. #8
    Membre averti Avatar de eryk71
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 322
    Points : 323
    Points
    323
    Par défaut
    Avec ta permission Demangef peut être qu'on peut le rajouter à la FAQ, qu'est ce que tu en dis Bruno?

  9. #9
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Citation Envoyé par eryk71 Voir le message
    Avec ta permission Demangef peut être qu'on peut le rajouter à la FAQ, qu'est ce que tu en dis Bruno?
    Je lui ai effectivement proposé Article ou FAQ.

  10. #10
    Membre averti Avatar de eryk71
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 322
    Points : 323
    Points
    323
    Par défaut
    Envoyé par Bruno2r
    Je lui ai effectivement proposé Article ou FAQ.
    Comme quoi les grands esprits se rencontrent

    Envoyé par Demangef
    Si vous avez des questions n'hésitez pas !!!!
    Eh ben moi j’ai des questions, oui déjà c'est que c'est intéressant le truc que t'as fait.

    requete = "SELECT MEDI.MUBO.CDHOP ";
    requete += "FROM MEDI.MUBO ";
    requete += "WHERE MEDI.MUBO.CDUTIL='";
    requete += userBO;
    requete += "'";
    Tu récupères le code hôpital avec cette requête et tu vérifies que l’utilisateur BO est bien connecté pour qu’il puisse créer les instances du rapport par la suite.
    Si j’ai bien compris, dans ton SGBD tu as tes informations de l’hôpital + les identifiants des utilisateurs de BO.
    MEDI = BDD
    MUBO=Table de la BDD
    CDHOP et CDUTIL = Champs de la table MUBO
    Tu te connectes comment sous DESKI ( mode ENTERPRISE ?)

    Je pars donc d'un rapport DesktopIntelligence de base (un fichier .rep) ayant une invite : un numéro de demande
    Il faut dans un premier temps exporter le rapport qu'on souhaite actualiser sur le référentiel, celui-ci ce nomme ici "Bilan_Activité_Service".
    L’invite est déjà renseigné avant l’exécution du code java je suppose.

    // #### Recuperation du numero de demande (NUDEM) ####
    requete = "SELECT s_dgs.nextval ";
    requete += "FROM DUAL";
    Normallement le nextval incrémente la valeur de la séquence que tu as crée sous oracle.
    Ça ne serait pas plutôt SELECT s_dgs.CURRVAL qui returne la valeur courante de la séquence ?

    Félicitation pour le programme, n’étant pas expert en java j’ai du m’y prendre plusieurs fois pour comprendre le code, heureusement que tu as bien détaillé !

    En fait tu t'es aidé de quel documentation de BO notamment pour savoir les objets BO a utilisé en java et les importations ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Tu récupères le code hôpital avec cette requête et tu vérifies que l’utilisateur BO est bien connecté pour qu’il puisse créer les instances du rapport par la suite.
    Si j’ai bien compris, dans ton SGBD tu as tes informations de l’hôpital + les identifiants des utilisateurs de BO.
    MEDI = BDD
    MUBO=Table de la BDD
    CDHOP et CDUTIL = Champs de la table MUBO
    Tu te connectes comment sous DESKI ( mode ENTERPRISE ?)
    MEDI = identifiant/compte oracle (si j'ai bien compris ce qu'on m'a raconté)
    D'un coté tu as les comptes BO, créés sous BO donc sur une table propre au logiciel BO.
    De l'autre on a une deuxième table (admettons sur une autre base de données)
    Celle-ci contient un champs CDUTIL (DUPONT, DUPUIS...) et un champs CHHOP (01, 39, 30...)


    Cette table est utilisée par plusieurs appli en fait....
    Dans mon cas, l'utilisateur qui planifie le travail sous BO se connecte (Enterprise). Je récupère son identifiant.
    Identifiant que je retrouve dans la table MUBO. Je récupère donc un code hôpital que je passe à la procédure stockée.

    Je me répète, je me connecte en Enterprise

    L’invite est déjà renseigné avant l’exécution du code java je suppose.
    Effectivement l'invite est déjà renseignée par défaut (dernière valeur affectée il me semble), mais le code java modifie cette valeur.

    Normallement le nextval incrémente la valeur de la séquence que tu as crée sous oracle.
    Ça ne serait pas plutôt SELECT s_dgs.CURRVAL qui returne la valeur courante de la séquence ?
    Je ne suis pas expert
    Mais j'ai besoin que la séquence soit incrémenté puis de récupérer la nouvelle valeur.
    Nextval fait ça très bien

    Félicitation pour le programme, n’étant pas expert en java j’ai du m’y prendre plusieurs fois pour comprendre le code, heureusement que tu as bien détaillé !

    En fait tu t'es aidé de quel documentation de BO notamment pour savoir les objets BO a utilisé en java et les importations ?
    Tout d'abord merci.
    Au niveau de la documentation :
    La doc des SDK BO
    Vous y trouvez des tutos, la JAVADOC des API, des exemples (orientés principalement JSP, mais exploitables)
    Un forum anglo-saxon consacré à BO : BOB (Trahisooooon !!! )
    La documentation sur la CMC pour mettre en place le programme sur le référentiel (j'ai appris à utiliser BO il y a 5 semaines grâce à ce document également...)

  12. #12
    Membre averti Avatar de eryk71
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 322
    Points : 323
    Points
    323
    Par défaut
    Merci pour les infos

  13. #13
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut comment faire savoir l'échec de la planification ?
    bonjour,

    pas mal effectivement cet article ...
    ... mais y'a un truc qui me travaille : le programme java planifié peut planter pour un tas de raisons, comme tu l'anticipes.
    vu que toutes les SDKException sont catchées, le truc apparaît comme réussi dans l'historique

    j'ai tenté de rebalancer SDKException en cas d'erreur :
    throw new SDKException.Unexpected(e);

    j'ai bien dans le log :
    Error running the program.
    avec l'exception trouvée, mais le statut est toujours "Réussite"...

    comment faire admettre à BO que le jar a planté et lui faire afficher "Echec" ?

    toute aide sera la bienvenue
    --
    Joseph

  14. #14
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Citation Envoyé par jvallot Voir le message
    bonjour,

    .../...
    j'ai tenté de rebalancer SDKException en cas d'erreur :
    throw new SDKException.Unexpected(e);

    j'ai bien dans le log :
    Error running the program.
    avec l'exception trouvée, mais le statut est toujours "Réussite"...

    comment faire admettre à BO que le jar a planté et lui faire afficher "Echec" ?

    toute aide sera la bienvenue
    --
    Joseph
    Demangef,
    Si tu as quelque chose à ajouter à ce sujet fais une réponse et ensuite on te demande un espace d'hébergement sur DVP pour que tu puisses le publier en article.

  15. #15
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut précision
    bonjour,

    pour préciser, j'ai tenté un plantage sévère (appel d'une classe absente du classpath): j'obtiens dans le log le "NoClassDefFoundError" attendu, mais le résultat de l'exécution est "Réussite"

    bug connu ? "feature" ?

    une idée ?

    merci
    --
    Joseph

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Bonjour à tous !
    Ca fait un moment que je ne suis plus passé sur le forum, vu que j'ai fini mon stage sur BO et que je suis en vacs

    Mais concernant le statut "Réussite" en cas de plantage, j'étais aussi confronté à ce problème...

    Le comportement est logique dans un sens :
    Le programme JAVA est exécuté. A ce moment l'instance du programme JAVA n'existe pas encore. Ce n'est qu'une fois l'exécution terminée que l'instance est créée (je ne sais plus si je l'avais constaté ou lu...)
    Donc dans ce cas comment fixer le statut d'une instance alors qu'elle n'existe pas encore.... Je pense qu'on est face à un problème sans solution directe....

    Par contre dans mon projet, j'ai effectué tous ces catch, cela permet de faire des System.out pour tracer l'exécution dans le log, que ca soit en cas d'Exception ou lorsqu'il n'y a pas de problème...

    En détaillant suffisamment les messages d'erreurs l'utilisateur final peut s'en sortir...

    Voila voila....

    Travaillez bien

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bonjour à tous,

    Ces explications sont effectivement très intéressantes.
    une question me vient de suite à l'esprit : savez-vous s'il est possible de faire la même chose en .NET ?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/07/2009, 00h16
  2. Petit guide TSQLQuery
    Par swirtel dans le forum C++Builder
    Réponses: 0
    Dernier message: 29/11/2007, 02h48
  3. Réponses: 4
    Dernier message: 20/01/2006, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo