Database JBuilder
Database JBuilder
Database JBuilder
Borland VERSION 9
JBuilder
Consultez le fichier deploy.html situ dans le rpertoire redist de JBuilder pour avoir la liste complte des fichiers que vous pouvez distribuer en accord avec votre contrat de licence JBuilder. Les applications mentionnes dans ce manuel sont brevetes par Borland Software Corporation ou en attente de brevet. Reportez-vous au CD ou la bote de dialogue A propos. Ce document ne donne aucun droit sur ces brevets. COPYRIGHT 19972003 Borland Software Corporation. Tous droits rservs. Tous les produits Borland sont des marques commerciales ou des marques dposes de Borland Software Corporation aux Etats-Unis et dans les autres pays. Toutes les autres marques sont la proprit de leurs fabricants respectifs. Pour connatre les conditions et limites des fournisseurs tiers, lisez les Remarques version sur votre CD JBuilder. JBE0090WW21002database 8E11R0503 0304050607-9 8 7 6 5 4 3 2 1 PDF
Introduction
1-1
Rsum des chapitres . . . . . . . . . . . . . . . 1-2 Tutoriels sur les bases de donnes . . . . . . . . 1-4 Exemples de bases de donnes . . . . . . . . . . 1-5 Documentation annexe . . . . . . . . . . . . . . 1-6 Conventions de la documentation . . . . . . . . 1-8 Support et ressources destins aux dveloppeurs . . . . . . . . . . . . . . . . 1-10 Comment contacter le support technique de Borland . . . . . . . . . . . . . . . . . . . . 1-10 Ressources en ligne. . . . . . . . . . . . . . . 1-10 World Wide Web . . . . . . . . . . . . . . . . 1-10 Groupes de discussion Borland. . . . . . . . 1-11 Groupes de discussion Usenet . . . . . . . . 1-11 Rapports de bogues . . . . . . . . . . . . . . 1-12
Chapitre 2
Chapitre 4
2-1
. 2-1 . 2-2 . 2-3 . 2-5 . 2-9 . 2-10 . 2-10 . 2-10 . 2-12 . 2-12 . 2-12 . 2-13 . 2-13 . 2-14 . 2-14 . 2-15 . 2-16
4-1
Connexion aux bases de donnes . . . . . . . . . 4-2 Ajout dun composant Database votre application . . . . . . . . . . . . . . . . . . . 4-3 Dfinition des proprits de connexion du composant Database. . . . . . . . . . . . 4-4 Configuration de JDataStore. . . . . . . . . . . . 4-7 Configuration dInterBase et InterClient . . . . . 4-7 Utilisation dInterBase et dInterClient avec JBuilder . . . . . . . . . . . . . . . . . . 4-8 Astuces pour lutilisation des tables InterBase exemple . . . . . . . . . . . . . . . . . . . . . 4-8 Ajout dun pilote JDBC JBuilder . . . . . . . 4-10 Cration des fichiers .library et .config . . . 4-10 Ajout du pilote JDBC aux projets . . . . . . 4-11 Connexion une base de donnes en utilisant des pilotes JDBC InterClient . . . . . . . . . . 4-13 Utilisation du composant Database dans votre application . . . . . . . . . . . . . . . . . . . . 4-15 Sollicitation dun nom dutilisateur et dun mot de passe . . . . . . . . . . . . . . . . . . . . . 4-16 Mise en pool des connexions JDBC . . . . . . . 4-17 Optimisation des performances de JConnectionPool . . . . . . . . . . . . . 4-19 Sorties historiques . . . . . . . . . . . . . . . 4-19 Exemple de mise en pool . . . . . . . . . . . 4-20 En cas de problme lors des connexions de JDataStore et dInterBase . . . . . . . . . . 4-22 Messages derreur de connexion courants . 4-22 i
Chapitre 5
5-1
Interrogation dune base de donnes . . . . . . 5-2 Dfinition des proprits dans la bote de dialogue query . . . . . . . . . . . . . . 5-4 La page Requte . . . . . . . . . . . . . . 5-4 La page Paramtres . . . . . . . . . . . . . 5-6 Placer le texte SQL dans lensemble de ressources . . . . . . . . . . . . . . . 5-7 Interrogation dune base de donnes : Trucs & astuces . . . . . . . . . . . . . . . . 5-9 Amlioration des performances des ensembles de donnes . . . . . . . . 5-10 Persistance des mtadonnes dune requte . . . . . . . . . . . . . . . 5-11 Ouverture et fermeture des ensembles de donnes . . . . . . . . . . . . . . . . . 5-12 Comment sassurer quune requte est modifiable . . . . . . . . . . . . . . . 5-12 Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes . . . . . . 5-12 Paramtrage dune requte . . . . . . . . . . 5-13 Cration de lapplication . . . . . . . . . . 5-13 Ajout dun composant ParameterRow . . 5-14 Ajout dun QueryDataSet . . . . . . . . . 5-15 Ajout des composants dinterface utilisateur . . . . . . . . . . . 5-16 Les requtes paramtres : Trucs & astuces . 5-19 Utilisation de paramtres . . . . . . . . . 5-19 R-excution dune requte avec des paramtres modifis . . . . . . 5-21 Requtes paramtres dans les relations matre-dtail . . . . . . . . . . . . . . . . 5-22
Utilisation de paramtres avec des procdures stockes Oracle PL/SQL . . . . . . . . . . . 6-5 Utilisation des procdures stockes Sybase . 6-6 Exemple dapplication avec des procdures stockes spcifiques au serveur de la base de donnes . . . . . . . . . . . . . . . . . . . 6-6 Ecriture dun fournisseur de donnes personnalis . . . . . . . . . . . . . . . . . . . . 6-7 Obtention des mtadonnes . . . . . . . . . . 6-8 Appel de initData . . . . . . . . . . . . . . 6-9 Obtention des donnes relles . . . . . . . . . 6-9 Conseils pour la conception dun fournisseur de donnes personnalis . . . . . . . . 6-10 Explication de la mthode provideData() dans des ensembles de donnes matre-dtail . . . . . . . . . . . . . . . 6-10
Chapitre 7
7-1
Chapitre 6
6-1
6-3
6-3 6-4
Prsentation des proprits et mtadonnes de colonne . . . . . . . . . . . . . . . . . . . . . 7-1 Proprits dune colonne qui ne sont pas des mtadonnes . . . . . . . . . . . . . . . 7-2 Visualisation des informations de colonnes dans le concepteur de colonne . . . . . . . . 7-2 Bouton Crer une classe RowIterator . . . . . 7-3 Utilisation du concepteur de colonne pour rendre persistantes des mtadonnes . 7-4 Utilisation du concepteur de colonne pour rendre dynamiques des mtadonnes 7-5 Visualisation des informations des colonnes dans le pilote de base de donnes . . . . . . 7-5 Optimisation dune requte . . . . . . . . . . . . 7-6 Dfinition des proprits dune colonne . . . 7-7 Dfinition des proprits des colonnes en utilisant les outils de conception visuelle de JBuilder . . . . . . . . . . . . . . . . . 7-7 Dfinition des proprits dans le code . . 7-7 Colonnes persistantes . . . . . . . . . . . . . . 7-8 Combinaison de mtadonnes dynamiques et de colonnes persistantes . . . . . . . . . . 7-9 Suppression des colonnes persistantes . . . . 7-9 Utilisation de colonnes persistantes pour ajouter des colonnes vides un ensemble de donnes . . . . . . . . . . . . . . . . 7-10 Contrle de lordre des colonnes dans un ensemble de donnes . . . . . . . . . . 7-11
6-4 6-5
ii
Chapitre 8
Chapitre 9
8-1
9-1
Enregistrement des modifications dun QueryDataSet. . . . . . . . . . . . . . . . 8-3 Ajout dun bouton pour enregistrer des modifications depuis un QueryDataSet 8-4 Enregistrement des modifications dans la source de donnes par une procdure stocke . . . . 8-6 Enregistrement des modifications avec un QueryResolver . . . . . . . . . . . . . . 8-6 Codage de procdures stockes pour grer la rsolution de donnes. . . . . . . . . . . . . 8-6 Enregistrement des modifications avec un ProcedureResolver . . . . . . . . . . . . 8-8 Exemple : Utilisation de procdures stockes InterBase avec paramtres de retour . . . . 8-10 Rsolution des donnes de plusieurs tables . . 8-10 Remarques sur les types de liaisons entre les tables dune requte . . . . . . . . . . . 8-11 Rfrences (alias) de tables et de colonnes dans une chane de requte . . . . . . . . . 8-12 Contrle du paramtrage des proprits de colonne . . . . . . . . . . . . . . . . . . . 8-13 Que faire si une table nest pas modifiable ? 8-13 Comment spcifier quune table ne doit pas tre actualise ? . . . . . . . . . . . . . . . . 8-13 Utilisation des ensembles de donnes avec RMI (mise en flux) . . . . . . . . . . . . . . . . . . . 8-13 Exemple : Utilisation de flux densembles de donnes . . . . . . . . . . . . . . . . . . 8-14 Utilisation des mthodes de flux densemble de donnes . . . . . . . . . . . . . . . . . . 8-15 Personnalisation de la logique de rsolution par dfaut . . . . . . . . . . . . . . . . . . . . . 8-16 Explication de la rsolution par dfaut . . . 8-17 Ajout dun composant QueryResolver . . 8-17 Interception des vnements de rsolution. . . . . . . . . . . . . . . . 8-18 Utilisation des vnements de rsolution. . . . . . . . . . . . . . . . 8-19 Ecriture dun rsolveur de donnes personnalis . . . . . . . . . . . . . . . . . . 8-20 Gestion des erreurs de rsolution . . . . . 8-21 Rsolution des relations matre-dtail . . 8-22
Dfinition dune relation matre-dtail . . . . . . 9-2 Cration dune application avec une relation matre-dtail . . . . . . . . . . . . . . . . . . 9-3 Lecture des dtails . . . . . . . . . . . . . . . . . 9-7 Lecture de tous les dtails en une seule fois . 9-8 Lecture des enregistrements dtail slectionns la demande . . . . . . . . . . . . . . . . . . 9-8 Modification des donnes dans les ensembles de donnes matre-dtail . . . . . . . . . . . . . 9-9 Etapes de la cration dune relation matre-dtail . . . . . . . . . . . . . . . . . . . 9-10 Enregistrement des modifications dans une relation matre-dtail . . . . . . . . . . . . . . . . . . . 9-12 Rsolution des ensembles de donnes matre-dtail avec une source JDBC . . . . 9-13
Chapitre 10
Utilisation des modules de donnes pour simplifier laccs aux donnes 10-1
Cration dun module de donnes en utilisant les outils de conception. . . . . . . . . . . . . 10-2 Cration du module de donnes avec lexpert . . . . . . . . . . . . . . . . . 10-2 Ajout de composants donnes un module de donnes . . . . . . . . . . . . . . . . . . 10-3 Ajout de la logique mtier au module de donnes . . . . . . . . . . . . . . . . . . 10-5 Utilisation dun module de donnes . . . . 10-5 Ajout dune bibliothque ncessaire un projet. . . . . . . . . . . . . . . . . 10-6 Rfrencement dun module de donnes dans votre application . . . . . . . . . . 10-7 Comprhension de lexpert Utilisation dun module de donnes . . . . . . . . 10-8 Cration de modules de donnes en utilisant le modeleur de donnes . . . . . . . . . . . 10-10 Cration des requtes avec le modeleur de donnes . . . . . . . . . . . . . . . . . 10-10 Ouverture dune URL . . . . . . . . . . .10-11 Dbut dune requte . . . . . . . . . . . 10-12 Ajout dune clause Group By . . . . . . 10-14 Slection des lignes ayant des valeurs de colonnes uniques . . . . . . . . . . 10-15 Ajout dune clause Where. . . . . . . . 10-15 Ajout dune clause Order By . . . . . . 10-16 Modification directe de la requte . . . 10-17
iii
Test de votre requte . . . . . . . . . . . 10-17 Construction de requtes multiples. . . 10-17 Spcification dune relation matre-dtail . . . . . . . . . . . . . . . 10-18 Enregistrement de vos requtes . . . . . 10-19 Gnration dapplications de bases de donnes . . . . . . . . . . . . 10-20 Utilisation dans votre code dun module de donnes gnr . . . . . . . . . . . 10-22
Chapitre 11
11-1
. 11-2 . 11-5 . 11-6 . 11-9 11-10 11-11 11-12 11-14 11-14 11-15 11-17 11-18 11-18 11-20 11-20
Exemple : Agrgation de donnes avec des champs calculs . . . . . . . 12-12 Dfinition des proprits de AggDescriptor . . . . . . . . . . . . . 12-15 Cration dun gestionnaire dvnement dagrgation personnalis . . . . . . . . 12-16 Ajout de modles daffichage ou de modification pour formater les donnes . . . . . . . . . . 12-16 Masques daffichage . . . . . . . . . . . . 12-18 Masques de saisie . . . . . . . . . . . . . . 12-18 Utilisation de masques pour limportation et lexportation de donnes. . . . . . . . 12-19 Modles dpendant du type de donnes . 12-19 Modles pour les donnes numriques 12-19 Modles des donnes date et heure . . 12-21 Modles de donnes chane. . . . . . . 12-21 Modles des donnes boolennes . . . 12-22 Prsentation de plusieurs vues des donnes. 12-23 Garantie de la persistance des donnes . . . 12-25 Rendre des colonnes persistantes . . . . . 12-25 Utilisation de types de donnes variant . . . 12-27 Stockage dobjets Java. . . . . . . . . . . . 12-27
Chapitre 13
13-1
Chapitre 12
Synchronisation des composants visuels. . . . 13-1 Accs aux donnes et aux informations de modle depuis un composant dinterface utilisateur . 13-2 Affichage dinformations dtat . . . . . . . . . 13-3 Ajout dun composant JdbStatusLabel une application . . . . . . . . . . . . . . 13-3 Excution de lapplication JdbStatusLabel . 13-4 Gestion des erreurs et des exceptions. . . . . . 13-5 Remplacement de la gestion par dfaut des exceptions DataSetException dans les contrles . . . . . . . . . . . . . . 13-6
Chapitre 14
Chapitre 15
Chapitre 16
15-1
Exploration des tables et mtadonnes des bases de donnes en utilisant le pilote de base de donnes . . . . . . . . . . 15-1 Parcourir les objets de schma dune base de donnes . . . . . . . . . . . . . . . . . . 15-2 Configuration des pilotes pour accder des bases de donnes distantes ou locales . . . 15-3 Excution dinstructions SQL . . . . . . . . . 15-4 Utilisation de lexplorateur pour visualiser ou modifier les donnes des tables . . . . . 15-6 Utilisation du pilote de base de donnes pour ladministration de bases de donnes . . 15-8 Cration de la source de donnes SQL . . . . 15-8 Remplissage dune table SQL en utilisant JBuilder . . . . . . . . . . . . . . . . . . . 15-10 Suppression de tables dans JBuilder . . . . 15-11 Surveillance des connexions aux bases de donnes . . . . . . . . . . . . . . . . . . . 15-11 A propos du Moniteur JDBC . . . . . . . . 15-11 Utilisation du Moniteur JDBC dans une application en excution . . . . 15-13 Ajout du MonitorButton la palette . . 15-13 Utilisation de la classe MonitorButton dans le code . . . . . . . . . . . . . . . 15-14 Proprits de MonitorButton . . . . . . 15-14
Chapitre 17
Index
I-1
vi
Chapitre
Chapitre1
Introduction
Dveloppement dapplications de bases de donnes traite de lutilisation des fonctionnalits de base de donnes de DataExpress (JBuilder) pour dvelopper des applications de bases de donnes. Vous y trouverez galement comment utiliser des composants dbSwing pour crer linterface utilisateur de votre application. Les fonctionnalits standard dune application de base de donnes sont prsentes au travers dexemples afin que vous puissiez apprendre en les ralisant. Des informations conceptuelles sont fournies et suivies, ds que possible, par des exemples, avec des renvois sur des informations plus dtailles quand cela est ncessaire. Veuillez vrifier que vous tes bien en possession des additifs la documentation et de ses mises jour, ladresse http://www.borland.com/ techpubs/jbuilder. Vous pouvez aussi consulter laide en ligne de JBuilder. Les informations de laide en ligne sont plus rcentes que celles de la documentation imprime. Si vous avez des questions en matire de cration des applications de bases de donnes en utilisant JBuilder, visitez le groupe de discussion consacr aux bases de donnes, ladresse news://newsgroups.borland.com/ borland.public.jbuilder.database. Ce groupe de discussion, ddi aux problmes dcriture des applications de bases de donnes avec JBuilder, est anim par nos ingnieurs support ainsi que par lquipe de dveloppement de JBuilder. Pour des discussions sur les composants dbSwing, le groupe de discussion news://newsgroups.borland.com/ borland.public.jbuilder.dbswing peut vous fournir de laide lors de la cration dinterfaces utilisateur dapplications de bases de donnes. Le site Web de la communaut Borland hberge les rponses aux questions frquemment poses (FAQ) sur DataExpress ladresse http://community.borland.com/.
Introduction
1-1
Remarque
Toutes les versions de JBuilder fournissent un accs direct aux donnes SQL via lAPI JDBC de Sun. JBuilder Entreprise propose des composants DataExpress supplmentaires simplifiant grandement le dveloppement des applications de bases de donnes, comme le montre ce manuel. Nombre de ces composants sont facilement accessibles via longlet DataExpress de la palette de composants. DataExpress stocke les donnes en mmoire. La plupart des tutoriels et applications exemple dcrits dans ce manuel utilisent des donnes exemple stockes dans un JDataStore et accessibles via un pilote JDBC. Le remplacement du module de stockage en mmoire de JDataStore fournit un stockage permanent des donnes. JDataStore peut tre trait comme toute base de donnes SQL - vous pouvez vous y connecter comme tout serveur, y excuter des requtes SQL, etc. Pour davantage dinformations sur JDataStore, voir le Guide du dveloppeur JDataStore. Pour des explications sur les conventions de la documentation, voir Conventions de la documentation, page 1-8. Si JBuilder ne vous est pas familier, nous vous conseillons de commencer par Introduction JBuilder. Si Java ne vous est pas familier, nous vous conseillons de commencer par Introduction Java.
1-2
Chapitre 5, Extraction des donnes dune source de donnes Dcrit comment crer une copie locale des donnes de votre source de donnes et quels composants du paquet DataExpress utiliser. Cette phase (appele acquisition ou fourniture des donnes) rend les donnes accessibles lapplication. Chapitre 6, Utilisation des procdures stockes Dcrit comment crer et utiliser des procdures stockes pour excuter des instructions SQL effectuant lacquisition ou la rsolution des donnes. Chapitre 7, Manipulation des colonnes Dcrit la manire de rendre des colonnes persistantes, de contrler laspect ou la saisie des donnes dune colonne, dobtenir les informations des mtadonnes, dajouter une colonne un ensemble de donnes et de dfinir lordre daffichage des colonnes. Chapitre 8, Enregistrement des modifications dans la source de donnes Dcrit la manire denregistrer dans la source de donnes les modifications de donnes faites dans lapplication JBuilder (ce processus est appel rsolution). Dtaille plusieurs mthodes de rsolution, notamment le mcanisme de rsolution standard propos par les composants DataExpress, lenregistrement des modifications avec les procdures stockes, la rsolution des donnes provenant de plusieurs tables, lutilisation des objets DataSet avec RMI, la personnalisation de la logique de rsolution par dfaut. Chapitre 9, Etablissement dune relation matre-dtail Dcrit comment lier plusieurs ensembles de donnes pour crer une relation parent/enfant (ou matre-dtail). Chapitre 10, Utilisation des modules de donnes pour simplifier laccs aux donnes Dcrit comment utiliser des modules de donnes pour simplifier laccs aux donnes de vos applications et, simultanment, standardiser la logique et les rgles de fonctionnement de la base de donnes pour tous les dveloppeurs accdant aux donnes. Fournit galement des informations sur lutilisation de lexpert Modeleur de donnes pour crer des modules de donnes. Chapitre 11, Filtrage, tri et recherche de donnes Dcrit comment implmenter le tri, le filtrage et la recherche de donnes dans les applications de bases de donnes, laide des composants DataExpress standard et les outils de conception de JBuilder. Explique les diffrences entre ces fonctionnalits, et offre un tutoriel pour chacune delles.
Introduction
1-3
Chapitre 12, Ajout de fonctionnalits aux applications de bases de donnes Inclut des informations sur les tches suivantes : Formatage et analyse de donnes avec des masques de saisie ou daffichage Cration de colonnes calcules Agrgation de donnes (minimum, maximum, somme, dcompte) Cration dun champ de recherche Prsentation de plusieurs vues des donnes Cration de champs persistants ou prdfinis Chapitre 13, Utilisation dautres contrles et vnements Expose les mthodes complmentaires facilitant le dveloppement de la partie interface utilisateur de votre application. Discute de laffichage des informations dtat dans votre application et du traitement des erreurs de lapplication. Chapitre 14, Cration dune application de base de donnes distribue laide de DataSetData Dcrit lutilisation des composants DataExpress dans un environnement informatique objets distribus (via Java RMI). Chapitre 15, Administration dune base de donnes Inclut des informations sur les tches suivantes : Parcours et modification des donnes, des tables et des schmas de base de donnes en utilisant le pilote de base de donnes Cration et suppression de tables Remplissage de tables par des donnes Surveillance du trafic JDBC avec le moniteur JDBC
1-4
Chapitre 17, Tutoriel : Cration dune application de base de donnes lmentaire Montre comment construire une application de base de donnes simple se connectant une base SQL. Vous verrez comment dfinir les proprits de connexion la base de donnes, ajouter un champ de recherche pour localiser des donnes et ajouter des champs calculs pour gnrer des totaux dans une colonne.
Si vous souhaitez examiner les applications exemple dans le concepteur de JBuilder, il vous faudra construire le projet correspondant chaque exemple avant de lamener dans le concepteur. Pour construire un projet, choisissez Projet|Reconstruire le projet.
Introduction
1-5
Documentation annexe
Documentation annexe
La documentation Borland contient des informations utiles au dveloppement des applications de bases de donnes : Rfrence de la bibliothque de composants DataExpress est la documentation en ligne sur lAPI des paquets DataExpress utiliss pour laccs aux donnes. Elle inclut les rfrences des paquets de composants suivants : Rfrence DataExpress : Contient la documentation API pour les paquets assurant laccs basique aux donnes. Le paquet com.borland.dx.dataset fournit les routines gnrales de connectivit, gestion et manipulation des donnes. Le paquet com.borland.dx.sql.dataset procure les fonctions de connectivit aux donnes spcifiques JDBC. Le paquet com.borland.dx.text contient des classes et des interfaces qui contrlent lalignement et le formatage des objets, ainsi que le formatage des donnes et des valeurs. Ce paquet gre en outre le formatage et lanalyse des exceptions comme la validation de la saisie. Rfrence dbSwing : Contient la documentation API pour le paquet com.borland.dbswing ; les composants contenus dans ce paquet permettent des composants Swing daccder des bases de donnes au travers des ensembles de donnes DataExpress (DataSet). Rfrence JDataStore : Contient la documentation API pour les paquets servant la connexion aux bases de donnes JDataStore ainsi qu la excution des transactions sur ces bases. Le paquet com.borland.datastore fournit les fonctions basiques de connectivit et du support des transactions pour les bases de donnes JDataStore locales. Le paquet com.borland.datastore.jdbc contient linterface JDBC avec le DataStore, y compris le pilote JDBC lui-mme, en mme temps que les classes permettant dimplmenter votre propre serveur DataStore pour les connexions multi-utilisateurs au mme DataStore. Le paquet com.borland.datastore.javax.sql apporte le support des transaction distribues (XA). Les classes de ce paquet sont utilises en interne par dautres classes Borland. Vous ne devez jamais utiliser directement les classes de ce paquet. Rfrence des classes Javax : Contient la documentation API pour le paquet com.borland.javax.sql qui fournit les implmentations des sources de donnes JDBC 2.0 et les composants pour la mise en pool des connexions. Ces classes peuvent servir avec nimporte quel pilote JDBC mais possdent des fonctionnalits supplmentaires spcifiques au pilote JDBC JDataStore.
1-6
Dveloppement dapplications de bases de donnes
Documentation annexe
Rfrence InternetBeans Express : Contient la documentation API pour les paquets com.borland.internetbeans et com.borland.internetbeans.taglib qui fournissent des composants et une bibliothque de balises JSP permettant de gnrer la couche prsentation dune application web, et dy rpondre. Rfrence des classes adaptateur pour SQL : Contient la documentation API pour le paquet com.borland.sql. Ce paquet contient linterface SQLAdapter pouvant tre implmente par nimporte quelle classe JDBC adaptable en vue de lamlioration des performances. Rfrence des classes des outils SQL : Contient la documentation API pour le paquet com.borland.sqltools contenant les classes pour rcuprer la sortie dun rapport en utilisant les requtes SQL spcifies dans le format XML. Rfrence CORBA Express : Contient la documentation API pour le paquet com.borland.cx contenant les classes de connexion CORBA pour les applications distribues bases sur CORBA. Rfrence DataExpress EJB : Contient la documentation API pour le paquet com.borland.dx.ejb. Ce paquet contient les composants DataExpress pour EJB qui permettent dutiliser des beans entit avec les DataSet DataExpress pour la rsolution et lacquisition des donnes. Certains de ces composants peuvent tre ajouts depuis la page EJB de la palette de composants dans le concepteur dinterface utilisateur. Rfrence des composants de bases de donnes XML : Contient la documentation API pour les composants de bases de donnes XML dans les paquets com.borland.jbuilder.xml.database.xmldbms, com.borland.jbuilder.xml.database.template et com.borland.jbuilder.xml.database.common. Beaucoup des composants de ces paquets peuvent tre ajouts depuis la page XML de la palette de composants dans le concepteur dinterface utilisateur. Guide du dveloppeur dapplications web contient des informations sur lutilisation des composants InternetBeans Express pour crer des applications web accdant aux donnes. Le Guide du dveloppeur dapplications web comprend des tutoriels qui montrent comment utiliser les composants InternetBeans Express avec des JSP et des servlets. Guide du dveloppeur XML explique comment utiliser les composants bean modle et template de XML pour crer des requtes sur une base de donnes et comment transfrer des donnes entre des documents XML et des bases de donnes. Le Guide du dveloppeur XML comprend
Introduction
1-7
Conventions de la documentation
galement des tutoriels qui illustrent lutilisation des composants de bases de donnes XML. Dveloppement des Enterprise JavaBeans explique comment utiliser les composants DataExpress pour EJB afin de transfrer des donnes depuis les beans entit dploys sur un serveur vers une application client et vice-versa. Guide du dveloppeur JDataStore contient une rfrence complte qui vous aidera utiliser JDataStore avec les applications de base de donnes que vous dveloppez.
Conventions de la documentation
La documentation Borland sur JBuilder utilise les polices et les symboles dcrits dans le tableau suivant pour signaler du texte particulier.
Tableau 1.1 Police
Police espacement fixe
Gras
Italiques Touches []
1-8
Conventions de la documentation
Italiques, serif
...
JBuilder est disponible sur plusieurs plates-formes. Reportez-vous au tableau suivant pour une description des conventions associes aux diverses plates-formes.
Tableau 1.2 Elment
Chemins
Rpertoire de base
Captures dcran
Introduction
1-9
Ressources en ligne
Vous pouvez obtenir des informations depuis les sources ci-aprs : World Wide Web Bulletins lectroniques http://www.borland.fr/ http://www.borland.com/techpubs/jbuilder/ Pour vous abonner aux bulletins lectroniques, utilisez le formulaire en ligne : http://www.borland.fr/products/newsletters/ index.html
1-10
Vous pouvez vous connecter en particulier aux URL suivantes : http://www.borland.fr/jbuilder/ (mises jour du logiciel et autres fichiers) http://www.borland.com/techpubs/jbuilder/ (mises jour de la documentation et autres fichiers) http://community.borland.com/ (contient notre magazine dinformations web pour les dveloppeurs)
news:comp.lang.java.advocacy news:comp.lang.java.announce news:comp.lang.java.beans news:comp.lang.java.databases news:comp.lang.java.gui news:comp.lang.java.help news:comp.lang.java.machine news:comp.lang.java.programmer news:comp.lang.java.security news:comp.lang.java.softwaretools
Ces groupes de discussion sont maintenus par les utilisateurs et ne sont pas des sites Borland officiels.
Introduction
1-11
Rapports de bogues
Si vous pensez avoir trouv un bogue dans le logiciel, merci de le signaler Borland, sur lun des sites suivants : Page du support dveloppeur de JBuilder, ladresse http://www.borland.com/devsupport/emea/. Cliquez sur le lien Reporting Defects pour afficher le formulaire de saisie. Quality Central, ladresse http://qc.borland.com. Suivez les instructions de la page Quality Central dans la section Bugs Reports. Quand vous signalez un bogue, indiquez toutes les tapes ncessaires la reproduction de ce bogue, ainsi que tout paramtre spcial de votre environnement et les autres programmes utiliss avec JBuilder. Prcisez bien le comportement attendu et ce qui sest rellement pass. Si vous avez des commentaires (compliments, suggestions ou questions) destins aux rdacteurs de la documentation de JBuilder, vous pouvez envoyer un e-mail [email protected]. Uniquement pour la documentation. Les questions de support doivent tre adresses au support dveloppeur. JBuilder est fait par des dveloppeurs pour des dveloppeurs. Nous apprcions vraiment vos remarques.
1-12
Chapitre
Chapitre2
On appelle application de base de donnes toute application accdant des donnes stockes et permettant de les visualiser et, ventuellement, de les modifier ou de les manipuler. Le plus souvent, ces donnes sont stockes dans une base de donnes. Les donnes peuvent cependant tre stockes dans des fichiers texte ou dans dautres formats. JBuilder permet daccder ces informations et de les manipuler en utilisant les proprits, les mthodes et les vnements dfinis dans les paquets DataSet de la bibliothque de composants DataExpress et dans le paquet dbSwing. Une base de donnes demandant des informations une telle source de donnes est appele une application client. Un gestionnaire de bases de donnes grant les demandes de donnes de divers clients est appel un serveur de bases de donnes.
2-1
Composants DataExpress
Le diagramme suivant illustre lorganisation dune base de donnes standard et les diffrentes couches entre lapplication de base de donnes client DataExpress JBuilder et la source de donnes :
Figure 2.1 Diagramme dune application de base de donnes standard
La section suivante, Composants DataExpress, prsente les composants de larchitecture DataExpress avec plus de dtails.
Composants DataExpress
DataExpress est un paquet, com.borland.dx.dataset, de classes et dinterfaces Borland qui apportent les fonctions basiques daccs aux donnes. Ce paquet dfinit galement les classes de base fournisseur et rsolveur, ainsi quune classe DataSet abstraite tendue aux autres objets DataSet. Ces classes fournissent laccs aux informations stockes dans les bases de donnes ou les autres sources de donnes. Ce paquet comprend les fonctionnalits couvrant les trois phases principales de la gestion des donnes : Acquisition Fonction gnrale qui obtient les donnes et gre les ensembles de donnes locaux. (Les connexions des serveurs distants spcifiques JDBC sont gres par des classes du paquet com.borland.dx.sql.dataset.)
2-2
Composants DataExpress
Manipulation Navigation et modification des donnes en local. Rsolution Routines gnrales de mise jour des donnes, du DataSet local vers la source originelle des donnes. (La rsolution sur des serveurs distants des modifications des donnes via JDBC sont gres par des classes du paquet com.borland.dx.sql.dataset.)
2-3
Composants DataExpress
MemoryStore met en cache toutes les donnes et en mmoire les modifications. JDataStore utilise une base de donnes entirement Java, faible encombrement, ultra-performante et incorporable pour mettre en cache les donnes et leurs modifications. Le JDataStore est idal pour linformatique dconnecte ou mobile, la rplication non synchrone des donnes et les applications de bases de donnes faible encombrement. Support de la liaison de donnes pour les composants visuels Les composants DataSet de DataExpress fournissent une puissante interface de programmation ainsi que le support de la liaison de donnes directe pour les composants orients donnes grce la dfinition de proprits par simple pointer-cliquer dans le concepteur visuel. JBuilder est livr avec des composants visuels bass sur Swing qui se lient directement aux composants DataSet. Lutilisation de larchitecture modulaire de DataExpress prsente les avantages suivants : Informatique en rseau Comme indiqu prcdemment, lapproche acquisition/rsolution isole les interactions des sources de donnes en deux points exactement dfinis. Cette approche offre deux autres avantages : Le processus dacquisition/rsolution peut facilement tre dcompos en faveur dun niveau intermdiaire. La logique dacquisition/rsolution possdant typiquement une nature transactionnelle est idalement adapte au partitionnement sur un niveau intermdiaire. Cest un modle de traitement sans tat idalement adapt linformatique en rseau. La connexion entre le client composant DataSet et la source de donnes peut tre interrompue aprs lacquisition. Lorsque les modifications doivent tre enregistres dans la source, la connexion na besoin dtre rtablie que pour la dure de la transaction de rsolution. Dveloppement rapide des interfaces utilisateur Les composants DataSet pouvant tre lis aux composants orients donnes par la simple dfinition dune proprit, ils sont idalement adapts la construction rapide des interfaces utilisateur des applications de bases de donnes. Informatique mobile Avec lintroduction du composant DataStore, les applications DataExpress disposent dune base de donnes persistante et portable. Le DataStore peut contenir plusieurs composants DataSet, des fichiers quelconques et des objets Java. Cela permet de conserver ltat complet dune application dans un seul fichier. Les composants DataSet intgrent des techniques de rplication des donnes, permettant que les
2-4
Dveloppement dapplications de bases de donnes
Composants DataExpress
modifications apportes aux donnes rpliques soient enregistres et rconcilies dans leur source. Applications imbriques Le faible encombrement, les hautes performances de la base de donnes JDataStore supportent idalement lincorporation des applications et acceptent toutes les fonctionnalits et toute la smantique du composant DataSet. Pour plus dinformations sur larchitecture DataExpress, visitez le site Web Borland, ladresse http://www.borland.fr/jbuilder/.
Description
Ncessaire pour accder aux donnes stockes dans un serveur distant, le composant Database gre la connexion JDBC avec la base de donnes dun serveur SQL. Pour davantage dinformations sur ce composant et son utilisation, voir Chapitre 4, Connexion une base de donnes.
2-5
Composants DataExpress
Composant/ Classe
DataSet
Description
Une classe abstraite qui dfinit le comportement par dfaut dun ensemble de donnes, DataSet sert galement dinfrastructure au stockage de donnes en grant un tableau deux dimensions organis en lignes et en colonnes. Elle implmente le concept de position de la ligne en cours, ce qui permet de parcourir les lignes de donnes et de grer un pseudo enregistrement contenant un enregistrement nouveau ou modifi jusqu ce quil soit valid dans le DataSet. Etant donn quil tend ReadWriteRow, DataSet dispose de mthodes de lecture et dcriture de valeurs de champ.
StorageDataSet
Une classe qui tend DataSet en fournissant une implmentation du stockage des donnes et de la manipulation de la structure du DataSet. Un composant StorageDataSet est rempli avec les donnes en extrayant des informations dune base de donnes distante (par exemple, InterBase ou Oracle) ou en important les donnes stockes dans un fichier texte. Pour ce faire, il faut instancier lune de ses sous-classes : QueryDataSet, ProcedureDataSet ou TableDataSet. Le composant DataStore propose un remplacement de MemoryStore qui offre un stockage permanent des donnes. Un JDataStore offre un cache des donnes performant et une persistance compacte pour des ensembles de donnes DataExpress, des fichiers quelconques ou des objets Java. Le composant DataStore utilise un seul fichier pour stocker un ou plusieurs flux de donnes. Un fichier JDataStore utilise une structure de rpertoire associant un nom et un tat de rpertoire chaque flux de donnes. JDataStore peut tre trait comme toute base de donnes SQL - vous pouvez vous y connecter comme tout serveur, y excuter des requtes SQL, etc. Pour davantage dinformations sur le composant DataStore, voir JDataStore et JBuilder, page 2-13, dans ce manuel, et le Guide du dveloppeur JDataStore.
DataStore
Le stockage et la mise en cache des composants StorageDataSet dans un DataStore seffectuent grce la dfinition de deux proprits du StorageDataSet : store et storeName. Par dfaut, quand la proprit store nest pas dfinie, tous les StorageDataSet utilisent un MemoryStore. Actuellement MemoryStore et DataStore sont les seules implmentations possibles de la proprit store. La proprit storeName contient le nom unique associ ce StorageDataSet dans DataStore.
2-6
Composants DataExpress
Composant/ Classe
DataStoreDriver
Description
DataStoreDriver est le pilote JDBC pour le JDataStore. Le pilote gre laccs local et distant. Ces deux types daccs ncessitent un nom dutilisateur (toute chane sans configuration ncessaire). Le mot de passe peut tre vide si le JDataStore nest pas crypt. Sinon, un mot de passe non nul doit tre fourni. Le composant QueryDataSet stocke le rsultat dune chane de requte excute sur un serveur distant. Ce composant fonctionne avec le composant Database pour se connecter aux bases de donnes dun serveur SQL et pour excuter la requte spcifie avec ou sans paramtres. Lorsque les donnes rsultantes sont stockes dans le composant QueryDataSet, vous pouvez manipuler les donnes en utilisant lAPI duDataSet. Pour davantage dinformations sur ce composant et son utilisation, voir Interrogation dune base de donnes, page 5-2. Le composant ProcedureDataSet contient le rsultat dune procdure stocke excute sur une base de donnes distante. Ce composant fonctionne associ au composant Database de la mme manire que le composant QueryDataSet. Pour plus dinformations sur ce composant et son utilisation, voir Chapitre 6, Utilisation des procdures stockes. Utilisez ce composant pour importer des donnes dun fichier texte. Ce composant tend la classe DataSet. Il simule les fonctionnalits dun serveur SQL sans passer par une connexion avec un serveur SQL. Pour une description dtaille de ce composant et des instructions dutilisation, voir Chapitre 3, Importation et exportation des donnes dun fichier texte, et le tutoriel associ, Chapitre 16, Tutoriel : Importation et exportation des donnes dun fichier texte. Ce composant propose une autre vue des donnes dun objet StorageDataSet existant. Il dispose de sa propre proprit (hrite) sort, ce qui permet une prsentation des donnes dans un ordre diffrent. Il dispose galement de fonctionnalits de tri et de navigation indpendantes de son StorageDataSet associ. Pour une description dtaille de ce composant et des instructions dutilisation, voir Prsentation de plusieurs vues des donnes, page 12-23.
QueryDataSet
Lobjet QueryDescriptor contient linstruction de la requte SQL, les paramtres de la requte et les informations sur la connexion la base de donnes. On accde cet objet en utilisant la proprit query.
ProcedureDataSet
Lobjet ProcedureDescriptor contient linstruction SQL, les paramtres, le composant base de donnes et dautres proprits. On accde cet objet via la proprit procedure du composant ProcedureDataSet.
TableDataSet
La proprit (hrite) dataFile spcifie le nom de fichier dans lequel se trouve les donnes charger dans lensemble de donnes et dans lequel les enregistrer.
DataSetView
La proprit storageDataSet indique le composant contenant les donnes dont le DataSetView prsente une vue.
2-7
Composants DataExpress
Composant/ Classe
Colonne
Description
Un objet colonne reprsente la collection de toutes les lignes dun lment de donnes particulier, par exemple toutes les valeurs du champ Nom dune table. Une colonne obtient ses valeurs quand un ensemble de donnes est instanci ou comme rsultat dun calcul. Lobjet Column est gr par son composant StorageDataSet. Pour une description dtaille de ce composant et des instructions dutilisation, voir Chapitre 7, Manipulation des colonnes.
DataRow
Le composant DataRow est une collection de toutes les donnes des colonnes pour une seule ligne, en considrant que chaque ligne contient un enregistrement dinformations complet. Le composant DataRow utilise les mmes colonnes que le DataSet avec lequel il a t construit. Les noms des colonnes dans un DataRow sont des noms de champ. Un composant DataRow est pratique utiliser pour comparer les valeurs de deux lignes ou pour rechercher des donnes dans un DataSet. Il peut tre utilis dans toutes les mthodes de DataSet qui attendent un ReadRow ou un ReadWriteRow. Le composant ParameterRow possde une Column pour chaque colonne de lensemble de donnes associ que vous pouvez vouloir dans la requte. Placez les valeurs qui devront tre utilises par la requte dans le ParameterRow et associez-les la requte par les noms de leurs paramtres (qui sont les noms des colonnes ParameterRow). Pour une description dtaille de ce composant et des instructions dutilisation, voir Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes, page 5-12.
ParameterRow
2-8
Composant/ Classe
DataModule
Description
DataModule est une interface du paquet com.borland.dx.dataset. Une classe qui implmente DataModule sera reconnue par le concepteur JBuilder comme une classe contenant divers composants dataset groups en un modle de donnes. Pour crer un module de donnes vide, double-cliquez sur licne Module de donnes dans la galerie dobjets (Fichier|Nouveau). En utilisant ensuite la palette des composants et le volet contenu, vous pouvez y placer divers objets dataset et dfinir des connexions, des requtes, des tris ou la logique de rgles de gestion personnalises. Les modules de donnes simplifient la rutilisation et le partage de collections de composants dataset. Par exemple, plusieurs classes dinterface utilisateur dune application peuvent utiliser une instance partage dun module de donnes personnalis. Pour une description dtaille de ce composant et des instructions dutilisation, voir Chapitre 10, Utilisation des modules de donnes pour simplifier laccs aux donnes.
Il y a dans les paquets com.borland.dx.dataset, com.borland.dx.sql.dataset et com.borland.datastore de nombreux composants et classes, ainsi que des classes utilitaires dans dautres paquets comme les paquets util ou view. Vous trouverez des informations dtailles sur les paquets et les classes de la bibliothque DataExpress dans la Rfrence de la bibliothque des composants DataExpress.
2-9
InternetBeans Express
InternetBeans Express
Le paquet InternetBeans Express, com.borland.internetbeans, fournit des composants et une bibliothque de balises JSP, permettant de gnrer la couche prsentation dune application web, et dy rpondre. La paquet InternetBeans Express nest pas trait dans ce manuel. Pour davantage dinformations sur lutilisation de composants appartenant au paquet InternetBeans Express afin de dvelopper des applications JSP et servlets orients donnes, voir InternetBeans Express dans le Guide du dveloppeur dapplications web. Pour les informations de rfrence, reportez-vous la documentation API du paquet com.borland.internetbeans.
dbSwing
Le paquet dbSwing permet de concevoir une application de base de donnes tirant profit de larchitecture des composants Swing Java. En plus de sous-classes orientes donnes prdfinies pour la plupart des composants Swing, dbSwing propose galement divers composants utilitaires conus spcifiquement pour le dveloppement dapplication utilisant DataExpress et JDataStore.
2-10
dbSwing
Pour crer une application de base de donnes, vous devez tout dabord la connecter une base de donnes et alimenter en donnes un ensemble de donnes. La section Accs aux donnes des exemples, page 11-2, permet de dfinir une requte utilisable comme point de dpart pour la cration dune application de base de donnes et dune interface utilisateur lmentaire. Pour utiliser les composants dbSwing orients donnes,
1 Ouvrez le fichier Cadre puis slectionnez longlet Conception. 2 Slectionnez un des onglets dbSwing : dbSwing, dbSwing supplmentaires ou Modles dbSwing. 3 Cliquez sur un composant de la palette puis cliquez dans le concepteur dinterface utilisateur afin de placer le composant dans lapplication. 4 Slectionnez le composant dans larborescence des composants ou dans le concepteur dinterface utilisateur.
Selon le type de composant et la valeur de la proprit layout du contentPane contenant le composant, le concepteur affiche des poignes de redimensionnement de couleur noire sur les bords du composant. Certains composants (JdbNavToolBar et JdbStatusLabel) se lient automatiquement aux donnes ayant la focalisation. Pour dautres (comme JdbTable), initialisez leurs proprits dataSet et/ou columnName dans linspecteur afin de les lier un DataSet instanci. La liste suivante contient quelques composants dbSwing disponibles depuis la page dbSwing de la palette de composants : TableScrollPane JdbTable JdbNavToolBar JdbStatusLabel JdbTextArea JdbComboBox JdbLabel JdbList JdbTextPane JdbTextField
dbSwing offre des avantages significatifs par rapport Swing grce des fonctionnalits amliores et une orientation donnes. De plus, dbSwing est totalement lger, fournit une prise en charge de lapparence pour plusieurs plates-formes et se conforme aux normes Swing. En utilisant des composants dbSwing, vous tes sr que tous vos composants sont compacts. Pour plus dinformations sur le paquet dbSwing, consultez la documentation API dbSwing.
2-11
Moniteur JDBC
Le moniteur JDBC (Outils|Moniteur JDBC) est un outil graphique servant surveiller le trafic JDBC. Le moniteur JDBC suivra tous les pilotes JDBC (cest--dire toute sous-classe de java.sql.Driver ) utiliss par JBuilder. Le moniteur JDBC suit toutes les sorties directement depuis le pilote JDBC. Pour davantage dinformations sur le moniteur JDBC, y compris des instructions dutilisation, voir Surveillance des connexions aux bases de donnes, page 15-11.
2-12
JDataStore et JBuilder
JDataStore et JBuilder
JDataStore est une solution de stockage de donnes de faible encombrement, 100% entirement Java. [JDataStore est : Une base de donnes relationnelle incorpore, avec des interfaces JDBC et DataExpress, qui gre des transactions multi-utilisateurs non bloquantes avec rcupration des erreurs. Un stockage objet qui permet de stocker des objets srialiss, des ensembles de donnes et dautres flux de fichier. Un composant JavaBean qui peut tre manipul par des outils de conception visuelle comme JBuilder. Lexplorateur JDataStore visuel, tout-Java, vous permet de grer vos DataStores. Pour davantage dinformations sur lutilisation dun DataStore, voir le Guide du dveloppeur JDataStore.
JDataStore peut tre utilis avec ou sans pilote JDBC. Dans la majorit des exemples et des tutoriels de ce manuel, JDataStore st utilis avec des pilotes JDBC. Le tutoriel Edition avec le JDataStore hors connexion dans le Guide du dveloppeur JDataStore montre comment utiliser un composant DataStore pour la modification des donnes hors connexion, plutt que dtablir un connexion JDBC un serveur JDataStore. Vous pouvez utiliser un JDataStore pour : Travailler hors connexion - vous pouvez enregistrer et modifier des donnes dans le systme de fichiers JDataStore et rsoudre les modifications lorsque vous vous reconnectez la source de donnes
2-13
JDataStore et JBuilder
Stocker des objets ainsi que des donnes Manipuler des ensembles de donnes volumineux
2-14
JDataStore et JBuilder
tant regroup avec ses index. Quand un flux de donnes est slectionn dans larborescence, son contenu est affich (dans la mesure ou lexplorateur peut afficher son contenu : fichier texte, .gif ou ensemble de donnes). Effectuer des oprations sur le stockage sans crire de code. Vous pouvez crer un nouveau JDataStore, importer des fichiers texte dlimit dans un ensemble de donnes, importer des fichiers dans des flux de fichier, supprimer des index et des ensembles de donnes ou vrifier lintgrit du JDataStore. Grer les requtes qui fournissent des donnes aux ensembles de donnes du stockage, modifier les ensembles de donnes et enregistrer les modifications dans les tables dun serveur. Utilisez la commande Outils|Explorateur JDataStore pour dmarrer lexplorateur JDataStore.
Figure 2.2 Explorateur JDataStore
1 Ouvrez lexplorateur JDataStore en choisissant Outils|Explorateur JDataStore. 2 Choisissez Fichier|Nouveau ou cliquez sur le bouton Nouveau JDataStore. 3 Entrez le nom du nouveau stockage et choisissez OK. Le stockage est cr et ouvert dans lexplorateur.
Pour importer un fichier texte dans un ensemble de donnes,
2-15
InterBase et JBuilder
2 Spcifiez le nom du fichier texte en entre et le nom dans le stockage de lensemble de donnes crer.
Le contenu du fichier texte doit tre au format dlimit dans lequel JBuilder exporte et il doit y avoir dans le rpertoire un fichier SCHEMA (.schema) portant le mme nom pour dfinir la structure de lensemble de donnes destination (pour crer un fichier .schema, voir Exportation des donnes, page 3-3). Le nom de stockage par dfaut est celui du fichier dentre, y compris lextension. Comme cette opration cre un ensemble de donnes et non un flux de fichier, il est prfrable domettre lextension dans le nom de stockage.
1 Choisissez Outils|Importer|Fichier. 2 Fournissez un nom de fichier dentre et le nom de stockage. Cliquez sur OK.
Pour vrifier lintgrit du JDataStore ouvert, choisissez Outils|Vrifier le JDataStore ou cliquez sur le bouton Vrifier le JDataStore. La totalit du stockage est vrifie et le rsultat est affich dans la fentre Historique du vrificateur. Une fois la fentre historique ferme, vous pouvez la rafficher en choisissant Voir|Historique du vrificateur. Pour davantage dinformations sur lutilisation de lExplorateur JDataStore, voir, dans le Guide du dveloppeur JDataStore, Administration de JDataStore.
InterBase et JBuilder
Borland InterBase est une base de donnes relationnelles conforme aux standards SQL haute performance et interplate-forme. InterBase inclut sa propre version de la base de donnes employee, employee.gdb, afin que vous utilisiez facilement InterBase au lieu de JDataStore dans les exemples et les tutoriels. Pour plus dinformations sur la configuration dInterBase et dInterClient pour leur utilisation dans les tutoriels, voir Connexion une base de donnes en utilisant des pilotes JDBC InterClient, page 4-13. Pour davantage dinformations sur InterBase ou pour tlcharger une version dessai gratuite, voir le site web de Borland, ladresse http://www.borland.fr/interbase/index.html.
2-16
Chapitre
Dans JBuilder, un composant TableDataSet permet de stocker les donnes importes dun fichier texte. Une fois les donnes fournies lensemble de donnes, il est possible de les visualiser et de les modifier. Pour r-enregistrer les modifications dans le fichier texte, r-exportez-les dans le fichier texte. Pour importer les donnes dun fichier texte, utilisez un composant TextDataFile pour spcifier lemplacement du fichier texte et les paramtres spcifiques sa structure. Utilisez un StorageDataSet, par exemple un composant TableDataSet, pour stocker localement les donnes afin de les consulter et de les modifier. Crez des objets Column afin que le composant TableDataSet connaisse le type de donnes et le nom de champ pour chaque colonne de donnes. Pour dfinir les colonnes dun composant TableDataSet, ajoutez des colonnes dans la fentre Source, utilisez le concepteur dinterface utilisateur ou chargez un fichier texte disposant dun fichier SCHEMA (.schema) valide. Cette section dcrit les deux premires possibilits. Limportation des donnes en utilisant un fichier SCHEMA existant est traite par le Chapitre 16, Tutoriel : Importation et exportation des donnes dun fichier texte. Votre fichier texte ne dispose dun fichier SCHEMA valide que sil a t pralablement export par JBuilder. Cette section traite les sujets suivants : Ajout de colonnes un TableDataSet en utilisant lditeur Importation des donnes formates dun fichier texte Rcupration de donnes dune source JDBC Exportation des donnes
3-1
1 Slectionnez Cadre1.java dans le volet contenu, puis slectionnez longlet Source. La dfinition de classe est affiche dans la fentre Source. Ajoutez les lignes de code suivantes :
Column column1 = new Column(); Column column2 = new Column();
2 Trouvez la mthode jbInit() dans le code source. Dfinissez le nom de la colonne et le type des donnes qui sont stockes dedans, de la manire suivante :
column1.setColumnName("my_number"); column1.setDataType(com.borland.dx.dataset.Variant.SHORT); column2.setColumnName("my_string"); column2.setDataType(com.borland.dx.dataset.Variant.STRING);
3 Ajoutez les nouvelles colonnes au TableDataSet dans la mme fentre source et dans la mme mthode jbInit(), de la manire suivante :
tableDataSet1.setColumns(new Column[] { column1,column2 } );
4 Compilez lapplication pour lier les nouveaux objets Column lensemble de donnes, puis ajoutez tout composant visuel adquat.
3-2
Les colonnes date et numriques ont des modles daffichage et de modification par dfaut. Si vous ne dfinissez pas ces proprits, des modles de saisie par dfaut sont utiliss. Les modles par dfaut proviennent du fichier java.text.resources.LocaleElements qui correspond aux valeurs locales par dfaut des colonnes. Si la localisation de la colonne nest pas spcifie, la localisation de lensemble de donnes est utilise. Si la localisation de lensemble de donnes nest pas dfinie, la localisation par dfaut du systme est utilise. Laffichage dun nombre virgule flottante comprend par dfaut trois chiffres aprs la virgule. Si vous voulez plus de dcimales, spcifiez un masque.
Ce code produit un fichier de donnes et le fichier SCHEMA associ. Vous pouvez utiliser ce type daccs aux donnes pour crer une application de sauvegarde et de restauration dune table de base de donnes qui fonctionne depuis la ligne de commande. Pour enregistrer les informations en retour dans la source de donnes JDBC, voir Enregistrement dans une source de donnes JDBC des modifications charges depuis un TextDataFile, page 3-5.
3-3
qui ont t importes depuis un fichier texte, dans ce fichier ou dans un autre fichier. Vous pouvez exporter les donnes dun QueryDataSet ou dun ProcedureDataSet dans un fichier texte. Il est galement possible de rsoudre les donnes dun TableDataSet dans une table SQL existante. Lexportation des donnes dans un fichier texte est gre diffremment de la rsolution dans une table SQL. QueryDataSet et TableDataSet sont des composants StorageDataSet. Quand des donnes sont fournies lensemble de donnes, le StorageDataSet surveille les informations dtat des lignes (supprime, insre ou modifie) pour toutes les lignes. Quand les donnes sont rsolues dans une source de donnes comme un serveur SQL, les informations dtat des lignes sont utilises pour dterminer comment les lignes sont ajoutes, retires ou modifies dans la table SQL. Quand une ligne a t correctement rsolue, elle passe ltat rsolue (RowStatus.UPDATE_RESOLVED, RowStatus.DELETE_RESOLVED ou RowStatus.INSERT_RESOLVED). Si le StorageDataSet est une nouvelle fois rsolu, les lignes dj rsolues ne sont pas prises en compte, sauf si des modifications leur ont t apportes depuis la prcdente rsolution. Quand des donnes sont exportes dans un fichier texte, toutes les donnes de la vue en cours sont crites dans un fichier texte et les informations dtat des lignes ne sont pas modifies. Lexportation des donnes dans un fichier texte prend en compte les critres de tri et de filtre en cours. Si un critre de tri est spcifi, les donnes sont enregistres dans le fichier texte dans lordre spcifi par le critre de tri. Si lordre des lignes est important, retirez le critre de tri avant dexporter les donnes. Si un critre de filtre est spcifi, seules les donnes vrifiant le critre de filtre sont enregistres. Cela est utile pour enregistrer des sous-ensembles de donnes dans des fichiers distincts, mais cela peut provoquer une perte de donnes si un fichier filtr remplace malencontreusement un fichier de donnes existant.
Attention
Retirez les critres de filtre avant denregistrer si vous voulez renregistrer toutes les donnes dans le fichier dorigine.
Les colonnes BLOB ne sont pas exportes, elles sont ignores lorsque dautres champs sont exports.
3-4
Enregistrement dans une source de donnes JDBC des modifications charges depuis un TextDataFile
Par dfaut, les donnes sont charges partir dun TextDataFile avec le statut deRowStatus.Loaded. Lappel de la mthode saveChanges() dun QueryDataSet ou dun ProcedureDataSet nenregistrera pas les modifications faites dans un TextDataFile car ces lignes ne sont pas encore considres comme insres. Pour permettre aux modifications dtre enregistres et pour que toutes les lignes charges depuis TextDataFile aient le status INSERTED, dfinissez la proprit TextDataFile.setLoadAsInserted(true). Dsormais, quand la mthode saveChanges() dun QueryDataSet ou dun ProcedureDataSet sera appele, les donnes seront enregistres par retour dans la source de donnes. Pour davantage dinformations sur lutilisation de QueryResolver pour enregistrer des modifications dans une table SQL, voir Personnalisation de la logique de rsolution par dfaut, page 8-16.
3-5
3-6
Chapitre
Chapitre4
Pour vous servir des tutoriels portant sur les bases de donnes dcrits dans cette documentation, vous devez installer le pilote JDBC JDataStore. Le pilote JDBC InterClient peut galement tre utilis. Cette section prsente la configuration de JDataStore et dInterClient dans le cadre des tutoriels. Sun a travaill en association avec des fournisseurs de bases de donnes et doutils de bases de donnes pour crer une API indpendante du gestionnaire de bases de donnes. Comme ODBC (lquivalent Microsoft du JDBC), JDBC est bas sur la norme X/Open SQL CLI (Call Level Interface). Il y a certaines diffrences entre JDBC et ODBC : JDBC est une API entirement Java qui est rellement multiplate-forme. ODBC est une interface en langage C qui doit tre implmente de manire native. La plupart des implmentations ne fonctionnent que sur des plates-formes Microsoft. La plupart des pilotes ODBC ncessitent linstallation dun ensemble complexe de modules et de paramtres de registre sur la station de travail client. JDBC est une implmentation entirement en Java qui peut sexcuter directement en local ou depuis un serveur distant centralis. JDBC permet une maintenance et un dploiement plus simple que ODBC. JDBC est reconnu par les principaux fournisseurs de bases de donnes, de connectivit et doutils, dont Oracle, Sybase, Informix, InterBase, DB2. Plusieurs socits, dont Borland, ont des pilotes JDBC. Il est possible dutiliser des pilotes ODBC existants grce au lien JDBC-ODBC fourni par Sun. Lutilisation de ce lien JDBC-ODBC nest cependant pas une solution idale car elle ncessite linstallation de pilotes ODBC et dentres de
4-1
registre. Les pilotes ODBC sont galement implments de manire native ce qui compromet la gestion multiplate-forme et la scurit des applets. Les composants DataExpress de JBuilder sont implments en utilisant lAPI de connexion de base de donnes Sun (JDBC). Pour crer une application de donnes Java, le paquet JDBC sql de Sun doit tre accessible. Si la connexion avec le serveur de base de donnes se fait via un pilote ODBC, le logiciel de lien JDBC-ODBC de Sun est galement ncessaire. Pour davantage dinformations sur JDBC ou le lien JDBC-ODBC, visitez la page JDBC Database Access API ladresse http://java.sun.com/ products/jdbc/.
Le pilote ODBC se trouve dans une DLL non portable. Cela peut convenir pour un dveloppement local, mais ne convient pas pour des applets ou des solutions entirement Java. Lors de la connexion une base de donnes locale non SQL, comme celles de Paradox ou de Visual dBASE, utilisez un pilote ODBC appropri au type de table et au niveau daccs en conjonction avec le logiciel de lien JDBC-ODBC.
Remarque
Quand vous navez plus besoin dune connexion une base de donnes, appelez explicitement, dans lapplication, la mthode Database.closeConnection(). Ainsi, la connexion JDBC nest pas laisse ouverte lorsque cela nest pas ncessaire et le recyclage de linstance de cette connexion JDBC devient possible.
4-2
1 Crez un nouveau projet et les fichiers de lapplication en utilisant lexpert Application. Vous pouvez galement suivre ces instructions pour ajouter la connexion de donnes un projet et une application existant dj. Pour crer un nouveau projet et les fichiers de lapplication : a Choisissez Fichier|Fermer dans le menu JBuilder afin de fermer les applications ouvertes.
Si vous neffectuez pas cette tape avant la suivante, les fichiers de la nouvelle application sont ajouts au projet existant.
b Choisissez Fichier|Nouveau et double-cliquez sur licne Application pour lancer lexpert application.
Acceptez ou modifiez les valeurs par dfaut pour les adapter vos besoins.
2 Ouvrez le concepteur dinterface utilisateur en slectionnant le fichier cadre (par exemple, Cadre1.java) dans le volet contenu, puis en slectionnant longlet Conception en bas de lAppBrowser. 3 Slectionnez longlet DataExpress de la palette de composants et cliquez sur le composant Database. 4 Cliquez dans la fentre du concepteur pour ajouter le composant Database lapplication.
Ceci ajoute la ligne de code suivante dans la classe Cadre :
Database database1 = new Database();
4-3
4-4
Obtenez le nom dutilisateur et le mot de passe ds que souvre lapplication. Pour cela, appelez openConnection() la fin de la mthode jbInit() du cadre principal. Si vous nouvrez pas la connexion de manire explicite, louverture sera tente la premire fois quun composant ou un ensemble de donnes aura besoin de donnes. Les tapes suivantes dcrivent la manire de procder pour dfinir, via le concepteur dinterface utilisateur, les proprits de connexion la base de donnes JDataStore exemple, Employee.
Remarque
Pour utiliser la base de donnes exemple, vous devez vous assurer que votre systme est configur pour JDataStore. Si ce nest dj fait, voir Configuration de JDataStore, page 4-7.
1 Slectionnez database1 dans larborescence des composants. 2 Slectionnez la valeur de la proprit connection dans linspecteur et cliquez sur les points de suspension (...) pour ouvrir lditeur de la proprit Connection. 3 Dfinissez les proprits suivantes :
Proprit
Pilote
Description
Le nom de la classe du pilote JDBC correspondant lURL ; pour cet exemple, slectionnez dans la liste com.borland.datastore.jdbc.DataStoreDriver. LURL (Universal Resource Locator) de la base de donnes, pour cet exemple. La valeur par dfaut est jdbc:borland:dslocal:directoryAndFile.jds. Cliquez sur le bouton Parcourir pour slectionner la base de donnes JDataStore locale, qui se trouve dans <jbuilder>/samples/JDataStore/ datastores/employee.jds. Utilisez le bouton Parcourir pour slectionner ce fichier afin dviter les erreurs de frappe. Une fois slectionn, lURL a laspect suivant : Unix :
URL
4-5
4 Cliquez sur le bouton Tester la connexion pour vrifier que les proprits de connexion ont t correctement dfinies. Les rsultats de lessai de connexion sont affichs ct du bouton Tester la connexion.
Si vous ne parvenez pas vous connecter la base de donnes exemple, veillez configurer votre ordinateur pour quil utilise la base de donnes JDataStore exemple. Voir Configuration de JDataStore, page 4-7, pour plus dinformations.
5 Une fois la connexion russie, cliquez sur OK pour sortir de la bote de dialogue et crire les proprits de connexion dans le code source.
Si vous avez suivi lexemple, le code source doit avoir laspect suivant :
database1.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor( "jdbc:borland:dslocal: <jbuilder>/samples/JDataStore/datastores/employee.jds", "admin", "", false, "com.borland.datastore.jdbc.DataStoreDriver"));
6 Slectionnez un composant DBDisposeMonitor dans longlet dbSwing supplmentaires et cliquez sur le volet Contenu pour lajouter lapplication.
Le DBDisposeMonitor fermera le JDataStore lorsque la fentre sera ferme.
Lorsquune connexion une URL de base de donnes russit, vous pouvez utiliser le pilote de base de donnes pour examiner les mta-informations JDBC de la base de donnes ou ses objets schma dans le JDataStore, comme vous pouvez excuter des instructions SQL pour examiner et modifier les donnes des tables existantes.
4-6
Configuration de JDataStore
Configuration de JDataStore
Pour afficher et explorer le contenu du JDataStore, utilisez lExplorateur JDataStore. Pour dmarrer lExplorateur JDataStore, choisissez Outils| Explorateur DataStore. Pour ouvrir le JDataStore exemple, naviguez jusqu <jbuilder>/samples/JDataStore/datastores/employee.jds. Pour davantage dinformations sur lExplorateur JDataStore, voir, dans le Guide du dveloppeur de JDataStore, Administration de JDataStore.
La version actuelle dInterClient utilise un pilote JDBC de type 4. Les anciens pilotes de type 3 sont obsoltes. Tous les dveloppements venir se feront avec le pilote de type 4. Les dveloppeurs peuvent dployer leurs clients InterClient de deux faons : Les applets Java sont des programmes Java inclus dans une page HTML avec la balise <APPLET>. Ils sont servis par un serveur web, visualiss et utiliss sur un systme client dans un navigateur web compatible Java. Cette mthode de dploiement ne ncessite pas dinstallation manuelle du paquet InterClient sur le systme client. En revanche, elle ncessite la prsence dun navigateur web compatible Java sur le systme client. Les applications Java sont des programmes Java autonomes excuts sur un systme client. Cette mthode de dploiement requiert linstallation du paquet InterClient et du JRE (Java Runtime Environment) sur le systme client. Le JRE inclut le gestionnaire de pilotes JDBC. Comme API entirement Java pour InterBase, InterClient permet le dveloppement client/serveur indpendamment de la plate-forme pour lInternet ou les intranets dentreprises. Un pilote entirement Java prsente par rapport un pilote en code natif lavantage de pouvoir dployer une applet InterClient sans charger de pilote JDBC spcifique
4-7
la plate-forme sur chaque systme client (les serveurs web envoient automatiquement les classes InterClient avec les applets). De plus, il nest pas ncessaire de grer des bibliothques de bases de donnes natives ce qui simplifie ladministration et la maintenance des applications. Comme partie dune applet Java, InterClient peut tre actualis dynamiquement ce qui diminue encore le cot du dploiement et de la maintenance dune application.
4-8
Ne transgressez pas les contraintes de la base de donnes. Les bases de donnes exemple mettent en uvre de nombreuses contraintes sur les valeurs des donnes, comme cest le cas dans une application relle. Ces contraintes interviennent dans tous les exemples o vous ajoutez, insrez ou modifiez les donnes de la table employee et essayez denregistrer les modifications dans la table du serveur. La table EMPLOYEE est frquemment utilise dans les exemples de ce manuel. Les contraintes suivantes sappliquent la table employee : Tous les champs sont obligatoires (il faut saisir des donnes) sauf PHONE_EXT. EMP_NO est gnr, il nest donc pas ncessaire de le saisir pour les nouveaux enregistrements. Cest galement la cl primaire, il ne faut donc pas le modifier. Intgrit rfrentielle. DEPT_NO doit exister dans la table Department. JOB_CODE, JOB_GRADE, JOB_COUNTRY doivent exister dans la table JOB. SALARY doit tre suprieur ou gal au champ min_salary de la table job pour les champs correspondants job_code, job_grade et job_country de la table job. FULL_NAME est gnr par la requte, il nest donc pas ncessaire de le saisir. La table CUSTOMER est galement utilise dans les tutoriels de bases de donnes. CUST_NO est gnr, il ne faut donc pas le saisir pour les nouveaux enregistrements. Lorsque vous travaillez avec les tables exemple, il est plus prudent de ne modifier que les champs LAST_NAME, FIRST_NAME et PHONE_EXT dans les enregistrements existants. Pour voir les mtadonnes des tables exemple,
2 Double-cliquez sur lURL de la base de donnes pour ouvrir une connexion la base. 3 Dveloppez le nud Tables pour voir les informations relatives chacune des tables exemple.
4-9
Les pilotes dsinstalls sont prsents en rouge dans la liste Pilotes de la bote de dialogue Proprits de la connexion et ne peuvent pas tre slectionns pour tre utiliss dans JBuilder. Vous devez les installer en suivant les instructions du fabricant avant de les configurer dans JBuilder.
1 Ouvrez JBuilder et choisissez Outils|Configuration Entreprise. 2 Cliquez sur longlet Pilotes base de donnes dans la bote de dialogue Configuration Entreprise.
Longlet Pilotes base de donnes affiche les fichiers .config de tous les pilotes des bases de donnes alors dfinis.
3 Cliquez sur Ajouter pour ajouter un nouveau pilote, puis sur Nouveau pour crer un nouveau fichier de bibliothque pour le pilote. Le fichier bibliothque est utilis pour ajouter le pilote la liste des bibliothques ncessaires aux projets.
Remarque
Vous pourriez aussi crer une nouvelle bibliothque en utilisant Outils|Configurer les bibliothques, mais, comme vous devez ensuite utiliser Configuration Entreprise pour driver le fichier .config, il est plus simple de tout faire au mme endroit.
4 Tapez le nom et slectionnez lemplacement du nouveau fichier dans la bote de dialogue Cration dune nouvelle bibliothque. 5 Cliquez sur Ajouter et naviguez jusqu lemplacement du pilote. Vous pouvez slectionner le rpertoire contenant le pilote et tous ses fichiers associs ou slectionner seulement le fichier archive du pilote. Les deux fonctionnent. JBuilder extraira les informations dont il a besoin.
4-10
6 Cliquez sur OK pour fermer le navigateur de fichiers. La nouvelle bibliothque saffiche en bas de la liste des bibliothques, slectionne. 7 Cliquez sur OK. JBuilder cre un nouveau fichier .library dans le rpertoire /lib de JBuilder, en utilisant le nom que vous avez indiqu (par exemple, InterClient.library). Il vous ramne la page Pilotes base de donnes qui affiche le nom du fichier .config correspondant, driv du fichier bibliothque (par exemple, InterClient.config). 8 Slectionnez le nouveau fichier .config dans la liste des pilotes de base de donnes, et cliquez sur OK. Le fichier .config est plac dans le rpertoire /lib/ext de JBuilder. 9 Fermez JBuilder et relancez-le pour que les modifications apportes aux pilotes de bases de donnes prennent effet, et que le nouveau pilote soit plac dans le chemin des classes de JBuilder.
Important
Si vous apportez des modifications au fichier .library aprs la gnration du fichier .config, vous devrez rgnrer le fichier .config laide de Configuration Entreprise, puis redmarrer JBuilder.
1 Dmarrez JBuilder et fermez tous les projets ouverts. 2 Choisissez Projet|Proprits du projet par dfaut. 3 Slectionnez longlet Bibliothques ncessaires sur la page Chemins et cliquez sur Ajouter. 4 Slectionnez le nouveau pilote JDBC dans la liste des bibliothques et cliquez sur OK. 5 Cliquez sur OK pour fermer la bote de dialogue Proprits du projet par dfaut.
Remarque
Vous pouvez aussi ajouter le pilote JDBC un projet existant. Il suffit douvrir le projet, de choisir Projet|Proprits du projet et dutiliser la mthode prcdente. Maintenant, JBuilder et le nouveau pilote JDBC sont configurs pour fonctionner ensemble. Ltape suivante consiste crer ou ouvrir un projet utilisant ce pilote, lui ajouter un composant Database et dfinir sa proprit connection afin quil puisse utiliser ce pilote pour accder aux donnes. Pour un exemple montrant comment faire, voir Connexion une base de donnes en utilisant des pilotes JDBC InterClient, page 4-13.
4-11
Le composant Database gre la connexion JDBC avec un serveur SQL. Il est ncessaire toute application de base de donnes utilisant les donnes dun serveur. JDBC, lAPI dapplication de base de donnes Sun, est une bibliothque de composants et de classes dveloppe par Sun pour accder des sources de donnes distantes. Les composants sont rassembls dans le paquet java.sql et reprsentent un cadre gnrique daccs de bas niveau aux bases de donnes SQL. LAPI JDBC dfinit des classes Java reprsentant les connexions de bases de donnes, les instructions SQL, les ensembles de rsultats, les mtadonnes de bases de donnes, etc. Elle permet au programmeur Java de produire des instructions SQL et de traiter les rsultats. JDBC est lAPI principale daccs aux bases de donnes en Java. LAPI JDBC est implmente via un gestionnaire de pilotes qui peut grer plusieurs pilotes se connectant diffrentes bases de donnes. Pour davantage dinformations sur JDBC, visitez le site de Sun consacr lAPI daccs aux bases de donnes JDBC, ladresse http://java.sun.com/products/jdbc/. JBuilder utilise lAPI JDBC pour accder aux informations stockes dans les bases de donnes. La plupart des composants et classes daccs aux donnes de JBuilder utilisent lAPI JDBC. Ces classes doivent donc tre correctement installes pour utiliser les composants de connexion aux bases de donnes JBuilder. De plus, pour connecter votre application de base de donnes un serveur distant, un pilote JDBC appropri est ncessaire. Les pilotes peuvent tre regroups en deux catgories : les pilotes implments en utilisant des mthodes natives qui font le lien entre les bibliothques daccs existantes et les pilotes entirement Java. Les pilotes qui ne sont pas entirement raliss en Java doivent sexcuter sur le systme client (local). Les pilotes entirement Java peuvent tre chargs sur le serveur ou localement. Un pilote entirement crit en Java prsente lavantage de pouvoir tre tlcharg comme partie dune applet et, de plus, il est indpendant de la plate-forme. Certaines versions de JBuilder proposent des pilotes JDBC. Consultez le site web Borland, ladresse http://www.borland.fr/jbuilder/, pour des informations sur la disponibilit des pilotes JDBC dans les diffrentes versions de JBuilder ou contactez le support technique de lditeur de votre logiciel serveur pour savoir sil existe des pilotes JDBC. Certaines versions de JBuilder proposent les options de pilote suivantes : DataStoreDriver DataStoreDriver est le pilote JDBC de la base de donnes JDataStore. Le pilote gre laccs local et distant. Les deux types daccs demandent un nom dutilisateur.
Remarque
Le nom dutilisateur peut tre nimporte quelle chane. Si aucun utilisateur na t ajout la table des utilisateurs du store, il est inutile den fournir un. Cependant, pour un store transactionnel, une chane non nulle doit tre fournie comme nom dutilisateur.
4-12
Pour savoir comment se connecter une base de donnes en utilisant le pilote JDataStore, voir Chapitre 17, Tutoriel : Cration dune application de base de donnes lmentaire. InterClient InterClient est un pilote JDBC qui vous permet de vous connecter InterBase. InterClient peut tre install en excutant le programme dinstallation InterClient. Une fois install, InterClient peut accder aux donnes exemples InterBase laide du ConnectionDescriptor. Pour plus dinformations sur la connexion une base de donnes en utilisant InterClient, voir Connexion une base de donnes en utilisant des pilotes JDBC InterClient, page 4-13. Vous pouvez connecter les applications JBuilder des tables SQL locales ou distantes, ou aux bases de donnes cres par dautres applications Borland comme C++ Builder ou Delphi. Pour ce faire, dterminez la base de donnes laquelle votre application doit se connecter et connectez-vous cette base de donnes en utilisant sa connexion URL.
1 Veillez suivre les tapes de Configuration dInterBase et InterClient, page 4-7, et de Ajout dun pilote JDBC JBuilder, page 4-10, afin que votre systme soit en mesure daccder aux fichiers InterBase exemple. 2 Fermez tous les projets et crez une nouvelle application, ou ajoutez la connectivit un projet et une application existants.
Vous pouvez crer les fichiers dun nouveau projet et dune nouvelle application en choisissant Fichier|Nouveau et en double-cliquant sur licne Application. Acceptez toutes les valeurs par dfaut. JBuilder
4-13
cre les fichiers ncessaires et les affiche dans le volet projet de lAppBrowser. Le fichier Cadre1.java souvre dans le volet contenu. Cadre1.java contiendra les composants de linterface utilisateur de lapplication.
3 Cliquez sur longlet Conception, en bas du volet contenu, Cadre1.java tant slectionn. 4 Slectionnez longlet DataExpress dans la palette de composants. Cliquez sur le composant Database. 5 Cliquez un endroit quelconque du volet contenu, ou concepteur dinterface utilisateur, pour ajouter le composant Database votre application. 6 Dfinissez la proprit connection du composant Database pour spcifier le pilote JDBC, lURL de connexion, le nom dutilisateur et le mot de passe.
LURL de connexion JDBC est la faon quutilise JDBC pour spcifier lemplacement dun fournisseur de donnes JDBC (ex., un serveur SQL). Elle peut contenir absolument toutes les informations ncessaires ltablissement de la connexion, y compris le nom dutilisateur et le mot de passe. Pour dfinir la proprit connection,
Valeur
interbase.interclient.Driver Naviguez jusquau fichier exemple InterBase, employee.gdb, situ dans votre rpertoire InterBase/ examples. Lentre du champ URL doit ressembler : UNIX : jdbc:interbase://localhost//usr/interbase/examples/ employee.gdb Windows : jdbc:interbase://localhost/D:\InterBaseCorp\ InterBase\examples\database\employee.gdb SYSDBA masterkey
4-14
c Cliquez sur le bouton Tester la connexion pour vrifier que les proprits de connexion ont t correctement dfinies.
Le rsultat de la tentative de connexion est affich ct du bouton Tester la connexion. Voir Messages derreur de connexion courants, page 4-22, pour connatre les solutions certains problmes de connexion courants.
d Une fois la connexion russie, cliquez sur OK pour sortir de la bote de dialogue et crire les proprits de connexion dans le code source.
Astuce
Lorsquune connexion une URL de base de donnes russit, vous pouvez utiliser le pilote de base de donnes pour explorer les tables et les mtadonnes des bases de donnes ou ses objets schma, comme vous pouvez excuter des instructions SQL pour parcourir et modifier les donnes des tables existantes.
4-15
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes, page 5-12 Utilisation des procdures stockes, page 6-1 La plupart des tutoriels et des applications exemples utilisent une connexion Database au JDataStore EMPLOYEE exemple, comme dcrit ici. Pour la plupart des applications de bases de donnes, vous encapsulerez probablement le Database et dautres composants DataExpress dans un module de donnes plutt que de les ajouter directement dans le cadre dune application. Pour davantage dinformations sur lutilisation du module de donnes du paquet DataExpress, voir Chapitre 10, Utilisation des modules de donnes pour simplifier laccs aux donnes.
4-16
fournies. La bote de dialogue saffiche lorsque vous appelez sa mthode showDialog(). Cela vous permet de dterminer le moment auquel elle saffiche. Veillez la prsenter tt dans votre application, avant que tout composant visuel ne tente douvrir votre base de donnes et dafficher des donnes. Le concepteur nappelle pas showDialog(), si bien que vous devez spcifier les informations sur le nom dutilisateur et le mot de passe dans le ConnectionDescriptor lors de lactivation du concepteur.
4-17
proprits consacres la gestion du pool de connexions, par exemple, les proprits spcifiant les nombres maximal et minimal de connexions. Lorsque vous utilisez JdbcConnectionPool, vous devez dfinir la proprit connectionFactory. Cela permet JdbcConnectionPool de crer des objets javax.sql.PooledConnection. La dfinition de la proprit connectionFactory doit faire rfrence une implmentation de javax.sql.ConnectionPoolDataSource (comme JdbcConnectionFactory). La proprit connectionFactory peut galement tre dfinie avec la proprit dataSourceName. La proprit dataSourceName accepte une String, qui sera recherche dans le service dannuaire JNDI pour fournir limplmentation de javax.sql.ConnectionPoolDataSource. Pour obtenir une connexion partir du pool, vous appellerez habituellement JdbcConnectionPool.getConnection(). La connexion renvoye par cette mthode ne supporte pas les transactions distribues mais peut fonctionner avec nimporte quel pilote JDBC. JDBCConnectionPool fournit galement le support des transactions distribues (XA), mais cette fonctionnalit nest disponible que si JDBCConnectionPool est utilis en conjonction avec le pilote JDBC JDataStore, et nest utile que combin un gestionnaire de transactions distribues tel que Borland Enterprise Server. Pour plus dinformations sur le support XA de JDBCConnectionPool, voir Mise en pool des connexions et support des transactions distribues dans le Guide du dveloppeur JDataStore. JdbcConnectionFactory est une implmentation de javax.sql.ConnectionPoolDataSource. Il sert crer des objets javax.sql.PooledConnection pour limplmentation dun pool de connexions, comme JDBCConnectionPool. JDBCConnectionPool et JDBCConnectionFactory fonctionnent habituellement ensemble, mais chacun peut tre utilis sparment. Le dsappariement de ces deux composants offre plus de souplesse. Par exemple, JDBCConnectionFactory peut tre utilis avec un autre composant de mise en pool des connexions qui utilise une stratgie diffrente de JDBCConnectionPool. JDBCConnectionFactory peut tre utilis avec nimporte quelle implmentation JDBC 2.0 du pool de connexions permettant dimplmenter javax.sql.ConnectionPoolDataSource (comme JDBCConnectionFactory) afin de fournir les javax.sql.PooledConnections. Dautre part, la stratgie de mise en pool utilise par JDBCConnectionPool peut servir avec une autre implmentation de factory de connexion. JDBCConnectionPool peut tre utilis avec nimporte quel pilote JDBC sil fournit un composant factory de connexion implmentant javax.sql.ConnectionPoolDataSource.
4-18
Maintenant que vous avez une vue gnrale des classes impliques dans la mise en pool des connexions, il est temps de vous en dire plus sur leur fonctionnement : La mthode JdbcConnectionPool.getConnection() essaie dviter la charge associe louverture dune nouvelle connexion en utilisant une connexion dj prsente dans le pool. Lorsquune connexion est recherche dans le pool, la recherche aboutit si le nom dutilisateur est gal au nom dutilisateur qui a servi crer la connexion existant dans le pool. Le mot de passe nest pas pris en compte dans cette recherche de lutilisateur. Une nouvelle connexion est sollicite de la factory uniquement si la recherche dans le pool choue. La mise en pool des connexions est une API relativement simple mais trs puissante. La majorit du travail difficile, comme le suivi des connexions du pool et la dcision dutiliser une connexion existant dans le pool ou den ouvrir une nouvelle, est pris en charge de manire totalement interne. Lorsquune application utilise la mise en pool des connexions, chaque connexion doit toujours tre ferme explicitement lorsquelle ne sert plus. Cela lui permet de retourner au pool pour une utilisation ultrieure, ce qui amliore les performances. La factory qui cr les connexions pour le pool doit utiliser les mmes proprits pour toutes les connexions, lexception du nom dutilisateur et du mot de passe. Il sen suit quun pool de connexions accde une seule base de donnes et que toutes ses connexions partagent les mmes dfinitions de proprits de connexion JDBC (mais peuvent diffrer sur les noms dutilisateur/mots de passe).
Sorties historiques
JdbcConnectionPool et JdbcConnectionFactory possdent des proprits PrintWriter. La majorit des sorties historiques prennent la forme suivante :
[<hashcode de linstance de la classe>]:<nom de la classe>.<nom de la mthode>(...)
4-19
Toutes les valeurs hexadcimales affiches entre les crochets droits ([ ]) dans les fichiers historiques sont les valeurs hashCode() pour un Object.
4-20
} catch (Exception ex) { ex.printStackTrace(); } return con; } public static ModuleDeDonnees1 getDataModule() { if (myDM == null) { myDM = new ModuleDeDonnees1(); } return myDM; } public static JdbcConnectionPool getPool() { return pool; } }
Vous crirez sans doute le code de la logique de lapplication dans un fichier source spar. Le fragment de code suivant montre comment solliciter des connexions auprs du pool et, ensuite, comment tre certain que les connexions sont renvoyes au pool. Il montre galement comment tre certain que le pool est arrt quand lapplication se termine.
public class doSomething { static ModuleDeDonnees dm = null; public doSomething() { } public static void main(String args[]) { // Plusieurs des mthodes appeles ici peuvent dclencher des exceptions, // une gestion des exceptions est donc ncessaire. try { // Instancie le module de donnes dm = new ModuleDeDonnees(); java.sql.Connection con = null; // Cette application obtient 100 connexions // et les renvoie au pool. for (int i=0; i<100; i++){ try { // Obtient une connexion con = dm.getPool().getConnection(); } catch(Exception e) { e.printStackTrace(); } finally{ // Renvoie la connexion au pool con.close(); } } } catch (Exception x) { x.printStackTrace(); } finally{ try {
4-21
// Arrte le pool avant que // lapplication ne se ferme. dm.getPool().shutdown(); } catch (Exception ex) { ex.printStackTrace(); } } } }
4-22
Chapitre
Ce chapitre est consacr lutilisation de larchitecture DataExpress de JBuilder pour extraire des donnes dune source de donnes et fournir des donnes une application. Les composants dans les paquets DataExpress encapsulent la fois la connexion entre lapplication et sa source de donnes, et le comportement requis pour manipuler les donnes. Pour crer une application de base de donnes, vous devez extraire les donnes stockes dans la source de donnes et en crer une copie que lapplication puisse manipuler localement. Lorsque les donnes sont trouves par un processus dacquisition, elles sont mises en cache dans le DataSet. Toutes les modifications apportes au DataSet cach sont suivies de sorte que les implmentations du processus de rsolution connaissent celles qui demandent une insertion, une mise jour ou une suppression dans la source de donnes. Dans JBuilder, un sous-ensemble des donnes de la source de donnes est extrait dans une sous-classe du StorageDataSet de JBuilder. La sous-classe de StorageDataSet utilise dpend de la manire dobtenir les informations. Selon lapproche acquisition/rsolution, seules deux interactions sont requises entre lapplication de base de donnes et la source de donnes : la connexion initiale pour acqurir les donnes et la connexion finale pour enregistrer (rsoudre) les modifications dans la source de donnes. La connexion entre le client composant DataSet et la source de donnes peut tre interrompue aprs lacquisition, et na besoin dtre rtablie que pour la dure de la transaction de rsolution. Les composants DataExpress fournissent galement le support de la liaison de donnes directe pour les composants dbSwing. Il suffit de dfinir une proprit dans linspecteur pour lier les donnes aux composants visuels.
Extraction des donnes dune source de donnes
5-1
Dans certains exemples de ce chapitre, un pilote JDataStore est utilis pour accder aux donnes dun JDataStore. Dans dautres, un pilote JDBC est utilis pour accder aux donnes de tables InterBase. Ces deux options prsentent des avantages. Votre choix dpend des besoins de votre application. Avec les deux options, Vous pouvez directement connecter des composants visuels. Vous disposez dun accs aux donnes offrant toutes les fonctionnalits, dont matre-dtail, tri, filtrage et contraintes. Vous pouvez suivre les modifications apportes aux donnes extraites de sorte quelles puissent tre correctement rsolues dans la source de donnes.
5-2
QueryDescriptor Lobjet QueryDescriptor stocke les proprits de la requte, y compris la base de donnes interroger, la chane de requte excuter et ventuellement les paramtres de la requte. Le composant QueryDataSet dispose de caractristiques prdfinies permettant de lire les donnes dune source de donnes JDBC. Toutefois, les caractristiques prdfinies (sous la forme du rsolveur par dfaut) vont au-del de la simple lecture des donnes. Elles gnrent galement les requtes SQL INSERT, UPDATE et DELETE adquates afin denregistrer les modifications dans la source de donnes aprs lopration de lecture. Les proprits suivantes de lobjet QueryDescriptor affectent lexcution de la requte. Ces proprits peuvent tre initialises visuellement en utilisant lditeur de la proprit query. Pour une description de lditeur de la proprit query et de ses outils et proprits, voir Dfinition des proprits dans la bote de dialogue query, page 5-4.
Proprit
database query paramtres executeOnOpen
Effet
Spcifie sur quel objet de connexion Database appliquer la requte. Une instruction SQL, gnralement une instruction SELECT. Un ReadWriteRow optionnel utilis pour renseigner les paramtres, sutilise avec les requtes paramtres. Oblige le QueryDataSet excuter la requte lors de son ouverture. Cette option est utile pour afficher des donnes relles la conception. Cette option peut galement tre active lexcution. Une valeur entire optionnelle qui dfinit la mthode de chargement des donnes dans lensemble de donnes. Les options possibles sont : Charger toutes les lignes : charge toutes les donnes en une seule fois. Charger les lignes de faon asynchrone : provoque la lecture des lignes de lensemble de donnes dans un thread distinct. Cela permet daccder aux donnes de lensemble de donnes et de les afficher alors que le composant QueryDataSet est en train de lire des lignes dans la connexion de base de donnes. Charger si ncessaire : charge les lignes quand elles sont ncessaires. Charger une ligne la fois : charge la demande et remplace la ligne prcdente par la ligne en cours. Option utile pour les applications traitant de gros volumes de donnes par lots.
loadOption
Un QueryDataSet peut tre utilis de trois manires diffrentes pour lire les donnes : Requtes sans paramtres. La requte est excute et les lignes sont lues dans le QueryDataSet.
5-3
Les requtes paramtres : Des variables sont utilises dans linstruction SQL et des valeurs sont spcifies pour sy substituer. Pour davantage dinformations sur les requtes paramtres, voir Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes, page 5-12. Lecture dynamique de groupes de dtail. Les enregistrements dun ensemble de donnes dtail sont lus la demande et stocks dans lensemble de donnes dtail. Pour davantage dinformations, voir Lecture des dtails, page 9-7.
Pour davantage dinformations, voir la rubrique com.borland.dx.sql.dataset.QueryDescriptor dans la Rfrence de la bibliothque de composants DataExpress.
La page Requte
La page Requte propose les options suivantes : La liste droulante Base de donnes affiche le nom de tous les objets Database instancis auxquels peut se lier ce composant QueryDataSet. Cette proprit doit tre initialise pour que la requte sexcute. Pour
5-4
instancier un composant Database, voir Chapitre 4, Connexion une base de donnes. La slection dun objet Database rend utilisables les boutons Constructeur SQL et Parcourir les tables. Cliquez sur le bouton Constructeur SQL pour afficher le constructeur SQL. Le constructeur SQL offre une reprsentation visuelle de la base de donnes, et permet de crer une instruction SQL en slectionnant les colonnes, en ajoutant une clause Where, Order By ou Group By, et en affichant et testant linstruction SQL gnre. Lorsque vous cliquez sur OK, linstruction SQL cre avec le constructeur SQL est place dans le champ Instruction de la bote de dialogue Requte. Cliquez sur le bouton Parcourir les tables pour afficher la bote de dialogue Tables et colonnes disponibles. Cette bote de dialogue montre la liste des tables de la Database spcifie et les colonnes de la table slectionne. Les boutons Coller la table et Coller la colonne permettent de crer rapidement linstruction de requte en collant dedans le nom de la table slectionne (en cliquant sur le bouton Coller la table) ou de la colonne slectionne (en cliquant sur le bouton Coller la colonne) la position en cours du curseur dinsertion. Ce bouton est estomp et inaccessible lorsque le champ Base de donnes affiche la valeur <aucun>. Slectionnez un objet Database dans cette zone pour rendre ce bouton disponible. Instruction SQL est la reprsentation sous la forme dune chane Java de linstruction SQL (gnralement une instruction SELECT). Entrez linstruction de requte portant sur la base de donnes dsigne par la liste droulante Base de donnes. Utilisez le bouton Parcourir les tables pour coller rapidement les noms de table ou de colonne dans linstruction de requte. Cest une proprit obligatoire qui doit contenir une instruction SQL correcte. Si linstruction SQL ne renvoie pas densemble rsultat, une exception est gnre. Lexemple suivant dinstruction SQL simple est utilis frquemment dans cette documentation. Cette instruction slectionne trois champs de la table EMPLOYEE :
SELECT emp_no, last_name, salary FROM employee
Loption Excuter la requte ds louverture dtermine si la requte est excute automatiquement quand le composant QueryDataSet est ouvert. Cette option est coche par dfaut, ce qui permet laffichage de donnes relles dans le concepteur dinterface utilisateur quand le composant QueryDataSet est li un composant orient donnes.
5-5
Options de chargement sont des valeurs entires dfinissant la mthode de chargement des donnes dans lensemble de donnes. Les options possibles sont :
a Charger toutes les lignes : charge toutes les donnes en une seule fois. b Charger les lignes de faon asynchrone : provoque la lecture des lignes de lensemble de donnes dans un thread distinct. Cela permet daccder aux donnes de lensemble de donnes et de les afficher alors que le composant QueryDataSet est en train de lire des lignes dans la connexion de base de donnes. c Charger si ncessaire : charge les lignes quand elles sont ncessaires. d Charger une ligne la fois : charge la demande et remplace la ligne prcdente par la ligne en cours. Option utile pour les applications traitant de gros volumes de donnes par lots.
Lorsque Placer le texte SQL dans lensemble de ressources est coch, au moment de sortir de lditeur de la proprit query, la bote de dialogue Cration dun ResourceBundle saffiche. Slectionnez un type de bundle de ressources. Quand vous choisissez le bouton OK, le texte SQL est crit dans un fichier ressource afin que vous puissiez continuer utiliser du code source pour du SQL persistant dans certaines applications. Pour davantage dinformations sur cette caractristique, voir Placer le texte SQL dans lensemble de ressources, page 5-7. Si cette option nest pas coche, la chane SQL est crite dans lobjet QueryDescriptor sous la forme dune chane place dans le code source. Cliquez sur le bouton Tester la requte pour tester linstruction de requte et les autres proprits de la bote de dialogue pour la base de donnes spcifie. Le rsultat (Succs ou Echec) est affich dans la zone grise en dessous du bouton Tester la requte. Si la zone en dessous du bouton indique Succs, la requte peut sexcuter. Si elle indique Echec, recherchez parmi les informations saisies dans la requte sil y a des erreurs de frappe ou des oublis.
La page Paramtres
Dans la page Paramtres, vous pouvez slectionner un ReadWriteRow ou un ensemble de donnes qui servira renseigner les paramtres utiliss dans les requtes paramtres. Les valeurs de paramtre sont spcifies par linstanciation dun objet ReadWriteRow. Dans la liste droulante, slectionnez lobjet ReadWriteRow (ou la sous-classe ReadWriteRow) contenant les valeurs appliquer aux paramtres de votre requte.
5-6
Figure 5.2
Page Paramtres
Tout ReadWriteRow, tel un ParameterRow, un DataSet et un DataRow, peut tre utilis comme paramtres de requte ou de procdure. Dans un ParameterRow, les colonnes sont simplement configures avec les mthodes addColumns et setColumns. Les DataSet et DataRow ne doivent tre utiliss que sils contiennent dj les colonnes avec les donnes voulues. Pour un exemple dutilisation, voir Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes, page 5-12.
5-7
Pour simplifier les choses, le JDK propose deux sous-classes ResourceBundle pratiques utiliser : ListResourceBundle et PropertyResourceBundle. La classe ResourceBundle mme est une classe abstraite. Pour crer effectivement un bundle, il faut donc driver ResourceBundle et spcifier limplmentation concrte des fonctions qui lisent dans llment employ pour stocker vos ressources, par exemple une chane. Vous pouvez stocker des ressources dans ce bundle en cliquant avec le bouton droit de la souris sur une proprit et en spcifiant la cl. JBuilder crit alors les chanes dans le fichier ressource en utilisant le format appropri au type. Si vous slectionnez ListResourceBundle, un fichier .java est gnr et ajout au projet. Avec ListResourceBundle, les messages (ou les autres ressources) sont stocks dans un tableau deux dimensions dans un fichier source java. ListResourceBundle est galement une classe abstraite. Pour crer un bundle qui puisse tre charg, il faut driver de ListResourceBundle et implmenter la mthode getContents(), qui gnralement se contente de pointer sur un tableau deux dimensions de la forme cl-objet. Pour lexemple prcdent, il faut crer la classe :
package myPackage; public class myResource extends ListResourceBundle { Object[][] contents = { {"Hello_Message", "Comment allez-vous?"} } public Object[][] getContents() { return contents; } }
Si vous slectionnez PropertyResourceBundle, un fichier de proprits est cr. PropertyResourceBundle est une classe concrte, ce qui signifie quil nest pas ncessaire de crer une autre classe pour lutiliser. Pour les bundles de ressources qui sont des proprits, le stockage des ressources seffectue dans des fichiers portant lextension .properties. Quand vous implmentez un bundle de ressources ayant cette forme, il suffit de fournir un fichier de proprits portant le nom correct et de le stocker au mme endroit que les fichiers de classe du paquet. Pour lexemple ci-dessus, il faut crer un fichier myResource.properties et le placer dans CLASSPATH ou dans le fichier zip/jar avec les autres classes du paquet myPackage. Cette forme de bundle de ressources peut stocker des chanes mais elles sont charges beaucoup plus lentement quavec une implmentation base sur une classe comme ListResourceBundle. Cette solution est nanmoins apprcie car elle ne ncessite pas de manipulation du code source ni de recompilation. Le contenu du fichier des proprits la forme suivante :
# comments Hello_message=Comment allez-vous ?
5-8
A chaque fois que vous enregistrez le texte SQL dun QueryDescriptor, JBuilder cre automatiquement un nouveau fichier appel SqlRes.java. Il place le texte de la chane SQL dans SqlRes.java et cre une balise sous forme dune chane unique qui est insre dans le texte. Par exemple, pour linstruction de slection SELECT * FROM employee, comme saisie prcdemment, au moment o OK est choisi le fichier SqlRes.java est cr et a la forme suivante :
public class SqlRes extends java.util.ListResourceBundle { static final Object[][] contents = { { "employee", "select * from employee" }}; static final java.util.ResourceBundle res = getBundle("untitled3.SqlRes"); public static final String getStringResource(String key) { return res.getString(key); } public Object[][] getContents() { return contents; } }
Si linstruction SQL est modifie, les modifications sont enregistres dans SqlRes.java. Aucune modification du code lintrieur de jbInit() ne sera ncessaire car la chane balise est invariante. Pour davantage dinformations sur les bundles de ressources, choisissez Aide|Rfrence Java dans laide de JBuilder pour voir la description JavaDoc de java.util.ResourceBundle. Slectionnez ensuite le paquet java.util et la classe ResourceBundle.
5-9
a Initialisez la proprit Resolver avec un QueryResolver. b Initialisez la proprit UpdateMode de ce QueryResolver UpdateMode.KEY_COLUMNS.
Ces actions limitent la mthode optimiste utilise pour les accs simultans mais rduit le nombre de paramtres dfinis pour une opration de modification/suppression. Dfinissez la proprit useTransactions de votre Database par false. Par dfaut, cette proprit est true lorsque la base de donnes supporte les transactions. Quand elle est true, chaque instruction dinsertion, de
5-10
Dveloppement dapplications de bases de donnes
suppression ou de mise jour est traite comme une transaction distincte, valide automatiquement. Quand vous dfinissez useTransactions par false, les instructions sont toutes traites en une seule transaction.
Remarque
Dans ce cas, vous devez appeler la mthode commit() de Database ou de Connection pour terminer la transaction (ou appeler rollback() pour abandonner toutes les modifications). Dsactivez lindicateur resetPendingStatus dans la mthode Database.saveChanges() afin dobtenir davantage de gains en performances. Si cet indicateur est dsactiv, DataExpress nefface pas ltat RowStatus pour toutes les lignes insres/ supprimes/modifies. Cela nest souhaitable que si vous nappelez pas saveChanges() pour de nouvelles modifications de lensemble de donnes sans appeler dabord refresh.
1 Slectionnez le QueryDataSet dans le concepteur, cliquez dessus avec le bouton droit de la souris et choisissez Activer le concepteur. 2 Cliquez sur le bouton Continuer toutes les mtadonnes dans le concepteur de colonne.
La requte est alors analyse et plusieurs affectations de proprits sont ajoutes au code. Pour davantage dexplications sur le bouton Continuer toutes les mtadonnes, voir Utilisation du concepteur de colonne pour rendre persistantes des mtadonnes, page 7-4. Pour initialiser ces proprits sans utiliser le concepteur,
1 Initialisez NONE la proprit metaUpdate du StorageDataSet. 2 Attribuez la proprit tableName du StorageDataSet le nom de la table pour les requtes monotables. 3 Initialisez la proprit rowID de Column des colonnes afin quelles identifient les lignes de manire unique et cohrente. 4 Modifiez la chane de la requte afin dinclure les colonnes ncessaires lidentification des lignes (voir le point prcdent) si elles ny apparaissent pas dj. De telles colonnes doivent tre marques comme invisibles laide de la proprit visible ou de la proprit hidden de Column.
5-11
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
5 Initialisez les proprits de colonne precision, scale et searchable. Ces proprits ne sont pas ncessaires si la proprit metaDataUpdate est dfinie par autre chose que NONE. 6 Dfinissez la proprit tableName de Column pour une requte multitable. 7 Dfinissez la proprit serverColumnName de Column par le nom de la colonne de la table physique correspondante si la requte utilise des alias pour les colonnes.
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
Une instruction SQL paramtre contient des variables, appeles paramtres, dont la valeur peut changer lexcution. Une requte
5-12
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
paramtre utilise ces variables la place de valeurs de donnes littrales, comme celles utilises dans une clause WHERE pour la comparaison, qui apparaissent dans une instruction SQL. Ces variables sont appeles paramtres. Gnralement, les paramtres remplacent les valeurs de donnes spcifies dans linstruction. Il faut spcifier la valeur de ce paramtre avant dexcuter la requte. Lexcution de la requte en spcifiant diffrents jeux de valeurs permet dobtenir diffrents ensembles de donnes pour une mme requte. Pour comprendre les requtes paramtres, il est indispensable de comprendre comment les donnes sont fournies un DataSet ; lisez donc, si ce nest dj fait, le Chapitre 2, Les applications de bases de donnes JBuilder, et Interrogation dune base de donnes, page 5-2. Ce qui suit traite spcifiquement des requtes paramtres. En plus des instructions fournies par la section Paramtrage dune requte, page 5-13, les aspects suivants des requtes paramtres seront abords : Utilisation de paramtres R-excution dune requte avec des paramtres modifis Requtes paramtres dans les relations matre-dtail
Avant de poursuivre par les tapes ci-dessous, il est ncessaire que vous vous soyez familiaris avec lutilisation des outils de conception. Pour ce faire, nous vous recommandons dexcuter le tutoriel du Chapitre 16, Tutoriel : Importation et exportation des donnes dun fichier texte. La version finale de lapplication cre par les tapes suivantes est disponible dans le projet exemple ParameterizedQuery.jpr, situ dans le rpertoire /samples/DataExpress/ParameterizedQuery de linstallation de JBuilder.
Cration de lapplication
Pour crer lapplication,
5-13
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
3 Acceptez toutes les valeurs par dfaut pour crer une nouvelle application. 4 Slectionnez longlet Conception pour activer le concepteur dinterface utilisateur. 5 Cliquez sur le composant Database dans la page DataExpress de la palette de composants, cliquez ensuite nimporte o dans le concepteur dinterface utilisateur pour ajouter ce composant votre application.
Ouvrez lditeur de la proprit Connection du composant Database en cliquant dans linspecteur sur les points de suspension (...) situs ct de la valeur de la proprit connection.
Valeur
com.borland.datastore.jdbc.DataStoreD river Naviguez jusqu <jbuilder>/samples/ JDataStore/datastores/employee.jds dans le champ URL local. Entrez votre nom non obligatoire
La bote de dialogue Connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vrifier que les proprits de connexion sont correctement dfinies. Les rsultats de la tentative de connexion saffichent ct du bouton. Quand la connexion russit, cliquez sur OK. Si vous souhaitez voir le code qui a t gnr, cliquez sur longlet Source et cherchez le code de ConnectionDescriptor. Cliquez sur longlet Conception pour continuer. Pour plus dinformations sur la connexion aux bases de donnes, voir Chapitre 4, Connexion une base de donnes.
1 Ajoutez un composant ParameterRow de la page DataExpress lapplication. 2 Cliquez sur licne dextension, gauche de parameterRow1 dans larborescence des composants, pour afficher les colonnes contenues dans ParameterRow.
5-14
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
3 Slectionnez <nouvelle colonne> et dfinissez dans linspecteur les proprits suivantes pour la nouvelle colonne :
Nom de la proprit
columnName dataType default
Valeur
low_no INT 15
Pour voir le code gnr par le concepteur pour cette tape, cliquez sur longlet Source et cherchez la mthode jbInit(). Cliquez sur longlet Conception pour continuer.
1 Slectionnez nouveau <nouvelle colonne> pour ajouter la deuxime colonne du ParameterRow et dfinissez les proprits suivantes de cette colonne :
Nom de la proprit
columnName dataType default
Valeur
high_no INT 50
Valeur
database1 select emp_no, first_name, last_name from employee where emp_no >= :low_no and emp_no <= :high_no
4 Cliquez sur longlet Paramtres de lditeur de la proprit Query. 5 Slectionnez parameterRow1 dans la liste droulante afin de lier lensemble de donnes au ParameterRow. 6 Slectionnez longlet Requte et cliquez sur le bouton Tester la requte pour vrifier que la requte est excutable. Quand la zone ct du bouton indique Succs, cliquez sur OK pour fermer le dialogue.
5-15
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
7 Ajoutez un composant DBDisposeMonitor de la page dbSwing supplmentaires. Le DBDisposeMonitor fermera le JDataStore lorsque la fentre sera ferme. 8 Dfinissez la proprit dataAwareComponentContainer du DBDisposeMonitor par this.
1 Cliquez sur un composant TableScrollPane dans longlet dbSwing de la palette. Dposez-le au centre du panneau dans le concepteur dinterface utilisateur.
Vrifiez que sa proprit constraints est dfinie par CENTER.
2 Dposez un composant JdbTable de longlet dbSwing au centre du composant tableScrollPane1 et dfinissez sa proprit dataSet par queryDataSet1.
Vous remarquerez que la table dans le concepteur affiche des donnes dynamiques.
3 Choisissez Excuter|Excuter le projet pour excuter lapplication et parcourir lensemble de donnes. 4 Fermez lapplication excute.
Pour ajouter les composants permettant de paramtrer la requte lexcution,
1 Slectionnez le composant JPanel dans longlet Conteneurs Swing de la palette et placez-le dans larborescence des composants, directement sur licne gauche de contentPane(BorderLayout).
Cela garantit que le JPanel (jPanel1) sera bien ajout linterface utilisateur principale et non au tableScrollPane1 qui occupe actuellement tout le panneau de linterface utilisateur.
5-16
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
Si tableScrollPane1 se rapetisse subitement, vrifiez que sa proprit constraints vaut toujours CENTER.
6 Donnez la proprit columns de jdbTextField1 la valeur 10 pour quil ait une largeur fixe. Donnez sa proprit text la valeur 10 pour correspondre la valeur minimum par dfaut prcdemment saisie. 7 Ajoutez un JLabel de la page Swing jPanel1. Cela permet didentifier jdbTextField1 comme champ minimum. 8 Cliquez sur jLabel1 dans le concepteur dinterface utilisateur et faites-le glisser juste au-dessus de jdbTextField1. 9 Dfinissez la proprit text de jLabel1 par Valeur minimum. Tirez sur la poigne de redimensionnement noire au milieu du ct gauche et augmentez la largeur du libell jusqu ce que lon voie tout le texte. 10 Ajoutez un autre JdbTextField et un autre JLabel au jPanel1 pour la valeur maximum. Faites glisser ces deux composants vers la droite du panneau. 11 Dfinissez la proprit columns de jdbTextField2 par 10, et sa proprit text par 50. 12 Dfinissez la proprit text de jLabel2 par Valeur maximum et augmentez sa largeur pour voir tout le texte. 13 Alignez les quatre composants.
Maintenez enfonce la touche CTRL et cliquez sur les deux composants jLabel1 et jdbTextField1. Cliquez avec le bouton droit et choisissez Aligner gauche pour aligner les cts gauches. (Quand vous utilisez la disposition null pendant le prototypage dune interface utilisateur, les options dalignement sont accessibles dans le menu contextuel.) Alignez gauche jLabel2 et jdbTextField2. Alignez en haut les deux champs de texte et les deux libells.
5-17
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
14 Ajoutez un JButton de la page Swing jPanel1. Placez ce bouton au milieu, mi-chemin des deux champs de texte. Dfinissez sa proprit text par Mise jour.
Cliquer sur ce bouton permet de mettre jour les rsultats de la requte paramtre partir des valeurs entres dans les champs de saisie des valeurs minimum et maximum.
15 Slectionnez longlet Evnements de linspecteur, slectionnez le champ actionPerformed et double-cliquez sur la valeur du champ pour crer un vnement actionPerformed() dans le code source. Le volet Source saffiche et le curseur apparat entre les accolades ouvrante et fermante du nouvel vnement actionPerformed().
Ajoutez le code suivant pour obtenir ceci :
void jButton1_actionPerformed(ActionEvent e) { try { // modifie les valeurs dans la ligne de paramtres // et rafrachit laffichage parameterRow1.setInt("low_no", Integer.parseInt(jdbTextField1.getText())); parameterRow1.setInt("high_no", Integer.parseInt(jdbTextField2.getText())); queryDataSet1.refresh(); } catch (Exception ex) { ex.printStackTrace(); } } }
Pour tester lexemple, entrez une nouvelle valeur dans le champ de saisie de la valeur minimum, puis cliquez sur le bouton Mise jour. La table naffiche que les valeurs suprieures la nouvelle valeur minimum. Entrez une nouvelle valeur dans le champ de saisie de la
5-18
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
valeur maximum, puis appuyez sur le bouton Mise jour. La table naffiche que les valeurs infrieures la nouvelle valeur maximum. Pour enregistrer vos modifications dans la source des donnes, vous devrez ajouter un QueryResolver. Voir Enregistrement des modifications dun QueryDataSet, page 8-3, pour savoir comment ajouter un bouton avec du code de rsolution, ou ajouter un composant JdbNavToolbar au volet Contenu et utiliser son bouton Enregistrer les modifications comme rsolveur de requte par dfaut.
Utilisation de paramtres
Pour affecter des valeurs aux paramtres dune requte paramtre, il faut dabord crer un ParameterRow et ajouter des colonnes nommes qui contiendront les valeurs transmettre la requte. Tout ReadWriteRow, tel un ParameterRow, un DataSet et un DataRow, peut tre utilis comme paramtres de requte ou de procdure. Dans un ParameterRow, les colonnes sont simplement configures avec les mthodes addColumns et setColumns. Les DataSet et DataRow ne doivent tre utiliss que sils contiennent dj les colonnes avec les donnes voulues. Les classes Row sont utilises de manire extensive dans lAPI DataExpress. Les classes ReadRow et ReadWriteRow sont utilises comme interfaces indiquant lutilisation voulue. En utilisant une hirarchie de classes, limplmentation est partage et il y a un lger avantage en performances par rapport lutilisation dinterfaces. Le texte suivant illustre la hirarchie des classes associe aux mthodes DataSet.
java.lang.Object +----com.borland.dx.dataset.ReadRow +----com.borland.dx.dataset.ReadWriteRow +----com.borland.dx.dataset.DataSet +----com.borland.dx.dataset.StorageDataSet +----com.borland.dx.sql.dataset.QueryDataSet
Les mthodes StorageDataSet traitent la structure des ensembles de donnes Les mthodes DataSet grent la navigation
5-19
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
Les mthodes ReadWriteRow permettent de modifier les valeurs des colonnes (cest--dire les champs) de la ligne en cours Les mthodes ReadWriteRow donnent accs aux valeurs des colonnes (cest--dire aux champs) de la ligne en cours TableDataSet et QueryDataSet hritent de toutes ces mthodes. Les classes Row donnent accs aux valeurs des colonnes par indice ou par nom de colonne. La spcification des colonnes par leur nom permet dcrire un code plus fiable et plus lisible. Laccs aux colonnes par nom nest pas aussi rapide que laccs par indice, mais reste raisonnable tant que le nombre des colonnes de lensemble de donnes ne dpasse pas 20 grce lutilisation dalgorithmes propritaires de mise en correspondance rapide du nom avec lindice. Il est prfrable dutiliser les mmes chanes pour tous les accs une mme colonne. Cela conomise de la mmoire et simplifie la saisie quand il y a de nombreuses rfrences la mme colonne. Le ParameterRow est transmis dans le QueryDescriptor. Lditeur de proprit query permet de slectionner une ligne de paramtres. Ldition dun composant ParameterRow, que ce soit lajout de colonnes ou la modification de ses proprits, peut seffectuer dans linspecteur ou dans le code. Vous pouvez, par exemple, crer un composant ParameterRow contenant deux champs, low_no et high_no. Il est possible de faire rfrence low_no et high_no dans la requte paramtre et de les comparer la valeur de nimporte quel champ de la table. Voir lexemple ci-dessous pour une illustration de lutilisation de ces valeurs. Les requtes paramtres JBuilder peuvent sexcuter en utilisant des paramtres nomms, des marqueurs de paramtres ou une relation matre-dtail. Les sections suivantes dcrivent brivement ces trois cas. En utilisant des paramtres nomms : Quand les marqueurs de paramtres de la requte sont spcifies par le caractre deux points (:) suivi dun nom alphanumrique, la mise en correspondance des noms de paramtres a lieu. La colonne du ParameterRow portant le mme nom que le marqueur de paramtre est utilise pour dfinir la valeur du paramtre. Dans linstruction SQL suivante, les valeurs slectionner sont transmises en utilisant des paramtres nomms :
SELECT * FROM employee where emp_no > :low_no and emp_no < :high_no
Dans cette instruction SQL, :low_no et :high_no sont le substitut de la valeur effective fournie linstruction lors de lexcution de la requte par lapplication. La valeur de ce champ peut provenir dun composant visuel ou avoir t gnre par du code. En mode conception, la valeur par dfaut de la colonne sera utilise. Quand un nom est affect un paramtre, il peut tre transmis la requte sans tenir compte de
5-20
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
lordre. JBuilder associe les paramtres lensemble de donnes dans le bon ordre au moment de lexcution. Dans Paramtrage dune requte, page 5-13, deux colonnes sont ajoutes au ParameterRow afin de contenir les valeurs minimum et maximum. Le descripteur de la requte spcifie que la requte ne doit renvoyer que les valeurs suprieures la valeur minimum et infrieures la valeur maximum. Avec les marqueurs de paramtres JDBC ? : Quand le marqueur de paramtre JDBC point dinterrogation (?) est utilis, la dfinition de la valeur des paramtres doit seffectuer strictement de gauche droite. Dans linstruction SQL suivante, les valeurs slectionner sont transmises avec les marqueurs de paramtres JDBC ? : SELECT * FROM employee WHERE emp_no > ? Dans cette instruction SQL, la valeur ? est le substitut de la valeur effectivement fournie par lapplication linstruction lors de son excution. La valeur de ce champ peut provenir dun composant visuel ou avoir t gnre par du code. Lorsquun marqueur de paramtre JDBC ? est utilis, les valeurs doivent tre transmises la requte en allant de la gauche vers la droite. A lexcution, JBuilder associe les paramtres la source des valeurs (un ReadWriteRow) dans cet ordre. La liaison des paramtres se traduit par lallocation de ressources pour linstruction et ses paramtres, la fois en local et sur le serveur, afin damliorer les performances lors de lexcution dune requte. Avec une relation matre-dtail : Par dfinition, les ensembles de donnes matre et dtail ont au moins un champ en commun. Ce champ est utilis comme une requte paramtre. Pour davantage dinformations sur la manire de spcifier ainsi des paramtres, voir Requtes paramtres dans les relations matre-dtail, page 5-22.
5-21
Utilisation de requtes paramtres pour obtenir des donnes dune base de donnes
Dans cet exemple, la valeur du paramtre :searchname peut tre dfinie par un composant de linterface utilisateur. Pour ce faire, votre code doit :
1 2 3 4
Obtenir la valeur du composant chaque fois quelle change. La placer dans une colonne dun objet ParameterRow. Fournir cet objet au QueryDataSet. Appeler refresh() pour le QueryDataSet.
Pour savoir comment faire cela avec les fichiers exemple de JBuilder, voir Paramtrage dune requte, page 5-13. Si les valeurs que vous voulez affecter au paramtre query se trouvent dans une colonne dun ensemble de donnes, vous pouvez utiliser cet ensemble de donnes en tant que votre ReadWriteRow dans le QueryDescriptor, naviguer dans lensemble de donnes et r-excuter la requte pour chaque valeur.
Dans cet exemple, :job_country correspond au champ que cet ensemble de donnes dtail utilise pour se relier lensemble de donnes matre. Il est possible de spcifier autant de paramtres et de champs de liaison matre que ncessaire. Dans une relation matre-dtail, le nom du paramtre doit toujours correspondre au nom de la colonne. Pour davantage dinformations sur les relations matre-dtail et le paramtre DelayedDetailFetch, voir Etablissement dune relation matre-dtail, page 9-1. Dans un descripteur de relation matre-dtail, la liaison seffectue implicitement. Liaison implicite signifie que les valeurs des donnes ne sont pas fournies explicitement par le programmeur, elles sont obtenues de la ligne en cours de lensemble de donnes matre et implicitement lies quand la requte dtail est excute. La liaison des paramtres se traduit par lallocation de ressources pour linstruction et ses paramtres, la fois en local et sur le serveur, afin damliorer les performances lors de lexcution dune requte. Si les valeurs que vous voulez affecter au paramtre query se trouvent dans une colonne dun ensemble de donnes (lensemble de donnes matre), vous pouvez utiliser cet ensemble de donnes en tant que votre ReadWriteRow dans le QueryDescriptor, naviguer dans lensemble de donnes et r-excuter la requte pour chaque valeur affiche dans lensemble de donnes dtail.
5-22
Chapitre
Dans une procdure stocke, une ou plusieurs instructions SQL sont encapsules en un seul endroit du serveur et peuvent sexcuter en groupe. Dans la version Client/Serveur de JBuilder, les composants ProcedureDataSet permettent daccder ou dacqurir les donnes de la base de donnes laide de procdures stockes existantes, en les appelant avec des squences dchappement de procdure JDBC ou en utilisant une syntaxe spcifique au serveur pour les appels de procdure. Pour excuter une procdure stocke sur une table SQL dont le rsultat est un ensemble de lignes, il faut les composants suivants. Il est possible de spcifier ces informations par code ou en utilisant les outils de conception JBuilder. Le composant Database encapsule une connexion de base de donnes via JDBC avec un serveur SQL et propose galement une gestion simplifie des transactions. Le composant ProcedureDataSet permet dexcuter la procdure stocke (avec ou sans paramtres) sur la base de donnes SQL et stocke le rsultat de lexcution dans la procdure stocke. Lobjet ProcedureDescriptor stocke les proprits de la procdure stocke, y compris la base de donnes interroger, les squences dchappement ou les appels des procdures stockes et tous les paramtres optionnels de la procdure stocke. Quand il fournit les donnes de sources JDBC, le composant ProcedureDataSet dispose de fonctions prdfinies pour lire les donnes dans une procdure stocke qui renvoie un curseur sur un ensemble de rsultats.
6-1
Les proprits suivantes de lobjet ProcedureDescriptor affectent lexcution des procdures stockes :
Proprit
database procedure
But
Spcifie lobjet de connexion Database sur lequel excuter la procdure. Une reprsentation sous forme dune chane Java de la squence dchappement ou de linstruction SQL de la procdure stocke provoquant lexcution de la procdure stocke. Un ReadWriteRow optionnel utilis pour remplir les paramtres. Ces valeurs peuvent provenir de tout DataSet ou ReadWriteRow. Entrane lexcution de la procdure ds louverture du ProcedureDataSet. Cette option est utile pour afficher des donnes relles la conception. Cette option peut galement tre active lexcution. La valeur par dfaut est true. Une valeur entire optionnelle qui dfinit la mthode de chargement des donnes dans lensemble de donnes. Les options possibles sont : 1 Charger toutes les lignes : charge toutes les donnes en une seule fois. 2 Charger les lignes de faon asynchrone : provoque la lecture des lignes de lensemble de donnes dans un thread distinct. Cela permet daccder aux donnes de lensemble de donnes et de les afficher alors que le composant QueryDataSet est en train de lire des lignes dans la connexion de base de donnes. 3 Charger si ncessaire : charge les lignes quand elles sont ncessaires. 4 Charger une ligne la fois : charge la demande et remplace la ligne prcdente par la ligne en cours. Option utile pour les applications traitant de gros volumes de donnes par lots.
paramtres executeOnOpen
loadOption
Un ProcedureDataSet peut sutiliser pour excuter des procdures stockes avec ou sans paramtres. Une procdure stocke avec paramtres peut obtenir la valeur de ses paramtres de tout DataSet ou ParameterRow. Pour un exemple, voir Utilisation de paramtres avec des procdures stockes Oracle PL/SQL, page 6-5. Utilisez le pilote de base de donnes pour parcourir ou modifier les objets schma spcifiques aux serveurs de bases de donnes, y compris les tables, les champs, les dfinitions de procdure stocke ou les index. Pour davantage dinformations sur le pilote de base de donnes, choisissez Outils|Pilote de base de donnes et consultez son aide en ligne. Les sujets suivants, relatifs aux procdures stockes, sont abords dans cette rubrique : Squences dchappement, instructions SQL et appels de procdure spcifiques au serveur Utilisation de procdures stockes InterBase
6-2
Utilisation de paramtres avec des procdures stockes Oracle PL/ SQL Utilisation des procdures stockes Sybase
Pour plus dinformations sur lutilisation de procdures stockes avec JDataStore, voir Procdures stockes et FDU dans le Guide du dveloppeur JDataStore.
6-3
Quand un serveur reconnat une syntaxe distincte pour les appels de procdure, vous pouvez utiliser cette syntaxe au lieu dune procdure stocke existante ou dune squence dchappement de procdure JDBC. Ainsi, une syntaxe spcifique au serveur peut avoir laspect suivant :
execute procedure PROCEDURENAME ?,?,?
Dans les deux derniers exemples, les indicateurs de paramtres (les points dinterrogation) peuvent tre remplacs par des paramtres nomms ayant la forme :NomParam. Pour un exemple dutilisation de paramtres nomms, voir Utilisation de paramtres avec des procdures stockes Oracle PL/SQL, page 6-5. Pour un exemple dutilisation de procdures stockes InterBase, voir Utilisation de procdures stockes InterBase, page 6-5.
6-4
Pour des exemples de procdures stockes InterBase plus complexes, utilisez le pilote de base de donnes pour parcourir les procdures de ce serveur. ORG_CHART est un exemple intressant. Il renvoie un ensemble de rsultats combinant les donnes de plusieurs tables. ORG_CHART est crit avec le langage InterBase de procdures et de dclencheurs qui contient les instructions SQL de manipulation de donnes, des structures de contrle et la gestion des exceptions. Les paramtres de sortie de ORG_CHART deviennent des colonnes de lensemble de donnes produit. Pour plus dinformations sur lcriture de procdures stockes InterBase, consultez la documentation du serveur InterBase.
6-5
Le paramtre de saisie INP doit tre spcifi dans le ParameterRow, mais pas la valeur spciale renvoye comme CURSOR REF. JBuilder utilise la valeur renvoye pour remplir de donnes le ProcedureDataSet. Le code suivant illustre la manire demployer un ParameterRow.
ParameterRow row = new ParameterRow(); row.addColumn( "INP", Variant.STRING, ParameterType.IN); row.setString("INP", "Input Value"); String proc = "{?=call MyFct1(?)}";
3 Slectionnez le fichier cadre dans le volet projet puis slectionnez longlet Conception. 4 Placez dans le volet contenu un composant ProcedureDataSet de longlet DataExpress. 5 Slectionnez la proprit procedure afin dafficher la bote de dialogue ProcedureDescriptor. 6 Slectionnez database1 dans la liste droulante des bases de donnes. 7 Entrez la syntaxe dchappement suivante dans la zone Instruction SQL ou Escape de procdure stocke ou dans le code :
{?=call MyFct1(?)}
8 Slectionnez longlet Paramtres de la bote de dialogue. Slectionnez le ParameterRow qui vient dtre dfini.
Consultez la documentation de votre serveur Oracle pour davantage dinformations sur le langage Oracle PL/SQL.
Exemple dapplication avec des procdures stockes spcifiques au serveur de la base de donnes
Une application exemple, situe dans le rpertoire <jbuilder>/samples/ DataExpress/ServerSpecificProcedures, contient un code intgrant des procdures stockes pour les bases de donnes JDataStore, Sybase, InterBase et Oracle.
6-6
Vous pouvez crer des implmentations de composants fournisseur/ rsolveur personnaliss pour EJB, des serveurs dapplications, SAP, BAAN, IMS, CICS, etc. Un projet exemple ayant un fournisseur et un rsolveur personnaliss se trouve dans le rpertoire /samples/DataExpress/CustomProviderResolver de votre installation de JBuilder. Le fichier exemple TestApp.java est une application avec un cadre contenant un JdbTable et un JdbNavToolBar. Ces deux composants visuels sont connects un composant TableDataSet dont les donnes sont fournies par un fournisseur personnalis (dfini dans le fichier ProviderBean.java), et sont enregistres avec un rsolveur personnalis (dfini dans le fichier ResolverBean.java). Cette application exemple lit les donnes et enregistre les modifications dans le fichier texte data.txt, un fichier simple, non dlimit. La structure de data.txt est dcrite dans le fichier interface DataLayout.java. Cette rubrique dcrit les fournisseurs de donnes personnaliss et explique comment ils peuvent tre utiliss comme fournisseurs dun TableDataSet et de tout DataSet driv de TableDataSet. La mthode principale implmenter est provideData(com.borland.dx.dataset.StorageDataSet dataSet, boolean toOpen). Cette mthode accde aux mtadonnes et charge les donnes relles dans lensemble de donnes.
6-7
Les proprits facultatives sont utiles lorsque vous enregistrez en retour vos modifications dans la source de donnes. Les proprits precision et
6-8
scale sont galement utilises par les composants DataSet des fins de contrainte et daffichage.
Appel de initData
Les arguments de la mthode ProviderHelp.initData(com.borland.dx.dataset.StorageDataSet dataSet, com.borland.dx.dataset.Column[], boolean, boolean, boolean) sont expliqus ci-aprs. dataSet est le StorageDataSet qui nous fournissons les donnes metaDataColumns est le tableau de Column cr avec les proprits qui nont pas besoin dtre ajoutes/intgres aux colonnes existant dj dans le DataSet updateColumns spcifie sil faut intgrer les colonnes dans des colonnes persistantes existantes de mme columnName keepExistingColumns spcifie sil faut garder les colonnes non persistantes Si keepExistingColumns est true, les colonnes non persistantes sont galement retenues. Plusieurs proprits du tableau de colonnes sont intgres aux colonnes existantes du StorageDataSet qui ont la mme valeur de la proprit name. Si le nombre, le type et la position des colonnes sont diffrents, cette mthode peut fermer le StorageDataSet associ. La proprit metaDataUpdate du StorageDataSet est examine lors de lappel de ProviderHelp.initData. Cette proprit contrle quelles proprits de Column redfinissent les proprits des colonnes persistantes prsentes dans le TableDataSet avant lappel de ProviderHelp.initData. Les valeurs correctes pour cette proprit sont dfinies dans linterface MetaDataUpdate.
6-9
Description
fournit seulement les mtadonnes fournit toutes les donnes fournit un maximum de n lignes
6-10
Chapitre
Chapitre7
Une colonne est une collection dinformations de mme type, par exemple une collection de numros de tlphone ou dintituls de postes professionnels. Une collection de composants colonne (Column) est gre par un composant StorageDataSet. Un objet colonne peut tre cr explicitement dans du code ou gnr automatiquement quand vous instanciez une sous-classe de StorageDataSet, par exemple un composant QueryDataSet lors de lexcution dune requte. Chaque objet Column possde des proprits qui dcrivent ou grent la colonne de donnes. Certaines des proprits dune colonne contiennent des mtadonnes (voir la dfinition plus bas) gnralement obtenues de la source de donnes. Dautres proprits contrlent laspect et ldition de la colonne pour les composants orients donnes.
Remarque
Les noms de classes abstraites ou de classes suprieures sont frquemment utiliss pour dsigner toutes leurs sous-classes. Par exemple, une rfrence un objet StorageDataSet dsigne une ou, selon les cas, toutes ses sous-classes : QueryDataSet, TableDataSet, ProcedureDataSet et DataSetView.
7-1
Le concepteur dinterface utilisateur fera des mises jour dynamiques pour les proprits daffichage du composant Column, comme color, width et caption. Pour davantage dinformations sur lobtention de mtadonnes, voir Obtention des mtadonnes, page 6-8. Pour plus de dtails sur lobtention de donnes relles, voir Obtention des donnes relles, page 6-9.
2 Double-cliquez sur le fichier Frame1.java dans le volet projet et cliquez sur longlet Conception en bas du volet droit de lAppBrowser. 3 Cliquez avec le bouton droit sur lobjet queryDataSet1 dans le volet contenu, choisissez Activer le concepteur dans le menu contextuel.
7-2
Cela affiche le concepteur de colonne pour lensemble de donnes prsent dans la fentre de conception. Pour la table exemple EMPLOYEE, le concepteur de colonne ressemble ce qui suit :
Pour dfinir une proprit dune colonne, slectionnez cette Column et entrez, ou slectionnez, la nouvelle valeur de la proprit. Linspecteur reflte les proprits (et les vnements) de la colonne slectionne. Par exemple,
1 Cliquez sur le bouton Proprits pour ouvrir la bote de dialogue Proprits afficher. 2 Cochez la proprit min pour quelle saffiche dans le concepteur de colonne et cliquez sur OK. 3 Allez jusqu la colonne min, entrez la date du jour dans le champ HIRE_DATE, en respectant le format de date suivant :
AAAA-MM-JJ hh:mm:ss.nnnnnnnnn o AAAA-MM-JJ reprsente lanne, le mois et le jour et hh:mm:ss.nnnnnnnnn reprsente lheure, les minutes, les secondes et, ventuellement, les nanosecondes.
7-3
columnName de toutes les Columns du DataSet et il gnre des mthodes get et set pour chacune dentre elles. La slection du bouton gnrateur de RowIterator ouvre une bote de dialogue qui offre des fonctionnalits ditration allges (faible consommation de mmoire et liaison rapide) garantissant un accs statique aux colonnes avec scurit des types. Les options de la bote de dialogue RowIterator prsentent les fonctions suivantes :
Tableau 7.1 Option
Etendre RowIterator
Pour davantage dinformations sur les RowIterator, voir la Rfrence de la bibliothque des composants DataExpress.
7-4
Les proprits tableName, schemaName et resolveOrder du QueryDataSet sont initialises si ncessaire. Toutes les colonnes deviennent persistantes avec diverses proprits initialises. Ces proprits sont precision, scale, rowId, searchable, tableName, schemaName, hidden, serverColumnName et sqlType. JBuilder extrait les mtadonnes automatiquement. Etant donn que certains pilotes JDBC sont lents pour rpondre aux demandes de mtadonnes, vous pouvez rendre les mtadonnes persistantes et indiquer DataExpress de ne pas les extraire. Si JBuilder paramtre ceci la conception et gnre le code ncessaire pour lexcution, les performances sont amliores.
Voir aussi
Appuyer sur le bouton Rendre toutes les mtadonnes dynamiques SUPPRIME LE CODE du fichier source. Cela retirera tout le code des dfinitions des proprits mentionnes dans la rubrique prcdente, ainsi que toutes les dfinitions des proprits concernant les mtadonnes nonces ci-dessus. En revanche, dautres proprits, comme editMask, ne sont pas modifies. Pour actualiser une requte aprs une modification de la table sur le serveur, vous devez tout dabord rendre dynamiques les mtadonnes puis les rendre persistantes afin dutiliser les nouveaux index crs dans la table de la base de donnes.
Remarque
7-5
Pour afficher le pilote de base de donnes, choisissez Outils|Pilote de base de donnes dans le menu JBuilder.
Lorsquune URL de base de donnes est ouverte, vous pouvez dvelopper larborescence pour afficher les objets enfant. Les colonnes sont les objets enfant dune table particulire dans la base de donnes. Comme dans la figure prcdente, lorsque lobjet Column est slectionn pour une table, la page Rsum du volet droit contient la liste des colonnes avec leurs types de donnes, tailles et autres. Slectionnez une colonne dans le volet gauche pour voir uniquement les informations concernant ce champ, comme dans la figure ci-dessous.
Pour avoir plus dinformations sur lutilisation du pilote de base de donnes, voir laide qui lui est consacre.
7-6
Dfinition des proprits des colonnes en utilisant les outils de conception visuelle de JBuilder
Linspecteur permet de manipuler les proprits dun objet Column. Pour affecter les proprits dune colonne :
1 Ouvrez (ou crez) un projet contenant lobjet StorageDataSet que vous voulez manipuler. Si vous crez un nouveau projet, vous pouvez suivre les instructions de Interrogation dune base de donnes, page 5-2. 2 Ouvrez le concepteur dinterface utilisateur en double-cliquant sur lobjet conteneur Frame dans le volet projet, puis en cliquant sur longlet Conception de lAppBrowser. 3 Dans le volet contenu, slectionnez le composant StorageDataSet. 4 Cliquez sur licne dextension ct du StorageDataSet pour afficher ses colonnes. 5 Slectionnez lobjet Column que vous voulez manipuler. Linspecteur affiche les proprits et vnements de la colonne. Dfinissez les proprits de votre choix.
2 Obtenez un tableau de rfrences aux objets Column existant dans le StorageDataSet en appelant la mthode getColumn(java.lang.String) du ReadRow. 3 Identifiez la ou les colonnes du tableau que vous voulez utiliser en lisant leurs proprits, par exemple en utilisant la proprit getColumnName() du composant Column. 4 Affectez les proprits des colonnes appropries.
7-7
Remarque
Si vous voulez que linitialisation de la proprit soit conserve la prochaine lecture des donnes, affectez la valeur true la proprit persist de la colonne. Ces tapes sont dcrites dans les chapitres suivants.
Colonnes persistantes
Une colonne persistante est un objet Column qui faisait dj partie dun StorageDataSet et dont la proprit persist a t dfinie true avant la fourniture de donnes. Si la proprit persist est dfinie aprs la fourniture des donnes, vous devez excuter une autre commande setQuery avec un nouveau queryDescriptor, pour que lapplication reconnaisse la persistance des colonnes. Un objet Column persistant permet de conserver le paramtrage des proprits de lobjet Column durant une opration de fourniture de donnes. Une colonne persistante ne provoque pas le gel des donnes des lignes pour cette colonne durant les oprations de fourniture de donnes. Normalement, un objet StorageDataSet cre automatiquement de nouveaux objets Column pour chaque colonne trouve dans les donnes fournies par la source de donnes. Il ne tient pas compte des objets Column ajouts explicitement au pralable ou crs automatiquement pour un lot prcdent de donnes. Cet abandon des objets Column antrieurs peut provoquer la perte du paramtrage de proprits de lancien objet Column que vous vouliez conserver. Pour viter cela, marquez une colonne comme persistante en affectant la valeur true sa proprit persist. Quand une colonne est persistante, lobjet Column nest pas abandonn lorsque de nouvelles donnes sont fournies lobjet StorageDataSet. Au contraire, lobjet Column existant est r-utilis pour contrler la mme colonne dans les donnes nouvellement fournies. La correspondance de colonne se base sur le nom de colonne. Toute colonne dfinie ou modifie en utilisant les outils de conception visuelle devient une colonne persistante. Les colonnes persistantes sont traites plus en dtail dans Garantie de la persistance des donnes, page 12-25. Vous pouvez crer explicitement des objets Column et les attacher un composant StorageDataSet en utilisant addColumn() pour ajouter une seule colonne ou setColumns() pour ajouter plusieurs colonnes en une seule fois. Si vous utilisez addColumn, vous devez dfinir la colonne comme persistante avant dobtenir les donnes de la source ; vous perdriez sinon toutes les proprits de la colonne lors de la lecture des nouvelles donnes. La proprit persist est initialise automatiquement par la mthode setColumns.
Remarque
Le concepteur dinterface utilisateur appelle la mthode StorageDataSet.setColumns() pour manipuler des colonnes. Si vous voulez charger et modifier votre application dans le concepteur dinterface
7-8
utilisateur, utilisez la mthode setColumns afin que les colonnes soient reconnues la conception. A lexcution, il ny a pas de diffrences entre setColumns et addColumn.
Lorsque vous tendez un StorageDataSet en cliquant sur son icne dextension dans le volet contenu, la liste des colonnes ne change pas automatiquement lorsque vous modifiez la chane de requte. Pour rafrachir la liste des colonnes en fonction des rsultats de la requte modifie, double-cliquez sur le QueryDataSet dans le volet contenu. Cela excute de nouveau la requte et ajoute toute nouvelle colonne trouve dans la requte modifie. Pour supprimer une colonne persistante inutile, slectionnez-la dans le volet contenu et appuyez sur la touche Suppr. Vous pouvez aussi slectionner la colonne dans le concepteur de colonne et cliquer sur le bouton Supprimer dans la barre doutils. Les actions suivantes sont dclenches : La colonne est marque comme non persistante ; Tout code qui dfinit les proprits de cette colonne est supprim ;
Manipulation des colonnes
7-9
Toute logique de gestionnaire dvnement place sur cette colonne est retire. Pour vrifier quune colonne persistante supprime ne fait plus partie du QueryDataSet, double-cliquez sur lensemble de donnes dans le volet contenu. Cela r-excute la requte et affiche toutes les colonnes dans le QueryDataSet rsultant.
Utilisation de colonnes persistantes pour ajouter des colonnes vides un ensemble de donnes
Vous pouvez, dans certains cas, ajouter au composant StorageDataSet une ou plusieurs colonnes qui ne sont pas fournies par la source de donnes et qui ne doivent pas tre rsolues avec la source de donnes. Par exemple, vous pouvez ajouter des colonnes supplmentaires dans les circonstances suivantes ou des faons suivantes : Ajouter une colonne supplmentaire pour des besoins internes lapplication. Pour cacher ces colonnes laffichage dans les composants orients donnes, affectez la valeur false la proprit visible de la Column. Construire un nouvel ensemble de donnes manuellement en ajoutant les colonnes ncessaires avant de calculer les donnes qui vont tre places dans ses lignes. Construire un nouvel ensemble de donnes pour une source de donnes personnalise qui nest pas gre par les modules dacquisition de JBuilder et ne peut donc pas fournir automatiquement de mtadonnes. Dans de tels cas, vous pouvez ajouter explicitement un objet Column lensemble de donnes avant ou aprs la fourniture de donnes. La valeur de columnName doit tre unique et ne peut dupliquer un nom dj existant dans les donnes fournies. De plus, si les donnes sont fournies aprs lajout de la colonne, marquez la colonne comme persistante afin quelle ne soit pas abandonne quand de nouvelles donnes seront fournies. Pour ajouter une nouvelle colonne manuellement avec du code source, suivez les instructions de la section Colonnes persistantes, page 7-8. Pour ajouter manuellement une colonne en utilisant les outils de conception visuelle de JBuilder,
1 Suivez les 3 premires tapes de la section Dfinition des proprits des colonnes en utilisant les outils de conception visuelle de JBuilder, page 7-7, afin dobtenir les mtadonnes des colonnes numres dans le volet contenu.
Vous pouvez sauter ces tapes si vous voulez ajouter des colonnes un ensemble de donnes vide.
3 Dans linspecteur, dfinissez la valeur de columnName, en vous assurant que la valeur saisie est diffrente des noms de colonne existants. 4 Affectez les autres proprits ncessaires cette nouvelle colonne.
JBuilder cre du code source pour un nouvel objet Column persistant et lattache lensemble de donnes. La nouvelle colonne existe avant mme que des donnes soient fournies. Comme son nom est diffrent des noms de colonne fournis, cette colonne nest pas remplie avec les donnes lors de la phase dacquisition ; dans toutes les lignes, cette colonne contient une valeur null.
7-11
7-12
Chapitre
Aprs avoir extrait les donnes dune source de donnes et les avoir modifies dans le StorageDataSet, vous pouvez enregistrer les modifications dans la source de donnes. Toutes les modifications mmorises dans un ensemble de donnes peuvent tre enregistres dans la source de donnes (par exemple un serveur SQL). Ce processus est appel rsolution. Un mcanisme sophistiqu de rconciliation permet de grer les problmes potentiels de modification. Entre le moment o le sous-ensemble de donnes local est extrait dune source de donnes et le moment o vous essayez denregistrer les donnes dans la source de donnes, diverses situations peuvent se produire et tre gres par la logique de rsolution. Par exemple, au moment denregistrer les donnes, il est possible que les mmes informations aient t modifies sur le serveur par un autre utilisateur. La rsolution doit-elle enregistrer les nouvelles informations sans en tenir compte ? Doit-elle afficher les informations modifies sur le serveur et les comparer avec vos modifications ? Doit-elle annuler vos modifications ? Selon lapplication, la logique des rgles de rsolution varie. La logique intervenant dans la rsolution des modifications peut tre assez complexe. Des erreurs peuvent se produire lors de lenregistrement, par exemple des violations de contrainte dintgrit du serveur ou des conflits de rsolution. Un conflit de rsolution peut se produire, par exemple, lors de la suppression dune ligne dj supprime ou de la modification dune ligne dj modifie par un autre utilisateur. JBuilder propose une gestion par dfaut de ces erreurs en positionnant lensemble
8-1
de donnes sur la ligne posant problme (si elle nest pas supprime) et en affichant lerreur qui a eu lieu dans une bote de message. Lors de la rsolution des modifications dans la source de donnes, ces modifications sont normalement regroupes dans ce quon appelle des transactions. DataExpress utilise par dfaut une seule transaction pour enregistrer dans la source de donnes toutes les insertions, suppressions et mises jour de lensemble de donnes. Pour disposer dun meilleur contrle, JBuilder permet de modifier le traitement par dfaut des transactions. DataExpress propose galement un mcanisme standard de rsolution compos de classes de base et dinterfaces. Vous pouvez les tendre en spcifiant une logique personnalise de rsolution si vous avez besoin dun contrle plus fin de la phase de rsolution. Ce mcanisme gnrique peut galement sadapter des sources de donnes non JDBC qui, gnralement, ne grent pas lutilisation de transactions. Ce chapitre dcrit les diffrents modes de rsolution : Enregistrement des modifications dun QueryDataSet, page 8-3, dcrit le mcanisme de rsolution standard propos par DataExpress et son traitement par dfaut des transactions. Quand une relation matre-dtail a t tablie entre des ensembles de donnes, il faut utiliser des procdures de rsolution particulires. Pour davantage dinformations, voir Enregistrement des modifications dans une relation matre-dtail, page 9-12. Enregistrement des modifications dans la source de donnes par une procdure stocke, page 8-6, dcrit la rsolution dans sa source de donnes des modifications apportes un ProcedureDataSet. Rsolution des donnes de plusieurs tables, page 8-10, indique les paramtrages ncessaires la rsolution des modifications quand une requte implique plusieurs tables. Utilisation des ensembles de donnes avec RMI (mise en flux), page 8-13, propose un moyen de placer les donnes dun ensemble de donnes dans un flux en crant un objet Java (DataSetData) contenant les donnes dun ensemble de donnes. Personnalisation de la logique de rsolution par dfaut, page 8-16, dcrit comment dfinir des rgles personnalises de rsolution en utilisant le composant QueryResolver et les vnements de rsolution. Exportation des donnes, page 3-3, dcrit comment exporter des donnes dans un fichier texte.
8-2
8-3
1 Crez une application de base de donnes simple, comme dcrit dans Accs aux donnes des exemples, page 11-2.
Si vous avez dj cr lapplication de base de donnes simple, il vous suffit de louvrir. Si vous navez pas termin les tapes crant lapplication, vous pouvez accder aux fichiers du projet complet dans le rpertoire /samples/DataExpress/QueryProvider de votre installation JBuilder.
Remarque
Vous pouvez gagner du temps en faisant une copie de sauvegarde de ces fichiers avant de les modifier car dautres exemples de ce manuel utilisent comme point de dpart lapplication de base de donnes cre dans Accs aux donnes des exemples, page 11-2.
2 Slectionnez le fichier cadre dans le volet contenu. 3 Ajoutez un composant JButton de la page Swing de la palette des composants. Dfinissez la proprit text du bouton par le texte Enregistrer les modifications. Reportez-vous limage de lapplication acheve au dbut de cet exemple pour avoir une ide de lemplacement des contrles dans linterface utilisateur. 4 Vrifiez que le bouton JButton est toujours slectionn, puis cliquez dans longlet Evnements de linspecteur. Slectionnez puis double-cliquez sur la mthode actionPerformed(). Cela fait passer la focalisation dans lAppBrowser du concepteur dinterface utilisateur au volet Source et affiche le squelette de la mthode actionPerformed().
8-4
Dveloppement dapplications de bases de donnes
Si vous avez utilis dautres noms pour les instances des objets, par exemple database1, remplacez-les en consquence.
5 Excutez lapplication en slectionnant Excuter|Excuter le projet. Lapplication se compile et affiche une fentre spare. Les donnes sont affiches dans une table, avec un bouton Enregistrer les modifications, la barre doutils et un libell barre dtat indiquant la position de la ligne en cours et le nombre de lignes.
Si des erreurs ont lieu la compilation, un volet apparat indiquant les lignes de code errones. Dans ce cas, lerreur provient probablement du code du bouton personnalis, vous devez donc vrifier si le code ci-dessus a t correctement saisi. Faites les corrections ncessaires et excutez lapplication. En excutant lapplication, vous pouvez remarquer les comportements suivants : Utilisez le clavier, la souris ou la barre doutils pour faire dfiler les donnes affiches dans la table. Le libell dtat sactualise en consquence. Vous pouvez redimensionner la fentre pour afficher davantage de champs ou les faire dfiler en utilisant la barre de dfilement horizontale. Modifiez les donnes affiches dans la table en insrant, supprimant et modifiant des donnes. Vous pouvez enregistrer les modifications sur le serveur en cliquant sur le bouton Enregistrer les modifications que vous avez cr, ou sur le bouton Enregistrer du composant JdbNavToolBar.
Remarque
Comme des contraintes de donnes sont dfinies dans la table employee, la sauvegarde peut chouer en fonction des modifications effectues. Comme dautres modifications peuvent entraner des erreurs, ne modifiez que les valeurs des colonnes FIRST_NAME et LAST_NAME dans les lignes existantes tant que vous ntes pas plus familier avec les contraintes dfinies sur cette table.
8-5
Enregistrement des modifications dans la source de donnes par une procdure stocke
Vous pouvez utiliser diffrentes implmentations de Resolver pour enregistrer les modifications apportes vos sources de donnes. QueryDataSets utilise par dfaut un QueryResolver pour enregistrer les modifications. Le rsolveur par dfaut peut tre remplac en dfinissant la proprit StorageDataSet.resolver. Cette section dcrit les fonctions de rsolution de base proposes par DataExpress pour les composants ProcedureDataSet. Elle dveloppe les concepts prsents dans Utilisation des procdures stockes, page 6-1, en explorant les diffrentes mthodes denregistrement des modifications dans une source de donnes. Dans cette section, le tutoriel dextraction est tendu en ajoutant un mcanisme de base de rsolution. Pour un composant ProcedureDataSet cela peut seffectuer de deux manires. Les sections suivantes dcrivent ces deux mthodes de manire plus dtailles. Un bouton activant le code de rsolution de base, ou un JdbNavToolBar dont le bouton Enregistrer effectue galement lopration de rsolution de requte de base. Voir Enregistrement des modifications avec un QueryResolver, page 8-6. Un ProcedureResolver ncessitant le codage spcifique dune procdure stocke dans la base de donnes pour laquelle les donnes doivent tre rsolues. Vous en trouverez un exemple dans Enregistrement des modifications avec un ProcedureResolver, page 8-8.
Ces trois procdures sont : insertProcedure est appele pour chaque ligne insrer dans le DataSet. Les paramtres utilisables dans un appel dune insertProcedure sont : La ligne insre telle quelle apparat dans lensemble de donnes. Le ParameterRow optionnel dans le ProcedureDescriptor. La procdure stocke doit tre conue pour insrer un enregistrement dans la, ou les tables appropries en fonction des donnes de cette ligne. Le ParameterRow peut tre utile pour un tat des sorties ou des paramtres dentre optionnels. updateProcedure est appele pour chaque ligne modifie dans le DataSet. Les paramtres utilisables dans un appel dune updateProcedure sont : La ligne modifie telle quelle apparat dans lensemble de donnes. La ligne dorigine telle quelle tait quand les donnes ont t fournies au DataSet. Le ParameterRow optionnel dans le ProcedureDescriptor. La procdure stocke doit tre conue pour actualiser un enregistrement dans la ou les tables appropries en fonction des donnes dorigine et des donnes modifies. Comme la ligne dorigine et la ligne modifie ont les mmes noms de colonne, la syntaxe des paramtres nomms a t tendue afin dindiquer la ligne de donnes voulue. Le paramtre nomm :ORIGINAL.CUST_ID indique ainsi le champ CUST_ID de la ligne des donnes dorigine alors que :CURRENT.CUST_ID dsigne ce mme champ dans la ligne des donnes modifies. De mme, un paramtre :parameter.CUST_ID indique le champ CUST_ID dans un ParameterRow. deleteProcedure est appele pour chaque ligne supprime du DataSet. Les paramtres utilisables dans un appel dune deleteProcedure sont : La ligne dorigine telle quelle tait quand les donnes ont t fournies au DataSet. Le ParameterRow optionnel dans le ProcedureDescriptor. La procdure stocke doit tre conue pour supprimer un enregistrement dans la ou les tables appropries en fonction des donnes de cette ligne. Un exemple de code utilisant cette mthode pour la rsolution de donnes dans une base de donnes se trouve ci-dessous dans Enregistrement des modifications avec un ProcedureResolver, page 8-8. Dans le cas dInterBase, voir galement Exemple : Utilisation de procdures stockes InterBase avec paramtres de retour, page 8-10.
8-7
1 Slectionnez le fichier cadre dans le volet contenu, puis slectionnez longlet Conception pour activer le concepteur dinterface utilisateur. 2 Slectionnez un composant ProcedureResolver de longlet Data Express de la palette des composants du volet contenu. Cliquez dans le volet contenu pour ajouter le composant lapplication. 3 Affectez la proprit database du ProcedureResolver la base de donnes instancie, database1, dans linspecteur. 4 Affectez la valeur DELETE_COUNTRY la proprit deleteProcedure, comme suit : a Slectionnez procedureResolver1 dans larborescence des composants et cliquez sur sa proprit deleteProcedure dans linspecteur. b Double-cliquez sur la valeur de la proprit deleteProcedure afin dafficher la bote de dialogue DeleteProcedure. c Affectez la valeur database1 la proprit Database. d Cliquez sur Parcourir les procdures puis double-cliquez sur la procdure nomme DELETE_COUNTRY.
Linstruction suivante est crite dans le champ Instruction SQL ou Escape de procdure stocke :
execute procedure DELETE_COUNTRY :OLD_COUNTRY
8-8
Le texte de la procdure peut tre affich avec le pilote de base de donnes (Outils|Pilote de base de donnes).
Remarque
Ne cliquez pas sur Tester la procdure, car cette procdure ne renvoie aucun rsultat.
5 Affectez la valeur INSERT_COUNTRY la proprit insertProcedure, comme suit : a Slectionnez, puis double-cliquez sur la proprit insertProcedure du ProcedureResolver pour ouvrir la bote de dialogue insertProcedure. b Affectez la valeur database1 au champ Database. c Cliquez sur Parcourir les procdures puis double-cliquez dans la procdure nomme INSERT_COUNTRY. d Modifiez le code gnr pour obtenir :
execute procedure INSERT_COUNTRY :COUNTRY, :CURRENCY Remarque
Ne cliquez pas sur Tester la procdure, car cette procdure ne renvoie aucun rsultat.
6 Affectez la valeur UPDATE_COUNTRY la proprit updateProcedure, comme suit : a Slectionnez, puis double-cliquez sur la proprit updateProcedure du ProcedureResolver pour ouvrir la bote de dialogue updateProcedure. b Affectez la valeur database1 la proprit Database. c Cliquez sur Parcourir les procdures puis double-cliquez dans la procdure nomme UPDATE_COUNTRY. d Modifiez le code gnr pour obtenir :
execute procedure UPDATE_COUNTRY :ORIGINAL.COUNTRY, :CURRENT.COUNTRY, :CURRENT.CURRENCY Remarque
Ne cliquez pas sur Tester la procdure, car cette procdure ne renvoie aucun rsultat.
7 Slectionnez procedureDataSet1 dans le volet projet. Affectez la valeur procedureResolver1 la proprit resolver. 8 Slectionnez procedureDataSet1. Dfinissez sa proprit metaDataUpdate par Aucun. 9 Choisissez Excuter|Excuter le projet afin dexcuter lapplication.
Quand vous excutez lapplication, vous pouvez parcourir, modifier, ajouter ou supprimer des donnes dans la table. Enregistrez les modifications effectues en utilisant le bouton Enregistrer les modifications de la barre doutils. Toutefois, il nest pas possible dans cet exemple de supprimer une valeur existante de la colonne COUNTRY en raison de lintgrit rfrentielle. Pour tester la procdure DELETE, ajoutez une nouvelle valeur la colonne COUNTRY puis supprimez-la.
Enregistrement des modifications dans la source de donnes
8-9
Appel de la procdure fct depuis diffrents pilotes : Visigenic et InterClient version 1.3 ou prcdentes
execute procedure fct ?
Si la procdure est appele via un pilote JDBC pur, la sortie est capture dans un ensemble de rsultats comportant une seule ligne. JBuilder autorise la syntaxe suivante pour grer les valeurs en sortie :
execute procedure fct ? returning_values ?
JBuilder capture alors lensemble de rsultats et initialise la valeur du paramtre spcifi par le second marqueur de paramtre. InterClient version 1.4 ou suivantes :
{call fct(?,?)}
O les marqueurs de paramtre doivent tre placs aprs les paramtres dentre.
8-10
La proprit tableName du StorageDataSet nest pas initialise. La proprit tableName est identifie par colonne. La proprit resolveOrder est un tableau de chanes qui spcifie lordre de rsolution dans le cas dune rsolution multitable. Les requtes INSERT et UPDATE utilisent lordre de ce tableau, les requtes DELETE utilisent lordre inverse de celui du tableau. Si une table est retire de la liste, les colonnes de cette table ne sont pas rsolues.
Remarques sur les types de liaisons entre les tables dune requte
Une requte SQL multitable dfinit gnralement un lien entre des tables dans la clause WHERE de la requte. Selon la nature du lien et la structure des tables, il y a quatre types diffrents de lien (en appelant la table primaire T1 et la table lie T2) : 1:1 Il y a exactement un enregistrement de T2 correspondant un enregistrement de T1 et inversement. Une base de donnes relationnelle peut employer cette organisation pour certaines tables soit dans un souci de clart ou cause dune limitation portant sur le nombre de colonnes par table. 1:M Il peut y avoir plusieurs enregistrements de T2 correspondant un enregistrement T1, mais un seul enregistrement de T1 correspond un enregistrement de T2. Exemple : chaque client peut avoir pass plusieurs commandes. M:1 Il y a un seul enregistrement de T2 qui correspond un enregistrement de T1, mais plusieurs enregistrements de T1 peuvent correspondre au mme enregistrement de T2. Exemple : chaque commande peut avoir un code produit qui est associ un nom de produit dans la table des produits. Cest un exemple de rfrence exprime directement en SQL. M:M Le cas le plus gnral. JBuilder adopte une approche simplifie pour la rsolution de plusieurs tables lies : JBuilder ne rsout que des liens de type 1:1. Nanmoins, comme il est difficile de dtecter le type de lien dcrit par une requte SQL donne, JBuilder suppose que toutes les requtes multitables sont de type 1:1.
8-11
Si les tables lies ne le sont pas par un lien de type 1:1, la rsolution doit tre gre de la manire suivante : 1:M Gnralement, il nest pas intressant de rpliquer les champs matre de chaque enregistrement dtail de la requte. A la place, crez un ensemble de donnes dtail spar, ce qui permet une rsolution correcte des modifications. M:1 En gnral, ce cas se gre en utilisant le mcanisme des rfrences. Cependant, si la rfrence est utilise uniquement pour laffichage (sans modifications de ces champs) elle peut tre gre par une requte multitable. Spcifiez dans le rowId dau moins une des colonnes de la table de rfrence quelle ne doit pas tre rsolue. M:M Ce type de relation entre tables se produit trs rarement, cest gnralement le rsultat dune erreur dans les spcifications.
Les rfrences de colonne semploient frquemment pour nommer une colonne calcule mais galement pour diffrencier des colonnes provenant de diffrentes tables et portant le mme nom.
SELECT T1.NO AS NUMBER, T2.NO AS NR FROM T1, T2
Si lalias de colonne est spcifi dans la chane de requte, il dfinit la valeur de la proprit columnName de lobjet Column dans JBuilder. Le nom physique, tel que dfini dans la table dorigine, est affect la proprit serverColumnName. Le QueryResolver utilise serverColumnName lors de la gnration des requtes de rsolution. Si un alias de table est spcifi dans la chane de requte, il dfinit la valeur de la proprit tableName dun objet Column. Le nom dorigine nest pas lui-mme expos par lAPI JBuilder.
8-12
La possibilit dactualisation dpend dautres facteurs, qui sont dcrits plus en dtail dans Interrogation dune base de donnes, page 5-2.
8-13
apportes lensemble de donnes. Cette fonctionnalit permet dimplmenter un serveur de niveau intermdiaire qui communique avec un gestionnaire de bases de donnes et un client lger qui est capable dditer un DataSet.
8-14
Les proprits sont actuellement stockes dans les trois bits de poids fort de chaque type de donnes. Chaque type de donnes est cod sur un octet. La proprit columnCount est stocke implicitement comme longueur du tableau columnNames.
2 Les bits dtats de chaque ligne. Une valeur short est stocke pour chaque ligne. 3 Les bits indicateurs de Null pour chaque lment de donnes. 2 bits sont stocks pour chaque lment de donnes. Les valeurs possibles sont :
0) Donnes normales 1) Null assign 2) Null non assign 3) Null non modifi
La dernire valeur est utilise exclusivement pour extractDataSetChanges. Les valeurs non modifies dans la version UPDATED sont stockes sous la forme de null ce qui conomise de lespace pour les donnes binaires volumineuses, etc.
4 Les donnes elles-mmes, organises en un tableau des donnes de colonne. Si une colonne de donnes est de type Variant.INTEGER, un tableau de int est utilis pour les valeurs de cette colonne. 5 Pour extractDataSetChanges, une colonne spciale, INTERNALROW, est ajoute la section des donnes. Cette colonne de donnes contient des valeurs entires longues qui dsignent la ligne interne (internalRow) de lensemble de donnes dont les donnes sont extraites. Cette colonne de donnes doit tre utilise pour ltat des erreurs quand les modifications ne peuvent tre rsolues dans la source de donnes.
La mthode loadDataSet charge les donnes dans un ensemble de donnes. Toute colonne qui nexiste pas dans lensemble de donnes doit tre ajoute. Attention, les informations sur le type physique et les proprits comme sqlType, precision et scale ne sont pas contenues dans lobjet DataSetData. Ces proprits doivent tre recherches directement dans la
8-15
source de donnes. Cependant, ces proprits ne sont pas ncessaires pour la modification. La colonne spciale, INTERNALROW saffiche comme nimporte quelle autre colonne de lensemble de donnes.
Un projet exemple ayant un fournisseur et un rsolveur personnaliss se trouve dans le rpertoire /samples/DataExpress/CustomProviderResolver de votre installation de JBuilder. Le fichier exemple TestApp.java est une application avec cadre contenant un JdbTable et un JdbNavToolBar. Ces deux composants visuels sont connects un composant TableDataSet dont les donnes sont fournies par un fournisseur personnalis (dfini dans le fichier ProviderBean.java), et sont enregistres avec un rsolveur personnalis (dfini dans le fichier ResolverBean.java). Cette application exemple lit les donnes et enregistre les modifications dans le fichier texte data.txt, un fichier simple, non dlimit. La structure de data.txt est dcrite dans le fichier interface DataLayout.java. Un exemple dcrivant lcriture dun ProcedureResolver personnalis se trouve dans Enregistrement des modifications avec un ProcedureResolver, page 8-8.
8-16
1 Ouvrez un projet existant auquel vous voulez ajouter une logique personnalise de rsolution.
Le projet devrait inclure un objet Database et un objet QueryDataSet. Pour savoir comment faire, voir Interrogation dune base de donnes, page 5-2.
2 Slectionnez le fichier cadre dans le volet contenu, puis slectionnez longlet Conception pour afficher le concepteur dinterface utilisateur. 3 Cliquez sur le composant QueryResolver de la page DataExpress de la palette de composants. 4 Cliquez nimporte o dans le concepteur dinterface utilisateur ou dans larborescence des composants pour lajouter lapplication.
Le concepteur dinterface utilisateur gnre du code source qui cre un objet QueryResolver par dfaut.
8-17
ensemble de donnes ncessite une gestion personnalise des vnements, crez un composant QueryResolver distinct pour chaque StorageDataSet.
8-18
Si la rponse de lvnement est skip(), la ligne en cours nest pas rsolue et le processus de rsolution se poursuit avec la ligne de donnes suivante. Si lvnement termine le processus de rsolution, la mthodeinserting est appele, qui son tour appelle response.abort(). Aucun vnement derreur nest gnr car les vnements erreur sont dclenchs pour rpondre aux erreurs internes. Cependant une exception gnrique ResolutionException est dclenche pour annuler le processus de rsolution. Quand une erreur se produit pendant le processus de rsolution, si par exemple, le serveur nautorise pas la suppression dune ligne, lvnement derreur appropri (deleteError, insertError ou updateError) est gnr. Les paramtres suivants sont transmis lvnement : Le DataSet original impliqu dans la rsolution Un DataSet temporaire filtr pour nafficher que les lignes concernes LException qui a eu lieu Un objet ErrorResponse Cest au gestionnaire dvnements : dexaminer lException ; de dterminer quoi faire ; de communiquer cette dcision au gestionnaire de rsolution. Cette dcision est transmise en utilisant lune des rponses ErrorResponse suivantes : abort() indique au gestionnaire de rsolution darrter toutes les rsolutions retry() indique au gestionnaire de rsolution dessayer de recommencer la dernire opration ignore() indique au gestionnaire de rsolution de ne pas tenir compte de lerreur et de poursuivre Si le gestionnaire dvnements dclenche une exception DataSetException, elle est traite comme lappel de ResolverResponse.abort(). De plus, elle dclenche lvnement erreur en transmettant le paramtre Exception utilisateur.
8-19
Une table est lie la table Customer de la base de donnes exemple JDataStore. Le bouton Enregistrer les modifications cre un objet QueryResolver personnalis qui prend le contrle du processus de rsolution. Quand lapplication est excute, vous pourrez constater les comportements suivants : La suppression de ligne est interdite. Toute tentative de suppression de ligne est systmatiquement bloque. Cela illustre lutilisation de lvnement deletingRow. Linsertion de ligne est autorise uniquement si le client est situ aux Etats-Unis. Si le client en cours nest pas situ aux Etats-Unis, le processus est interrompu. Cela illustre lutilisation de lvnement insertingRow avec une rponse ResolverResponse de abort(). La mise jour des lignes est effectue en ajoutant lancienne et la nouvelle valeur du nom du client un contrle ListControl. Cela illustre, pendant le processus de rsolution, laccs simultan aux nouvelles valeurs, ainsi quaux anciennes donnes.
1 Vrifiez que le StorageDataSet est bloqu pour des modifications dans le fournisseur pendant la phase de rsolution. Cela est fait par lappel des mthodes :
ProviderHelp.startResolution(dataSet, true); ProviderHelp.endResolution(dataSet);
Important
2 Localisez les modifications de donnes en crant un DataSetView pour chacune des lignes insres, supprimes et mises jour. Pour ce faire, utilisez les appels de mthodes suivants :
StorageDataSet.getInsertedRows(DataSetView); StorageDataSet.getDeletedRows(DataSetView); StorageDataSet.getUpdatedRows(DataSetView);
8-20
Il est important de noter que : Les lignes insres peuvent contenir des lignes supprimes (qui ne doivent pas tre rsolues). Les lignes supprimes peuvent contenir des lignes insres (qui ne doivent pas tre rsolues). Les lignes mises jour peuvent contenir des lignes supprimes et des lignes insres (qui ne doivent pas tre gres comme des mises jour).
3 Fermez chaque DataSetView aprs la rsolution des donnes ou aprs le dclenchement dune exception pendant la rsolution. Si les composants DataSetView ne sont pas ferms, le StorageDataSet garde des rfrences vers lui et la vue ne fera jamais partie de la collecte des donnes primes (garbage collection).
Appelez cette mthode pour chaque ligne insre, supprime ou mise jour rsoudre.
2 Appelez une ou plusieurs des mthodes suivantes pour rinitialiser le bit RowStatus.PENDING_RESOLVED.
La mthode appeler dpend du type de gestion derreur : markPendingStatus(false); La mthode markPendingStatus rinitialise la ligne en cours. resetPendingStatus(boolean resolved); La mthode resetPendingStatus rinitialise toutes les lignes du DataSet. resetPendingStatus(long internalRow, boolean resolved); La mthode resetPendingStatus rinitialise la ligne dont lidentificateur internalRow est spcifi.
3 Redfinissez le paramtre resolved par true, en utilisant une des mthodes resetPendingStatus, pour les lignes dont les modifications ont t rellement effectues dans la source des donnes.
8-21
Quand le bit PENDING_RESOLVED est rinitialis, les lignes gardent ltat de modifications enregistres. Elles doivent tre rinitialises et rsolues pour que : Les lignes INSERTED & UPDATED passent ltat LOADED. Les lignes DELETED soient supprimes du DataSet. Les modifications de lignes qui nont pas t effectues effaceront le bit PENDING_RESOLVED, mais les modifications resteront encore enregistres dans le DataSet. Certains rsolveurs choisiront dabandonner toutes les modifications la moindre erreur. En fait, cest le comportement par dfaut du QueryDataSet. Dautres rsolveurs choisiront de valider certaines modifications et de traiter les modifications en chec par des messages derreur.
8-22
Chapitre
Chapitre9
Les bases de donnes bien conues comportent plusieurs tables. Le but de la conception de table est de stocker toutes les informations ncessaires dune manire accessible et efficace. Il est donc ncessaire de dcomposer une base de donnes en tables identifiant des entits distinctes (comme des personnes, des lieux ou des objets) et des activits (comme des vnements ou des transactions) importantes dans lapplication. Pour mieux dfinir les tables, il est ncessaire didentifier et de comprendre comment ces entits sont relies entre elles. La cration de plusieurs petites tables relies rduit la quantit de donnes redondantes, ce qui limite les possibilits derreur et simplifie lactualisation des donnes. Dans JBuilder, il est possible de joindre, ou de relier, deux ou plusieurs ensembles de donnes ayant au moins un champ en commun en utilisant un MasterLinkDescriptor. Habituellement, une relation matre/dtail est une relation un--plusieurs entre des ensembles de donnes. Vous pouvez, par exemple, avoir un ensemble de donnes des clients et un ensemble de donnes des commandes passes par eux, le numro de client constituant le champ commun aux deux ensembles de donnes. Vous pouvez crer une relation matre-dtail qui permet de parcourir lensemble de donnes des clients et de nafficher pour lensemble de donnes dtail que les commandes passes par le client en cours. Vous pouvez lier un ensemble de donnes matre plusieurs ensembles de donnes dtail, en tablissant le lien sur le mme champ ou sur des champs diffrents. Vous pouvez aussi crer une relation matre/dtail qui se dveloppe en cascade en une relation un--plusieurs--plusieurs. Les relations plusieurs--un ou un--un peuvent tre gres dans un contexte matre/dtail, mais ces types de relations sont de prfrence pris en compte par lutilisation de champs de rfrence, afin de voir toutes les
Etablissement dune relation matre-dtail
9-1
donnes comme faisant partie dun ensemble de donnes unique. Pour davantage dinformations sur lenregistrement des modifications apportes aux donnes de plusieurs ensembles de donnes, voir la section Rsolution des donnes de plusieurs tables, page 8-10. Les ensembles de donnes matre et dtail nont pas besoin dtre des ensembles de donnes de mme type. Par exemple, il est possible dutiliser un QueryDataSet comme ensemble de donnes matre et un TableDataSet comme ensemble de donnes dtail. QueryDataSet, TableDataSet et DataSetView peuvent sutiliser indiffremment comme ensembles de donnes matre ou dtail. Cette section traite les sujets suivants : Dfinition dune relation matre-dtail Lecture des dtails Modification des donnes dans les ensembles de donnes matre-dtail Etapes de la cration dune relation matre-dtail Enregistrement des modifications dans une relation matre-dtail
cependant un filtre peut tre ajout, en plus de la relation matre-dtail, sur lun ou lautre des ensembles de donnes. Pour crer une relation matre-dtail vous pouvez utiliser, la place dun MasterLinkDescriptor, une instruction SQL JOIN. Une instruction SQL JOIN est un oprateur relationnel qui produit une seule table partir de deux tables en se fondant sur la comparaison des valeurs de certaines colonnes (colonnes de jointure) dans chacun des ensembles de donnes. Le rsultat constitue un seul ensemble de donnes contenant les lignes formes par la concatnation des lignes des deux ensembles de donnes quand les valeurs des colonnes de jointure correspondent. Pour actualiser des requtes JOIN avec JBuilder, voir Rsolution des donnes de plusieurs tables, page 8-10.
1 Fermez tous les projets ouverts (Fichier|Fermer). 2 Choisissez Fichier|Nouveau et double-cliquez sur licne Application pour crer une nouvelle application.
Acceptez toutes les valeurs par dfaut.
3 Slectionnez longlet Conception du volet contenu. 4 Slectionnez un composant Database dans la page DataExpress de la palette de composants, puis cliquez dans larborescence des composants ou dans le concepteur dinterface utilisateur pour ajouter le composant votre application. 5 Ouvrez la proprit connection du composant Database dans linspecteur, et dfinissez les proprits de la manire suivante en supposant que votre systme est configur pour utiliser lexemple
9-3
Valeur
com.borland.datastore.jdbc.DataStoreDriver Naviguez jusqu votre copie locale de <jbuilder>/samples/ JDataStore/datastores/employee.jds Entrez votre nom non obligatoire
La bote de dialogue connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vrifier que les proprits de connexion sont correctement dfinies. Les rsultats de la tentative de connexion saffichent ct du bouton. Quand la connexion russit, cliquez sur OK.
Remarque
La bibliothque JDataStore Server est ajoute votre projet lorsque vous vous connectez une base de donnes JDataStore. Le code gnr par le concepteur pour cette tape peut tre affich en slectionnant longlet Source et en recherchant le code de ConnectionDescriptor. Cliquez sur longlet Conception pour continuer.
6 Slectionnez un composant QueryDataSet de la page DataExpress, puis cliquez dans larborescence des composants pour ajouter le composant votre application.
Ce composant dfinit la requte pour lensemble de donnes matre. Slectionnez la proprit query du composant QueryDataSet dans linspecteur, puis effectuez le paramtrage suivant :
Nom de la proprit
Base de donnes Instruction SQL
Valeur
database1 SELECT * FROM COUNTRY
7 Cliquez sur Tester la requte pour vous assurer que la requte est excutable et, lorsque la zone dtat indique Succs, cliquez sur OK pour fermer la bote de dialogue. 8 Ajoutez un autre composant QueryDataSet votre application, slectionnez sa proprit query dans linspecteur, cliquez sur les points de suspension (...) pour ouvrir le dialogue Query et dfinissez les proprits suivantes :
Nom de la proprit
Base de donnes Instruction SQL
Valeur
database1 SELECT * FROM EMPLOYEE
9-4
9 Cliquez sur Tester la requte pour vous assurer que la requte est excutable et, lorsque la zone dtat indique Succs, cliquez sur OK pour fermer la bote de dialogue. 10 Slectionnez sur la proprit masterLink de lensemble de donnes dtail (queryDataSet2) dans linspecteur, cliquez sur le bouton points de suspension (...) pour ouvrir le dialogue MasterLink et dfinissez les proprits suivantes : a La proprit DataSet matre propose un menu droulant des ensembles de donnes disponibles. Choisissez lensemble de donnes contenant les enregistrements matre pour lensemble de donnes dtail en cours, cest--dire queryDataSet1. b Les champs de liaison dcrivent les champs utiliser pour dterminer les donnes se correspondant dans les composants ensemble de donnes matre et dtail. Pour slectionner une colonne dans lensemble de donnes matre relier avec une colonne de lensemble de donnes dtail : slectionnez les noms de colonne, dans cet exemple COUNTRY (un champ chane), dans la liste Colonnes matre disponibles puis cliquez sur le bouton Ajouter aux liens matre. La colonne saffiche dans la bote Colonnes de lien matre. c Pour slectionner la colonne de lensemble de donnes dtail relier avec une colonne de lensemble de donnes matre, slectionnez le nom de la colonne, dans cet exemple JOB_COUNTRY (un champ chane), dans la liste Colonnes dtail disponibles puis cliquez sur le bouton Ajouter aux liens dtail. La colonne saffiche dans la bote Colonnes lies dtail. d Loption Retarder la lecture des enregistrements dtail jusqu ce que cela soit ncessaire dtermine si les enregistrements de lensemble de donnes dtail sont tous lus en une seule fois ou ne sils ne sont lus, pour un enregistrement matre donn, que lorsque celui-ci est activ. Ne cochez pas cette case pour affecter la proprit fetchAsNeeded la valeur false. Pour davantage dinformations sur la lecture, voir Lecture des dtails, page 9-7. e Cliquez sur Tester le lien.
9-5
f Cliquez sur OK pour fermer la bote de dialogue MasterLink. 11 Ajoutez votre application un composant DBDisposeMonitor de la page dbSwing supplmentaires.
Le DBDisposeMonitor fermera le JDataStore lorsque la fentre sera ferme.
1 Slectionnez contentPane (BorderLayout) dans larborescence des composants et dfinissez sa proprit layout par null. 2 Cliquez sur un composant JdbNavToolBar dans longlet dbSwing. Dposez-le dans la zone juste au-dessus du panneau dans le concepteur dinterface utilisateur.
JdbNavToolBar sattache automatiquement au DataSet qui dtient la focalisation.
3 Ajoutez un JdbStatusLabel et placez-le dans la partie infrieure du panneau, dans le concepteur dinterface utilisateur.
JdbStatusLabel sattache automatiquement au DataSet qui dtient la focalisation.
4 Slectionnez un composantTableScrollPane de la page dbSwing, puis cliquez et faites glisser le contour du volet dans la partie suprieure du concepteur dinterface utilisateur pour lajouter lapplication juste en-dessous de jdbNavToolBar1.
9-6
Le comportement de dfilement nest propos par dfaut dans aucun composant Swing ni dans leur extension dbSwing, il faut donc pour en disposer, ajouter un composant Swing ou dbSwing dfilable un JScrollPane ou un TableScrollPane. Le composant TableScrollPane offre des possibilits spcifiques au JdbTable que noffre pas le JScrollPane. Voir la documentation dbSwing pour plus dinformations.
5 Placez un JdbTable au centre du tableScrollPane1 dans le concepteur dinterface utilisateur et dfinissez sa proprit dataSet par queryDataSet1. 6 Ajoutez un autre TableScrollPane la partie infrieure du volet, dans le concepteur dinterface utilisateur.
Il devient tableScrollPane2.
7 Placez un JdbTable dans tableScrollPane2 et donnez sa proprit dataSet la valeur queryDataSet2. 8 Compilez et excutez lapplication en choisissant Excuter|Excuter le projet.
Vous pouvez maintenant parcourir les enregistrements matre (COUNTRY) et voir les enregistrements dtail (EMPLOYEE) changer pour nafficher que les employs du pays en cours. Lapplication en train de sexcuter ressemble ceci :
9-7
exemple Jones, tous les enregistrements du dtail pour Jones sont lus. Puis, quand vous accdez un autre enregistrement matre, par exemple Cohen, tous les enregistrements du dtail pour Cohen sont lus et ajouts lensemble de donnes dtail. Si vous instanciez un composant DataSetView pour visualiser lensemble de donnes dtail, tous les enregistrements de Jones et Cohen sont dans lensemble de donnes dtail mais aucun des enregistrements correspondant aux autres noms. Quand la proprit fetchAsNeeded a la valeur true, la requte portant sur lensemble de donnes doit contenir une clause WHERE dfinissant la relation des colonnes de dtail avec un paramtre reprsentant la valeur dune colonne dans lensemble de donnes matre. Si la requte paramtre contient des marqueurs de paramtres nomms, les noms doivent correspondre un nom de lensemble de donnes matre. If ? Si des marqueurs JDBC sont utiliss, les colonnes de liaison du dtail sont lies aux marqueurs de paramtres de gauche droite comme dfini dans la proprit masterLink. La liaison des valeurs de paramtre est implicite quand le matre arrive sur une ligne pour la premire fois. La requte est re-excute pour lire chaque nouveau groupe de dtail. Sil ny a pas de clause WHERE, JBuilder dclenche une exception DataSetException.NO_WHERE_CLAUSE. Quand la lecture est gre de cette manire, sil ny a pas de transaction explicite active, les groupes de dtail sont lus dans des transactions distinctes. Pour davantage dinformations sur les relations matre-dtail avec des requtes paramtres, voir Requtes paramtres dans les relations matre-dtail, page 5-22. Si lensemble de donnes matre a plusieurs ensembles de donnes dtail associs dont la proprit fetchAsNeeded a la valeur true, les dtails conservent la trace des groupes dtail dj lus via une requte ou une procdure paramtres par les colonnes de liaison du matre actif. Cette mmorisation peut tre annule en appelant la mthode StorageDataSet.empty(). Il ny a pas de mmorisation pour les proprits masterLink pour lesquelles fetchAsNeeded a la valeur true. Quand lensemble de donnes dtail est un TableDataSet, le paramtre fetchAsNeeded nest pas pris en compte et toutes les donnes sont lues en une seule fois.
9-9
sont, elles, affiches. Quand une nouvelle ligne est insre dans lensemble de donnes dtail, JBuilder insre les valeurs dans les champs non affichs. Avec les proprits cascadeUpdates et cascadeDeletes des relations matre-dtail, vous pouvez autoriser la mise jour de lignes dun DataSet dtail partir des mises jour de colonnes dans le DataSet matre, ainsi que la suppression de lignes dun DataSet dtail lorsque les lignes correspondantes sont supprimes dans le DataSet matre. Ces proprits peuvent tre dfinies dans lditeur de proprits MasterLink, dans les cases cocher Autoriser les mises jour en cascade et Autoriser les suppressions en cascade. Lorsque vous utilisez les options cascadeUpdates et cascadeDeletes pour des relations matre-dtail, soyez particulirement attentif, en particulier lorsque ces dernires sont chanes, par exemple lorsquun DataSet du dtail est un matre pour un autre dtail, et ainsi de suite. En effet, si vous utilisez ces options, une ligne de lensemble de donnes dtail peut tre mise jour ou supprime alors que les autres ne le sont pas. Par exemple, un gestionnaire de lvnement deleting() dun editListener peut autoriser la suppression de quelques lignes dtail et la suppression dautres par bloc. Dans le cas des mises jour en cascade, vous risquez de vous retrouver avec des lments dtail orphelins si certaines lignes dun ensemble dtail ont t mises jour et dautres non. Pour davantage dinformations sur les options cascadeUpdates et cascadeDelete, voir la rubrique MasterLinkDescriptor dans la Rfrence de la bibliothque de composants DataExpress.
1 Crez ou ouvrez une application avec au moins deux composants ensemble de donnes, lun reprsentant lensemble de donnes matre et lautre lensemble de donnes dtail.
Vous pouvez utiliser lexemple dapplication Matre-dtail du projet MasterDetail.jpx situ dans le rpertoire <jbuilder>/samples/DataExpress/ MasterDetail.
2 Slectionnez le fichier cadre dans le volet contenu. Slectionnez longlet Conception pour activer le concepteur dinterface utilisateur. 3 Slectionnez lensemble de donnes dtail dans larborescence des composants, puis sa proprit masterLink dans la page Proprits de linspecteur. Dans lditeur de proprit masterLink, spcifiez les proprits suivantes de lensemble de donnes dtail :
9-10
La proprit Dataset matre propose un choix des ensembles de donnes disponibles. Choisissez lensemble de donnes contenant les enregistrements matre de lensemble de donnes dtail en cours. Les colonnes de liaison dcrivent quelles sont les colonnes utiliser pour dterminer la correspondance des donnes entre les composants ensemble de donnes matre et dtail. Pour slectionner une colonne de lensemble de donnes matre relier avec une colonne de lensemble de donnes dtail, double-cliquez sur un nom de colonne dans la liste Colonnes matre disponibles. Cette colonne est alors affiche dans la proprit Colonnes lies matre. Pour slectionner la colonne de lensemble de donnes dtail relier une colonne de lensemble de donnes matre, double-cliquez sur le nom de la colonne dans la liste Colonnes dtail disponibles. Le type de donnes de chaque colonne est affich. Si vous slectionnez une colonne du dtail dont le type nest pas identique celui de la colonne matre correspondante, il ne se passe rien car les colonnes de liaison doivent tre de mme type. Si la colonne slectionne est correcte, elle est affiche dans la proprit Colonnes lies dtail. Pour lier les deux ensembles de donnes sur plusieurs colonnes, rptez les deux tapes prcdentes autant de fois que ncessaire. Pour retarder la lecture des enregistrements du dtail jusqu ce quils soient ncessaires, cochez la case Retarder la lecture des enregistrements dtail jusqu ce que cela soit ncessaire. Pour davantage dinformations sur cette option, voir Lecture des dtails, page 9-7. Pour vrifier que les ensembles de donnes sont correctement connects, cliquez sur le bouton Tester le lien. La zone dtat indique alors Excution, Succs ou Echec. Pour terminer les spcifications, cliquez sur OK.
4 Ajoutez des composants visuels (comme JdbTables) pour pouvoir visualiser et modifier les donnes. Affectez la proprit dataSet de lun, lensemble de donnes matre et la proprit dataSet de lautre, lensemble de donnes dtail. 5 Compilez et excutez lapplication.
Lensemble de donnes matre affiche tous les enregistrements. Lensemble de donnes dtail naffiche que les enregistrements correspondant aux valeurs des colonnes lies de la ligne en cours de lensemble de donnes matre mais, par dfaut, sans afficher les colonnes lies.
9-11
9-12
Vous pouvez utiliser un seul navigateur JdbNavToolBar pour les deux ensembles de donnes. Le composant JdbNavToolBar sattache automatiquement lensemble de donnes qui dtient la focalisation.
Voir aussi
Chapitre 8, Enregistrement des modifications dans la source de donnes
9-13
9-14
10
Utilisation des modules de donnes pour simplifier laccs aux donnes
Chapitre10
Chapitre
Un module de donnes est un conteneur spcialis pour les composants daccs aux donnes. Les modules de donnes simplifient le dveloppement de laccs aux donnes dans vos applications. Les modules de donnes proposent un conteneur utilisable la conception pour tous les composants daccs aux donnes. Cela permet de dcomposer le code en modules et de sparer les rgles de fonctionnement et daccs aux bases de donnes de vos applications davec la logique de linterface utilisateur de lapplication. Vous pouvez galement garder le contrle sur lutilisation du module de donnes, en fournissant seulement les fichiers classe aux dveloppeurs dapplication. Une fois que des composants ensemble de donnes, et les colonnes associes, ont t dfinis dans un module de donnes, toutes les applications utilisant ce module ont un accs homogne aux ensembles de donnes et aux colonnes sans quil soit ncessaire de les recrer dans chaque application chaque fois quils sont utiliss. Il nest pas ncessaire que les modules de donnes se trouvent dans le mme rpertoire ou le mme paquet que votre projet. Vous pouvez mme les placer un endroit permettant de les partager entre plusieurs dveloppeurs ou entre diffrentes applications. DataModule est une interface qui dclare le comportement de base dun module de donnes. Pour manipuler par programme cette interface, il faut limplmenter dans une classe de module de donnes et ajouter des composants daccs aux donnes.
10-1
Lorsque vous crez un module de donnes et ajoutez des composants qui apparatront automatiquement sous la section Accs aux donnes du volet contenu (Database, DataSet, DataStore), une mthode dacquisition est gnre. Cela signifie que chacun de ces composants sera disponible dans une liste de choix pour le projet qui rfrence le module de donnes. Par exemple, vous pouvez Ajouter un composant Database un module de donnes. Compiler le module de donnes. Ajouter un composant QueryDataSet lapplication qui contient le module de donnes ou au module de donnes lui-mme. Dans la bote de dialogue de la proprit query, slectionner ModuleDeDonnees1.database1 (ou quelque chose de similaire) dans la bote de choix Base de donnes. Ce chapitre prsente deux faons de crer un module de donnes : Cration dun module de donnes en utilisant les outils de conception Cration de modules de donnes en utilisant le modeleur de donnes
1 Crez un nouveau projet. 2 Slectionnez Fichier|Nouveau et double-cliquez sur licne Module de donnes. 3 Spcifiez le paquet et le nom de la classe du module de donnes.
JBuilder remplit automatiquement le nom et le chemin daccs du fichier Java en fonction de vos saisies. Pour crer le module de donnes en utilisant le concepteur JBuilder, dsactivez Appeler le Modeleur de donnes.
10-2
5 Double-cliquez sur le fichier du module de donnes dans le volet projet afin de louvrir dans le volet Contenu. 6 Examinez le code source.
Le code gnr par lexpert pour la classe du module de donnes diffre sensiblement du code gnr par les autres experts. La mthode getDataModule() est dfinie comme public static. Cette mthode a pour fonction de permettre le partage dune seule instance de ce module de donnes par plusieurs cadres. Le code gnr pour cette mthode est :
public static ModuleDeDonnees1 getDataModule() { if (myDM == null){ myDM = new ModuleDeDonnees1();} return myDM; }
Le code de cette mthode, Dclare cette mthode comme static. Cela signifie quil est possible dappeler cette mthode sans une instanciation en cours dun objet classe DataModule. Renvoie une instance de la classe DataModule. Vrifie sil y a dj une instanciation dun DataModule. Cre et renvoie un nouveau DataModule sil nexiste pas dj. Renvoie un objet DataModule sil est dj instanci. La classe du module de donnes contient alors toutes les mthodes ncessaires une classe de module de donnes personnalise et un squelette de mthode pour jbInit(), auquel il faut ajouter des composants daccs aux donnes et la logique de gestion personnalise.
Bien que les modules de donnes ne saffichent pas dans le concepteur en tant que composants visibles comme les composants dbSwing, ils sont utiles. Dans le concepteur, vous pouvez rapidement ajouter et modifier des composants daccs aux donnes dans la palette des composants, le volet structure et linspecteur.
1 Double-cliquez sur le fichier du module de donnes dans le volet projet afin de louvrir dans le volet Contenu. 2 Slectionnez longlet Conception du volet Contenu pour activer le concepteur dinterface utilisateur. 3 Ajoutez les composants donnes la classe du module de donnes.
10-3
Par exemple,
a Slectionnez un composant Database de la page DataExpress de la palette des composants. b Cliquez dans larborescence des composants ou dans le concepteur dinterface utilisateur pour ajouter le composant Database au module de donnes. c Initialisez la proprit connection via le connectionDescriptor de la base de donnes. La dfinition de cette proprit dans linspecteur est dcrite au Chapitre 4, Connexion une base de donnes.
Les composants donnes sont ajouts au module de donnes ds quils sont ajouts un fichier cadre. Pour davantage dinformations sur lajout de composants donnes, voir Chapitre 5, Extraction des donnes dune source de donnes.
Remarque
JBuilder cre automatiquement le code dune mthode publique qui obtient chaque composant DataSet plac dans le module de donnes. Ainsi les composants DataSet peuvent apparatre comme des proprits (en lecture seule) du module de donnes. Cela permet galement aux composants DataSet dtre accessibles la proprit dataSet des composants orients donnes dans linspecteur quand des composants orients donnes et des modules de donnes sont utiliss dans le mme conteneur. Une fois cette tape acheve, le module de donnes a la forme suivante :
package datamoduleexample; import com.borland.dx.dataset.*; import com.borland.dx.sql.dataset.*; public class ModuleDeDonnees1 implements DataModule { private static ModuleDeDonnees1 myDM; Database database1 = new Database(); public ModuleDeDonnees1() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { database1.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor(" jdbc:borland:dslocal:/usr/local/<jbuilder>/samples/JDataStore/ datastores/employee.jds", "votre nom", "", false, "com.borland.datastore.jdbc.DataStoreDriver")); } public static ModuleDeDonnees1 getDataModule() { if (myDM == null) myDM = new ModuleDeDonnees1(); return myDM;
10-4
Le paramtrage des proprits et le codage des rgles de gestion dfinis dans le modle de donnes ne peuvent tre redfinis dans une application utilisant le modle de donnes. Si vous avez cr un comportement qui ne sapplique pas systmatiquement toutes les applications utilisant ce modle de donnes, il vous faudra probablement crer plusieurs modles de donnes adapts aux besoins des divers groupes dapplications ou dutilisateurs. Pour ajouter du code aux vnements dun composant,
1 Double-cliquez sur le fichier du module de donnes dans le volet projet afin de louvrir dans le volet Contenu. 2 Slectionnez longlet Conception du volet Contenu pour activer le concepteur dinterface utilisateur. 3 Slectionnez le composant auquel vous voulez ajouter des rgles de gestion, puis cliquez sur longlet Evnements dans linspecteur. 4 Double-cliquez sur lvnement associ la rgle de gestion.
JBuilder cre le squelette dans le fichier source Java auquel vous pouvez ajouter le code de votre rgle de gestion personnalise.
10-5
Cela cre les fichiers de la classe du module de donnes dans le rpertoire spcifi par Projet|Proprits du projet, Chemin de sortie.
3 Choisissez Fichier|Fermer.
Pour faire rfrence au module de donnes dans une application, vous devez dabord lajouter votre projet en tant que bibliothque ncessaire.
1 Ouvrez la bote de dialogue Proprits du projet (Projet|Proprits du projet). 2 Slectionnez Bibliothques ncessaires sur la page Chemins et ajoutez un fichier classe ou un fichier archive comme nouvelle bibliothque.
Dans le cas particulier de lajout dun module de donnes, ce sera le fichier classe du module de donnes que vous venez de compiler.
3 Cliquez sur Ajouter pour ouvrir la bote de dialogue Slectionnez une ou plusieurs bibliothques. 4 Cliquez sur Nouveau.
Lexpert Nouvelle bibliothque souvre.
5 Entrez le nom de la bibliothque (comme ModuleDonnesEmploys). 6 Slectionnez lemplacement o vous voulez mettre le fichier <nom bibliothque>.library.
Vous avez le choix entre JBuilder, Projet et Home de lutilisateur. Si vous excutez JBuilder depuis un rseau, et que vous voulez rendre votre bibliothque accessible tous, vous devez slectionner JBuilder. Cela placera le fichier <nom bibliothque>.library dans le rpertoire /lib de votre installation de JBuilder. Si vous tes le seul dveloppeur accder votre bibliothque, vous pouvez choisir une des autres options, pour que le fichier .library soit stock en local.
7 Cliquez sur Ajouter, naviguez jusquau dossier contenant le chemin daccs au fichier classe ou larchive ajouter, puis cliquez sur OK.
JBuilder dtermine automatiquement les chemins daccs aux fichiers classe, aux fichiers source et aux fichiers de documentation, lintrieur de ce dossier. Le champ Chemins de bibliothques indique le chemin daccs la nouvelle bibliothque.
10-6
8 Cliquez sur OK pour fermer lexpert. 9 Cliquez sur OK pour fermer la bote de dialogue Slectionnez une ou plusieurs bibliothques.
A ce stade, vous voyez que votre nouvelle bibliothque a t ajoute la liste des bibliothques ncessaires.
1 Fermez tous les projets ouverts (Fichier|Fermer les projets). 2 Choisissez Fichier|Nouveau et double-cliquez sur licne Application dans la page Gnral de la galerie dobjets.
Cela cre et une application et un projet.
3 Entrez les informations appropries relatives au paquet et la classe. 4 Slectionnez le fichier cadre de lapplication dans le voler contenu. 5 Vrifiez que DataExpress est spcifie comme une des bibliothques ncessaires.
Si DataExpress napparat pas dans la liste des bibliothques ncessaires de la bote de dialogue Proprits du projet (Projet| Proprits du projet),
a Cliquez sur Ajouter. b Slectionnez DataExpress. c Cliquez sur OK jusqu la fermeture de la bote de dialogue Proprits du projet. 6 Assurez-vous que le module de donnes a t ajout en tant que bibliothque ncessaire. 7 Importez le paquet auquel appartient la classe du module de donnes (sil est lextrieur de votre paquet) en choisissant Expert|Utiliser un module de donnes. 8 Cliquez sur les points de suspension (...) pour ouvrir la bote de dialogue Slection du module de donnes.
Une arborescence de tous les paquets et classes connus est affiche. Naviguez jusqu lemplacement des fichiers classe gnrs lors de lenregistrement et de la compilation du module de donnes (ce doit tre sous le nud de larborescence portant le mme nom que votre paquet, si le module de donnes fait partie dun paquet). Slectionnez
10-7
la classe du module de donnes. Si vous ne voyez pas la classe du module de donnes cet emplacement, vrifiez que le projet du module de donnes sest bien compil sans erreurs et quil a t correctement ajout aux bibliothques ncessaires pour le projet.
Slectionnez un module de donnes en slectionnant les points de suspension dans le champ Classe DataModule. Une arborescence de tous
10-8
les paquets et classes connus est affiche. Si vous ne trouvez pas votre classe DataModule dans cette liste, utilisez Projet|Proprits du projet pour ajouter le paquet ou larchive aux bibliothques requises du projet. Placez-vous sur lemplacement des fichiers classe gnrs quand le module de donnes a t enregistr et compil. Slectionnez la classe du module de donnes. Dans la zone Dclaration de champ Java, le nom de champ par dfaut est le nom du module de donnes suivi dun 1. Cest le nom utilis pour la variable membre gnre dans le code. Le module de donnes sera galement dsign par ce nom dans larborescence des composants. Saisissez un nom qui dcrit les donnes du module de donnes, comme ModuleDonnesEmploys. Dans la section Dclaration de champ Java, vous pouvez choisir un des moyens suivants dutiliser le DataModule dans votre application : Crer une nouvelle instance de DataModule Si vous avez une seule sous-classe Frame dans votre application, slectionnez cette option. Partager linstance (statique) du DataModule Si vous envisagez de faire rfrence au module de donnes dans plusieurs cadres de votre application et si vous voulez partager une seule instance de la classe DataModule personnalise, slectionnez cette option. Lappeleur dfinit une instance avec setModule() Slectionnez cette option lorsque vous disposez de plusieurs modules de donnes diffrents, par exemple, un module de donnes qui obtient les donnes localement et un autre qui les obtient distance. Choisissez OK pour ajouter le module de donnes au paquet et injecter le code appropri dans le fichier source en cours afin de crer une instance du module de donnes. Selon les choix indiqus dans le dialogue prcdent, le code suivant est ajout la mthode jbinit() du fichier du cadre. Notez que loption Partager linstance (statique) du DataModule est slectionne :
ModuleDeDonnes12 = com.borland.samples.dx.datamodule.ModuleDeDonnees1.getDataModule();
Si loption Crer une nouvelle instance de DataModule est slectionne, le code suivant est ajout la mthode jbInit() du fichier du cadre :
ModuleDeDonnes12 = new com.borland.samples.dx.datamodule.ModuleDeDonnees1();
Si loption Lappeleur dfinit une instance avec setModule() est slectionne, une mthode setModule() est ajoute la classe en cours de modification.
10-9
1 Choisissez Fichier|Nouveau projet pour dmarrer lexpert projet. 2 Choisissez lemplacement et le nom du projet. 3 Cliquez sur le bouton Terminer.
Pour plus dinformations sur la cration de projets, voir Cration et gestion des projets dans Construction dapplications avec JBuilder. Pour afficher le modeleur de donnes,
1 Choisissez Fichier|Nouveau. 2 Double-cliquez sur licne Module de donnes dans la page Gnral de la galerie dobjets. 3 Entrez un nom de paquet et de classe pour le module de donnes que vous voulez crer, et cochez loption Appeler le Modeleur de donnes. 4 Cliquez sur OK.
Le modeleur de donnes apparat.
10-10
Figure 10.1
Modeleur de donnes
1 Cliquez avec le bouton droit sur le module dans le volet projet.. 2 Choisissez Ouvrir avec le Modeleur de donnes.
1 Choisissez Base de donnes|Ajouter une URL de connexion pour afficher la bote de dialogue Nouvelle URL. 2 Slectionnez un pilote install dans la liste droulante des pilotes, ou tapez le pilote souhait.
Pour les exemples, vous pouvez slectionner com.borland.datastore.jdbc.DataStoreDriver.
3 Tapez une URL ou utilisez le bouton Parcourir pour slectionnez lURL des donnes auxquelles vous voulez accder.
Pour les exemples, slectionnez la base de donnes employee.jds situe dans le rpertoire samples de votre installation JBuilder, /samples/ JDataStore/datastores/employee.jds. Utilisez le bouton Parcourir pour naviguer jusqu ce fichier afin dviter les fautes de frappe.
10-11
1 Slectionnez la table interroger puis les colonnes ajouter la requte ou la fonction statistique oprant sur une colonne particulire. a Double-cliquez sur le nud Tables ou choisissez licne de dveloppement Tables pour voir les tables. b Dans la liste des tables, slectionnez la table que vous voulez interroger et double-cliquez. Double-cliquez sur le nud Colonnes pour voir toutes les colonnes de la table slectionne. 2 Ajoutez une ou plusieurs colonnes une instruction SELECT de la requte
Linstruction SELECT est linstruction de lecture (ou extraction) des donnes qui renvoie un nombre variable de lignes comportant un nombre de colonnes fixe. Le modeleur de donnes vous aide construire votre instruction SELECT. La clause SELECT spcifie la liste des colonnes extraire.
a Dans la table laquelle vous voulez avoir accs, slectionnez une colonne ajouter. b Cliquez sur le bouton Copier.
Le nom de la colonne slectionne apparat dans la bote Colonnes slectionnes et le nom de la table en haut dans le panneau Requtes. Continuez la slection des colonnes jusqu avoir tout ce qui vous intresse dans la table. Si vous voulez slectionner toutes les colonnes, cliquez sur le bouton Tout copier.
Figure 10.2 Slection des colonnes
10-12
Les fonctions statistiques (ou dagrgation) produisent une nouvelle valeur partir dun ensemble de valeurs. Les fonctions statistiques sont SUM, AVG, MIN, MAX et COUNT.
b Dans la liste Colonnes disponibles, cliquez sur la colonne dont vous souhaitez agrger les valeurs. c Dans la liste Fonctions statistiques, cliquez sur la fonction que vous souhaitez utiliser sur la colonne slectionne. d Cochez la case Distinct si vous souhaitez que la fonction nopre que sur les valeurs uniques de la colonne slectionne. e Choisissez Ajouter une fonction statistique pour ajouter la fonction votre requte.
Au fur et mesure que vous slectionnez des colonnes, votre instruction SQL SELECT se construit. Lorsque vous agrgez des donnes, vous devez inclure une clause GROUP BY. Pour plus dinformations sur les clauses GROUP BY, voir Ajout dune clause Group By, page 10-14. Pour voir votre instruction SQL, cliquez sur longlet SQL.
10-13
La liste Colonnes disponibles contient les colonnes de la requte en cours dans le panneau Requtes du modeleur de donnes. La bote Group By contient les noms des colonnes sur lesquelles la requte effectuera le regroupement. Par dfaut, la requte nest pas groupe sur une colonne jusqu ce que vous en spcifiiez une. Pour ajouter une clause Group By votre requte,
1 Slectionnez la colonne sur laquelle vous souhaitez regrouper la requte. 2 Cliquez sur le bouton dajout (>) afin de transfrer le nom de colonne dans la bote Group By.
Une clause Group By est ajoute votre instruction SQL SELECT. Pour la voir, cliquez sur longlet SQL.
10-14
A gauche, la liste Colonnes contient les colonnes des tables de la requte en cours dans le panneau Requtes du modeleur de donnes. Utilisez les listes Colonnes, Oprateurs et Fonctions pour construire la clause Where dans la bote Clause Where comme ci-dessous :
1 Slectionnez la colonne dans la liste Colonnes et cliquez sur le bouton Coller la colonne pour faire passer une colonne, en tant que nom de colonne, dans la bote Clause Where. 2 Pour faire passer une colonne, en tant que paramtre dune requte paramtre, slectionnez la colonne dans la liste Colonnes et cliquez sur le bouton Coller le paramtre. 3 Slectionnez loprateur dont vous avez besoin dans la liste droulante Oprateurs et cliquez sur le bouton Coller.
10-15
4 Si votre requte ncessite une fonction, slectionnez celle-ci dans la liste droulante Fonctions et cliquez sur le bouton Coller.
En collant des slections, vous crez une clause Where. Vous pouvez aussi modifier directement le texte dans la bote Clause Where pour terminer votre requte. Par exemple, supposons que vous crez une clause Where comme celle-ci :
WHERE PAYS=USA
Vous devrez slectionner et coller la colonne PAYS et loprateur =. Pour terminer la requte, vous pouvez saisir directement la valeur de donnes, qui dans ce cas est USA. Lorsque vous tes satisfait de votre clause Where, cliquez sur le bouton Appliquer. La clause Where est ajoute linstruction SQL SELECT entire. Pour la voir, cliquez sur longlet SQL.
1 Dans le panneau Requtes, slectionnez la requte que vous voulez trier. 2 Dans le panneau Requte en cours, cliquez sur longlet Order By.
Figure 10.6 Page Order By
3 Slectionnez la colonne sur laquelle vous voulez que la requte soit trie dans la bote Colonnes disponibles et cliquez sur le bouton dajout (>) pour transfrer cette colonne dans la bote Order By.
10-16
10-17
dans une ou plusieurs tables, les noms des tables apparaissent la place du champ <nouvelle requte>.
1 Affichez la bote de dialogue Liaison entre requtes par lun des moyens suivants : a Choisissez Requtes|Lien. b Dans le panneau Requtes, cliquez et faites glisser le pointeur de la souris de la requte dont vous voulez faire la requte matre vers la requte dont vous voulez faire la requte dtail.
Figure 10.7 Bote de dialogue Liaison entre requtes
2 Slectionnez la requte qui sera la requte matre dans le champ Requte matre. 3 Slectionnez la requte qui sera la requte dtail dans le champ Requte dtail.
Les champs Requte matre et Requte dtail sont remplis par des champs proposs par le programme. Sils ne vous conviennent pas, faites les modifications ncessaires.
4 Utilisez la table pour indiquer de manire visuelle les colonnes liant les requtes matre et dtail : a Cliquez sur la premire ligne situe sous la colonne requte matre de la table pour afficher la liste droulante de toutes les colonnes spcifies dans la table matre. Slectionnez la colonne sur laquelle vous voulez grouper les donnes dtail. b Cliquez sur la premire ligne situe sous la colonne requte dtail de la table pour afficher la liste droulante de toutes les colonnes ayant le mme type de donnes et la mme longueur que la colonne matre
10-18
Dveloppement dapplications de bases de donnes
en cours. Slectionnez la colonne souhaite. Cela suffit lier les tables matre et dtail.
c Si vous souhaitez slectionner dautres colonnes de liaison, rptez les deux tapes sur les lignes suivantes situes sous la colonne requte matre. d Cliquez sur OK.
Lorsque la bote de dialogue Liaison entre requtes se ferme, une flche apparat entre les deux requtes dans le panneau Requtes pour figurer la relation tablie entre elles.
Figure 10.8 Flches montrant les relations entre les requtes
Pour plus dinformations sur les relations matre-dtail, voir Chapitre 9, Etablissement dune relation matre-dtail
1 Pour enregistrer le module de donnes, cliquez sur Fichier|Enregistrer dans le modeleur de donnes. 2 Quittez le modeleur de donnes.
Le fichier rsultant apparat dans votre projet.
10-19
Figure 10.9
1 Choisissez Fichier|Nouveau et slectionnez longlet Gnral. 2 Double-cliquez sur licne Application Module de donnes.
10-20
3 Spcifiez dans la bote de dialogue qui apparat alors le fichier de module de donnes partir duquel vous voulez gnrer une application.
Vous pouvez slectionner nimporte quel module de donnes JBuilder disponible ou un de ceux crs par le modeleur de donnes.
10-21
2 Dans le code source du fichier de votre application, appelez la mthode setModule() du cadre, en lui transmettant la classe du module de donnes.
Supposons, par exemple, que vous avez utilis le modeleur de donnes pour crer un module de donnes appel CountryDataModelModule. Pour accder la logique stocke dans ce module de donnes depuis lapplication que vous crivez, vous devez ajouter une mthode setModule() la classe de votre cadre. Pour ajouter la mthode setModule() et supprimer lappel de la mthode jbInit() dans le constructeur de la classe,
1 Ajoutez le module de donnes la liste des bibliothques ncessaires (dans la bote de dialogue Projet|Proprits du projet). 2 Choisissez Experts|Utiliser un module de donnes alors que le code source du cadre est visible dans lditeur. 3 Spcifiez le module de donnes utiliser avec lexpert. 4 Slectionnez loption Lapplication dfinit linstance en appelant setModule(). 5 Cliquez sur OK.
Le code obtenu pour le cadre doit avoir laspect suivant :
package com.borland.samples.dx.myapplication; import java.awt.*; import java.awt.event.*; import javax.swing.*; //importe le paquet o se trouve le module de donnes import com.borland.samples.dx.datamodule.*; public class Cadre1 extends JFrame { BorderLayout borderLayout1 = new BorderLayout(); CountryDataModelModule countryDataModelModule1; //Construit le cadre sans appeler jbInit() public Cadre1() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); } //Initialisation du composant
10-22
private void jbInit() throws Exception { this.getContentPane().setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("Titre du cadre"); } //Redfinition pour pouvoir quitter la fermeture du systme protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } // Lexpert Utilisation dun module de donnes a ajout le code suivant public void setModule(CountryDataModelModule countryDataModelModule1) { this.countryDataModelModule1 = countryDataModelModule1; try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } }
Remarquez comment la mthode jbInit() du cadre est maintenant appele aprs la dfinition du module et non dans le constructeur. Vous devez ensuite appeler la nouvelle mthode setModule() dans le code source principal de votre application. Dans le constructeur de lapplication, appelez setModule() en lui transmettant la classe du module de donnes. Le code de lapplication principale doit avoir laspect suivant :
package com.borland.samples.dx.myapplication; import javax.swing.UIManager; public class Application1 { boolean packFrame = false; //Construit lapplication public Application1() { Cadre1 frame = new Cadre1();
// Voici la ligne de code que vous devez ajouter frame.setModule(new sans_titre3.CountryDataModelModule()); //Valider les cadres ayant des tailles prdfinies //Regroupe les cadres ayant des infos utilisables sur la taille prfre, //par exemple par leur disposition if (packFrame) frame.pack(); else frame.validate(); frame.setVisible(true); } //Mthode principale
10-23
public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { } new Application1(); } }
10-24
11
Chapitre11
Chapitre
Dans une application, une fois acheve la phase dacquisition des donnes, les donnes sont places dans le composant ensemble de donnes appropri du paquet DataExpress. Il reste alors dfinir les fonctions standard de lapplication et son interface utilisateur. Ce chapitre prsente les caractristiques de filtrage, tri et recherche de donnes que propose gnralement une application de base de donnes. Un des principes fondamentaux du paquet DataExpress est que la manipulation des donnes est indpendante de la manire dobtenir ces donnes. Quel que soit le type de composant ensemble de donnes utilis pour obtenir les donnes, il est manipul et connect aux contrles de la mme manire. La plupart des exemples de ce chapitre utilisent le composant QueryDataSet, mais vous pouvez le remplacer par le composant TableDataSet ou toute autre sous-classe de StorageDataSet sans avoir modifier le code dans la partie principale de lapplication. Tous les exemples exposs dans ce chapitre sont crs en utilisant lAppBrowser JBuilder et les outils de conception. Chaque fois que cest possible, ces outils sont utiliss pour gnrer le code source Java. Quand cela savre ncessaire, vous apprendrez modifier le code pour que lapplication effectue une action particulire. Les informations prsentes dans ce chapitre supposent que vous connaissez suffisamment lutilisation de lenvironnement de JBuilder. Les tapes dtailles sur la faon dutiliser linterface utilisateur ne sont pas mentionnes. Si JBuilder ne vous est pas familier, reportez-vous au Chapitre 16, Tutoriel : Importation et exportation des donnes dun fichier texte, Utilisation de lAppBrowser dans Introduction JBuilder ou Introduction au concepteur dans Conception dapplications avec JBuilder.
Filtrage, tri et recherche de donnes
11-1
Tous le matriel mis en uvre dans ce chapitre ncessite laccs aux donnes SQL stockes dans une base de donnes locale. Pour des instructions sur linstallation et la configuration de JBuilder pour utiliser le pilote JDataStore exemple, voir Ajout dun pilote JDBC JBuilder, page 4-10. Il est conseill dutiliser les exemples comme guide pour ajouter des fonctions votre application. Des projets complets et des fichiers source Java, comprenant des commentaires lorsque cest ncessaire, sont fournis pour la plupart des concepts prsents dans ce chapitre. Tous les fichiers rfrencs par ces exemples se trouvent dans le rpertoire des exemples de JBuilder. Pour crer une application de base de donnes, vous devez tout dabord la connecter une base de donnes et alimenter en donnes un ensemble de donnes. Accs aux donnes des exemples, page 11-2, dfinit une requte qui peut tre utilise pour certains des exemples contenus dans ce chapitre. Les options de base de donnes de la liste suivante (filtre, tri, recherche de donnes) peuvent sutiliser dans diverses combinaisons, vous pouvez ainsi choisir de masquer, temporairement, tous les employs dont le nom commence par une lettre comprise entre M et Z. Vous pouvez galement trier les employs visibles par ordre alphabtique des prnoms. Le filtrage masque temporairement des lignes dans un ensemble de donnes. Le tri modifie lordre dun ensemble de donnes filtr ou non filtr. La recherche positionne le curseur dans lensemble de donnes filtr ou non filtr.
Cette instruction SQL slectionne toutes les colonnes dune table nomme EMPLOYEE, incluse dans la base de donnes JDataStore exemple (employee.jds). Pour configurer une application afin de pouvoir lutiliser avec les exemples,
1 Fermez tous les projets ouverts (choisissez Fichier|Fermer le projet). 2 Choisissez Fichier|Nouveau projet. 3 Entrez le nom et lemplacement du projet dans lexpert projet. Cliquez sur Terminer.
11-2
Dveloppement dapplications de bases de donnes
4 Choisissez Fichier|Nouveau dans le menu et double-cliquez sur licne Application dans la page Gnral de la galerie dobjets. 5 Spcifiez le nom du paquet et le nom de la classe dans lexpert application. Cliquez sur Terminer. 6 Slectionnez longlet Conception pour activer le concepteur dinterface utilisateur. 7 Cliquez sur le composant Database de longlet Data Express dans la palette des composants, puis cliquez dans larborescence des composants ou le concepteur dinterface utilisateur pour ajouter le composant lapplication. 8 Ouvrez lditeur de la proprit connection du composant Database en le slectionnant, puis en cliquant sur les points de suspension (...) de la proprit connection dans linspecteur. Dfinissez les proprits de connexion pour la table employee du JDataStore exemple, comme suit. La connexion URL pointe sur un emplacement dinstallation particulier. Si vous avez install JBuilder dans un autre rpertoire, pointez sur lemplacement de votre installation.
Nom de la proprit
Pilote URL Nom dutilisateur Mot de passe
Valeur
com.borland.datastore.jdbc.DataStoreDriver Naviguez jusqu votre copie locale de <jbuilder>/ samples/JDataStore/datastores/employee.jds Entrez votre nom non obligatoire
La bote de dialogue connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vrifier que les proprits de connexion sont correctement dfinies. Le rsultat de la tentative de connexion est affich dans la zone dtat. Quand la connexion russit, cliquez sur OK. Si la connexion choue, vrifiez que vous avez bien suivi toutes les tapes du Chapitre 4, Connexion une base de donnes.
9 Ajoutez un composant QueryDataSet au concepteur en cliquant sur le composant QueryDataSet de longlet DataExpress puis en cliquant dans larborescence des composants ou dans linterface utilisateur.
Dans linspecteur, slectionnez la proprit query du composant QueryDataSet, cliquez sur les points de suspension pour ouvrir le dialogue QueryDescriptor et dfinissez les proprits de la manire suivante :
Nom de la proprit
Base de donnes Instruction SQL
Valeur
database1 SELECT * FROM EMPLOYEE
11-3
Cliquez sur Tester la requte pour vrifier quelle peut tre excute. Si la zone dtat indique Succs, choisissez OK pour fermer la bote de dialogue.
10 Ajoutez un composant DBDisposeMonitor de la page dbSwing supplmentaires. Le DBDisposeMonitor fermera le JDataStore lorsque la fentre sera ferme. 11 Dfinissez la proprit dataAwareComponentContainer du DBDisposeMonitor par this.
Pour visualiser les donnes dans votre application, ajoutez les composants dinterface utilisateur suivants et liez-les lensemble de donnes :
1 Slectionnez contentPane(BorderLayout) dans larborescence des composants et dfinissez sa proprit layout par null. 2 Placez un JdbNavToolBar dans la zone situe au dessus du panneau dans le concepteur dinterface utilisateur. jdbNavToolBar1 sattache lui-mme automatiquement au DataSet qui dtient la focalisation, de sorte quil nest pas ncessaire de dfinir sa proprit dataSet. 3 Placez un JdbStatusLabel dans la zone situe en bas du panneau dans le concepteur dinterface utilisateur. jdbStatusLabel1 sattache lui-mme automatiquement au DataSet qui dtient la focalisation, de sorte quil nest pas ncessaire de dfinir sa proprit dataSet. 4 A partir de longlet dbSwing, ajoutez un TableScrollPane au centre du panneau dans le concepteur dinterface utilisateur. 5 Placez un JdbTable au centre du tableScrollPane1 et dfinissez sa proprit dataSet par queryDataSet1.
Vous remarquerez qu ce stade, le concepteur affiche des donnes relles.
Remarque
Pour que lapplication saffiche correctement lors de lexcution, vous aurez peut-tre positionner et redimensionner des composants dans le concepteur.
11-4
11-5
une demande de lutilisateur (comme dans lexemple ci-dessous) ou en fonction de la logique de lapplication (par exemple, en affichant toutes les lignes devant tre supprimes avant denregistrer les modifications, afin de confirmer ou dannuler lopration). Quand vous utilisez une vue filtre des donnes et validez une modification ne satisfaisant pas aux spcifications de filtre, la ligne disparat de la vue mais reste dans lensemble de donnes. Il est possible dutiliser simultanment plusieurs vues des mmes donnes en utilisant des composants DataSetView. Pour davantage dinformations sur lutilisation de vues multiples dun mme ensemble de donnes, voir Prsentation de plusieurs vues des donnes, page 12-23. Le filtrage est parfois confondu avec le tri et la recherche. Le filtrage masque temporairement des lignes dans un ensemble de donnes. Le tri modifie lordre dun ensemble de donnes filtr ou non filtr. Pour davantage dinformations sur le tri des donnes, voir Tri des donnes, page 11-9. La recherche positionne le curseur dans lensemble de donnes filtr ou non filtr. Pour davantage dinformations sur la recherche de donnes, voir Recherche de donnes, page 11-14.
1 Crez une nouvelle application en suivant les instructions de Accs aux donnes des exemples, page 11-2. Cette tape permet de vous
11-6
connecter une base de donnes, de lire les donnes dune table, de voir et de modifier ces donnes dans un composant orient donnes.
2 Cliquez sur longlet Conception. 3 Ajoutez deux composants JdbTextField partir de la page dbSwing et un composant JButton partir de la page Swing. Les composants JdbTextField vous permettent de saisir un nom de champ et une valeur de filtre, le composant JButton excutant le mcanisme de filtre. Le composant JButton excute le mcanisme de filtre. 4 Dfinissez le nom de la colonne filtrer et de son formateur. Slectionnez le longlet Source et ajoutez les instructions import suivantes aux instructions import existantes :
import com.borland.dx.text.VariantFormatter;
5 Ajoutez les dfinitions de variables suivantes aux dfinitions de variables existantes dans la dfinition de classe :
Variant v = new Variant(); String columnName = "Last_Name"; String columnValue = "Young"; VariantFormatter formatter;
a Slectionnez longlet Conception. b Slectionnez le composant queryDataSet1 dans larborescence des composants. c Slectionnez longlet Evnements de linspecteur. d Slectionnez lvnement filterRow. e Double-cliquez dans la zone de valeur filterRow.
Un RowFilterListener est automatiquement gnr en tant que classe inner. Il appelle une nouvelle mthode de votre classe appele queryDataSet1_filterRow.
f Ajoutez le code de filtrage lvnement queryDataSet1_filterRow. Vous pouvez copier le code de laide en ligne en slectionnant le
11-7
code puis en choisissant le bouton Copier (ou en utilisant Ctrl+C ou Edition|Copier dans le Visualiseur daide) :
void queryDataSet1_filterRow(ReadRow row, RowFilterResponse response) { try { if (formatter == null || columnName == null || columnValue == null || columnName.length() == 0 || columnValue.length() == 0) //lutilisateur a laiss le champ vide ; ajouter toutes les lignes response.add(); else { row.getVariant(columnName, v); //lire la valeur de la colonne pour la ligne // la formater en chane String s = formatter.format(v); // si vrai afficher cette ligne if (columnValue.equals(s)) response.add(); else response.ignore(); } } catch(Exception e) { System.err.println("Echec de lexemple de filtre"); } }
7 Redfinissez lvnement actionPerformed pour le bouton JButton afin dappliquer effectivement le filtrage des donnes. Pour ce faire, a Slectionnez longlet Conception. b Slectionnez le JButton dans larborescence des composants. c Cliquez sur longlet Evnements de linspecteur. d Slectionnez lvnement actionPerformed et double-cliquez sur la zone de valeur pour cet vnement.
Longlet source affiche le squelette de la mthode jButton1_actionPerformed. Le code suivant ralise le filtrage des donnes en dtachant et rattachant ladaptateur dvnement rowFilterListener qui a t gnr ltape prcdente.
11-8
// La table ne doit maintenant redessiner que les lignes // respectant ces critres } catch (Exception ex) { System.err.println("Echec de lexemple de filtre"); } }
1 Entrez le nom de la colonne sur laquelle filtrer (par exemple, Last_Name) dans le premier contrle JdbTextField. 2 Entrez la valeur du filtre dans lautre contrle JdbTextField (par exemple, Young). 3 Cliquez sur le JButton.
Remarque
Le filtre est annul et toutes les lignes sont affiches si le nom de la colonne ou la valeur est laiss vide.
11-9
La colonne suivante intervient si les deux premires colonnes contiennent des doublons, et ainsi de suite. Sil reste encore des doublons aprs la dernire colonne du tri, les lignes saffichent dans lordre o elles existent dans la table du serveur. Sil reste encore des rptitions aprs la dernire colonne du tri, les colonnes saffichent dans lordre o elles existent dans la table du serveur. Il est possible de trier les donnes dans toute sous-classe de DataSet, y compris les composants QueryDataSet, ProcedureDataSet, TableDataSet et DataSetView. Quand les donnes sont tries : La diffrenciation majuscules/minuscules ne sapplique quau tri de donnes de type String. La diffrenciation majuscules/minuscules sapplique toutes les colonnes String dun tri multicolonne. Les directions de tri (ascendant/descendant) sont dfinies colonne par colonne. Les valeurs null sont places au dbut dans un tri descendant et la fin dans un tri ascendant. Le tri et lindexation sont intimement lis. Pour davantage dinformations sur les index, voir Tri et indexation, page 11-12.
En procdant ainsi, il nest possible que de trier selon une seule colonne. Si vous cliquez sur un autre en-tte de colonne, vous remplacez le tri existant par un nouveau.
11-10
Dveloppement dapplications de bases de donnes
1 Ouvrez ou crez le projet laide des instructions de la section Accs aux donnes des exemples, page 11-2. 2 Cliquez sur longlet Conception. Slectionnez le QueryDataSet dans le volet contenu. 3 Dans linspecteur, slectionnez puis double-cliquez sur la zone ct de la proprit sort. Lditeur de la proprit sort saffiche. 4 Spcifiez les valeurs des options affectant lordre de tri des donnes. Dans ce cas, slectionnez le champ LAST_NAME dans la liste Colonnes disponibles et choisissez Ajouter au tri. 5 Si vous slectionnez la mauvaise colonne, cliquez sur le bouton Retirer du tri et recommencez ltape prcdente.
11-11
7 Choisissez Excuter|Excuter le projet pour compiler et excuter lapplication. Lapplication doit avoir laspect suivant :
Figure 11.5 Application trie lexcution
Tri et indexation
Deux options de la bote de dialogue Sort ncessitent davantage dexplications : Unique et Index. Le tri et lindexation sont troitement lis. Voici une description dtaille de loption Unique et des index nomms.
Unique
Cochez loption Unique pour crer un index unique qui met en place une contrainte sur les donnes dun StorageDataSet. Avec cette contrainte, seules les lignes ayant des valeurs uniques pour les colonnes dfinies
11-12
comme sortKeys dans le SortDescriptor peuvent tre ajoutes ou mises jour dans un ensemble de donnes. Loption Unique est pratique lors de linterrogation de donnes provenant dune table dun serveur ayant un index unique. Avant que lutilisateur ne commence modifier les donnes, il est possible de dfinir un index unique pour les colonnes qui sont indexes sur le serveur en sachant quil ny aura pas de doublons. Ainsi, lutilisateur ne peut pas crer de lignes qui seraient rejetes comme doublons lors de la sauvegarde sur le serveur. Si un index unique trie sur plusieurs colonnes, la contrainte porte sur les colonnes prises comme un tout : deux lignes peuvent contenir la mme valeur dans une des colonnes du tri, mais il ne peut pas y avoir deux lignes contenant les mmes valeurs pour chacune des colonnes du tri. Unique est une contrainte sur lensemble de donnes, et non pas seulement sur lindex. Si vous dfinissez un index unique sur une colonne, vous affirmez quil nexiste pas deux lignes de lensemble de donnes ayant la mme valeur dans cette colonne. Si plusieurs lignes de lensemble de donnes ont la mme valeur dans la colonne unique la premire cration de lindex, toutes les lignes ne respectant pas la contrainte dunicit sont copies vers un DataSet spar. Vous pouvez accder ce DataSet en appelant la mthode StorageDataSet.getDuplicates(). Vous pouvez supprimer le DataSet des doublons en appelant la mthode StorageDataSet.deleteDuplicates(). Il est possible de dfinir en mme temps plusieurs paramtres dunicit dans la proprit sort dun StorageDataSet. Sil existe dj un DataSet des doublons pour une prcdente dfinition dunicit dans la proprit sort, il nest pas possible de dfinir dautres paramtres dunicit pour la proprit sort tant que les doublons dj existants nont pas t supprims. Cette rgle est dfinie pour empcher la suppression involontaire de lignes de donnes correctes la suite dune dfinition incorrecte de la proprit sort.
Nom dindex
Entrez un nom dans le champ Nom dindex pour crer un index nomm. Il sagit du nom indiqu par lutilisateur associer aux spcifications de tri (index) en cours de dfinition dans lditeur de la proprit Sort. Le rle dun index nomm est de permettre le retour un tri prcdemment dfini. Lindex a t prserv (tenu jour) afin dtre rutilis. Cela signifie que lindex est actualis afin de reflter les ajouts, suppressions et modifications effectus dans la ou les colonnes de tri. Si, par exemple, vous dfinissez un tri unique sur la colonne NumClient de votre ensemble de donnes Clients, mme si vous dcidez de visualiser les donnes par
11-13
Recherche de donnes
ordre de code postal et dfinissez lordre de tri correspondant, vous ne pouvez toujours pas crer un client dont le NumClient serait en double. Un index nomm implmente les ordres de tri (donc les index) et la contrainte dunicit reste applique mme si vous arrtez de visualiser les donnes dans cet ordre. Pour utiliser un ensemble de donnes dans lordre dfini par un nom dindex existant, initialisez sa proprit sort laide du constructeur sortDescriptor qui accepte seulement un nom dindex. Si vous dfinissez dans la proprit sort dun ensemble de donnes un nouveau sortDescriptor utilisant exactement les mmes paramtres quun tri existant, celui-ci est utilis.
Codage du tri
Vous pouvez galement coder le tri manuellement ou utiliser les outils de conception visuelle de JBuilder pour gnrer le code afin dinstancier un objet SortDescriptor. Le code gnr automatiquement par les outils de conception visuelle de JBuilder a laspect suivant :
queryDataSet1.setSort(new com.borland.dx.dataset.SortDescriptor("", new String[] {"LAST_NAME", "FIRST_NAME", "EMP_NO"}, new boolean[] {false, false, false, }, true, false, null));
Dans ce segment de code, le sortDescriptor est instanci pour trier les employs selon leur nom et leur prnom (LAST_NAME et FIRST_NAME), puis leur numro (EMP_NO) est utilis comme sparateur dans le cas demploys portant le mme nom. Le tri seffectue en ordre ascendant en ne tenant pas compte de la diffrenciation majuscule/minuscule. Pour revenir une vue non trie des donnes, fermez lensemble de donnes et initialisez la proprit setSort null, comme suit : Les donnes seront ensuite affiches dans lordre o elles ont t ajoutes la table.
queryDataSet1.setSort(null);
Recherche de donnes
Rechercher des donnes est une fonction lmentaire des applications de donnes. Cette rubrique prsente les deux types de recherche suivants : La recherche interactive en utilisant un composant JdbNavField dans laquelle lutilisateur peut saisir les valeurs rechercher lors de lexcution de lapplication. La recherche de valeurs dfinies par programmation.
11-14
Recherche de donnes
1 Crez une nouvelle application en suivant les instructions de Accs aux donnes des exemples, page 11-2.
Cette tape vous permet de vous connecter une base de donnes, de lire les donnes dune table, de voir et de modifier ces donnes dans un composant orient donnes. Consultez la capture cran de lapplication en cours dexcution ci-dessus pour dterminer lemplacement approximatif des composants.
2 Ajoutez un JdbNavField au concepteur dinterface utilisateur partir de la page DbSwing supplmentaires de la palette de composants et dfinissez sa proprit dataSet par queryDataSet1. 3 Ajoutez un JdbComboBox au concepteur dinterface utilisateur partir de la page dbSwing de la palette de composants.
11-15
Recherche de donnes
4 Initialisez la proprit items de jdbComboBox1 avec les valeurs des noms de colonnes EMP_NO, FIRST_NAME et LAST_NAME. 5 Slectionnez longlet Evnements de linspecteur. Slectionnez lvnement itemStateChanged() de jdbComboBox1, et double-cliquez sur son champ de valeur. Un stub pour lvnement itemStateChanged() est ajout au source. Le positionnement du curseur permet dinsrer le code suivant, qui offre lutilisateur la possibilit de spcifier la colonne dans laquelle rechercher les donnes.
void jdbComboBox1_itemStateChanged(ItemEvent e) { jdbNavField1.setColumnName(jdbComboBox1.getSelectedItem().toString()); jdbNavField1.requestFocus(); }
Ce code teste si une modification est intervenue dans JdbComboBox. Sil dtermine quune autre valeur de colonne est slectionne, la proprit columnName du JdbNavField prend pour valeur la colonne nomme dans le JdbComboBox. Cela indique au JdbNavField deffectuer les recherches dans la colonne spcifie (Column). La focalisation est ensuite attribue au JdbNavField pour la saisie de la valeur rechercher.
7 Ajoutez un composant JdbLabel partir de la page dbSwing. Placez-le ct de jdbNavField1. Initialisez sa proprit text : Valeur localiser.
Remarque
Voir plus haut, dans lcran de lapplication en cours dexcution, le texte des autres instructions.
8 Excutez lapplication.
Le libell dtat est mis jour pour reflter ltat courant de lapplication. Par exemple, Slectionnez dans le composant JdbComboBox le nom de colonne dans laquelle rechercher. La zone dtat affiche "Entrez une valeur puis appuyez sur la touche Entre pour commencer la recherche". Commencez saisir la valeur rechercher dans le composant JdbNavField. Si la recherche est effectue dans une colonne String, au
11-16
Recherche de donnes
fur et mesure de la saisie, remarquez comment le JdbNavField effectue une recherche incrmentale sur les caractres dj saisis. Pour tous les autres types de donnes, appuyez sur Entre pour effectuer la recherche. Si aucune valeur nest trouve dans la table, la zone dtat affiche Impossible de trouver une valeur de colonne correspondante. Appuyez sur les touches Haut ou Bas pour, respectivement, rechercher en arrire ou en avant. Lorsquune valeur correspondante est trouve, la zone dtat affiche Valeur trouve. Appuyez sur les flches haut/bas pour les autres correspondances.
1 Instanciez un DataRow bas sur lensemble de donnes dans lequel rechercher. Si vous ne voulez pas rechercher dans toutes les colonnes du DataSet, crez un DataRow restreint (un DataRow ne contenant que les colonnes pour lesquelles vous voulez spcifier des valeurs de recherche). (Voir Recherche de donnes au moyen dun DataRow, page 11-18.) 2 Affectez les valeurs rechercher aux colonnes appropries du DataRow. 3 Appelez la mthode locate(ReadRow, int) en spcifiant les options de recherche voulues avec le paramtre int. Testez la valeur renvoye pour dterminer si la recherche a russi ou chou. 4 Pour trouver dautres occurrences, appelez de nouveau locate(), en spcifiant une option de recherche diffrente (par exemple, Locate.NEXT ou Locate.LAST). Voir le rsum des champs de la classe Locate pour davantage dinformations sur toutes les options de Locate.
La recherche est effectue en utilisant la mthode locate(ReadRow, int). Le premier paramtre, ReadRow, est un type de classe abstrait. Vous utilisez gnralement sa sous-classe instanciable, la classe DataRow. Le second paramtre reprsente loption de recherche et il est dfini dans le rsum des champs de la classe Locate. Les champs de classe Locate reprsentent les options qui vous permettent de contrler o dmarre la recherche et comment elle fonctionne, par exemple si les majuscules et les minuscules sont diffrencies. (Pour davantage dinformations sur les options de locate, voir Utilisation des options de recherche, page 11-18.) Si une correspondance est trouve, la position de la ligne en cours passe cette ligne. Tous les composants orients donnes connects au composant DataSet dans lequel la recherche est effectue se dplacent ensemble sur la ligne trouve.
11-17
Recherche de donnes
La mthode Locate() recherche dans la vue en cours du DataSet. Cela signifie que les ligne exclues de laffichage par un RowFilterListener ne sont pas prises en compte dans la recherche. La vue de lensemble de donnes peut tre trie ou pas, mais, si elle est trie, la mthode locate() trouve les lignes correspondantes dans lordre de tri. Pour rechercher une valeur null dans une colonne dun ensemble de donnes, incluez la colonne dans le paramtre DataRow de la mthode locate() sans lui affecter de valeur.
Astuce
Si la mthode locate() ne peut trouver de correspondance alors que vous pensez quelle le devrait, vrifiez sil ny a pas de valeurs null dans certaines colonnes ; noubliez pas que toutes les colonnes de DataRow font partie de la recherche. Pour empcher ceci, utilisez un DataRow restreint ne contenant que les colonnes voulues.
Recherche de donnes
options CASE_INSENSITIVE et PARTIAL) dfinissent comment une valeur est considre comme correspondante. La constante FAST affecte la prparation de la recherche. Il faut spcifier o la recherche commence et dans quel sens les lignes de lensemble de donnes sont parcourues. Choisissez lune des options suivantes : FIRST commence la premire ligne, indpendamment de la position en cours, et se dplace vers le bas. LAST commence la dernire ligne et va vers le haut. NEXT part de la position en cours et se dplace vers le bas. PRIOR part de la position en cours et va vers le haut. Si aucune de ces constantes nest spcifie dans les options de recherche, une exception DataSetException de type NEED_LOCATE_START_OPTION est dclenche. Pour trouver toutes les lignes correspondantes dun DataSet, appelez une fois la mthode locate() avec loption de recherche FIRST. Si une correspondance est trouve, r-excutez la recherche en utilisant loption NEXT_FAST et appelez la mthode avec cette option de recherche jusqu ce quelle renvoie false. Loption FAST spcifie que les valeurs de recherche nont pas t modifies et quil nest donc pas ncessaire de les relire dans DataRow. Pour trouver toutes les lignes correspondantes en commenant par la fin de la vue, utilisez la place les options LAST et PRIOR_FAST. Loption CASE_INSENSITIVE spcifie que les valeurs chanes sont considres comme correspondantes mme sil y a des diffrences de majuscules-minuscules. Il nest pas obligatoire de spcifier si la recherche est ou non CASE_INSENSITIVE et cela ne sapplique quaux colonnes String ; cette option nest pas prise en compte pour les autres types de donnes. Si cette option est utilise dans une recherche multicolonne, la diffrenciation majuscules-minuscules ne sapplique quaux colonnes String impliques dans la recherche. Loption PARTIAL spcifie quune valeur de ligne est considre comme correspondante si elle commence par les mmes premiers caractres que la valeur recherche. Il est ainsi possible dutiliser la valeur de recherche M pour trouver tous les noms commenant par M. Tout comme loption CASE_INSENSITIVE, il nest pas obligatoire de spcifier loption PARTIAL qui na de sens que pour la recherche dans les colonnes String. Les recherches multicolonnes utilisant PARTIAL fonctionnent diffremment des autres recherches multicolonnes car lordre des colonnes est pris en compte. Le constructeur dun DataRow restreint multicolonne attend comme paramtre un tableau de noms de colonne. Il nest pas ncessaire que ces noms soient numrs dans leur ordre dapparition dans lensemble de donnes. Puisque loption PARTIAL ne sapplique qu la
11-19
Recherche de donnes
dernire colonne spcifie, la dernire colonne numre dans le tableau est importante. Pour quune recherche multicolonne utilisant loption PARTIAL russisse, une ligne de lensemble de donnes doit correspondre exactement toutes les colonnes du DataRow sauf la dernire. Si la dernire colonne commence par la valeur recherche, la mthode russit. Sinon, la mthode choue. Si la dernire colonne du DataRow nest pas une colonne String, la mthode locate() dclenche une exception DataSetException de type PARTIAL_SEARCH_FOR_STRING.
11-20
12
Ajout de fonctionnalits aux applications de bases de donnes
Chapitre12
Chapitre
Dans une application, une fois acheve la phase dacquisition des donnes, les donnes sont places dans le composant ensemble de donnes appropri du paquet DataExpress. Il reste alors dfinir les fonctions standard de lapplication et son interface utilisateur. Le Chapitre 11, Filtrage, tri et recherche de donnes, prsente le tri, le filtrage et la recherche de donnes dans un ensemble de donnes. Ce chapitre dcrit dautres fonctions standard des applications de bases de donnes. Un des principes fondamentaux du paquet DataExpress est lindpendance entre la manipulation des donnes et la manire dobtenir ces donnes. Quel que soit le type de composant ensemble de donnes utilis pour obtenir les donnes, il est manipul et connect aux contrles de la mme manire. La plupart des exemples de ce chapitre utilisent le composant QueryDataSet, mais vous pouvez le remplacer par le composant TableDataSet ou toute autre sous-classe de StorageDataSet sans avoir modifier le code dans la partie principale de lapplication. Tous les exemples sont crs en utilisant lAppBrowser et les outils de conception de JBuilder. A chaque fois que cest possible, ces outils sont utiliss pour gnrer du code source Java. Quand cela savre ncessaire, vous apprendrez quel code il faut modifier et comment procder afin dexcuter une action particulire dans lapplication. Les exemples et les tutoriels auxquels ce chapitre fait rfrence ncessitent laccs aux donnes SQL stockes dans un JDataStore local. Des projets entirement raliss sont fournis dans le rpertoire exemple DataExpress
12-1
Cration de rfrences
de JBuilder (/samples/DataExpress), le code source tant comment quand cest ncessaire. Il est conseill dutiliser les exemples comme guide pour ajouter des fonctions votre application. Pour crer une application de base de donnes, vous devez tout dabord la connecter une base de donnes et alimenter en donnes un ensemble de donnes. Les tapes de la connexion une base de donnes sont dcrites au Chapitre 17, Tutoriel : Cration dune application de base de donnes lmentaire. Le tutoriel configure une requte utilisable pour les tches de bases de donnes suivantes : Cration de rfrences, inclut des informations sur la cration dune rfrence laide dune liste de slection. Utilisation de colonnes calcules Agrgation de donnes avec des champs calculs Ajout de modles daffichage ou de modification pour formater les donnes Prsentation de plusieurs vues des donnes Garantie de la persistance des donnes Utilisation de types de donnes variant
Cration de rfrences
Une colonne (Column) peut obtenir ses valeurs de plusieurs faons : A partir des donnes dune colonne de base de donnes. A partir du rsultat de limportation dun fichier texte. A partir du rsultat dun calcul, ce qui inclut les colonnes calcules, les donnes agrges, les donnes recherches dans un autre ensemble de donnes ou les donnes slectionnes via une liste de slection. Cette section dcrit comment fournir des valeurs laide dune liste de slection lors de la saisie dune nouvelle valeur dans une colonne, et dcrit galement la cration dune rfrence affichant les valeurs dune autre colonne.
12-2
Cration de rfrences
La section suivante dcrit comment crer ( laide des outils de conception de JBuilder) une liste de slection servant dfinir la valeur dune colonne partir dune liste de valeurs accessibles dans un autre ensemble de donnes. Les instructions dcrivent les tapes du rfrencement dune valeur dans une liste de slection lors de la saisie du pays dun client ou dun employ. Dans cet exemple, la proprit pickList dune colonne vous permet de dfinir quelle colonne de quel ensemble de donnes servira fournir les valeurs de la liste de slection. Les choix seront disponibles pour la saisie dans une composant visuel, tel une table, lorsque lapplication sera excute. Lorsque lapplication est excute, vous pouvez insrer une ligne dans la table et, lorsque vous saisissez une valeur pour le champ JOB_COUNTRY, vous pouvez la slectionner dans la liste de slection droulante. Le pays slectionn est automatiquement insr dans le champ JOB_COUNTRY de lensemble de donnes EMPLOYEE.
1 Crez une application de base de donnes simple, comme dcrit dans Accs aux donnes des exemples, page 11-2. 2 Ajoutez un autre composant QueryDataSet lapplication.
Ce composant constitue la requte utilise pour remplir la liste de slection.
3 Cliquez sur la proprit query de queryDataSet2, dans linspecteur, cliquez sur le bouton points de suspension (...) pour ouvrir lditeur de la proprit Query et dfinissez la proprit comme suit :
Option
Base de donnes Instruction SQL
Valeur
database1 select COUNTRY from COUNTRY
4 Cliquez sur Tester la requte. Lorsquelle est russie, cliquez sur OK pour fermer la bote de dialogue. 5 Dveloppez le composant queryDataSet1 dans larborescence des composants pour voir toutes les colonnes et slectionnez JOB_COUNTRY.
12-3
Cration de rfrences
6 Slectionnez la proprit pickList dans linspecteur, cliquez sur le bouton points de suspension (...) pour ouvrir lditeur de la proprit PickList et dfinissez la proprit comme suit :
Nom de la proprit
Ensemble de donnes Picklist/Lookup queryDataSet2 Type de donnes Afficher dans la liste de slection queryDataSet2
Valeur
queryDataSet2 COUNTRY STRING coche JOB_COUNTRY
7 Cliquez sur longlet Source et entrez le code suivant aprs lappel jbInit() :
queryDataSet2.open();
Il permet douvrir queryDataSet2, qui est attach la table EMPLOYEE_PROJECT. Normalement, un composant visuel orient donnes tel que JdbTable ouvre automatiquement lensemble de donnes, mais dans ce cas, aucun composant visuel nest attach cet ensemble de donnes qui doit donc tre ouvert explicitement.
1 Slectionnez la colonne contenant la liste de slection dans larborescence des composants. 2 Ouvrez lditeur de la proprit PickList en cliquant dans linspecteur sur les points de suspension (...) de la proprit pickList. 3 Dfinissez le champ Ensemble de donnes PickList/Lookup par <aucune>, puis cliquez sur OK. 4 Vous pouvez aussi supprimer une liste de slection dans linspecteur en cliquant avec le bouton droit sur la proprit, puis en choisissant, dans le menu contextuel, Effacer la valeur de proprit.
12-4
Cration de rfrences
12-5
Cration de rfrences
dans le sous-rpertoire /samples/DataExpress/Lookup de votre installation JBuilder. Pour davantage dinformations sur lutilisation de lvnement calcFields pour dfinir une colonne calcule, voir Utilisation de colonnes calcules, page 12-8.
1 Crez une nouvelle application en suivant les instructions de Accs aux donnes des exemples, page 11-2.
Cette tape vous permet de vous connecter une base de donnes, de lire les donnes dune table, de voir et de modifier ces donnes dans un composant orient donnes.
Choisissez
database1 select * from EMPLOYEE_PROJECT
3 Cliquez sur Tester la requte. Lorsquelle est russie, cliquez sur OK pour fermer la bote de dialogue. 4 Slectionnez JdbTable dans le volet contenu et modifiez sa proprit dataSet en queryDataSet2.
Cela vous permet de visualiser les donnes dans le concepteur et dans lapplication excute.
5 Cliquez sur licne dextension gauche du composant queryDataSet2 dans larborescence des composants pour afficher toutes les colonnes, slectionnez <nouvelle colonne> et dfinissez dans linspecteur les proprits suivantes pour la nouvelle colonne :
Nom de la proprit
calcType caption columnName dataType
Valeur
CALC EMPLOYEE_NAME EMPLOYEE_NAME STRING
La nouvelle colonne apparat dans la liste des colonnes et dans le contrle grille. La proprit preferredOrdinal permet de prciser lemplacement auquel sera affiche cette colonne, ou toute autre colonne. Aucune donne nest affiche dans la colonne de rfrence de la table du concepteur. Les rfrences ne sont visibles que lors de lexcution de lapplication. Le type de donnes STRING est utilis ici
12-6
Cration de rfrences
car cest le type de donnes de la colonne LAST_NAME servant de colonne de rfrence. Les colonnes calcules sont, toujours, en lecture seule.
6 Slectionnez longlet Evnements de linspecteur (la nouvelle colonne tant toujours slectionne dans le volet contenu) puis, slectionnez et double-cliquez sur lvnement calcFields.
Le curseur est correctement positionn dans le volet Source.
7 Saisissez le code suivant, qui effectue la recherche et place la valeur rfrence dans la colonne nouvellement dfinie.
void queryDataSet2_calcFields(ReadRow changedRow, DataRow calcRow, boolean isPosted) throws DataSetException{ // Dfinit un DataRow pour conserver le numro de lemploy rechercher // dans queryDataSet1, et un autre pour conserver la ligne des donnes // de lemploy trouves. DataRow lookupRow = new DataRow(queryDataSet1, "EMP_NO"); DataRow resultRow = new DataRow(queryDataSet1); // Le EMP_NO de la ligne courante de queryDataSet2 est // le critre de recherche. // La premire correspondance est recherche, car EMP_NO est unique. // Si la recherche russit, les champs nom sont concatns partir // des donnes de lemploy et le rsultat est plac dans dataRow ; // sinon, la colonne demeure vierge. lookupRow.setShort("EMP_NO", changedRow.getShort("EMP_NO")); if (queryDataSet1.lookup(lookupRow, resultRow, Locate.FIRST)) calcRow.setString("EMPLOYEE_NAME", resultRow.getString("FIRST_NAME") + " " + resultRow.getString("LAST_NAME")); } }
8 Cliquez sur longlet Source et entrez le code suivant aprs lappel jbInit().
queryDataSet1.open();
Cela ouvre queryDataSet1, qui est attach la table EMPLOYEE. Normalement, un composant visuel orient donnes tel que JdbTable ouvre automatiquement lensemble de donnes, mais dans ce cas, aucun composant visuel nest attach cet ensemble de donnes qui doit donc tre ouvert explicitement.
12-7
Quand lapplication sexcute, les valeurs de la colonne de rfrence calcule sadaptent automatiquement aux modifications des autres colonnes, dans cet exemple la colonne EMP_NO, qui est utilise dans les valeurs calcules. Si le champ EMP_NO est modifi, la rfrence affiche la valeur associe la valeur en cours quand cette valeur est valide.
12-8
et une colonne calcule pour le prix total (EXTENDED_PRICE). La colonne EXTENDED_PRICE est calcule en multipliant les valeurs de QUANTITY et de UNIT_PRICE. Les colonnes agrges calcules peuvent tre utilises pour grouper et rcapituler les donnes, par exemple, pour rcapituler les ventes totales par trimestre. Les calculs statistiques peuvent tre spcifis entirement via des paramtres de proprits et plusieurs colonnes peuvent tre incluses dans le regroupement. Quatre types de fonctions statistiques sont supports (sum, count, min et max) ainsi quun mcanisme de cration de mthodes de calcul statistique personnalises. Pour davantage dinformations, voir Agrgation de donnes avec des champs calculs, page 12-11. Les colonnes calcules sont galement utiles pour stocker des rfrences dans dautres tables. Par exemple, un numro de srie peut tre utilis pour rcuprer la description dun objet afin de lafficher dans un lment dune ligne de commande. Pour davantage dinformations sur lutilisation dun champ calcul comme champ de rfrence, voir Cration de rfrences, page 12-2. Les valeurs de toutes les colonnes calcules dune ligne sont values dans le mme appel dvnement. Cette section traite les sujets suivants : Cration dune colonne calcule dans le concepteur Agrgation de donnes avec des champs calculs Dfinition des proprits de AggDescriptor Cration dun gestionnaire dvnement dagrgation personnalis
1 Crez une nouvelle application en suivant les instructions de Accs aux donnes des exemples, page 11-2.
Cette tape vous permet de vous connecter une base de donnes, de lire les donnes dune table, de voir et de modifier ces donnes dans un composant orient donnes.
12-9
2 Cliquez sur licne dextension ct du composant queryDataSet1 dans larborescence des composants pour afficher toutes les colonnes, slectionnez <nouvelle colonne> et dfinissez dans linspecteur les proprits suivantes pour la nouvelle colonne :
Nom de la proprit
calcType caption columnName dataType currency
Valeur
CALC NEW_SALARY NEW_SALARY BIGDECIMAL true
Si vous ajoutez plusieurs colonnes, vous pouvez utiliser la proprit preferredOrdinal pour prciser lemplacement auquel sera affiche cette colonne, ou toute autre colonne persistante. Aucune donne nest affiche dans la colonne calcule de la table du concepteur. Les calculs ne sont effectus quau moment de lexcution de lapplication. Le type de donnes BIGDECIMAL est employ ici car cest le type de donnes de la colonne SALARY qui est utilise dans lexpression de calcul. Les colonnes calcules sont toujours en lecture seule.
3 Slectionnez lobjet queryDataSet1, slectionnez longlet Evnements de linspecteur, slectionnez le gestionnaire dvnement calcFields et double-cliquez sur sa valeur.
Cela cre le stub de la mthode de lvnement dans la fentre Source.
Cette mthode est appele pour calcFields chaque fois quune valeur de champ est enregistre et chaque fois quune ligne est valide. Cet vnement reoit une donne reprsentant la valeur en cours dans la ligne (changedRow) et renvoie une ligne pour y placer les modifications que vous voulez apporter la ligne (calcRow) et un boolen (isPosted) indiquant si la ligne est valide ou pas dans DataSet. Vous pouvez ne pas recalculer les champs pour les lignes qui nont pas encore t valides.
5 Importez la classe java.math.BigDecimal pour utiliser le type de donnes BIGDECIMAL. Ajoutez linstruction suivante aux instructions import :
import java.math.BigDecimal;
12-10
La proprit AggDescriptor sert dfinir les colonnes selon lesquelles seffectue le regroupement, la colonne agrger et lopration dagrgation effectuer. LaggDescriptor est trait en dtail dans les sections suivantes. Lopration dagrgation est une instance de lune des classes suivantes : CountAggOperator SumAggOperator MaxAggOperator MinAggOperator Une classe dagrgation personnalise que vous dfinissez vous-mme
Il est plus facile de crer une colonne agrge calcule que de crer une colonne calcule, car il ny a pas besoin dune mthode dvnement (sauf pour crer un composant dagrgation personnalis). La fonction statistique peut tre calcule pour lensemble de donnes entier ou vous pouvez grouper sur une ou plusieurs colonnes de lensemble de donnes et calculer une valeur statistique pour chaque groupe. La colonne
Ajout de fonctionnalits aux applications de bases de donnes
12-11
statistique calcule est dfinie dans lensemble de donnes en cours de rcapitulation, ainsi chaque ligne du groupe aura la mme valeur dans la colonne calcule (la valeur statistique du groupe en question). La colonne est cache par dfaut. Vous pouvez afficher la colonne ou afficher ses valeurs dans un autre contrle, comme cest le cas dans la section suivante.
1 Crez une nouvelle application en suivant les instructions de Accs aux donnes des exemples, page 11-2.
Cette tape vous permet de vous connecter une base de donnes, de lire les donnes dune table, de voir et de modifier ces donnes dans un composant orient donnes.
3 Ouvrez la proprit query de queryDataSet1 et modifiez linstruction SQL pour quelle devienne :
SELECT CUST_NO, PO_NUMBER, SHIP_DATE, TOTAL_VALUE from SALES
4 Cliquez sur le bouton Tester la requte pour tester la requte et vrifier sa validit ; lorsque la requte est russie, cliquez sur OK. 5 Cliquez sur licne dextension ct du composant queryDataSet1 dans larborescence des composants afin dafficher toutes les colonnes, slectionnez <nouvelle colonne> et dfinissez dans linspecteur les proprits suivantes pour la nouvelle colonne :
Nom de la proprit
caption columnName currency dataType calcType visible
Valeur
GROUP_TOTAL GROUP_TOTAL True BIGDECIMAL aggregated Oui
12-12
Une nouvelle colonne est instancie et le code suivant est ajout la mthode jbInit(). Slectionnez longlet Source pour voir le code. Slectionnez longlet Conception pour continuer.
column1.setCurrency(true); column1.setCalcType(com.borland.dx.dataset.CalcType.AGGREGATE); column1.setCaption("GROUP_TOTAL"); column1.setColumnName("GROUP_TOTAL"); column1.setDataType(com.borland.dx.dataset.Variant.BIGDECIMAL);
6 Depuis la page dbSwing de la palette de composants, ajoutez un JdbTextField au concepteur dinterface utilisateur ; dfinissez sa proprit dataSet par queryDataSet1 et sa proprit columnName par GROUP_TOTAL.
Ce contrle affiche les donnes agrges. Vous pouvez aussi ajouter un contrle JdbTextArea pour dcrire ce quaffiche le champ texte. Aucune donne nest affiche dans le JdbTextField dans le concepteur. Les calculs ne sont effectus quau moment de lexcution de lapplication. Le type de donne BIGDECIMAL est utilis ici car cest le type de donnes de la colonne TOTAL_VALUE qui est utilise dans lexpression de calcul. Les colonnes agrges sont toujours en lecture seule.
7 Slectionnez chacune des colonnes suivantes et dfinissez par True la proprit visible de chacune.
PO_NUMBER CUST_NO SHIP_DATE Cette tape rend persistantes les colonnes affiches dans la table. Les colonnes persistantes sont places entre crochets dans le volet contenu.
8 Slectionnez la colonne GROUP_TOTAL dans le volet contenu et; pour dfinir lagrgat de cette colonne, double-cliquez sur la proprit agg afin dafficher lditeur de la proprit agg.
Dans lditeur de la proprit agg,
a Slectionnez CUST_NO dans la liste Colonnes disponibles. Cliquez sur Ajouter au groupe pour dsigner ce champ comme le champ qui sera utilis pour dfinir le groupe. b Slectionnez TOTAL_VALUE dans la liste Colonne statistique afin de la spcifier comme colonne contenant les donnes agrger. c Slectionnez SumAggOperator dans la liste Opration statistique afin de spcifier que cette opration doit tre effectue.
En fonction de ces slections, vous obtiendrez le total des ventes pour un client donn.
12-13
Quand lapplication est excute, les valeurs du champ agrg sont automatiquement modifies pour reflter les modifications du champ TOTAL_VALUE. De mme, la valeur affiche dans le JdbTextField affiche lagrgat pour le CUST_NO de la ligne slectionne.
12-14
12-15
indique un agrgat de type calcul. Quand la case Calcul sur fonction statistique nest pas coche, les contrles Colonne statistique et Opration statistique sont activs.
utilisant la syntaxe des modles dfinie dans les classes java.text.Format du JDK. Il y a quatre types diffrents de modles correspondant aux diffrents types de donnes de llment contrler :
1 2 3 4
les modles de nombre ; les modles de date et dheure ; les modles de chane ; les modles de boolen.
Pour davantage dinformations sur les modles, voir Modles bass sur des chanes (masques) dans la Rfrence de la bibliothque de composants DataExpress. Les proprits de lobjet Column qui utilisent les modles exprims sous forme de chane sont : La proprit displayMask, qui dfinit le modle utilis pour la saisie et laffichage de base. La proprit editMask, qui dfinit le modle utilis pour analyser la saisie de donnes touche par touche (galement appel fragmentation). La proprit exportDisplayMask, qui dfinit le modle utilis pour importer et exporter les donnes dans un fichier texte. Les implmentations par dfaut de VariantFormatter pour chaque objet Column sont simples afin dtre rapide. Les colonnes mettant en jeu des caractres de ponctuation, comme les dates, utilisent un modle par dfaut driv des paramtres de locale de la colonne. Pour remplacer le formatage par dfaut, par exemple pour utiliser le point comme sparateur des milliers au lieu de lespace, dfinissez explicitement le modle sous forme dune chane pour la proprit que vous voulez changer (displayMask, editMask ou exportDisplayMask). Laffectation dune chane vide ou null displayMask, editMask et exportDisplayMask a une signification particulire : cela choisit le modle correspondant la valeur de la proprit Locale. Cest le comportement par dfaut dans JBuilder pour les colonnes de type Date, Time, Timestamp, Float, Double et BigDecimal. Ce faisant, JBuilder garantit quune application qui utilise les valeurs par dfaut va automatiquement employer le bon format daffichage quand elle est excute dans un autre pays.
Remarque
Si vous ralisez des applications internationales utilisant des valeurs de locale autres que en_US (English (United States)), vous devez utiliser dans vos modles le style de sparateur amricain (par exemple, la virgule comme sparateur des milliers et le point comme sparateur dcimal). En procdant ainsi, lapplication peut utiliser les mmes modles quel que soit le pays o elle est installe. Quand vous utilisez une locale autre que en_US, ces caractres sont convertis par le JDK dans leur quivalent local
12-17
et affichs de manire approprie. Pour un exemple dutilisation des modles dans une application internationale, voir le fichier projet IntlDemo.jpx, situ dans le sous-rpertoire /samples/dbSwing/MultiLingual de votre installation JBuilder. Pour remplacer les formats par dfaut des valeurs numriques et dates stockes dans les fichiers locaux, affectez les proprits displayMask, editMask ou exportDisplayMask du composant Column de lensemble de donnes. Les possibilits de formatage proposes par les chanes de modle du paquet DataExpress suffisent gnralement pour la plupart des cas. Si vous avez besoin de modles plus spcifiques, le mcanisme de formatage dispose dinterfaces et de classes que vous pouvez tendre pour crer des classes de formatage personnalises.
Masques daffichage
Les masques daffichage sont des modles sous forme de chane utiliss pour formater les donnes affiches par les colonnes, par exemple dans un JdbTable. Les modles daffichage peuvent ajouter des espaces ou des caractres spciaux llment de donnes. Les masques daffichage sont galement utiliss pour analyser les saisies de lutilisateur en convertissant la chane saisie dans le type adapt la colonne. Si vous entrez des donnes qui ne peuvent tre analyses en utilisant le masque daffichage spcifi, vous navez pas le droit de sortir du champ tant que les donnes ne sont pas saisies de la manire approprie.
Astuce
Les saisies utilisateur qui ne peuvent tre analyses par le modle spcifi gnrent des messages de validation. Ces messages apparaissent dans le contrle JdbStatusLabel quand JdbStatusLabel et le composant dinterface utilisateur affichant les donnes modifier (par exemple, un JdbTable) sont lis au mme ensemble de donnes.
Masques de saisie
Avant le dbut de la saisie, le masque daffichage contrle entirement le formatage et la fragmentation. Les masques de saisie sont des modles optionnels sous forme de chane utiliss pour contrler la saisie dans une colonne et pour replacer les donnes de la chane saisie dans la colonne en traitant les frappes de touche une une. Quand le masque de saisie dune colonne est spcifi, les caractres littraux placs dans le modle peuvent tre ventuellement enregistrs avec les donnes. Les emplacements du modle indiquant des caractres saisir saffichent par dfaut comme un caractre de soulignement (_).
12-18
Au fil de la saisie dans une colonne utilisant un masque de saisie, la saisie est valide en confrontant chaque touche enfonce aux caractres autoriss par le modle la position en cours dans le masque. Les caractres qui ne sont pas autoriss un emplacement donn du modle ne sont pas pris en compte et le curseur ne passe au caractre suivant que si le critre dfini cet emplacement du modle est respect.
12-19
Les composants Column numrique ont toujours des masques daffichage et de saisie. Si vous ne dfinissez pas explicitement ces proprits, des modles par dfaut sont dfinis en recherchant de la manire suivante :
1 Dans la locale du composant Column ; 2 Si la locale du composant Column nest pas dfinie, dans la locale de lobjet DataSet ; 3 Si la locale de lobjet DataSet nest pas dfinie, dans la locale par dfaut du systme. Les donnes numriques saffichent par dfaut avec trois chiffres aprs la virgule.
Il est possible de saisir un nombre quelconque de chiffres gauche de la virgule dans une colonne numrique. Par contre, les masques limitent la saisie au nombre de chiffres spcifis gauche du sparateur dcimal dans le masque. Pour tre sr que toutes les valeurs autorises puissent tre saisies dans une colonne, spcifiez un nombre suffisant de chiffres gauche du sparateur dcimal dans la spcification du modle. De plus, chaque masque numrique contient un caractre supplmentaire gauche des donnes pour contenir le signe du nombre. Le code utilis pour dfinir le masque daffichage du premier modle du tableau suivant est :
column1.setDisplayMask(new String("###%"));
Le tableau suivant prsente plusieurs exemples de spcifications de modles pour les donnes numriques :
Spcification de modle
###%
Valeur
85
Valeur formate
85%
Signification
Tous les chiffres sont optionnels, les zros de dbut ne sont pas affichs, la valeur est divise par 100 et saffiche comme un pourcentage. Le 0 indique un chiffre obligatoire, les zros ne sont pas supprims. Les nombres ngatifs sont prcds dun signe moins (-). La valeur littrale F est affiche droite de la valeur. Le curseur est positionn au point indiqu par le caret (^), les chiffres se dplaant vers la gauche au fil de la saisie. Tous les chiffres sont optionnels, affiche le sparateur des milliers et le sparateur dcimal ainsi que le symbole montaire. Les valeurs ngatives sont entre parenthses. Si le signe moins (-) ou la parenthse ouvrante (() sont saisis, JBuilder encadre la valeur de parenthses.
$#,###.##;($#,###.##)
4321.1 -123.456
$4,321.1 ($123.46)
12-20
1 Dans la locale du composant Column ; 2 Si la locale du composant Column nest pas dfinie, dans la locale de lobjet DataSet ; 3 Si la locale de lobjet DataSet nest pas dfinie, dans la locale par dfaut du systme.
Les symboles de modle utilisables pour les donnes date, heure et date/ heure sont dcrits dans la section Modles date, heure et date/heure de la Rfrence de la bibliothque de composants DataExpress. Le code dfinissant le masque de saisie du premier modle du tableau suivant est :
column1.setDisplayMask(new String("jj MMM aaaaG"));
Le tableau suivant prsente plusieurs exemples de spcifications de modles pour les donnes date et heure :
Spcification de modle
jj MMM aaaaG j/MM/aa H:m
Valeur
14 janvier 1900 2 fvrier 1492 4 juillet 1776 3:30am 2 mars 1997 11:59pm
Valeur formate
14 Jan 1900AD 02 Fv 1492AD 07/4/76 3:30 03/2/92 23:59
Signification
Renvoie deux chiffres pour le jour, labrviation du mois, un espace (littral) et 4 chiffres pour lanne. Renvoie un ou deux chiffres pour le jour, le numro du mois, deux chiffres pour lanne et lheure en utilisant une horloge de 24 heures.
1 Le modle de la chane. 2 Indique si les littraux doivent tre stocks avec les donnes. La valeur 1 (comportement par dfaut) spcifie le stockage des littraux avec les donnes. Pour retirer les littraux des donnes stockes, utilisez 0. 3 Le caractre utiliser comme indicateur blanc. Ce caractre indique les emplacements saisir dans les donnes. Si cette partie est omise, le caractre de soulignement (_) est utilis par dfaut.
12-21
4 Les caractres utiliser pour remplacer les zones vides laffichage. Si cette partie est omise, les positions vides sont supprimes.
Les symboles de modle utilisables pour les donnes texte sont dcrits dans la section Modles de texte de la Rfrence de la bibliothque de composants DataExpress. Par exemple, le code dfinissant le masque daffichage et de saisie du premier modle spcifi dans le tableau suivant est :
column1.setDisplayMask(new String("00000{-9999}")); column1.setEditMask(new String("00000{-9999}"));
Valeur
950677394 00043 1540001
Valeur formate
95067-7394 00043 00154-0001
Signification
Affichage des zros pour les cinq positions de gauche (obligatoires), les caractres restants sont optionnels, ce sont un tiret littral et quatre chiffres. Utilisez ce modle pour les codes postaux amricains. Le L correspond une saisie obligatoire de lettre A-Z. Le 0 (zro) correspond une saisie obligatoire de chiffre 0-9, les signes plus (+) et moins (-) ntant pas autoriss. Utilisez ce modle pour les codes postaux canadiens. Ce modle correspond aux numros de tlphone amricains avec un indicatif optionnel entre parenthses. Le signe caret (^) positionne le curseur la droite du champ, les donnes se dcalant vers la gauche au fil de la saisie. Pour que les donnes soient stockes correctement de droite gauche, utilisez le symbole !. Ce comportement est automatique pour les valeurs numriques. Le code zro (0) indique que les littraux ne sont pas stocks avec les donnes.
L0L 0L0
H2A2R9 M1M3W4
{(999)} 000-0000^!;0
4084311000
(408) 431-1000
12-22
1 Crez une nouvelle application en suivant les instructions de Accs aux donnes des exemples, page 11-2.
Cette tape vous permet de vous connecter une base de donnes, de lire les donnes dune table, de voir et de modifier ces donnes dans un composant orient donnes.
2 Depuis longlet DataExpress, ajoutez un composant DataSetView larborescence des composants ou au concepteur dinterface utilisateur. 3 Attribuez la valeur queryDataSet1 la proprit storageDataSet du composant DataSetView.
Le composant DataSetView parcourt les donnes indpendamment de son StorageDataSet associ.
12-23
4 Ajoutez dautres TableScrollPane et JdbTable au concepteur dinterface utilisateur et dfinissez la proprit dataSet du JdbTable par dataSetView1 pour synchroniser la navigation dans les contrles. 5 Compilez et excutez lapplication.
Le composant DataSetView affiche les donnes du QueryDataSet mais sans dupliquer son contenu. Il prsente les donnes dorigine du QueryDataSet non tries, non filtres. Vous pouvez dfinir des critres de tri ou de filtre dans le composant DataSetView qui diffrent de ceux du StorageDataSet original. Lattachement du DataSetView un StorageDataSet et la dfinition dun nouveau critre de filtre et/ou de tri na aucun effet sur les critres de filtre ou de tri dfinis dans le StorageDataSet. Pour dfinir un critre de filtre ou de tri dun composant DataSetView,
1 Double-cliquez sur le fichier cadre dans le volet projet et slectionnez longlet Conception. 2 Slectionnez le composant DataSetView. 3 Dans la page Proprits de linspecteur, a Slectionnez la proprit sort pour modifier lordre daffichage des enregistrements dans le DataSetView.
Pour davantage dinformations sur le sortDescriptor, voir Tri des donnes, page 11-9.
b Slectionnez la proprit masterLink pour dfinir un ensemble de donnes parent de cette vue.
Pour davantage dinformations sur masterLinkDescriptor, voir Chapitre 9, Etablissement dune relation matre-dtail.
4 Sur la page Evnements de linspecteur, slectionnez la mthode filterRow pour masquer temporairement des lignes dans le DataSetView. Pour davantage dinformations sur le filtrage, voir Filtrage des donnes, page 11-5.
Vous pouvez, par dfaut, modifier, supprimer ou ajouter des donnes dans le DataSetView. Quand vous modifiez, supprimez ou ajoutez des donnes dans le DataSetView, vous le faites galement dans le StorageDataSet auquel est li le composant DataSetView. Attribuez la valeur false la proprit enableDelete pour empcher lutilisateur de supprimer des donnes du StorageDataSet. Attribuez la valeur false la proprit enableInsert pour empcher lutilisateur dajouter des donnes au StorageDataSet. Attribuez la valeur false la proprit enableUpdate pour empcher lutilisateur de modifier les donnes du StorageDataSet.
12-24
1 Ouvrez un projet contenant un objet DataSet, par exemple slectionnez lun des fichiers projets (.jpx) du sous-rpertoire /samples/DataExpress/ de votre installation JBuilder. 2 Double-cliquez sur le fichier Cadre (par exemple, BasicAppFrame.java) pour louvrir dans le volet contenu, puis cliquez sur longlet Conception.
12-25
3 Double-cliquez sur lobjet DataSet. Cela affiche le concepteur de colonne pour lensemble de donnes. Le concepteur de colonne ressemble limage suivante pour la table exemple employee :
Figure 12.3 Concepteur de colonne
4 Slectionnez la colonne dont vous voulez dfinir les proprits. Linspecteur reflte les proprits (et les vnements) de la colonne slectionne. 5 Dfinissez une proprit en saisissant une valeur dans la zone de saisie de linspecteur. Si vous ne voulez pas modifier de proprit de la colonne, vous pouvez dfinir une valeur, puis la rinitialiser sa valeur par dfaut.
A titre dexemple, dfinissez la valeur minimum dune colonne contenant une donne numrique en saisissant une valeur dans la proprit min. JBuilder met automatiquement le nom de la colonne entre crochets ([ ]) dans larborescence. Dans le concepteur de colonne, les colonnes de lensemble de donnes sont affiches dans une table lintrieur du concepteur dinterface utilisateur. Une barre doutils permet dajouter, de supprimer et de parcourir lensemble de donnes. Le bouton Insrer une colonne dans le dataset insre une nouvelle colonne lindice prfr de la colonne mise en vidence dans la table. Le bouton Supprimer supprime la colonne de lensemble de donnes. Les boutons Dplacer vers le haut et Dplacer vers le bas changent la position par dfaut des colonnes et leur ordre daffichage dans les composants orients donnes comme le contrle table. Le bouton Choisir les proprits afficher vous permet de choisir les proprits affiches dans le concepteur. Le bouton Continuer toutes les mtadonnes rend persistantes toutes les mtadonnes ncessaires pour louverture dun QueryDataSet lexcution. Voir Utilisation du concepteur de colonne pour rendre persistantes des mtadonnes, page 7-4.
12-26
Le bouton Rendre toutes les mtadonnes dynamiques vous permet de mettre jour une requte aprs la modification ventuelle de la table sur le serveur. Vous devez dabord rendre les mtadonnes dynamiques, puis persistantes, afin dutiliser les nouveaux index crs sur la table de la base de donnes. La slection du bouton Rendre toutes les mtadonnes dynamiques SUPPRIME LE CODE du fichier source. Voir Utilisation du concepteur de colonne pour rendre dynamiques des mtadonnes, page 7-5. La slection du bouton de gnration de classe de RowIterator ouvre une bote de dialogue qui offre des fonctionnalits ditration allges (faible consommation de mmoire et liaison rapide) garantissant un accs statique aux colonnes avec scurit des types. Voir Bouton Crer une classe RowIterator, page 7-3, pour davantage dinformations.
Remarque
Si vous accdez aux bases de donnes avec JDataStore, vous pouvez restructurer la base de donnes JDataStore depuis JBuilder, sans crire de code, laide de JdsExplorer (Outils|Explorateur JDataStore). Pour fermer le concepteur de colonnes, double-cliquez sur nimporte quel composant de linterface utilisateur, comme contentPane, dans larborescence, ou cliquez avec le bouton droit sur un composant, puis slectionnez Activer le concepteur. En dautres termes, la seule faon de fermer un concepteur est den ouvrir un autre.
12-27
Veuillez noter ce qui suit concernant le formatage et ldition dune colonne contenant un objet Java. Formatage et dition par dfaut Dans le concepteur dinterface utilisateur, un formateur est attribu par dfaut aux colonnes de type Object. Quand lobjet est dit, il est considr comme un objet de type java.lang.String indpendamment de son type dorigine. Personnalisation du formatage et de ldition Vous pouvez (et vous voudrez probablement le faire) dfinir la proprit formatter dune colonne pour redfinir les fonctionnalits par dfaut, ou au moins rendre la colonne non modifiable. Un formateur personnalis permet de dfinir le formatage et la fragmentation adapts aux objets contenus dans la colonne. Le mme formateur de colonne est utilis pour tous les enregistrements de lensemble de donnes. Cela signifie quil nest pas possible de mlanger des objets de types diffrents dans une mme colonne. Cette restriction ne sapplique qu ldition personnalise.
12-28
13
Chapitre13
Chapitre
Cette rubrique donne davantage dinformations sur lutilisation des contrles et des vnements. Accs aux donnes des exemples, page 11-2, dfinit une requte qui peut tre utilise comme point de dpart pour les questions traites dans ce chapitre. Ce chapitre aborde les sujets suivants : Synchronisation des composants visuels Accs aux donnes et aux informations de modle depuis un composant dinterface utilisateur Affichage dinformations dtat Gestion des erreurs et des exceptions
13-1
galement le mme pseudo enregistrement. Cela permet aux modifications dtres visibles ds que la saisie au niveau du champ est acheve, par exemple ds que vous sortez du champ. Plusieurs composants visuels sont synchroniss par laffectation du mme ensemble de donnes leur proprit dataSet. Quand des composants sont lis au mme ensemble de donnes, ils parcourent les donnes de concert et restent automatiquement synchroniss sur la mme ligne de donnes. Cest ce que lon appelle des curseurs partags. Si, par exemple, un programme utilise un JdbNavToolBar et un JdbTable connects tous les deux au mme QueryDataSet, le fait de cliquer sur le bouton Dernier dans le JdbNavToolBar affiche automatiquement le dernier enregistrement du QueryDataSet dans la JdbTable. Si ces composants sont lis diffrents composants ensemble de donnes, ils ne se repositionnent pas automatiquement sur la mme ligne de donnes. Plusieurs composants dbSwing, dont JdbNavToolBar et JdbStatusLabel, sattachent automatiquement tout ensemble de donnes (DataSet) ayant la focalisation. La mthode goToRow(com.borland.dx.dataset.ReadRow) permet de synchroniser deux composants ensemble de donnes sur la mme ligne (celle sur laquelle est positionn dataSet) mme si diffrents critres de tri ou de filtre sont actifs.
Accs aux donnes et aux informations de modle depuis un composant dinterface utilisateur
Si vous avez initialis la proprit dataSet dun composant, il faut viter daccder par programme aux donnes ou aux informations de modle de lensemble de donnes via le composant tant que le responsable du composant na pas t cr. Les oprations qui chouent ou renvoient des rsultats incorrects ou incohrents quand elles sont excutes avant laffichage du composant dans linterface utilisateur sont celles qui accdent au modle du composant. Entre autres, Oprations <composant>.get() ou <composant>.set() <composant>.insertRow() etc. Pour garantir la bonne excution de telles oprations, vrifiez la notification dvnement open() gnre par lensemble de donnes. Une fois que la notification dvnement a eu lieu, vous tes certain que le composant et son modle sont correctement initialiss.
13-2
1 Ouvrez les fichiers projet de lapplication laquelle vous voulez ajouter un JdbStatusLabel.
Cette application doit inclure un composant JdbTable, un composant Database et un composant QueryDataSet. Si vous ne disposez pas dune application de ce type, utilisez les fichiers crs daprs les instructions de la section Accs aux donnes des exemples, page 11-2. Vrifiez que la disposition du contentPane du projet est bien dfinie par null.
2 Double-cliquez sur le fichier cadre dans le volet projet de lAppBrowser pour louvrir dans le volet du contenu, puis cliquez sur longlet Conception, en bas de lAppBrowser. 3 Cliquez sur la page dbSwing de la palette des composants et cliquez sur le composant JdbStatusLabel.
13-3
4 Dessinez le JdbStatusLabel sous le composant JdbTable. Le composant jdbStatusLabel1 se connecte automatiquement tout objet DataSet ayant la focalisation.
Habituellement, vous utilisez un composant JdbStatusLabel en conjonction avec un autre composant dinterface utilisateur, gnralement un composant JdbTable qui affiche les donnes de lensemble de donnes. Ainsi, les deux composants suivent le mme ensemble de donnes, cest ce quon dsigne par le terme de curseur partag. Une fois JdbStatusLabel ajout, le composant JdbStatusLabel indique que le curseur est sur la ligne 1 de x (x indiquant le nombre denregistrements dans lensemble de donnes).
6 Slectionnez les colonnes Last_Name et First_Name et, dans linspecteur, affectez la valeur true la proprit required de ces deux colonnes. 7 Affectez la valeur 25000 la proprit min de la colonne SALARY. 8 Excutez lapplication.
1 Insrez une nouvelle ligne de donnes. Essayez denregistrer la ligne sans saisir de valeur dans les colonnes FIRST_NAME ou LAST_NAME. Un message est affich dans le JdbStatusLabel indiquant quil nest pas possible denregistrer la ligne en raison de champs manquants ou incorrects. 2 Entrez une valeur dans les colonnes FIRST_NAME et LAST_NAME. Saisissez dans la colonne SALARY un nombre (1000) infrieur au minimum autoris (25000). Quand vous essayez de changer de ligne, le JdbStatusLabel affiche le mme message derreur signalant que la ligne ne peut tre valide cause de valeurs de champs manquantes ou incorrectes.
En dfinissant, des endroits appropris de votre code, le texte du JdbStatusLabel, vous remplacez le message en cours affich dans le JdbStatusLabel par ce texte. Mais ce message texte est son tour remplac
13-4
par le texte suivant que vous dfinissez ou par le texte du prochain message gnr par lensemble de donnes. Un message dtat est gnr par les dplacements dans les donnes de la table, les erreurs de validation, etc.
13-5
peuvent voir dans le libell dtat les messages produits par les violations.
Remplacement de la gestion par dfaut des exceptions DataSetException dans les contrles
Il est possible de redfinir des portions de la gestion par dfaut des erreurs en recensant un auditeur StatusEvent dans lensemble de donnes. Cela empche laffichage des messages ValidationException dans la bote de dialogue Exceptions. Il est possible de neutraliser davantage la gestion par dfaut des DataSetException pour les contrles au niveau de lensemble de donnes en attribuant la valeur false sa proprit displayErrors. Comme cest une proprit densemble de donnes, dfinissez-la pour chaque ensemble de donnes de lapplication pour neutraliser la gestion des erreurs par dfaut de tous les objets DataSet de lapplication. Pour contrler compltement la gestion DataSetException de tous les contrles dbSwing et des objets ensemble de donnes, vous devez crer votre propre classe gestionnaire et la connecter lauditeur ExceptionEvent de la classe DataSetException. La plupart des vnements du paquet dataset dclenchent des exceptions DataSetException. Cela savre trs pratique quand vos gestionnaires derreurs utilisent lAPI dataSet (qui dclenche gnralement DataSetException). Cela vous vite de coder la logique try/catch pour chaque gestionnaire dvnements que vous crivez. Pour le moment, les outils de conception JBuilder ninsrent pas la clause throws DataSetException dans le code source java quils gnrent mais vous pouvez ajouter cette clause.
13-6
14
Cration dune application de base de donnes distribue laide de DataSetData
Chapitre14
Chapitre
Le projet exemple DataSetData.jpx se trouvant dans le rpertoire /samples/ DataExpress/StreamableDataSets de votre installation JBuilder contient une application de base de donnes distribue complte qui utilise lappel de mthode distant (RMI) et DataSetData. Il contient une application serveur utilisant les donnes de la table exemple employee JDataStore qui envoie les donnes, via le RMI, sous la forme de DataSetData. Un DataSetData est utilis pour passer des donnes en tant quargument une mthode RMI ou en tant que flux dentre un servlet Java. Une application client communique avec le serveur via un fournisseur et un rsolveur personnaliss. Lapplication client affiche les donnes dans une table. Les modifications effectues sur le client peuvent tre enregistres en utilisant le bouton Enregistrer dune barre doutils JdbNavToolBar. Pour plus dinformations sur lcriture de fournisseurs personnaliss, voir Ecriture dun fournisseur de donnes personnalis, page 6-7. Pour plus dinformations sur lcriture ou sur la personnalisation dun rsolveur, voir Personnalisation de la logique de rsolution par dfaut, page 8-16. Voir le fichier DataSetData.html dans le rpertoire /samples/DataExpress/ StreamableDataSets/ pour des informations actualises sur cette application exemple.
14-1
Explication de lexemple dapplication de base de donnes distribue (utilisant Java RMI et DataSetData)
Le projet exemple, situ dans /samples/DataExpress/StreamableDataSets/ DataSetData.jpx, illustre lutilisation de la classe DataExpress DataSetData pour construire une application de base de donnes distribue. Outre lutilisation dobjets DataSetData pour la transmission de donnes de base de donnes entre un serveur et un client RMI, cet exemple illustre lutilisation dun fournisseur et dun rsolveur densemble de donnes personnaliss. Lapplication exemple contient les fichiers suivants : Fichiers interface EmployeeApi.java est une interface qui dfinit les mthodes que vous voulez distantes. Fichiers serveur DataServerApp.java est un serveur RMI. Il tend UnicastRemoteObject. Fichiers fournisseur ClientProvider.java est limplmentation dun Provider. La mthode provideData est limplmentation dune mthode de com.borland.dx.dataset.Provider. Nous faisons rfrence au service DataServerApp sur lhte spcifi par la proprit hostName, puis effectuons lappel la mthode distante et chargeons notre DataSet avec le contenu. Fichiers rsolveur Fichiers rsolveur ClientResolver.java est limplmentation dun Resolver. La mthode resolveData est limplmentation dune mthode de com.borland.dx.dataset.Resolver. Nous faisons rfrence au service DataServerApp sur lhte spcifi par la proprit hostName. Puis, nous rcuprons les modifications dans une instance de DataSetData. Ensuite, nous effectuons lappel la mthode distante, grons les ventuelles erreurs de rsolution et changeons les bits dtat de toutes les lignes modifies pour montrer que tout a t rsolu. Fichiers client ClientApp.java est une application client RMI. Voir ClientFrame.java pour plus de dtails. Autres fichiers Res.java est un fichier ressource pour linternationalisation de lapplication. ClientFrame.java est le cadre de ClientApp. Remarquez que le DataSet affich dans la table est un TableDataSet avec un fournisseur
14-2
personnalis et un rsolveur personnalis. Voir ClientProvider.java et ClientResolver.java pour plus de dtails. DataServerFrame.java est le frame affich par DataServerApp.
1 Ouvrez cette application dans JBuilder en choisissant Fichier|Ouvrir et en naviguant jusqu /samples/DataExpress/StreamableDataSets/ DataSetData.jpx. 2 Choisissez Projet|Proprits du projet et dfinissez les options dexcution de lapplication : a Slectionnez longlet Excution. b Slectionnez la configuration dexcution avec DataServerApp (propose par dfaut) et cliquez sur Modifier pour ouvrir la bote de dialogue Proprits de configuration dexcution. c Vrifiez que les proprits du champ Paramtres VM indiquent le chemin daccs correct.
La proprit java.rmi.server.codebase pointe sur lemplacement des classes du serveur RMI. Par dfaut, cette proprit est dfinie de la manire suivante :
-Djava.rmi.server.codebase="file: /usr/local/jbuilder/samples/DataExpress/StreamableDataSets/classes/ file:/usr/local/jbuilder/lib/dx.jar"
La proprit java.rmi.server.codebase pointe sur lemplacement correct des classes du serveur RMI. Par dfaut, cette proprit est dfinie de la manire suivante :
-Djava.security.policy=file:/usr/local/jbuilder/samples/DataExpress/ StreamableDataSets/SampleRMI.policy
d Fermez la bote de dialogue Proprits du projet. 3 Dmarrez le registre RMI en choisissant Outils|Registre RMI dans JBuilder.
Le registre est activ et dsactiv partir du menu Outils.
4 Dans le volet projet, cliquez avec le bouton droit sur DataServerApp.java, puis choisissez Excuter|Excuter DataServerApp pour dmarrer le serveur RMI. 5 Dans le volet projet, cliquez avec le bouton droit sur ClientApp.java, puis choisissez Excuter|Excuter ClientApp pour dmarrer le client RMI.
14-3
6 Modifiez les donnes dans la table de ClientApp, puis cliquez sur le bouton Enregistrer les modifications de la barre doutils (pour enregistrer les modifications sur le serveur) ou sur le bouton Rafrachir de la barre doutils (pour recharger les donnes depuis le serveur).
Chaque fois que les donnes sont enregistres ou rafrachies, le compteur de requtes intermdiaires est incrment.
Que se passe-t-il ?
DataServerApp se recense lui-mme en tant que serveur RMI. Il rpond deux requtes client RMI : provideEmployeeData et resolveEmployeeChanges, dfinies dans linterface distante RMI EmployeeApi.java. Lapplication client se compose dun cadre (ClientFrame.java) et de composants dbSwing JdbTable et JdbNavToolBar pour laffichage des donnes dans un TableDataSet DataExpress. Les donnes sont fournies au TableDataSet via un fournisseur personnalis, ClientProvider.java, et les donnes sont enregistres dans la source via un rsolveur personnalis, ClientResolver.java. ClientProvider.java remplit ses donnes de table en invoquant la mthode distante provideEmployeeData() de DataServerApp via RMI. DataServerApp demande ensuite des donnes, partir dune table situe sur un serveur de bases de donnes JDBC, qui sont regroupes dans un DataSet. Il extrait ensuite les donnes du DataSet et les place dans un objet DataSetData puis les renvoie au ClientProvider via RMI. ClientProvider charge ensuite les donnes situes dans lobjet DataSetData dans le DataSet de ClientApp, puis les donnes saffichent dans la table. Au moment de rsoudre les modifications de la table dans la base de donnes, le rsolveur personnalis du DataSet de ClientApp, ClientResolver.java, extrait (uniquement) les modifications qui doivent tre envoyes au serveur de bases de donnes dans un objet DataSetData. ClientResolver invoque ensuite la mthode distante resolveEmployeeChanges() de DataServerApp via RMI, en lui transmettant comme paramtre lobjet DataSetData contenant les mises jour ncessaires. DataServerApp utilise ensuite DataExpress pour rsoudre les modifications dans le serveur de bases de donnes. En cas derreur (en raison dune rgle de mtier ou dune violation de contrainte de donnes, par exemple), DataServerApp empaquette les lignes qui nont pas pu tre enregistres dans la base de donnes dans un objet DataSetData quil renvoie au ClientResolver. ClientResolver extrait ensuite les lignes non rsolues se trouvant dans lobjet DataSetData et les place dans la table de ClientApp afin quelles puissent de nouveau tre corriges et rsolues dans le serveur. Notez que DataServerApp est le niveau intermdiaire de lapplication. Il peut imposer ses propres rgles et contraintes de mtier entre le serveur de bases de donnes et le client. De plus, il peut, bien sr, offrir un nombre
14-4
quelconque de mthodes supplmentaires accessibles distance pour limplmentation de tches de mtiers ou applicatives.
Les autres proprits de colonnes quun serveur doit passer un client doivent tre transmises en tant que tableau de Columns via RMI. Lobjet Column lui-mme est srialisable, de sorte quune application client peut tre conue pour obtenir ces proprits de colonnes avant quelle ait besoin des donnes. Les colonnes doivent tre ajoutes en tant que colonnes persistantes avant le chargement de DataSetData.
1 Ouvrez DataServerApp.java et changez lURL de connexion la base de donnes dans le constructeur afin quelle pointe sur la connexion dune base de donnes distante laquelle vous avez accs.
La base de donnes constitue lextrmit dorsale, ou troisime niveau.
2 Choisissez Projet|Construire le projet pour recompiler et mettre jour la classe DataServerApp. 3 Dployez DataServerApp.class sur une machine distante laquelle vous tes connect.
DataServerApp sexcute au deuxime niveau (niveau intermdiaire).
4 Dmarrez le registre RMI sur lordinateur du niveau intermdiaire. 5 Dmarrez DataServerApp au niveau intermdiaire.
Remarque
A partir de JDK 1.2, il est ncessaire daccorder un serveur RMI des droits de scurit particuliers afin quil puisse couter et accepter les requtes de clients RMI via un rseau. Gnralement, ces droits sont spcifis dans un fichier de stratgie de scurit Java dfini par une proprit particulire, java.security.policy, transmise par un argument de la ligne de commande la VM du serveur. Cette proprit est similaire la proprit java.rmi.server.codebase qui doit galement tre transmise la VM du serveur. Un fichier exemple de stratgie de
14-5
scurit RMI permettant un client RMI de se connecter au serveur est inclus dans ce projet dans le fichier SampleRMI.policy. Lors du dmarrage de DataServerApp au niveau intermdiaire, assurez-vous que les deux proprits java.security.policy et java.rmi.server.codebase sont initialises aux emplacements corrects sur la machine de niveau intermdiaire.
6 Double-cliquez sur ClientFrame.java dans le volet projet de JBuilder pour louvrir dans le volet contenu. Slectionnez longlet Conception pour invoquer le concepteur. Slectionnez clientProvider1 dans larborescence des composants et donnez la proprit hostName le nom de lhte de la machine de niveau intermdiaire. 7 Slectionnez clientResolver1 et donnez la proprit hostName le nom de lhte de la machine de niveau intermdiaire. 8 Choisissez Projet|Construire le projet pour reconstruire ClientApp.
Dmarrez ClientAppsur le client, ou premier niveau, en cliquant avec le bouton droit sur le fichier ClientApp.java dans le volet projet puis en choisissant Excuter.
14-6
15
Chapitre15
Chapitre
Ce chapitre donne des informations sur les tches courantes dadministration de base de donnes. Les sujets suivants sont abords : Exploration des tables et mtadonnes des bases de donnes en utilisant le pilote de base de donnes Utilisation du pilote de base de donnes pour ladministration de bases de donnes Surveillance des connexions aux bases de donnes
Exploration des tables et mtadonnes des bases de donnes en utilisant le pilote de base de donnes
Chapter 15
Le pilote de base de donnes est un navigateur hirarchique, permettant dafficher et de modifier des donnes. Il prsente des mtadonnes JDBC de bases de donnes dans une fentre deux volets. Le volet gauche contient une arborescence qui affiche de faon hirarchique un ensemble de bases de donnes et les tables, vues, procdures stockes et mtadonnes associes. Le volet droit affiche sur plusieurs pages des informations qui dcrivent chaque nud de larborescence. Dans certains cas, il vous est galement possible de modifier les donnes du volet droit. Pour afficher le pilote de base de donnes, choisissez Outils|Pilote de base de donnes dans le menu JBuilder.
15-1
Figure 15.1
Via une connexion persistante une base de donnes, le pilote de base de donnes vous permet de : Parcourir et modifier les objets de schma dune base de donnes, y compris les tables, donnes des tables, colonnes (champs), index, cls primaires, cls trangres, dfinitions de procdures stockes et paramtres des procdures stockes. Voir, crer et modifier des URL de base de donnes. Entrer et excuter des instructions SQL pour interroger une base de donnes. Crer, voir et modifier des donnes dans des tables existantes.
15-2
Le volet droit contient des pages onglets qui affichent le contenu des objets mis en vidence dans le volet gauche. Les pages onglets du volet droit varient selon le type de lobjet mis en vidence dans le volet gauche. Par exemple, sil sagit dun alias de base de donnes, le volet droit affiche une page Dfinition contenant les paramtres Type, PATH et DRIVER NAME de la base de donnes, ou proprits. Les noms de paramtres en gras signalent les paramtres qui ne peuvent pas tre modifis. Tous les autres paramtres qui apparaissent dans le volet droit peuvent tre modifis ici. Les pages onglet suivantes peuvent apparatre dans le volet droit : Dfinition Saisie SQL Rsum Donnes
Pour davantage dinformations sur le pilote de base de donnes, dmarrez le pilote de base de donnes en choisissant Outils|Pilote de base de donnes dans le menu puis reportez-vous son aide en ligne, Pilote de base de donnes.
Configuration des pilotes pour accder des bases de donnes distantes ou locales
Le Pilote de base de donnes parcourt les bases de donnes numres dans la section Connection URL History List du fichier <home>/.dbpilot/ dbpilot.properties. Cette liste reoit un nouvel lment quand vous vous connectez une base de donnes en utilisant lditeur de la proprit connection dun composant Database. Vous pouvez utiliser le pilote de bases de donnes pour visualiser, crer, modifier et supprimer des URL de base de donnes. Les procdures suivantes supposent que lURL est ferme et dcrivent brivement les tapes ncessaires pour accomplir les diffrentes tches.
2 Cliquez sur licne dextension ct de lURL de la base de donnes (ou double-cliquez dessus) dans le volet de gauche afin de visualiser son contenu.
15-3
1 Dans le volet de gauche, cliquez avec le bouton droit sur une URL ou une base de donnes pour en afficher le menu contextuel. 2 Dans le menu contextuel (ou dans le menu Fichier), choisissez Nouveau pour ouvrir la bote de dialogue Nouvelle URL. 3 Slectionnez un pilote dans la liste droulante, ou entrez ses informations.
Pour pouvoir tre utiliss, les pilotes doivent tre installs, et les fichiers du pilote doivent apparatre dans linstruction CLASSPATH du script de configuration de JBuilder. Cette installation se fait sur la page Pilotes base de donnes de la bote de dialogue Configuration Entreprise (Outils|Configuration Entreprise).
4 Naviguez vers lURL dsire ou tapez-la, puis cliquez sur OK. 5 Dans la page Dfinition du volet droit, spcifiez le nom dutilisateur et les autres proprits ncessaires. 6 Choisissez le bouton Appliquer dans la barre doutils afin dappliquer les paramtres de connexion.
1 Slectionnez dans le volet gauche lURL modifier. 2 Modifiez les paramtres de la page Dfinition selon vos souhaits. 3 Sur la barre doutils, cliquez sur le bouton Appliquer pour mettre jour les paramtres de connexion, ou cliquez sur le bouton Annuler pour ne pas prendre en compte les modifications apportes aux paramtres.
1 Slectionnez dans le volet gauche lURL supprimer. 2 Choisissez Fichier|Supprimer pour supprimer lURL.
Remarque
Si vous crez une nouvelle URL ODBC alors que vous travaillez sous Windows NT, vous devez dfinir sa source de donnes ODBC via le panneau de configuration Windows avant de pouvoir vous connecter la base de donnes.
partie principale de lcran est une bote de saisie dans laquelle vous pouvez saisir des instructions SQL. A droite de la bote de saisie se trouvent quatre boutons, le bouton Excuter, le bouton Suivant, le bouton Prcdent et le bouton Charger SQL. Quand une instruction SQL SELECT est excute, le rsultat de la requte est affich dans une table modifiable qui se trouve sous la bote de saisie. Il est possible de redimensionner cet cran afin den visualiser tous les lments. La page se prsente ainsi :
Figure 15.2 Page Saisie SQL du pilote de base de donnes
1 Ouvrez une base de donnes en slectionnant son URL dans le volet gauche puis entrez, si cest ncessaire, un nom dutilisateur et un mot de passe. 2 Dans le volet gauche, slectionnez la base de donnes ou lun de ses nuds enfant. 3 Cliquez sur longlet Saisie SQL dans le volet de droite afin dafficher la bote de saisie dans laquelle vous allez pouvoir entrer ou slectionner une instruction SQL. 4 Saisissez (ou collez) une instruction SQL dans la bote de saisie, ou cliquez sur le bouton Charger SQL et saisissez un nom de fichier SQL.
Si vous entrez des instructions nemployant pas SELECT, linstruction est excute mais il ny a pas de rsultats renvoys.
15-5
Remarque
Si la syntaxe SQL saisie est incorrecte, un message derreur est gnr. Vous pouvez ensuite corriger votre guise les erreurs de syntaxe dans la zone Saisie SQL.
Vous pouvez utiliser le pilote de base de donnes pour visualiser, modifier, ajouter ou supprimer les donnes des tables. Les procdures suivantes indiquent les tapes ncessaires lexcution des diffrentes tches.
1 Dans le volet gauche, slectionnez la table visualiser. 2 Cliquez sur longlet de la page Donnes du volet droit afin de visualiser une table droulante affichant toutes les donnes de la table. 3 Utilisez les boutons de la barre doutils en haut de la table pour parcourir les enregistrements.
15-6
Modifier un enregistrement
Pour modifier un enregistrement,
1 Vrifiez que, dans la bote de dialogue Options (Voir|Options), sur la page Requte, Demander des requtes modifiables est coch. 2 Modifiez les champs de lenregistrement dans la table. 3 Pour envoyer les modifications lensemble de donnes local, slectionnez un enregistrement diffrent dans la table ou cliquez sur le bouton Valider de la barre doutils propose sur la page Donnes. 4 Pour annuler une modification avant de changer denregistrement, cliquez sur le bouton Annuler de la barre doutils ou appuyez sur Echap. 5 Pour enregistrer vos modifications dans la base de donnes, cliquez sur le bouton Enregistrer les modifications.
Insrer un enregistrement
Pour insrer un nouvel enregistrement,
1 Slectionnez la ligne prcdant celle que vous souhaitez ajouter. 2 Cliquez sur le bouton Insrer dans la barre doutils de la page Donnes.
Une ligne vide apparat.
4 Pour envoyer linsertion lensemble de donnes local, slectionnez un enregistrement diffrent dans la table ou cliquez sur le bouton Valider de la barre doutils propose sur la page Donnes. 5 Pour annuler une insertion avant de changer denregistrement, choisissez le bouton Annuler de la barre doutils ou appuyez sur Echap. 6 Pour enregistrer une insertion dans la base de donnes, cliquez sur le bouton Enregistrer les modifications.
Supprimer un enregistrement
Pour supprimer un enregistrement,
1 Placez le curseur sur la ligne supprimer. 2 Cliquez sur le bouton Supprimer. 3 Pour enregistrer une suppression de la base de donnes, cliquez sur le bouton Enregistrer les modifications.
15-7
Sur de nombreux systmes, ladministrateur de bases de donnes restreint les droits de cration de tables aux utilisateurs autoriss. Si vous rencontrez des problmes dans la cration de tables, contactez-le pour vrifier si vos droits daccs sont suffisants pour effectuer cette opration. Pour crer une table simple, vous devez tout dabord tablir une connexion avec une URL de base de donnes. Si vous ntes pas familier avec cette opration, procdez comme suit :
1 Choisissez Outils|Pilote de base de donnes. 2 Dans le pilote de base de donnes, choisissez Fichier|Nouveau ou cliquez avec le bouton droit de la souris sur une URL existante et choisissez Nouveau dans le menu contextuel.
La bote de dialogue Nouvelle URL souvre.
5 Cliquez sur OK pour fermer la bote de dialogue. 6 Spcifiez le nom dutilisateur et les autres proprits souhaites dans la page Dfinition du volet de droite. 7 Cliquez sur le bouton Appliquer dans la barre doutils afin dappliquer les paramtres de connexion.
Une fois une connexion tablie, vous pouvez spcifier une instruction SQL excuter sur la base de donnes. Il y a deux moyens de le faire. Le premier passe par le dialogue Cration dune table. Pour crer une table nomme mytable en utilisant le dialogue Cration dune table,
1 Choisissez Fichier|Crer une table, dans le pilote de base de donnes. 2 Tapez mytable dans le champ Nom de table. 3 Cliquez sur le bouton Insrer. 4 Tapez lastName dans la colonne Nom de colonne. 5 Slectionnez VARCHAR comme valeur de la colonne Type de donnes. 6 Tapez 20 dans la colonne Prcision. 7 Cliquez sur le bouton Ligne suivante.
Une nouvelle ligne est cre.
8 Tapez firstName dans la colonne Nom de colonne. 9 Slectionnez VARCHAR comme valeur de la colonne Type de donnes. 10 Tapez 20 dans la colonne Prcision. 11 Cliquez sur le bouton Ligne suivante.
Une nouvelle ligne est cre.
12 Tapez salary dans la colonne Nom de colonne. 13 Slectionnez NUMERIC comme valeur de la colonne Type de donnes. 14 Tapez 10 dans la colonne Prcision. 15 Tapez 2 dans la colonne Echelle. 16 Cliquez sur le bouton Excuter. 17 Remarquez quune instruction SQL a t cre dans la zone de texte SQL. 18 Cliquez sur OK.
La table est cre dans la source de donnes actuellement ouverte.
15-9
Le deuxime moyen de crer une table est de spcifier une instruction SQL CREATE TABLE dans longlet Saisie SQL. Par exemple, pour crer une table nomme mytable2 dans la source de donnes laquelle vous tes connect :
1 Cliquez sur longlet Saisie SQL dans le pilote de base de donnes. 2 Entrez ce qui suit dans la zone de saisie :
create table mytable2 ( lastName char(20), firstName char(20), salary numeric(10,2) )
1 Suivez les tapes de la rubrique Cration de la source de donnes SQL, page 15-8. 2 Slectionnez dans le volet gauche la table que vous venez de crer, puis slectionnez la page Donnes dans le volet de droite.
Une table remplie avec les donnes de la table slectionne apparat dans le volet droit. Un contrle barre doutils est affich au-dessus de la table afin de permettre le parcours et la modification des donnes.
3 Utilisez le pilote de base de donnes pour visualiser, modifier, insrer et supprimer des enregistrements dans les tables.
15-10
Voir Utilisation de lexplorateur pour visualiser ou modifier les donnes des tables, page 15-6, pour plus dinformations sur lutilisation du pilote de base de donnes pour afficher et modifier des tables.
Vous pouvez vrifier le bon fonctionnement de cette opration en constatant la disparition de la table dans le volet gauche du pilote de base de donnes.
15-11
Figure 15.3
Moniteur JDBC
2 Ouvrez un fichier source contenant les composants daccs aux donnes qui permettent la connexion avec une base de donnes, ce qui dote le concepteur de donnes dynamiques.
Cest le cas de la plupart des classes Frame des exemples DataExpress (<jbuilder>/samples/DataExpress), qui contiennent des composants fournissant des donnes dynamiques en mode conception.
Vous pouvez accomplir les actions suivantes dans le Moniteur JDBC : Choisissez le bouton Fermer dans la fentre du Moniteur JDBC pour fermer le Moniteur JDBC. Slectionnez le texte dans la zone historique en le mettant en vidence avec la souris ou le clavier.
15-12
Choisissez le bouton Enregistrer dans un fichier pour enregistrer dans un fichier le texte slectionn (ou la totalit du texte si rien nest slectionn). Choisissez le bouton Effacer lhistorique pour effacer le texte slectionn (ou la totalit du texte si rien nest slectionn). Choisissez le bouton Activer la sortie historique pour activer/ dsactiver lhistorique. Cliquez sur le bouton Taille de lhistorique pour dfinir la quantit maximum dinformations conserver dans lhistorique (8 Ko par dfaut). Ayant positionn le curseur dans la zone de texte, appuyez sur F1 ou sur le bouton Aide pour afficher laide du Moniteur JDBC. Laide est disponible uniquement en mode conception.
1 Choisissez Outils|Configurer la palette pour ouvrir la bote de dialogue Proprits de la palette. 2 Slectionnez longlet Page puis, dans le volet gauche, slectionnez DataExpress. 3 Slectionnez longlet Ajout de composants, puis cliquez sur Slectionner la bibliothque pour ouvrir la bote de dialogue Bibliothque diffrente. 4 Slectionnez JDBC dans la liste des bibliothques disponibles, puis cliquez sur OK.
15-13
5 Si la liste droulante Page de palette qui reoit les composants naffiche pas DataExpress, slectionnez-le.
Cest ce qui dtermine la page de la palette sur laquelle sera plac le bouton MonitorPanel.
6 Parmi les boutons radio Filtrage de composant, slectionnez Pas de filtrage. 7 Cliquez sur Ajouter depuis la bibliothque slectionne pour ouvrir la bote de dialogue Parcourir pour rechercher une classe. 8 Allez jusqu com.borland.jbcl.sql.monitor.MonitorButton et cliquez sur OK pour ajouter le composant. 9 Cliquez sur OK pour fermer la bote de dialogue Rsultats. 10 Cliquez sur OK pour fermer la bote de dialogue Proprits de la palette.
Proprits de MonitorButton
Les proprits suivantes sont disponibles pour le MonitorButton afin de contrler ltat par dfaut du moniteur :
Proprit
outputEnabled maxLogSize
Effet
Active ou dsactive la surveillance du pilote. Taille maximum de lhistorique de suivi. La valeur par dfaut est de 8 Ko.
15-14
16
Tutoriel : Importation et exportation des donnes dun fichier texte
Chapitre16
Chapitre
Ce tutoriel dcrit la manire de fournir des donnes une application en utilisant un composant TableDataSet et un fichier de donnes texte. Pour ce tutoriel, nous crerons manuellement le fichier texte, mais ce type de fichier peut tre export depuis la majorit des bases de donnes bureautiques. Dans ce tutoriel, nous allons excuter les tches suivantes : Crer un projet JBuilder Crer un fichier de donnes texte simple Gnrer une application Ajouter des composants DataExpress pour accder et stocker les donnes dun fichier texte Ajouter des composants dbSwing pour crer linterface utilisateur Ajouter un composant Swing JButton pour exporter les donnes Compiler et excuter votre programme Utiliser des modles pour exporter des champs numriques, date/ heure et texte
16-1
Vous pouvez consulter lapplication complte en ouvrant le fichier projet exemple, TextFileImportExport.jpx qui se trouve dans <jbuilder>/samples/ DataExpress/TextFileImportExport/. Les utilisateurs pour qui laccs aux exemples de JBuilder est limit la lecture doivent copier le rpertoire samples dans un rpertoire dont ils possdent les droits de lecture et dcriture. La section Tutoriels dans les Astuces JBuilder donne des informations sur la visualisation et limpression des tutoriels. La section Options daccessibilit des Astuces JBuilder contient des conseils permettant de simplifier laccs aux fonctionnalits de JBuilder, destins en particulier aux personnes ayant des difficults. Pour plus dinformations sur les conventions de la documentation de ce tutoriel et des autres documents JBuilder, voir Conventions de la documentation, page 1-8.
1 Choisissez Fichier|Nouveau projet pour afficher lexpert projet. 2 Tapez TextFileImportExport dans le champ Nom. 3 Assurez-vous que loption Crer le fichier de remarques du projet est coche. 4 Cliquez sur le bouton Terminer pour fermer lexpert et crer le projet. Vous navez pas modifier les valeurs par dfaut des tapes 2 et 3 de lexpert.
16-2
Le fichier projet TextFileImportExport.jpx et le fichier HTML du projet sont affichs dans le volet projet.
1 Crez un nouveau fichier texte, nomm ImportTest.txt, dans le rpertoire contenant le fichier projet cr ltape prcdente, TextFileImportExport.jpx.
Choisissez Fichier|Nouveau fichier pour ouvrir la bote de dialogue de cration dun fichier. Dans le champ Nom, entrez ImportTest. Slectionnez txt dans la liste droulante Type. Vrifiez que le champ Rpertoire est dfini par le rpertoire o se trouve TextFileImportExport.jpx.
2 Saisissez les trois lignes et deux colonnes (une colonne de valeurs entires et une colonne de valeurs chane) de donnes suivantes dans le nouveau fichier texte.
Appuyez sur Entre la fin de chaque ligne. Vous devez saisir les donnes ainsi que les virgules et les guillemets.
1,"A" 2,"B" 3,"C"
3 Enregistrez et fermez le fichier. 4 Ajoutez le fichier votre projet (Projet|Ajouter des fichiers/paquets).
Dans la page Explorateur de la bote de dialogue Ajout de fichiers ou paquets au projet, naviguez jusquau rpertoire contenant le fichier, slectionnez-le et cliquez sur OK pour lajouter votre projet.
1 Choisissez Fichier|Nouveau pour ouvrir la galerie dobjets. 2 Slectionnez longlet Gnral et double-cliquez sur licne Application pour ouvrir lexpert application.
16-3
3 Acceptez les valeurs par dfaut de ltape 1 de lexpert application et cliquez sur Terminer.
Les nouveaux fichiers source Java sont ajouts votre projet et affichs en tant que nuds dans le volet projet. Le code source de Cadre1.java est ouvert dans le volet contenu.
4 Choisissez Fichier|Tout enregistrer pour enregistrer les fichiers source et le fichier projet.
1 Slectionnez longlet Conception pour le fichier Cadre1.java dans le volet contenu. 2 Slectionnez un composant TextDataFile dans la page DataExpress de la palette de composants, cliquez dans larborescence des composants ou dans le concepteur dinterface utilisateur pour ajouter le composant votre application.
Le nouveau composant TextDataFile, textDataFile1, apparat dans le volet structure sous la forme dun nud de larborescence des composants.
3 Slectionnez les proprits suivantes dans linspecteur et dfinissez leurs valeurs comme indiqu :
Pour dfinir la proprit fileName, slectionnez le champ droite du nom de la proprit, et cliquez sur bouton points de suspension (...) pour ouvrir la bote de dialogue FileName. Cliquez sur le bouton points de suspension (...) dans la bote de dialogue FileName, naviguez jusquau fichier ImportTest.txt, slectionnez-le et cliquez sur Ouvrir. Cliquez sur OK pour fermer la bote de dialogue FileName.
Nom de la proprit
delimiter separator fileName
Valeur
" (guillemet) , (virgule) <chemin_fichier_donnes_texte> (le chemin daccs ImportTest.txt, y compris le nom du fichier)
Pour un fichier texte, le dlimiteur est le caractre servant dfinir le dbut et la fin dun champ chane. Par dfaut, le guillemet est utilis comme dlimiteur des types de donnes chane. Pour ce tutoriel, il nest pas ncessaire deffectuer de modification.
16-4
Pour un fichier texte, le sparateur (separator) est le caractre servant sparer les diffrentes valeurs des colonnes. Par dfaut, la tabulation (/t) est utilise comme sparateur. Pour cet exemple, le sparateur est une virgule (,). Selon le fichier que vous importez, modifiez ces proprits en consquence. Spcifiez le nom de fichier et le chemin daccs complet pour le champ fileName.
4 Slectionnez un composant TableDataSet dans la page DataExpress de la palette de composants, cliquez dans larborescence des composants ou dans le concepteur dinterface utilisateur pour ajouter le composant votre application. 5 Slectionnez le composant et initialisez sa proprit dataFile en lui affectant la valeur textDataFile1. 6 Ajoutez des colonnes au composant TableDataSet.
Ce tutoriel dcrit la manire dajouter des colonnes lensemble de donnes en utilisant le concepteur dinterface utilisateur. Pour ajouter des colonnes en utilisant lditeur, voir Ajout de colonnes un TableDataSet en utilisant lditeur, page 3-2. Si vous avez achev le tutoriel prcdent, JBuilder a cr un fichier SCHEMA (.schema) donnant une dfinition des colonnes lors de louverture du fichier et il nest donc pas ncessaire dajouter manuellement les colonnes.
a Cliquez sur licne dextension gauche du composant TableDataSet afin dafficher les colonnes existantes.
En ce cas, il nexiste pas de colonne.
b Slectionnez <nouvelle colonne> et dfinissez dans linspecteur les proprits suivantes pour la nouvelle colonne :
Nom de la proprit
dataType caption columnName
Valeur
SHORT my_number my_number
c Slectionnez nouveau <nouvelle colonne> et dfinissez dans linspecteur les proprits suivantes pour la seconde colonne :
Nom de la proprit
dataType caption columnName
Valeur
STRING my_string my_string
7 Choisissez Fichier|Tout enregistrer pour enregistrer les fichiers source et le fichier projet.
Tutoriel : Importation et exportation des donnes dun fichier texte
16-5
Les composants fondamentaux permettant dextraire et de stocker les donnes de votre fichier texte sont en place. Nous allons maintenant crer linterface utilisateur pour afficher et modifier ces donnes.
Lors de la dfinition dune interface utilisateur, la premire tape consiste normalement choisir une disposition approprie lapplication (comment seront visuellement arrangs les composants et quel gestionnaire de disposition Java vous utiliserez pour contrler ces positions.) Mais, apprendre utiliser les gestionnaires de disposition Java est en soit une tche ardue. Donc, pour laisser ce tutoriel ax sur la cration dune application de base de donnes, nous utiliserons la disposition par dfaut (BorderLayout) et contrlerons la position des composants en dfinissant leur proprit constraints. Pour plus dinformations sur lutilisation des dispositions, voir Utilisation du concepteur et Utilisation des gestionnaires de disposition dans Conception dapplications avec JBuilder. Les tapes ci-aprs ajoutent lapplication les composants dinterface utilisateur suivants partir de longlet dbSwing de la palette de composants : JdbTable (et conteneur), pour afficher des donnes bi-dimensionnelles dans un format de type feuille de calcul. JdbNavToolBar, ensemble de boutons pour vous aider naviguer dans les donnes affiches dans une JdbTable. Il vous permet de naviguer rapidement dans lensemble de donnes lorsque lapplication est excute. JdbStatusLabel, qui affiche des informations sur lenregistrement ou lopration en cours et les messages derreur. Vous ajouterez ces composants contentPane (BorderLayout), qui est un JPanel, et le conteneur principal de linterface utilisateur, dans lequel vous allez disposer les composants visuels.
16-6
2 Slectionnez le composant JdbNavToolBar et cliquez sur la zone centrale proche du bord suprieur du panneau dans le concepteur dinterface utilisateur.
Une instance de JdbNavToolBar, appele jdbNavToolBar1, est ajoute au panneau et apparat dans larborescence des composants. Par dfaut, le composant JdbNavToolBar dtecte automatiquement les autres composants orients donnes du mme conteneur racine (tels que JFrame), et se dplace dans lensemble de donnes du composant ayant actuellement la focalisation. Vous navez donc pas besoin de dfinir la proprit constraints de jdbNavToolBar1 dans linspecteur. jdbNavToolBar1 est dsormais le composant slectionn, et stend le long du bord suprieur du panneau. Ne vous inquitez pas sil est plac dans un endroit diffrent que celui attendu. Le gestionnaire de disposition dtermine lemplacement en fonction de lendroit o vous cliquez. Si vous tes trop prs de la gauche, de la droite ou du centre du panneau, il peut croire que vous voulez placer le composant ailleurs. Vous le corrigerez ltape suivante.
4 Slectionnez le composant JdbStatusLabel et cliquez sur la zone centrale proche du bord suprieur du panneau dans le concepteur dinterface utilisateur.
Une instance de JdbStatusLabel, appele jdbStatusLabel1, est ajoute au panneau et apparat dans larborescence des composants. La proprit constraints de jdbStatusLabel1 doit avoir la valeur SOUTH. Si ce nest pas le cas, changez-la dans linspecteur. jdbStatusLabel1 sattache automatiquement au DataSet qui dtient la focalisation.
5 Slectionnez un composant TableScrollPane de la page dbSwing de la palette de composants, cliquez au centre du concepteur dinterface utilisateur pour ajouter le composant votre application.
Le composant TableScrollPane, tableScrollPane1, apparat dans le volet structure sous la forme dun nud de larborescence des composants.
6 Slectionnez un composant JdbTable de la page dbSwing de la palette de composants, cliquez dans larborescence des composants ou dans le concepteur dinterface utilisateur pour ajouter le composant votre application.
Le composant JdbTable, jdbTable1, apparat dans le volet structure sous la forme dun nud de larborescence des composants, sous tableScrollPane1.
16-7
Lorsque vous dfinissez la proprit dataSet du jdbTable1 par tableDataSet1, les donnes du fichier texte apparaissent dans le concepteur dinterface utilisateur : Une bote de dialogue derreur est affiche si vous navez pas spcifi le fichier de donnes correct ou si les colonnes nont pas bien t dfinies. Si vous ninstanciez pas de composant visuel pour afficher les donnes, il faut ouvrir explicitement le fichier dans le code source pour accder aux donnes.
donnes. Quand des donnes sont exportes dans un fichier texte, toutes les donnes de la vue en cours sont crites dans un fichier texte et les informations dtat des lignes ne sont pas modifies.
1 Slectionnez longlet Conception du volet contenu. 2 Slectionnez contentPane (BorderLayout) dans le volet contenu. Modifiez sa proprit layout en null dans linspecteur. 3 Slectionnez tableScrollPane1 dans larborescence des composants. Slectionnez la poigne suprieure du composant dans le concepteur dinterface utilisateur, et redimensionnez-le pour laisser la place dajouter un bouton.
Voir la capture dcran de lapplication excute plus loin dans ce tutoriel pour connatre le placement gnral des composants.
4 Ajoutez un composant JButton depuis longlet Swing dans le concepteur dinterface utilisateur. Sur la page Proprits de linspecteur, dfinissez la proprit text de ce composant JButton par Enregistrer les modifications. 5 Cliquez longlet Evnements de linspecteur et slectionnez la mthode actionPerformed() puis double-cliquez dessus.
Cela fait passer la focalisation dans lAppBrowser de longlet Conception longlet Source et affiche dans le code source le squelette de la mthode actionPerformed(). Ajoutez le code suivant la mthode actionPerformed() :
try { tableDataSet1.getDataFile().save(tableDataSet1); System.out.println("Modifications enregistres"); } catch (Exception ex) { System.out.println("Modifications NON enregistres"); System.err.println("Exception : " + ex); }
16-9
Figure 16.3
6 Choisissez Fichier|Tout enregistrer pour enregistrer les fichiers source et le fichier projet.
16-10
Figure 16.4
2 Lapplication sexcutant, slectionnez le champ chane dans le premier enregistrement et modifiez la valeur du champ de A en Apple. 3 Enregistrez les modifications dans le fichier texte en cliquant sur le bouton Enregistrer les modifications. 4 Ouvrez ImportTest.txt dans le volet contenu, remarquez quil contient dsormais les donnes suivantes :
1,"Apple" 2,"B" 3,"C"
6 Visualisez le fichier SCHEMA dans un diteur de texte. Remarquez que ce fichier contient des informations sur les noms des champs exports et le type des donnes exportes dans ce champ. Il ressemble ceci :
[] FILETYPE = VARYING FILEFORMAT = Encoded ENCODING = Cp1252 DELIMITER = " SEPARATOR = , FIELD0 = my_number,Variant.SHORT,-1,-1, FIELD1 = my_string,Variant.STRING,-1,-1,
16-11
1 Slectionnez Cadre1.java dans le volet contenu, puis slectionnez longlet Conception. Dveloppez tableDataSet1 dans larborescence des composants en cliquant sur licne dextension sa gauche. Slectionnez <nouvelle colonne>, puis modifiez les proprits de la colonne dans linspecteur de la manire suivante :
dataType en DATE caption et columnName en my_date
2 Excutez lapplication. Dans la fentre de lapplication en cours dexcution, entrez une date dans la colonne my_date de la premire ligne. Par dfaut, vous devez saisir les dates au format jj/MM/aa, par exemple 16/11/95. Cliquez sur le bouton Enregistrer les modifications pour enregistrer les modifications dans le fichier texte. 3 Visualisez le fichier texte dans un diteur de texte. Il contient maintenant les donnes suivantes :
1,"Apple",1995-11-16 2,"B" 3,"C"
4 Fermez le fichier texte. 5 Visualisez le fichier SCHEMA dans un diteur de texte. Remarquez que le nouveau champ date a t ajout dans la liste de champs. Il ressemble ceci :
[] FILETYPE = VARYING FILEFORMAT = Encoded ENCODING = Cp1252 DELIMITER = " SEPARATOR = , FIELD0 = my_number,Variant.SHORT,-1,-1, FIELD1 = my_string,Variant.STRING,-1,-1, FIELD2 = my_date,Variant.DATE,-1,-1,
16-12
Les tapes suivantes montrent ce qui se passe lorsque vous modifiez le modle date, ditez les donnes et enregistrez nouveau les modifications.
1 Fermez lapplication excute et le fichier texte et revenez au concepteur dinterface utilisateur de JBuilder. Slectionnez la colonne my_date et entrez le modle suivant pour la proprit exportDisplayMask dans linspecteur : MM-jj-aaaa. La syntaxe des modles est dfinie dans Modles base de chane (masques), dans la Rfrence de la bibliothque de composants DataExpress. Ce type de modle va crire le champ date sous la forme suivante : 11-16-1995. 2 Lapplication produit maintenant une erreur si vous tentez de lexcuter car le format de donnes dans le fichier texte ne correspond pas celui que lapplication tente dutiliser. Modifiez manuellement le fichier texte et supprimez la valeur ,11/16/95 de la premire ligne.
Au lieu dutiliser ltape ci-dessus, vous pouvez entrer manuellement du code tablissant un exportDisplayMask pour limportation de donnes et un autre exportDisplayMask pour lexportation de donnes.
3 Excutez lapplication, entrez une date, comme 16/11/1995, dans la colonne my_date de la premire ligne et cliquez sur le bouton Enregistrer les modifications pour enregistrer les modifications dans le fichier texte. 4 Visualisez le fichier texte dans un diteur de texte. Il contient maintenant les donnes suivantes :
1,"Apple",11-16-1995 2,"B" 3,"C"
5 Fermez le fichier texte. 6 Visualisez le fichier SCHEMA dans un diteur de texte. Remarquez que le format de champ date est affich dans la dfinition du champ. Lorsque le format par dfaut est utilis, cette valeur est vide puisquil se trouve dans la dfinition FIELD0. Il ressemble ceci :
[] FILETYPE = VARYING FILEFORMAT = Encoded ENCODING = Cp1252 DELIMITER = " SEPARATOR = , FIELD0 = my_number,Variant.SHORT,-1,-1, FIELD1 = my_string,Variant.STRING,-1,-1, FIELD2 = my_date,Variant.DATE,-1,-1,MM-jj-aaaa
16-13
Pour visualiser les donnes dans une table en utilisant un modle diffrent, utilisez la proprit displayMask. Pour diter les donnes en utilisant un autre modle, dfinissez la proprit editMask. Ces proprits affectent uniquement la visualisation et la modification des donnes et pas la manire dont elles sont enregistres. Par exemple, pour saisir des donnes dans un champ montaire sans avoir saisir le symbole montaire chaque fois, utilisez un displayMask qui utilise le symbole montaire et un editMask ne contenant pas de symbole montaire. En initialisant la proprit exportDisplayMask, vous pouvez choisir denregistrer les donnes dans le fichier texte en utilisant ou pas le symbole montaire.
16-14
17
Tutoriel : Cration dune application de base de donnes lmentaire
Chapitre17
Chapitre
Ce tutoriel explique comment dvelopper une application de base de donnes en utilisant les composants DataExpress et les outils de conception JBuilder. Quand cest ncessaire, le code gnr par les outils de conception sera modifi pour proposer des comportements personnaliss. Cette application illustre les fonctionnalits suivantes : La connexion la base de donnes exemple JDataStore, employee.jds, en utilisant des composants Database et QueryDataSet. Voir Chapitre 4, Connexion une base de donnes et Interrogation dune base de donnes, page 5-2. Elle contient un contrle JdbTable qui affiche les donnes et illustre les caractristiques suivantes : Les colonnes persistantes. Ce sont des colonnes dont les informations de structure (normalement obtenues du serveur) sont spcifies dans les proprits de la colonne. Cette faon de procder permet damliorer les performances et assure la persistance des proprits de colonne. Pour davantage dinformations, voir Colonnes persistantes, page 7-8. Dans le concepteur, double-cliquez sur lensemble de donnes pour ouvrir le concepteur de colonne et voir davantage dinformations sur chaque colonne. Le formatage des donnes affiches dans JdbTable laide de masques daffichage (la colonne HIRE_DATE). Pour davantage
17-1
dinformations, voir Ajout de modles daffichage ou de modification pour formater les donnes, page 12-16. La modification de donnes contrle par des masques de saisie (la colonne HIRE_DATE). Pour davantage dinformations, voir Ajout de modles daffichage ou de modification pour formater les donnes, page 12-16. Les champs calculs et rcapitulatifs qui obtiennent leur valeur du rsultat de lvaluation dune expression (les colonnes NEW_SALARY, ORG_TOTAL, NEW_TOTAL, DIFF_SALARY et DIFF_TOTAL). Pour davantage dinformations, voir Utilisation de colonnes calcules, page 12-8. Elle inclut un contrle JdbStatusLabel qui affiche des informations de navigation, des messages de validation des donnes, etc. Les messages sont crits dans le contrle JdbStatusLabel lorsque cela est appropri ou lorsque une instruction du programme le commande. Voir Affichage dinformations dtat, page 13-3. Un contrle JdbNavToolBar est affich pour parcourir aisment les donnes affiches dans la table. Elle permet de trouver des donnes de manire interactive en utilisant un contrle JdbNavField incorpor dans JdbNavToolBar. Pour davantage dinformations sur la recherche de donnes, voir Recherche de donnes, page 11-14. Elle utilise un DBDisposeMonitor pour fermer automatiquement la connexion la base de donnes lorsque le cadre est ferm. Lapplication rsout les modifications apportes aux donnes du QueryDataSet en utilisant le comportement par dfaut de rsolution. Pour davantage dinformations, voir Explication de la rsolution par dfaut, page 8-17. Le bouton Enregistrer de JdbNavToolBar effectue lenregistrement. Les messages relatifs au processus de rsolution sont affichs dans le contrle JdbStatusLabel. Dans ce tutoriel, nous allons excuter les tches suivantes : Crer un projet JBuilder Gnrer une application Ajouter des composants DataExpress pour accder aux donnes dune base Concevoir les colonnes de lapplication Ajouter des composants dbSwing pour crer linterface utilisateur Agrger des donnes avec des champs calculs
17-2
Vous pouvez consulter lapplication complte en ouvrant le fichier projet exemple, BasicApp.jpx, qui se trouve dans <jbuilder>/samples/DataExpress/ BasicApp/. Il existe des diffrences mineures entre lapplication cre dans ce tutoriel et lapplication exemple fournie. Les utilisateurs pour qui laccs aux exemples de JBuilder est limit la lecture doivent copier le rpertoire samples dans un rpertoire dont ils possdent les droits de lecture et dcriture. La section Tutoriels dans les Astuces JBuilder donne des informations sur la visualisation et limpression des tutoriels. La section Options daccessibilit des Astuces JBuilder contient des conseils permettant de simplifier laccs aux fonctionnalits de JBuilder, destins en particulier aux personnes ayant des difficults. Pour plus dinformations sur les conventions de la documentation de ce tutoriel et des autres documents JBuilder, voir Conventions de la documentation, page 1-8.
17-3
2 Tapez BasicApp dans le champ Nom. 3 Cliquez sur le bouton Terminer pour fermer lexpert et crer le projet. Vous navez pas modifier les valeurs par dfaut des tapes 2 et 3 de lexpert.
Le fichier projet BasicApp.jpx est ouvert dans le volet projet.
1 Choisissez Fichier|Nouveau pour ouvrir la galerie dobjets. 2 Slectionnez longlet Gnral et double-cliquez sur licne Application pour ouvrir lexpert application.. 3 A ltape 1 de lexpert application, acceptez le nom de paquet par dfaut, basicapp, tapez BasicApp dans le champ Nom de classe et cliquez sur Suivant.
Remarque
Le nom du paquet utilis dans ce tutoriel, basicapp, nest pas le mme que celui qui est utilis par lapplication exemple, com.borland.samples.dx.basicapp mais, hormis cela, les applications sont les mmes.
4 A ltape 2 de lexpert application, tapez BasicAppFrame dans le champ Classe, tapez Exemple dapplication de base de donnes lmentaire dans le champ Titre et cliquez sur Terminer.
Les nouveaux fichiers source Java sont ajouts votre projet et affichs en tant que nuds dans le volet projet. Le code source de BasicAppFrame.java est ouvert dans le volet contenu.
5 Choisissez Fichier|Tout enregistrer pour enregistrer les fichiers source et le fichier projet.
17-4
1 Slectionnez longlet Conception pour BasicAppFrame.java dans le volet Contenu afin dactiver le concepteur dinterface utilisateur.
La palette de composants apparat en haut du concepteur dinterface utilisateur.
3 Slectionnez le composant database1 dans le volet structure, slectionnez la proprit connection dans linspecteur et cliquez sur le bouton Points de suspension (...) pour ouvrir la bote de dialogue Connection. 4 Dfinissez les proprits de connexion pour la table employee du JDataStore exemple, en utilisant la valeur des champs du tableau suivant.
LURL de connexion pointe sur le fichier employee.jds dans un sous-rpertoire dpendant du rpertoire o est install JBuilder, <jbuilder>.
Nom de la proprit
Pilote URL Nom dutilisateur Mot de passe
Valeur
com.borland.datastore.jdbc.DataStoreDriver Naviguez jusqu votre copie locale de <jbuilder>/ samples/JDataStore/datastores/employee.jds Entrez votre nom non obligatoire
La bote de dialogue Connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vrifier que les proprits de connexion sont correctement dfinies. Le rsultat de la tentative de connexion est affich dans la zone dtat. Quand la connexion russit, cliquez sur OK. Si la connexion choue, vrifiez que vous avez bien suivi toutes les tapes du Chapitre 4, Connexion une base de donnes.
5 Ajoutez un composant QueryDataSet au concepteur en cliquant sur le composant QueryDataSet de longlet DataExpress puis en cliquant dans larborescence des composants ou dans linterface utilisateur.
Tutoriel : Cration dune application de base de donnes lmentaire
17-5
Dans linspecteur, slectionnez la proprit query du composant QueryDataSet, cliquez sur les points de suspension pour ouvrir la bote de dialogue Query et dfinissez les proprits de la manire suivante :
Nom de la proprit
Base de donnes Instruction SQL
Valeur
database1 SELECT EMP_NO, FULL_NAME, HIRE_DATE, DEPT_NO, JOB_COUNTRY, SALARY FROM EMPLOYEE
LInstruction SQL sera automatiquement excute sur la base de donnes spcifie ds louverture du QueryDataSet.
6 Cliquez sur Tester la requte pour vrifier quelle peut tre excute.
La bote de dialogue Query doit ressembler ce qui suit pour que la requte soit russie.
Figure 17.2 Bote de dialogue Query
Si la bote de dialogue Query indique Echec, recherchez des erreurs de frappe ou des oublis dans les informations saisies pour la requte.
7 Cliquez sur OK pour fermer la bote de dialogue Query. 8 Ajoutez un composant DBDisposeMonitor de la page dbSwing supplmentaires.
Le DBDisposeMonitor fermera le JDataStore lorsque la fentre sera ferme.
9 Dfinissez la proprit dataAwareComponentContainer du DBDisposeMonitor par this. 10 Dveloppez le nud queryDataSet1 dans le volet structure.
17-6
Figure 17.3
Les colonnes slectionnes dans la base de donnes JDataStore des employs, employee.jds, sont affiches dans le nud queryDataSet1. Les composants fondamentaux permettant dextraire et de stocker les donnes issues de la base de donnes Employee sont en place. Nous allons maintenant crer linterface utilisateur pour afficher et modifier ces donnes.
2 Dans linspecteur, changez la valeur de la proprit columnName de NouvelleColonne1 en NEW_SALARY. 3 Cliquez sur le bouton Insrer une colonne pour ajouter quatre colonnes supplmentaires dont les valeurs de la proprit columnName sont les suivantes :
DIFF_SALARY ORIG_TOTAL NEW_TOTAL DIFF_TOTAL
17-7
4 Dfinissez les proprits de ces colonnes comme indiqu dans le tableau suivant :
Colonne
HIRE_DATE HIRE_DATE HIRE_DATE NEW_SALARY NEW_SALARY NEW_SALARY NEW_SALARY EMP_NO FULL_NAME FULL_NAME DEPT_NO JOB_COUNTRY JOB_COUNTRY SALARY ORIG_TOTAL ORIG_TOTAL ORIG_TOTAL NEW_TOTAL NEW_TOTAL NEW_TOTAL DIFF_SALARY DIFF_SALARY DIFF_SALARY DIFF_TOTAL DIFF_TOTAL DIFF_TOTAL
Nom de la proprit
caption displayMask editMask caption calcType dataType visible caption caption width caption caption width caption calcType caption dataType calcType caption dataType calcType caption dataType calcType caption dataType
Valeur
Date dembauche MM-jj-aa MM-jj-aaaa NEW_SALARY calculated BIGDECIMAL FALSE No employ Nom 16 Dpt. Pays 15 Salaire aggregated ORIG_TOTAL BIGDECIMAL aggregated Nouveau total BIGDECIMAL calculated DIFF_SALARY BIGDECIMAL aggregated Total diff. BIGDECIMAL
La modification des proprits dune colonne rend celle-ci persistante. Quand une colonne devient persistante, des crochets ([ ]) sont placs autour du nom de la colonne dans le volet structure.
17-8
Lorsque vous aurez termin la modification des colonnes, le concepteur de colonne doit ressembler ceci :
Figure 17.4 Colonnes de queryDataSet1 dans le concepteur de colonne
1 Slectionnez le nud queryDataSet1 dans le volet structure, slectionnez longlet Evnements de linspecteur et double-cliquez sur le gestionnaire dvnement calcFields.
Cela cre le stub de la mthode de lvnement dans BasicAppFrame.java et affiche son code source dans le volet contenu.
2 Ajoutez linstruction suivante aux instructions import existantes dans BasicAppFrame.java pour importer la classe java.math.BigDecimal ncessaire au type de donnes BIGDECIMAL choisi pour les colonnes calcules.
import java.math.BigDecimal;
3 Modifiez la mthode dvnement afin de calculer les valeurs de NEW_SALARY et de DIFF_SALARY, de la manire suivante :
void queryDataSet1_calcFields(ReadRow changedRow, DataRow calcRow, boolean isPosted) throws DataSetException { BigDecimal bDin = changedRow.getBigDecimal("Salaire"); BigDecimal bDout = bDin.add(new BigDecimal(bDin.doubleValue()*10.0/100)); calcRow.setBigDecimal("NEW_SALARY", bDout); calcRow.setBigDecimal("DIFF_SALARY", bDout.subtract(bDin)); }
17-9
Cette mthode est appele pour calcFields chaque fois quune valeur de champ est enregistre et chaque fois quune ligne est valide. Cet vnement reoit une donne reprsentant la valeur en cours dans la ligne (changedRow) et renvoie une ligne pour y placer les modifications que vous voulez apporter la ligne (calcRow) et un boolen (isPosted) indiquant si la ligne est valide ou pas dans DataSet. Vous pouvez ne pas recalculer les champs pour les lignes qui nont pas encore t valides. Certaines des colonnes ajoutes par cette tape sont des colonnes agrges (ou statistiques). Nous nous occuperons de ces colonnes ultrieurement. Ajoutons plutt une interface utilisateur de faon voir quoi ressemble lapplication.
Lors de la dfinition dune interface utilisateur, la premire tape consiste normalement choisir une disposition approprie lapplication (comment seront visuellement arrangs les composants et quel gestionnaire de disposition Java vous utiliserez pour contrler ces positions.) Mais, apprendre utiliser les gestionnaires de disposition Java est en soit une tche ardue. Donc, pour laisser ce tutoriel ax sur la cration dune application de base de donnes, nous utiliserons la disposition par dfaut (BorderLayout) et contrlerons la position des composants en dfinissant leur proprit constraints. Pour plus dinformations sur lutilisation des dispositions, voir Introduction au concepteur et Utilisation des gestionnaires de disposition dans Conception dapplications avec JBuilder. Les tapes ci-aprs ajoutent lapplication les composants dinterface utilisateur suivants partir de longlet dbSwing de la palette de composants : JdbTable (et conteneur), utilis pour afficher des donnes bi-dimensionnelles dans un format de type feuille de calcul. JdbNavToolBar, ensemble de boutons pour vous aider naviguer dans les donnes affiches dans une JdbTable. Il vous permet de naviguer rapidement dans lensemble de donnes lorsque lapplication est excute. JdbStatusLabel, qui affiche des informations sur lenregistrement ou lopration en cours et les messages derreur.
17-10
Vous ajouterez ces composants contentPane (BorderLayout), qui est un JPanel, et le conteneur principal de linterface utilisateur, dans lequel vous allez disposer les composants visuels. Des composants JPanel supplmentaires seront utiliss pour sparer les composants servant la navigation du JdbStatusLabel. Pour ajouter un composant JdbTable,
1 Slectionnez longlet Conception pour BasicAppFrame.java dans le volet Contenu afin dactiver le concepteur dinterface utilisateur. 2 Slectionnez la page dbSwing de la palette de composants dans le concepteur dinterface utilisateur. 3 Slectionnez un composant TableScrollPane de la page dbSwing de la palette de composants, cliquez sur contentPane dans larborescence des composants ou au centre de la surface du concepteur dinterface utilisateur pour ajouter le composant votre application.
Le composant TableScrollPane, tableScrollPane1, apparat dans le volet structure sous la forme dun nud de larborescence des composants.
4 Slectionnez un composant JdbTable de la page dbSwing de la palette de composants, cliquez sur tableScrollPane1 dans larborescence des composants ou au centre de la surface du concepteur dinterface utilisateur pour ajouter le composant votre application.
Le composant JdbTable, jdbTable1, apparat dans le volet structure sous la forme dun nud de larborescence des composants, sous tableScrollPane1.
17-11
Ensuite, nous ajouterons des composants de navigation, y compris un JdbNavToolBar. Les composants JPanel permettent de sparer les diffrents lments de linterface utilisateur. Pour ajouter des lments de navigation,
1 Slectionnez la page Conteneurs Swing de la palette de composants dans le concepteur dinterface utilisateur, slectionnez le composant JPanel component
et cliquez sur le nud contentPane dans le volet structure.
2 Dfinissez la proprit layout de jPanel1 par FlowLayout. 3 Slectionnez la page dbSwing supplmentaires de la palette de composants, slectionnez le composant JdbNavField et cliquez sur le nud jPanel1 dans le volet structure.
Le composant JdbNavField offre une fonction de recherche incrmentale pour les colonnes de type String. Sa proprit columnName spcifie la colonne o seffectue la recherche. Si cette proprit nest pas dfinie, la recherche est effectue sur la dernire colonne visite dans JdbTable.
4 Dfinissez la proprit preferredSize de jdbNavField1 par 125, 21. 5 Slectionnez la page dbSwing de la palette de composants, slectionnez le composant JLabel
et cliquez sur le nud jPanel1 dans le volet structure.
6 Dfinissez la proprit text de jLabel1 par Chercher. 7 Slectionnez la page dbSwing de la palette de composants, slectionnez le composant JdbNavToolBar et cliquez sur le nud jPanel1 dans le volet structure.
Une instance de JdbNavToolBar, appele jdbNavToolBar1, est ajoute au panneau et apparat dans larborescence des composants. Par dfaut, le composant JdbNavToolBar dtecte automatiquement les autres composants orients donnes du mme conteneur racine, et se dplace dans lensemble de donnes du composant dtenant alors la focalisation. Vous navez donc pas besoin de dfinir la proprit constraints de jdbNavToolBar1 dans linspecteur.
Remarque
Vous aurez peut-tre redimensionner lespace du concepteur pour voir tous les composants de linterface utilisateur. Vous voil prt ajouter le composant JdbStatusLabel. Pour ajouter un composant JdbStatusLabel,
1 Ajoutez un autre composant JPanel au nud contentPane dans le volet structure. 2 Dans linspecteur, dfinissez la proprit contraints de jPanel2 par South.
17-12
Utilisez la barre de navigation et le champ de navigation pour vous dplacer dans les enregistrements. Remarquez que la barre dtat sactualise en consquence.
5 Fermez lapplication entrain de sexcuter et enregistrez toutes les modifications (Fichier|Tout enregistrer).
Pour terminer lapplication, ajoutons des composants JdbTextField pour afficher les donnes des colonnes statistiques (ou agrges).
17-13
1 Slectionnez la page Conteneurs Swing de la palette de composants dans le concepteur dinterface utilisateur, slectionnez le composant JPanel et cliquez sur le nud jPanel2 dans le volet structure.
Cela ajoute un nouveau composant JPanel, jPanel3, dans jPanel2.
2 Dfinissez la proprit layout de jPanel3 par GridLayout, et la proprit layout de jPanel2 par BorderLayout. 3 Slectionnez la page dbSwing de la palette de composants, slectionnez le composant JdbTextField et cliquez sur le nud jPanel3 dans le volet structure. 4 Dfinissez la proprit dataSet de jdbTextField1 par queryDataSet1, et sa proprit columnName par ORIG_TOTAL. 5 Slectionnez la page Swing de la palette de composants, slectionnez le composant JLabel et cliquez sur le nud jPanel3 dans le volet structure.
Si ncessaire, repositionnez le composant JLabel (jLabel2) dans le concepteur dinterface utilisateur pour quil soit gauche du composant jdbTextField1.
6 Dfinissez la proprit horizontalAlignment de jLabel2 par LEADING et la proprit text par Total originel. 7 Ajoutez deux autres composants JdbTextField et JLabel, et dfinissez leurs proprits comme indiqu dans le tableau suivant :
Composant
jdbTextField2 jdbTextField2 jLabel3 jLabel3 jdbTextField3 jdbTextField3 jLabel4 jLabel4
Nom de la proprit
dataSet columnName horizontalAlignment text dataSet columnName horizontalAlignment text
Valeur
queryDataSet2 NEW_TOTAL CENTER Nouveau total queryDataSet2 DIFF_TOTAL CENTER Diffrence
17-14
8 Dveloppez le nud queryDataSet2 dans le volet structure et slectionnez la colonne ORIG_TOTAL. 9 Dans linspecteur, slectionnez la proprit agg, puis cliquez sur le bouton points de suspension (...) pour ouvrir lditeur de la proprit Agg.
Figure 17.7 Bote de dialogue Agg
10 Choisissez SALARY dans la liste droulante Colonne statistique, choisissez SumAggOperator dans la liste droulante Opration statistique et cliquez sur OK. 11 Slectionnez la colonne NEW_TOTAL dans le volet structure et ouvrez la bote de dialogue Agg. 12 Choisissez NEW_SALARY dans la liste droulante Colonne statistique, choisissez SumAggOperator dans la liste droulante Opration statistique et cliquez sur OK. 13 Slectionnez la colonne DIFF_TOTAL dans le volet structure et ouvrez la bote de dialogue Agg. 14 Choisissez DIFF_SALARY dans la liste droulante Colonne statistique, choisissez SumAggOperator dans la liste droulante Opration statistique et cliquez sur OK. 15 Choisissez Excuter|Excuter le projet pour compiler et excuter lapplication.
Lapplication doit afficher les donnes agrges dans les nouveaux composants JdbTextField.
17-15
17-16
Index
Symboles
.config, fichiers cration pour les pilotes 4-10 ? comme marqueur de paramtre JDBC 5-19 API JDBC 2-1 appels de procdure spcifiques au serveur 6-3 applications base de donnes (2-niveaux) 10-10 gnration 10-20 applications client dveloppement avec InterClient 4-7 applications de bases de donnes 2-1 cration 11-2 distribues 14-1 gnration 10-20 introduction 1-1, 2-1 applications deux-niveaux gnration 10-20 applications distribues base de donnes 14-1 applications exemple DataSetData 14-2 ResolverEvents 8-19 applications multiniveaux dploiement 14-5 Appliquer, bouton 10-15 architecture DataExpress 2-1
A
accs aux bases de donnes distantes 15-3 locales 15-3 accs aux donnes 4-1, 5-1 partir dun module de donnes 10-1 depuis des sources de donnes personnaliss 6-7 depuis les composants de linterface utilisateur 13-2 sources de donnes JDBC 4-1 accs aux informations de modle 13-2 acquisition dfinition 6-1 acquisition des donnes 5-1 partir de sources de donnes JDBC 6-1 avec des requtes paramtres 5-12 optimisation 5-10 actualisation des mtadonnes des colonnes persistantes 7-9 administration des bases de donnes 15-8 tches 15-1 affichage caractres spciaux 12-18 des donnes dans les composants orients donnes 7-2 informations dtat 13-3 masques 12-18 agrgation de donne 12-1 agrgation de donnes cration de colonnes agrges 12-11, 12-15 agrgation des donnes personnalisation des mthodes dagrgation 12-16 ajout de colonnes des fichiers texte imports 3-2 aux requtes paramtres 5-19 pour objectifs internes 7-10 ajout de composants aux modules de donnes 10-3 ajout de paramtres aux requtes 5-12 amlioration de lacquisition des donnes 5-10 analyse chanes 12-18 analyse des donnes 12-16
B
Base de donnes, champ dans QueryDescriptor 5-4 bases de donnes 2-5, 4-3 accs 15-3 affichage des informations 15-2 configuration des pilotes 15-3 connection, proprit 4-4 connexion 4-2, 4-3 connexion via JDBC 8-3 construction dapplications de bases de donnes 1-1 dans les applications distribues 14-1 dveloppement 1-1 exemples 8-16 exploration 15-1 exploration des champs 15-1 index 15-1 interface utilisateur 11-1 interrogation 5-4 mise en pool des connexions 4-17 proprits (exemples) 12-1 UI 12-1 bases de donnes fichiers bi-dimensionnels 3-1
Index
I-1
bases de donnes distantes connexion 4-2 bases de donnes exemple StreamableDataSets 14-3 bases de donnes relationnelles 9-1 bibliothque de composants DataExpress 2-1 bibliothques ajout un projet 10-6 cration 4-10 ncessaires 10-6 Borland contacter 1-10 e-mail 1-12 groupes de discussion 1-11 rapports de bogues 1-12 ressources en ligne 1-10 support aux dveloppeurs 1-10 support technique 1-10 World Wide Web 1-10 bundles de ressources 5-7
C
calcul colonnes 12-1 cots des marchandises 12-16 remises 12-16 taux de TVA 12-16 totaux 12-16 caractres spciaux 12-18 cascadeDeletes, option 9-9 cascadeUpdates, option 9-9 chanes analyse 12-18 champs liaison sur champs communs 9-2 obligatoires 12-25 champs communs 9-1 champs de donnes exportation 16-1 champs heure exportation 16-1 champs numriques exportation 16-1 champs texte exportation 16-1 chargement des don 6-9 codage des vnements pour les modules de donnes 10-5 Coller la colonne, bouton 10-15 Coller le paramtre, bouton 10-15 colonnes 7-1, 7-8 ajout aux StorageDataSet 7-10 concepteur 7-2 contrle de leur ordre 7-11 dfinition des proprits 7-1, 7-2 I-2
dfinition des proprits persistantes 7-7 exploration 15-1 filtrage de donnes 11-1 liaison sur colonnes communes 9-2 localisation de donnes 11-1 manipulation 7-1 tri 11-1 valeurs de rfrence dans. Voir rfrence 12-2 visualisation des informations 7-2, 7-5 colonnes calcules 12-1, 12-8, 12-11 agrgation de donnes 12-11, 12-15 cration de listes de choix avec 12-2 cration de rfrences avec 12-2, 12-5 donnes agrges 12-12, 17-1 exemple 12-9 tutoriel 17-1 types supports 12-8 colonnes de rfrence 12-2 cration 12-2 exemple 12-5 colonnes persistantes ajout 7-10 contrle de lactualisation des mtadonnes avec 7-9 prsentation 7-8 suppression 7-9 Column, composant dfinition des proprits 12-25 manipulation 12-25 persistant 12-25 prsentation 7-1 proprit locale 16-1 spcification comme persistant 7-8 stockage des objets Java dans 12-27 visualisation 12-25 vue densemble 2-8 composant DataSet filtrage de donnes 11-1 localisation de donnes 11-1 tri de donnes 11-1 composants JFC orients donnes 13-1 synchronisation 13-1 composants DataExpress DataSetView 12-23 composants DataExpress pour EJB 2-9 composants de base de donnes XML 2-10 composants orients donnes 13-1 affichage des colonnes dans 12-25 affichage par dfaut des donnes 7-2 concepteur de colonne 12-25 activation 7-2 bouton gnrateur de RowIterator 7-3 options des mtadonnes 7-4, 7-5
concepteurs concepteur de colonne. Voir aussi concepteur de colonne 7-2 connexion une base de donnes tutoriel 17-1 connexions 4-1, 4-2 mise en pool des connexions JDBC 4-17 prsentation 4-1 problmes et solutions 4-22 connexions aux bases de donnes monitoring 15-11, 15-13 connexions JDBC 4-1 gestion 2-5 manipulation du trafic 15-11 monitoring 15-11 prsentation 4-1 tutoriel 17-1 connexions SQL 4-1 Constructeur SQL 5-4 Continuer toutes les mtadonnes, option 7-4 contraintes activation 11-12 contrle de la saisie de lutilisateur 12-18 contrles 13-1 conventions de la documentation 1-8 conventions des plates-formes 1-9 conversions de chanes avec les masques 12-18 cots des marchandises calcul 12-16 Cration dun ResourceBundle, bote de dialogue 5-7 cration de requtes 5-2 cration des relations matre-dtail 9-1, 9-10 cration des tables SQL 15-8 curseurs partags 13-1
D
Database, composant 4-1, 4-3 exemple 4-3 prsentation 4-1 utilisation 4-3 vue densemble 2-5 DataExpress applications 2-1 architecture 1-1, 2-1, 2-2 composants 2-2, 2-5, 5-1 description 2-1 DataExpress, composants accs aux donnes avec 5-1 DataModule, interface description 10-1 personnalisation 10-3 rfrencement 10-8
vue densemble 2-9 DataRow, composant localisation 11-18 localisation des donnes 11-17 ordre des colonnes dans les recherches 11-20 vue densemble 2-8 DataSet, composant enregistrement des modifications 8-1 flux 8-13 fonctionnalit 2-2 stockage des objets Java 12-27 vue densemble 2-6 DataSet, paquet 2-5 DataSetData, 14-1 DataSetData, composant 8-13 application exemple, description 14-2 extractDataSet, mthode 8-14, 8-15 extractDataSetChanges, mthode 8-15 remplissage 8-15 transmission des mtadonnes 14-5 DataSetException, classe 13-5 DataSetView, composant proprits 12-23 tri dans 11-9 utilisation 12-1, 12-23 vue densemble 2-7 DataStore, composant vue densemble 2-6 DataStoreDriver, composant vue densemble 2-7 dates importation 3-2 dbSwing, composants cration dune interface utilisateur de base de donnes 2-10 utilisation 13-1 deleteProcedure, p 8-6 demande nom dutilisateur et mot de passe 4-16 dploiement applications multiniveaux 14-5 Direction de tri de la colonne slectionne, options 10-16 distants serveurs 4-1 distribution des objets base de donnes 14-1 donnes 5-1 accs 11-2 acquisition 5-1, 6-9 activation des contraintes 11-12 autre vue 12-23 cache 2-13 chargement 6-9 dition 15-6 I-3
Index
exemples de modles 12-19 exploration 15-10 exportation 3-3 extraction 5-1, 6-7, 11-2 extraction dune source de donnes 5-1 filtrage 11-1 filtres 11-5 fournisseurs 5-1 fourniture 6-9 insertion 15-10 localisation 11-1, 11-14, 11-15, 11-17 manipulation 11-1 modification 15-10 obligatoires 12-25 persistance 12-25 persistantes 2-13 recherche 11-14 rsolution 8-1, 8-3 personnalisation 8-20 rsolution avec des procdures stockes 8-6 rsolution des donnes comportement par dfaut 8-17 stockage 2-13 tri 11-1 visualisation 15-6 donnes agrges exemple 12-12, 17-1 donnes boolennes modles 12-22 donnes dheure modles 12-21 donnes de chanes modles 12-21 donnes de date modles 12-21 donnes membre non transient 8-15 donnes membre private 8-15 donnes numriques 3-2 importation 3-2 modles 12-19 donnes rcapitules 12-11, 12-12, 17-1 donnes regroupes 12-11 Donnes, page Pilote de base de donnes 15-6
E
diteur de la proprit agg 12-15 diteur de la proprit sort 11-11 dition des donnes contrle de la saisie de lutilisateur 12-18 matre-dtail 9-9 dition/affichage masques 12-1 enableDelete, proprit 12-23 enableInsert, proprit 12-23 enableUpdate, proprit 12-23 I-4
enregistrement des 8-3 enregistrement des donnes 8-1 exemple 8-6 ProcedureResolver 8-8 tables multiples 8-10 utilisation de QueryResolver 8-6 enregistrement des modifications 8-6, 8-16 dans les QueryDataSet 8-4 relations matre-dtail 9-12 enregistrement dtail lecture 9-8 lecture des donnes 9-8 enregistrements dtail lecture 9-7 ensembles de donnes amlioration des performances 5-10 en lecture seule lecture seule ensembles de donnes 5-12 fermeture 5-12 flux 8-13 liaison 9-1 liaison des valeurs des paramtres 5-21 ouverture 6-9 ouverture explicite 5-12 erreurs gestion des exceptions. Voir aussi exceptions 13-5 vnements ajout de la logique mtier 10-5 rsolveur 8-16 exceptions traitement 13-5 Excuter la requte, commande 10-17 exemple CalculatedColumn 12-9 exemples agrgations calcules 12-12 agrgations de donnes avec des colonnes calcules 12-12 ajout dinformation dtat 13-3 base de donnes 8-16 bases de donnes 12-23 colonnes calcules 12-9 cration de listes de choix 12-2 cration de rfrences 12-5 filtrage des donnes 11-6 procdures stockes codage 8-6 relations matre-dtail 9-3 requtes paramtres 5-13 rsolution de la modification des donnes 8-3 ResolverEvents 8-19 visualisation des informations sur les colonnes 7-2
exemples base de donnes agrgations calcules 12-12 autres vues des donnes 12-23 colonnes calcules 12-9 cration de listes de choix 12-2 visualisation des informations sur les colonnes 7-2 exemples de base de donnes relations matre-dtail 9-3 exemples de bases de donnes configuration de JDataStore 4-4, 4-7 cration de rfrences 12-5 filtrage des donnes 11-6 requtes paramtres 5-13 rsolution des modifications 8-3 rsolution des ProcedureDataSet 8-6 ResolverEvents 8-19 StreamableDataSets 14-3 Expert Utilisation dun module de donnes, bote de dialogue description 10-8 Explorateur JDataStore 2-14 exportation de donnes dans des fichiers texte 3-1 utilisation de modles 16-1 exportation des donnes 3-3 partir dun QueryDataSet 3-4 exportDisplayMask, proprit 12-19 exemple 16-1 extractDataSet, mthode 8-15 extractDataSetChanges, mthode 8-15 extraction de donnes partir dun module de donnes 10-1 extraction des 8-16 extraction des donnes 5-1, 6-7, 11-2 enregistrements dtail 5-22 via des procdures stockes 6-1
filtrage de donnes 11-1 filtrage des donnes 11-5 exemple 11-6 filtres de donnes exemple 11-6 flux densembles de donnes 8-13 utilisation 8-14 fontes Conventions de la documentation JBuilder 1-8 formatage des donnes 12-16 masques daffichage 12-18 formatter, proprit utilisation 12-27 fournisseurs cration de personnaliss 6-7 de donnes 5-1 fournisseurs de donnes 5-1 fourniture des donnes 5-1 partir de sources de donnes JDBC 6-1 pour les exemples de bases de donnes 11-2
G
gnration applications de bases de donnes 10-20 gestion exceptions 13-5 gestionnaire de pilotes 4-1 gestionnaires dvnements agrgation personnalise 12-16 Group By, clause 10-14 Group By, page Modeleur de donnes 10-14 groupes de discussion Borland 1-11 public 1-11 groupes de discussion Usenet 1-11 groupes de donnes 12-11
F
fermeture ensembles de donnes 5-12 fetchAsNeeded, proprit 9-7 fichiers .config cration pour les pilotes 4-10 fichiers ASCII. Voir aussi fichiers texte 3-1 fichiers SCHEMA et exportDisplayMasks 12-19 fichiers texte 3-1 exportation 3-1, 3-3 importation 2-15, 3-1 vers des sources JDBC 3-5 vers des tables SQL 3-5 fichiers texte format 3-2 importation 3-2 FilterRows, exemple 11-6
I
implmentations de serveurs au niveau intermdiaire 8-13 importation de donnes partir de fichiers texte 3-1 importation des donnes 2-15 importation et exportation de donnes tutoriel 16-1 index base de donnes 15-1 uniques et nomms 11-12 index uniques 11-12 informations dtat 13-3 insertion 8-8 insertProcedure, proprit 8-6
Index
I-5
insertRow(), mthode 6-9 installation InterClient 4-7 instruction SQL discussion 6-3 Instruction SQL, champ dans QueryDescriptor 5-4 instructions SQL dfinition 5-4 encapsulation 6-1 excution 15-4 InterBase 4-7 astuces 4-8 configuration pour JBuilder 4-7 exemple de procdures stockes 6-5 paramtres de retour des procdures stockes 8-10 InterBase et InterClient utilisation avec JBuilder 4-8 InterClient 4-7 configuration pour JBuilder 4-7, 4-10 erreurs de connexion 4-22 installation 4-7 utilisation de pilotes JDBC 4-13 interfaces Java dveloppement avec InterClient 4-7 INTERNALROW 8-13 Internet dveloppement dapplications client/ serveur 4-7 InternetBeans Express 2-10 Intranet dveloppement dapplications client/ serveur 4-7
mise en pool des connexions 4-17 squences dchappement 6-3 tutoriel 17-1 JDBC API 4-1 JdbNavField, composant 11-15 exemple 11-14 JdbStatusLabel, composant 13-3 exemple 13-3 JdbTable, composant tri dans 11-10 JFC, composants 13-1 jointure entre tables 9-1
L
lecture des donnes 4-1, 5-1, 5-2 enregistrement dtail 9-8 enregistrements dtail 5-22, 9-7 optimisation 5-10 liaison des valeurs des paramtres 5-21 liaison entre ensembles de donnes 9-1 Liaison entre requtes, bote de dialogue 10-18 liaisons des tables remarques 8-11 types 8-11 libells dtat ajout aux applications 13-3 listes de choix 12-2 exemple 12-2 suppression 12-4 Local InterBase Server 4-8 locale proprit 16-1 localisation de donnes 11-1 localisation des donnes 11-14 interactive 11-15 localisation 11-18 options locate 11-18 ordre des colonnes 11-20 par programme 11-17 variants 11-20 locate, mthode 11-17 LocateOptions, classe 11-18 logique mtier 10-1, 10-5
J
Java objets contenant des DataSet 8-13 pilotes de base de donnes 4-7 RMI avec des bases de donnes 14-1 JBCL, composants orients donnes 13-1 JConnectionPool optimisation des performances 4-19 JDataStore cration 2-15 oprations 2-15 paquet 2-5 pilotes JDBC 4-4, 4-7 quand lutiliser 2-13 utilisation 2-13 vrification 2-15 JDBC 1-1, 8-3 ajout de pilotes 4-10 connexions 4-1 I-6
M
matre-dtail, relations 10-18 manipulation du trafic JDBC 15-11 marqueurs de lemplacement dun paramtre 5-19 masques 12-1 pour dition 12-18 pour formats de donnes 12-18 pour importer/exporter 12-19 masques daffichage 12-1, 12-18 ajout 12-16
masques ddition 12-1 masques dexportation 12-16, 12-19 masques dimportation 12-16, 12-19 masques de saisie ajout 12-16 proprit editMask 12-18 masterDataSet, proprit 9-10 MasterDetail, exemple 9-3 masterLink, proprit 9-2 MasterLinkDescriptor, classe utilisation 9-2 metaDataUpdate, proprit avec des tables multiples 8-13 mtadonnes 7-1 configuration en tant que dynamiques 7-5 dcouverte 7-1 exploration 15-1 obtention 6-8 persistance 5-11, 7-4 visualisation 7-5 mthodes StorageDataSet insertRow() 6-9 startLoading() 6-9 mise jour s 8-1 modle numriques exemples 12-19 modles 12-1, 12-16 accs aux informations les concernant 13-2 donnes boolennes 12-22 donnes dheure 12-21 donnes de chanes 12-21 donnes de date 12-21 donnes numriques 12-19 exemples 12-19 exportation de donnes 16-1 pour saisie des donnes 12-18 modles boolens 12-16 modles de chanes 12-16 exemples 12-19 modles de date et dheure 12-16 exemples 12-19 modles de donnes 12-16 modles de donnes boolennes exemples 12-19 modles numriques 12-16 Modeleur de donnes applications 2-niveaux 10-10 applications client-serveur 10-10 cration des requtes 15-2 Module de donnes, expert 10-2 modules de donnes 10-1 ajout aux bibliothques 10-6 ajout de composants 10-3 ajout de la logique mtier 10-5
compilation 10-5 cration 10-2, 10-10 enregistrement 10-5 experts 10-2, 10-8 fichiers classe 10-5 rfrencement 10-5, 10-8 utilisation 10-5, 10-8 utilisation des modules gnrs 10-22 Moniteur JDBC 15-11 dans les applications 15-13 moniteur JDBC dmarrage 15-11 utilisation 15-13 MonitorButton ajout la palette 15-13 proprits 15-14 utilisation 15-14 monitoring connexions 15-11, 15-13 pilotes JDBC 15-11 mot de passe demande 4-16
N
navigation ensembles de donnes multiples 13-1 synchronisation des composants 13-1 nom dutilisateur demande 4-16 nomms index 11-12 paramtres 5-19
O
objets contenant des DataSet 8-13 Java 12-27 stockage 12-27 objets AggDescriptor 12-15 optimisation de lacquisition des donnes 5-10 Options de chargement, champ dans QueryDescriptor 5-4 Oracle PL/SQL exemple de procdures stockes 6-5 Order By, clause ajout 10-16 Order By, page 10-16 ordre de rsolution spcification 8-13 ordre de tri 11-12 SQL, requtes 10-16 unique 11-12 ordre de tri croissant 10-16 ordre de tri dcroissant 10-16
Index
I-7
ordre des colonnes localisation des donnes 11-20 ouverture ensembles de donnes 5-12
P
paquets consacrs aux bases de donnes 2-5 paquets consacrs aux 2-5 ParameterRow 5-14 ParameterRow, composant 5-19 vue densemble 2-8 paramtres requtes 10-17 paramtres spcification 5-6 paramtres de retour 8-10 Paramtres, page QueryDescriptor 5-6 partage des curseurs 13-1 PARTIAL, option recherches multicolonnes 11-20 performance amlioration apportes aux ensembles de donnes 5-10 persistance donnes 2-13 persistance des colonnes 12-25 annulation 7-9 persistance des donnes 12-25 personnalisation de la rsolution 8-18 personnalisation des fournisseurs 6-7 personnalise 8-22 Pilote de base de donnes 7-5 configuration 15-3 Donnes, page 15-6, 15-10 fentre 15-2 Saisie SQL, page 15-4 utilisation 15-1 visualisation des informations des colonnes 7-5 pilotes ajout des pilotes de bases de donnes un projet 4-11 configuration pour les bases de donnes 15-3 pilotes de base de donnes entirement Java 4-7 pilotes de bases de donnes ajout JBuilder 4-10 ajout un projet 4-11 pilotes JDBC 4-2 ajout JBuilder 4-10 ajout au projet 4-11 configuration 4-7 InterClient 4-13 JDataStore 4-4, 4-7 I-8
quand les utiliser 2-13 spcifis dans le composant Database 4-4 plusieurs--plusieurs relations entre les donnes 8-11 plusieurs--un relations entre les donnes 8-11 ProcedureDataSet, composant 2-1 propos 6-1 enregistrement des modifications dans 8-8 exemple de rsolution 8-6 rsolution des donnes 8-6 tri dans 11-9 vue densemble 2-7 ProcedureResolver proprits 8-6 ProcedureResolver, c 8-6 ProcedureResolver, composant codage 8-6 enregistrement des modifications avec 8-8 procdures stockes cration 6-3 exemple 6-5, 6-6, 8-6 InterBase 8-10 paramtres de retour 8-10 prsentation 6-1 ProcedureResolver 8-8 processus de rsolution contrle 8-18 projet par dfaut ajout des pilotes de bases de donnes 4-11 projets ajout des pilotes de bases de donnes 4-11 proprit query, diteur tutoriel 17-1 proprits de connexion base de donnes 4-4 proprits des colonnes affichage des donnes 7-2 pour les requtes multitables 8-13 provideData, mthode 6-9 ProviderHelp initData, mthode 6-9
Q
query, proprit comprhension 5-4 diteur 5-4 paramtres 5-6 QueryDataSet, composant 2-1, 2-7, 5-15 dfinition de la proprit query 5-4 enregistrement des modifications 8-4 exemple 5-13, 8-3 exportation dans un fichier 3-3, 3-4 prsentation 5-2, 5-10 tri dans 11-9
QueryDescriptor, composant dfinition visuelle des proprits 5-4 Paramtres, page 5-6 Placer le texte SQL dans lensemble de ressources, option 5-7 Requte, page 5-4 QueryProvider, composant pour les requtes multitables 8-13 QueryResolver, composant ajout 8-17 avec des procdures stockes 8-6 dfaut 8-17 enregistrement des modifications avec 8-6 vnements contrle 8-18 interception des vnements 8-18 personnalisation 8-16, 8-17, 8-18
R
rcapitulation de donnes 12-11, 12-12, 17-1 recherches multicolonnes ordre des colonnes 11-20 rconciliation des donnes 8-1 rcupration des donnes partir de sources de donnes JDBC 3-3 enregistrement dtail 9-8 enregistrements dtail 5-22 regroupement de donnes 12-11 regroupement des ressources 5-7 relations entre les donnes 1--1 8-11 1--plusieurs 8-11 plusieurs--1 8-11 plusieurs--plusieurs 8-11 relations matre-dtail 10-18 cration 9-1, 9-10 dfinition 9-2 exemple 9-3 requtes 5-22 rsolution 8-22, 9-12 relations un--plusieurs 9-1 remises calcul 12-16 remplissage des tables SQL 15-10 renvoie de paramtres 8-10 Requte, page 5-4 requtes 5-2 composants ncessaires 5-2 construction 5-4 contenant une clause WHERE 8-11 cration 15-2 cration avec le modeleur de donnes 10-10 cration de requtes paramtres 5-12 dition directe 10-17
enregistrement dans des modules de donnes Java 10-19 enregistrement dans un module de donnes 10-19 excution 15-4 Group By, clause 10-14 matre-dtail 10-18 multiples dans le modeleur de donnes 10-17 ordre de tri 10-16 paramtres 10-15 prsentation 5-2 proprits des colonnes de plusieurs tables 8-13 sassurer quelles sont modifiables 5-12 SQL Pilote de base de donnes 15-4 sur plusieurs tables 8-11 test 10-17 visualisation des rsultats 10-17 Where, clause 10-15 requtes paramtres 5-12, 10-15, 10-17 ajout de colonnes 5-19 exemple 5-13 fourniture de nouvelles valeurs 5-21 liaison des valeurs 5-21 pour les enregistrements matre-dtail 5-22 requtes SQL 5-2 ajout de paramtres 5-12 composants ncessaires 5-2 optimisation 7-6 prsentation 5-2 ressourable 5-7 rsolution exemple 8-6 ProcedureResolver 8-8 rsolution des donnes 8-1, 8-3, 8-16, 8-20 dfaut 8-17 personnalisation de la logique du rsolveur 8-17 personnalisation des vnements 8-18 procdures stockes 8-6 QueryDataSet 8-4 relations matre-dtail 9-12 tables multiples 8-10 rsolution multitable ordre de rsolution 8-13 ResolutionManager, classe 8-16 resolveOrder, proprit 8-10, 8-13 ResolverEvents, application exemple 8-19 rsolveurs dfaut 8-17 vnements 8-16 personnalisation 8-17, 8-20 Retarder la lecture des dtails jusqu ce que cela soit ncessaire 9-7
Index
I-9
RMI avec des bases de donnes 14-1 RowFilterListener, interface exemple 11-6 rowID, proprit utilisation 8-13 RowIterator, classe 7-3
S
saisie de donnes modles 12-1 saisie de lutilisateur analyse 12-18 contrle 12-18 Saisie SQL, page Pilote de base de donnes 15-4 saveChanges(), mthode et proprit rowID 8-13 SCHEMA, fichiers 3-2, 12-19 schemaName, proprit 8-10 squences dchappement 6-3 srialisation des objets 8-13 serveur InterBase local 4-8 serveurs de bases de donnes communication avec 2-1 serveurs SQL connexion aux. Voir connexions SQL 4-1 setResolver, proprit 8-17 SimpleStoredProcedure, exemple 8-6 sources de donnes accs 5-1 connexion 4-2 sources de donnes JDBC 3-3, 5-1, 6-1 partir de fichiers texte 3-5 accs 4-1, 5-1 enregistrement des donnes dun fichier texte 3-5 spcification de lordre de rsolution 8-13 SQL composants ncessaires aux requtes 5-2 connexions 4-1 optimisation des requtes 7-6 sassurer que les requtes sont modifiables 5-12 SQL, bases de donnes connexion 4-2 SQL, instructions 15-4 SQL, requtes dition directe 10-17 enregistrement dans des modules de donnes Java 10-19 enregistrement dans un module de donnes 10-19 Group By, clause 10-14 matre-dtail 10-18 multiples dans le modeleur de donnes 10-17 I-10
ordre de tri 10-16 test 10-17 visualisation des rsultats 10-17 Where, clause 10-15 SQL, tables 15-8, 15-10, 15-11 SqlRes, classe 5-7 SQLResolver utilisation avec des tables multiples 8-10 SQLResolver, composant 8-16 personnalisation 8-17 StatusEvent, auditeur 13-5 StorageDataSet, composant ajout de colonnes vides 7-10 contrle de lordre des colonnes 7-11 enregistrement des modifications 8-1 prsentation de lutilisation 5-1 vue densemble 2-6 storageDataSet, proprit 12-23 StreamableDataSets, exemple excution 14-3 suppression colonnes persistantes 7-9 suppression des tables 15-11 Sybase exemple de procdures stockes 6-6 synchronisation des composants 13-1 synonymes affichage des donnes dans 15-6
T
tableColumnName, proprit 8-10 TableDataSet, composant enregistrement des modifications 3-3 exportation de donnes formates 16-1 prsentation de lutilisation 3-1 rsolution 3-5 tri dans 11-9 vue densemble 2-7 tableName, proprit 8-10 tables cration 15-8 exploration 15-1 interrogation 11-2 lies 8-11 modification des donnes 15-6, 15-10 non modifiable 8-13 remplissage 15-10 suppression 15-11 visualisation des donnes 15-6, 15-10 tables de donnes affichage des colonnes de liaison du dtail 9-9 tables dtail 9-2 dition 9-9 tables matre 9-2 dition 9-9
tables multiples rsolution 8-10 tables SQL partir de fichiers texte 3-5 cration 15-8 enregistrement des donnes dun fichier texte 3-5 remplissage 15-10 suppression 15-11 taux de TVA calcul 12-16 test requtes 10-17 TestFrame.java, exemple 6-7 TextDataFile, composant prsentation de lutilisation 3-1 rcupration des donnes JDBC pour 3-3 rsolution 3-5 totaux calcul 12-16 traitement des erreurs 13-5 transactions 8-3 traitement par dfaut 8-1 tri de donnes 11-1 tri des donnes 11-9 avec des relations matre-dtail 9-2 avec les outils de conception 11-11 dans les tables 11-10 ordre de tri 11-12 par programme 11-14 tutoriels agrgations calcules 17-1 agrgations de donnes avec des colonnes calcules 17-1 application de base de donnes 17-1 connexions JDBC 17-1 importation et exportation des donnes dun fichier texte 16-1
tutoriels de bases de donnes agrgations calcules 17-1 connexions JDBC 17-1 types de donnes variant 12-27
U
un--plusieurs 9-1 relations entre les donnes 8-11 un--un relations entre les donnes 8-11 updateProcedure, proprit 8-6 URL ajout dans le modeleur de donnes 10-11 ouverture dans le modeleur de donnes 10-11
V
ValidationException 13-5 Variant, classe localisation des donnes 11-20 variant, types de donnes 12-27 Variant.OBJECT, types de donnes dans les colonnes 12-27 VariantFormatter, classe 12-16 vues affichage des donnes dans 15-6 de donnes 2-7
W
Where, clause 10-15 Where, page Modeleur de donnes 10-15
Index
I-11
I-12