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

Le guide Oracle Forms 9i/10g

Date de publication : Juin 2005




Une première application
Cahier des charges
Mise en oeuvre


Une première application

Afin de mettre en pratique un certain nombre de concepts étudiés dans les chapitres précédents, nous allons construire une petite application.

Celle-ci permettra de partir d'un nouveau module, de lui attacher une librairie PL/SQL, une barre de menu et ses icônes, de construire deux blocs liés par une relation maître/détail et d'implémenter quelques déclencheurs.


Cahier des charges

Pour la réalisation de ce module, nous partons de l'analyse suivante:

- L'écran doit permettre d'afficher et de modifier toutes les colonnes de la table DEPT ainsi que celle de la table EMP à l'exception des colonnes participant aux clés primaires.
- Aucune mise à jour ni aucune suppression ne sont autorisées sur la table DEPT.
- Les blocs devront être alimentés dès le chargement de l'écran.
- Le positionnement d'un enregistrement sur la table DEPT doit afficher automatiquement les employés qui lui sont associés.
- Dans chaque bloc, l'enregistrement courant doit être coloré en vert.
- Les champs de type date doivent être centrés dans l'item et associé au masque de format : DD/MM/YYYY
- Les items numériques relatif à une quantité doivent être cadrés à droite.
- Si le département sélectionné est 10, alors aucun ajout d'employé n'est possible.
Si le département sélectionné est 20, alors aucune suppression d'employé n'est possible.
Pour les autres départements, l'insertion et la suppression sont autorisés.


Mise en oeuvre

Créons un nouveau module : Fichier -> nouveau -> Appli Form ou Ctrl+N

Cliquer sur le nœud du module et afficher la fenêtre des propriétés (F4). Nous allons renommer le module, lui assigner le menu standard muni de sa barre d'icônes : MENUDEFS

Attachons ensuite la librairie PL/SQL:
Cliquer le nœud : Bibliothèques attachées puis l'icône

pour sélectionner une bibliothèque disponible, cliquer le bouton Parcourir…

Sélectionner la bibliothèque TUTO_FORMS.PLL et Répondre Oui au message : Suppression du chemin physique.

Récupérons également les attributs visuels et classes de propriétés qui seront utilisées dans la forme.
Ouvrez la bibliothèque d'objets fournie en exemple : Fichier -> ouvrir OBJ_TUTO_FORMS.OLB
Double-cliquer sur le nœud de la librairie d'objet pour afficher le contenu.
Cliquer l'onglet: GROUPES
Séléctionner l'objet GRP_TUTO dans cet onglet puis le glisser dans le nœud : Groupe d'objets de la nouvelle forme.
Choisissez l'option : Copie par référence

La petite flèche rouge à l'intérieur de chaque icône des objets indique qu'ils sont référencés. Toute modification de l'objet d'origine de la librairie d'objets sera donc automatiquement répercutée dans le module.

Créons maintenant le canevas principal sur lequel seront affichés les items de la forme.
Cliquer le nœud Canevas puis l'icône
Un nouveau canevas intégral est créé dans le navigateur d'objets.
Affichons les propriétés du canevas (F4)


Renommons le canevas en CV1
Nous allons faire dériver certaine propriétés du canevas depuis une classe de propriété héritée de la librairie d'objets.
Cliquer le bouton ... de la propriété Général -> informations de référence
La boite de dialogue de sélection des objets référencés apparaît.
Cliquer l'option Classe de propriétés puis sélectionner la classe : CV_INTEGRAL dans la liste déroulante.


Faisons de même avec la fenêtre Fenêtre1 en lui dérivant la classe : WIN_MAIN
Fixons également la propriété Fonctionnel -> Canevas principal à : CV1

La forme dispose maintenant d'une fenêtre et d'un canevas sur lequel nous allons poser nos blocs de données.

Le bloc maître : DEPT

Ajoutons maintenant le bloc maître de la forme qui sera basé sur la table DEPT.

Cliquer le nœud Blocs de données puis l'icône
Pour bâtir ce bloc, nous utiliserons l'assistant

Indiquons que le bloc sera basé sur une table/vue
Dans la liste des tables disponibles, sélectionnons la table : DEPT


Sélectionnons toutes les colonnes de la case Colonnes disponibles et plaçons-les dans le bloc avec le bouton >>

Dans les écrans suivants, laissez les options par défaut jusqu'à l'écran Assitant présentation

Nous définissons que les items du bloc seront affichés sur notre canevas principal (CV1)

Puis, fixons certaines caractéristiques comme le titre du cadre, le nombre d'enregistrements affichés, la distance entre chaque enregistrements ainsi que l'affichage d'une barre de défilement verticale

Notre canevas CV1 doit maintenant avoir l'aspect suivant:

Changeons la couleur de fond des items de ce bloc.
Avec la souris, cliquez d'abord un endroit vide du canevas pour désélectionner les objets en cours.
En maintenant la touche Ctrl enfoncée, cliquez les trois items du bloc (Dept, Dname, Loc). Cliquez l'outil de couleur du fond dans la barre d'outils verticale et choisissez la couleur : blanc

Définissons l'attribut visuel attaché à l'enregistrement courant en fixant la propriété du bloc: Enregistrements -> Groupe d'attribut visuel de l'enregistrement courant : VA_CURRENT_RECORD

Définissons également que le cadre entourant le bloc sera à gestion automatique
Cliquer le cadre dans l'éditeur de présentation puis F4

La propriété Cadre de présentation -> Prêt à l'emploi est positionnée à Oui
De plus le titre sera affiché en bleu et en gras


Le bloc Détail : EMP

Même opération que pour le bloc maître:
Cliquer le nœud Bloc de données puis l'icône
Bloc basé sur table/vue
Sélectionner la table EMP
Glissez tous les éléments de la case Eléments disponibles vers la case Eléments base de données

Dans l'écran suivant, décochez la case Relier automatiquement les blocs puis cliquez le bouton Créer une relation…

Comme il s'agit de table relationnelle standard, nous allons les joindre sur une condition de jointure

Sélectionnons le bloc maître : DEPT
Etablissons les colonnes de la relation
colonne DEPTNO du bloc détail et colonne DEPTNO du bloc maître

Affichons dans le bloc détail tous les élément à l'exception de la colonne DEPTNO.
Cette colonne faisant partie de la condition de jointure, elle ne doit pas être modifiable et son affichage ne fait qu'alourdir le bloc.

Définissons le titre du bloc détail, 6 enregistrements affichés ainsi qu'une barre de défilement verticale.

Depuis l'éditeur de présentation, cliquons tous les items du bloc pour leur assigner une couleur de fond : blanc.

Modifions quelques propriétés:
L'item Hiredate héritera de la classe de propriété : ITEM_DATE (information de référence)
Les items Sal et Comm seront cadrés à droite : Menu Présentation -> Justification -> Droite

Définissons l'attribut visuel attaché à l'enregistrement courant en fixant la propriété du bloc:
Enregistrements -> Groupe d'attribut visuel de l'enregistrement courant : VA_CURRENT_RECORD

Définissons également que le cadre entourant le bloc sera à gestion automatique
Cliquer le cadre dans l'éditeur de présentation puis F4

La propriété Cadre de présentation -> Prêt à l'emploi est positionnée à Oui
De plus le titre sera affiché en bleu et en gras

Le canevas doit maintenant ressembler à l'image suivante:

Enregistrons le module : Fichier -> Enregistrer ou Ctrl+S

Il est enfin temps d'exécuter ce module afin de vérifier son comportement.
Vérifiez qu'une instance OC4J a bien été lancée:
Démarrer -> Programmes -> Developer Suite -> Forms Developer -> Start OC4J Instance

Puis demandez l'exécution du module:
Menu Programme -> Exécuter application Forms ou Ctrl+R

Notre formulaire s'affiche correctement mais en mode insertion (aucun enregistrement n'est affiché).
Il faut exécuter manuellement l'interrogation Ctrl+F11 ou menu Interrogation -> Exécuter pour les alimenter.

Modifions donc le comportement de la forme pour que les blocs de données soient alimentés dès le chargement de la forme.

Nous allons créer une procédure qui sera exécutée dès le lancement de la forme.
Cette procédure sera appelée depuis un déclencheur When-New-Form-Instance

Cliquons le nœud Unités de programme puis l'icône

Appelons cette procédure : Init_Forme.
Nous souhaitons qu'elle réalise les opérations suivantes:
Initialisation du titre de la fenêtre MDI et alimentation automatique des blocs de données

Le titre de la fenêtre MDI est modifié via la fonction Set_Window_Property()
Le focus est placé sur le bloc maître (DEPT) avec la fonction Go_Block()
Enfin l'interrogation est demandée avec la fonction Execute_Query()

Au niveau module, créons maintenant un déclencheur:
Cliquer le nœud Déclencheurs sous le nom du module puis

A l'ouverture de la boite de sélection entrez w au clavier pour restreindre la liste et sélectionner WHEN-NEW-FORM-INSTANCE

La fenêtre d'édition PL/SQL du nouveau déclencheur est alors affichée.
Entrez le code suivant puis compiler le code

Rappel:
Le déclencheur When-New-Form-Instance et l'un des premiers à se déclencher, avant que la fenêtre ne soit affichée. C'est l'endroit idéal pour initialiser les objets de la forme.

Reste maintenant à mettre en œuvre les règles de gestion définies dans le cahier des charges concernant les droits de modification sur le bloc EMP

Rappel:
Lorsque le département sélectionné est 10, aucun employé ne peut être ajouté
Lorsque le département sélectionné est 20, aucun employé ne peut être supprimé
Pour les autres département, l'utilisateur est libre de créer et/ou de supprimer un employé.

Comme nous souhaitons une interface conviviale, nous considérons que le simple fait d'interdire la création d'un enregistrement dans le bloc détail est insuffisant.
Nous voulons que l'utilisateur constate visuellement les droits qui lui sont assignés d'une part, et nous préférons anticiper sur les commandes que celui-ci pourrait déclencher. En effet, l'obtention d'un message : " Création d'enregistrement impossible " est frustrant pour l'utilisateur alors que l'option et l'icône du menu lui laissent croire qu'il en a le droit.

Nous allons mettre en œuvre cette fonctionnalité par l'appel d'une procédure sur le déclencheur When-New-Record-Instance du bloc détail (EMP).

Ce déclencheur s'exécute à chaque fois que le focus se déplace vers un nouvel enregistrement.
Mais alors, pourquoi ne pas le placer sur le bloc maître (DEPT) ? dès que le département est sélectionné, nous savons si l'insertion ou la suppression est autorisée dans le bloc détail.
Oui...
Seulement, nous allons agir au niveau de la barre de menu et de ses icônes associées. Hors, nous ne pouvons pas désactiver l'option Insertion enregistrement du menu alors que le focus est encore dans le bloc maître, dans lequel la suppression et l'ajout sont autorisés !

Voici le code du déclencheur When-New-Record-Instance:

Si l'enregistrement maître est sur le département 10, alors l'insertion d'un employé est interdite.
Nous interdisons l'insertion dans le bloc avec la fonction Set_Block_Property() et nous grisons l'option du menu avec la fonction Set_Menu_Item_Property()

Compilons la procédure et exécutons à nouveau le module

Nous constatons que lorsque l'enregistrement maître est sur le département 10, l'insertion est désactivée dans le bloc détail au niveau de l'entrée du menu et de l'icône associée

Lorsque l'enregistrement maître est sur le département 20, la suppression est désactivée dans le bloc détail au niveau de l'entrée du menu et de l'icône associée

Cette façon de procéder procure deux avantages certains:

  • L'utilisateur constate visuellement les droits qui lui sont assignés.
  • Il ne peut lancer aucune des commandes associées.
La forme que nous venons de construire est présente dans les modules d'exemple livrés avec le tutoriel (TEST_APP.FMB)



Copyright © 2005 SheikYerbouti. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.