Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > Business Objects > SDK
SDK Forum d'entraide pour la programmation des outils BO par des API (VBA, ASP, Java)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2008, 09h11   #1
Invité régulier
 
Inscription : avril 2008
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 36
Points : 6
Points : 6
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
Demangef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 00h24   #2
Membre confirmé
 
Avatar de eryk71
 
Inscription : novembre 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 322
Points : 261
Points : 261
Bonsoir,


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

URL
eryk71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 08h39   #3
Invité régulier
 
Inscription : avril 2008
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 36
Points : 6
Points : 6
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
Demangef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 08h55   #4
Nouveau Membre du Club
 
Inscription : septembre 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 33
Points : 32
Points : 32
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
waloux1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 17h14   #5
Invité régulier
 
Inscription : avril 2008
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 36
Points : 6
Points : 6
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 !
Demangef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 18h05   #6
Membre confirmé
 
Avatar de eryk71
 
Inscription : novembre 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 322
Points : 261
Points : 261
Merci de nous avoir fait profiter de tes recherches.
eryk71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 18h17   #7
Rédacteur
 
Avatar de Bruno2r
 
Bruno ROMAN-RUIZ
Inscription : décembre 2006
Messages : 2 185
Détails du profil
Informations personnelles :
Nom : Bruno ROMAN-RUIZ
Âge : 57

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : décembre 2006
Messages : 2 185
Points : 2 724
Points : 2 724
Génial !
Enfin on apprend quelque chose
__________________
Précisez la VERSION ! Règles du forum Business Objects et FAQ BO
"A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"
Bruno2r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 21h43   #8
Membre confirmé
 
Avatar de eryk71
 
Inscription : novembre 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 322
Points : 261
Points : 261
Avec ta permission Demangef peut être qu'on peut le rajouter à la FAQ, qu'est ce que tu en dis Bruno?
eryk71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 22h14   #9
Rédacteur
 
Avatar de Bruno2r
 
Bruno ROMAN-RUIZ
Inscription : décembre 2006
Messages : 2 185
Détails du profil
Informations personnelles :
Nom : Bruno ROMAN-RUIZ
Âge : 57

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : décembre 2006
Messages : 2 185
Points : 2 724
Points : 2 724
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.
__________________
Précisez la VERSION ! Règles du forum Business Objects et FAQ BO
"A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"
Bruno2r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 22h52   #10
Membre confirmé
 
Avatar de eryk71
 
Inscription : novembre 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 322
Points : 261
Points : 261
Envoyé par Bruno2r
Citation:
Je lui ai effectivement proposé Article ou FAQ.
Comme quoi les grands esprits se rencontrent

Envoyé par Demangef
Citation:
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.

Citation:
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 ?)

Citation:
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.

Citation:
// #### 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 ?
eryk71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 08h52   #11
Invité régulier
 
Inscription : avril 2008
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 36
Points : 6
Points : 6
Citation:
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

Citation:
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.

Citation:
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

Citation:
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...)
Demangef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 09h01   #12
Membre confirmé
 
Avatar de eryk71
 
Inscription : novembre 2007
Messages : 322
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 322
Points : 261
Points : 261
Merci pour les infos
eryk71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 18h28   #13
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 2
Points : 2
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
jvallot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 19h34   #14
Rédacteur
 
Avatar de Bruno2r
 
Bruno ROMAN-RUIZ
Inscription : décembre 2006
Messages : 2 185
Détails du profil
Informations personnelles :
Nom : Bruno ROMAN-RUIZ
Âge : 57

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : décembre 2006
Messages : 2 185
Points : 2 724
Points : 2 724
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.
__________________
Précisez la VERSION ! Règles du forum Business Objects et FAQ BO
"A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"
Bruno2r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 09h08   #15
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 2
Points : 2
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
jvallot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2008, 14h19   #16
Invité régulier
 
Inscription : avril 2008
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 36
Points : 6
Points : 6
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
Demangef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2010, 10h38   #17
Invité régulier
 
Inscription : septembre 2007
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 31
Points : 9
Points : 9
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.
FloLens est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h46.


 
 
 
 
Partenaires

Hébergement Web