300
Guide du développeur d’applications bases de données VERSION 8 Borland ® JBuilder ®

Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

Embed Size (px)

Citation preview

Page 1: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

Guide du développeur d’applications bases de données

V E R SI O N 8

Borland®

JBuilder®

Page 2: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

Consultez le fichier deploy.html situé dans le répertoire redist de JBuilder pour avoir la liste complète des fichiers que vous pouvez distribuer en accord avec votre contrat de licence JBuilder.

Les applications mentionnées dans ce manuel sont brevetées par Borland Software Corporation ou en attente de brevet. Reportez-vous au CD ou à la boîte de dialogue A propos. Ce document ne donne aucun droit sur ces brevets.

COPYRIGHT © 1997–2002 Borland Software Corporation. Tous droits réservés. Tous les produits Borland sont des marques commerciales ou des marques déposées de Borland Software Corporation aux Etats-Unis et dans les autres pays. Toutes les autres marques sont la propriété de leurs fabricants respectifs.

Pour connaître les conditions et limites des fournisseurs tiers, lisez les Remarques version sur votre CD JBuilder.

JBE0080WW21002database 7E10R10020203040506-9 8 7 6 5 4 3 2 1PDF

Page 3: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

i

Chapitre 1Introduction 1-1Résumé des chapitres . . . . . . . . . . . . . . . 1-2Tutoriels sur les bases de données . . . . . . . . 1-4Exemples de bases de données . . . . . . . . . . 1-5Documentation annexe . . . . . . . . . . . . . . 1-6Conventions de la documentation . . . . . . . . 1-9Support et ressources destinés

aux développeurs . . . . . . . . . . . . . . . . 1-11Comment contacter le support technique

de Borland. . . . . . . . . . . . . . . . . . . 1-11Ressources en ligne. . . . . . . . . . . . . . . 1-11World Wide Web . . . . . . . . . . . . . . . . 1-12Groupes de discussion Borland. . . . . . . . 1-12Groupes de discussion Usenet . . . . . . . . 1-12Rapports de bogues . . . . . . . . . . . . . .1-13

Chapitre 2Les applications de bases de données JBuilder 2-1

Architecture des applications de bases de données . . . . . . . . . . . . . . . 2-1

Composants DataExpress . . . . . . . . . . . . . 2-2Principales fonctionnalités et avantages . . . 2-3Présentation des composants DataExpress . 2-5

Composants DataExpress pour EJB . . . . . . . 2-9InternetBeans Express . . . . . . . . . . . . . . . 2-10Composants de bases de données XML . . . . . 2-10dbSwing. . . . . . . . . . . . . . . . . . . . . . .2-10Modules de données et modeleur

de données . . . . . . . . . . . . . . . . . . . .2-12Pilote de base de données . . . . . . . . . . . . . 2-12Moniteur JDBC . . . . . . . . . . . . . . . . . . . 2-12JDataStore et JBuilder . . . . . . . . . . . . . . . 2-13

Utilisation d’un JDataStore ou d’un pilote JDBC . . . . . . . . . . . . . 2-13

Avantages supplémentaires apportés par JDataStore. . . . . . . . . . . . . . . . .2-14

Utilisation de l’explorateur JDataStore. . . . 2-14Opérations avec l’explorateur

JDataStore . . . . . . . . . . . . . . . . . 2-15InterBase et JBuilder . . . . . . . . . . . . . . . . 2-16

Chapitre 3Importation et exportation des données d’un fichier texte 3-1

Ajout de colonnes à un TableDataSet en utilisant l’éditeur. . . . . . . . . . . . . . . . 3-2

Importation des données formatées d’un fichier texte . . . . . . . . . . . . . . . . . 3-2

Récupération de données d’une source JDBC . . 3-3Exportation des données . . . . . . . . . . . . . . 3-3

Exportation des données d’un QueryDataSet dans un fichier texte . . . . . . . . . . . . . . 3-4

Enregistrement des modifications d’un TableDataSet dans une table SQL . . . 3-5

Enregistrement dans une source de données JDBC des modifications chargées depuis un TextDataFile . . . . . . . . . . . . 3-5

Chapitre 4Connexion à une base de données 4-1Connexion aux bases de données . . . . . . . . . 4-2

Ajout d’un composant Database à votre application. . . . . . . . . . . . . . . 4-3

Définition des propriétés de connexion du composant Database. . . . . . . . . . . . 4-4

Configuration de JDataStore. . . . . . . . . . . . 4-7Configuration d’InterBase et InterClient . . . . . 4-7

Utilisation d’InterBase et d’InterClient avec JBuilder . . . . . . . . . . . . . . . . . . 4-8

Astuces pour l’utilisation des tables InterBase exemple . . . . . . . . . . . . . . . 4-9

Ajout d’un pilote JDBC à JBuilder . . . . . . . 4-10Création des fichiers .library et .config . . . 4-10Ajout du pilote JDBC aux projets . . . . . . 4-11

Connexion à une base de données en utilisant des pilotes JDBC InterClient . . . 4-13

Utilisation du composant Database dans votre application . . . . . . . . . . . . . 4-16

Sollicitation d’un nom d’utilisateur et d’un mot de passe . . . . . . . . . . . . . . 4-16

Mise en pool des connexions JDBC . . . . . . . 4-17Optimisation des performances

de JConnectionPool . . . . . . . . . . . . . 4-20Sorties historiques . . . . . . . . . . . . . . . 4-20Exemple de mise en pool . . . . . . . . . . . 4-20

Table des matières

Page 4: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

ii

En cas de problème lors des connexions de JDataStore et d’InterBase . . . . . . . . . . 4-23

Messages d’erreur de connexion courants. . 4-23

Chapitre 5Extraction des données d’une source de données 5-1

Interrogation d’une base de données . . . . . . 5-2Définition des propriétés

dans la boîte de dialogue query. . . . . . . 5-4La page Requête . . . . . . . . . . . . . . 5-5La page Paramètres . . . . . . . . . . . . . 5-6Placer le texte SQL

dans l’ensemble de ressources . . . . . . 5-7Interrogation d’une base de données :

trucs & astuces . . . . . . . . . . . . . . . . 5-10Amélioration des performances

des ensembles de données . . . . . . . . 5-10Persistance des métadonnées

d’une requête . . . . . . . . . . . . . . . 5-11Ouverture et fermeture

des ensembles de données . . . . . . . . 5-12Comment s’assurer

qu’une requête est modifiable . . . . . .5-12Utilisation de requêtes paramétrées pour obtenir

des données d’une base de données . . . . . . 5-13Paramétrage d’une requête . . . . . . . . . . 5-13

Création de l’application. . . . . . . . . . 5-14Ajout d’un composant ParameterRow . . 5-15Ajout d’un QueryDataSet . . . . . . . . .5-15Ajout des composants

d’interface utilisateur . . . . . . . . . . .5-16Requêtes paramétrées trucs & astuces . . . . 5-19

Utilisation de paramètres . . . . . . . . .5-19Ré-exécution d’une requête a

vec des paramètres modifiés. . . . . . . 5-22Requêtes paramétrées dans les relations

maître-détail . . . . . . . . . . . . . . . . 5-22

Chapitre 6Utilisation des procédures stockées 6-1

Procédures stockées : trucs & astuces . . . . . . 6-3Séquences d’échappement,

instructions SQL et appels de procédure spécifiques au serveur . . . . . . . . . . . . 6-3

Création manuelle des tables et procédures de ce tutoriel . . . . . . . . . . . . . . . . . 6-4

Utilisation des procédures stockées spécifiques à un fournisseur . . . . . . . . . . 6-6

Utilisation avec JDataStore de procédures stockées et de fonctions définies par l’utilisateur. . . . . . . . . . . . . . . . . 6-7

Utilisation de procédures stockées InterBase . . . . . . . . . . . . . . . . . . . . 6-7

Utilisation de paramètres avec des procédures stockées Oracle PL/SQL . . . . . . . . . . . 6-7

Utilisation des procédures stockées Sybase . 6-9Exemple d’application avec des procédures

stockées spécifiques au serveur de la base de données . . . . . . . . . . . . . 6-9

Ecriture d’un fournisseur de données personnalisé . . . . . . . . . . . . . 6-9

Obtention des métadonnées . . . . . . . . . 6-10Appel de initData . . . . . . . . . . . . . 6-11

Obtention des données réelles . . . . . . . . 6-12Conseils pour la conception d’un fournisseur

de données personnalisé . . . . . . . . 6-12Explication de la méthode provideData()

dans des ensembles de données maître-détail . . . . . . . . . . . . . . . 6-12

Chapitre 7Manipulation des colonnes 7-1Présentation des propriétés et métadonnées

de colonne . . . . . . . . . . . . . . . . . . . . . 7-1Propriétés d’une colonne

qui ne sont pas des métadonnées . . . . . . 7-2Visualisation des informations de colonnes

dans le concepteur de colonne . . . . . . . . 7-2Bouton Créer une classe RowIterator . . . . . 7-3Utilisation du concepteur de colonne

pour rendre persistantes des métadonnées . 7-4Utilisation du concepteur de colonne pour

rendre dynamiques des métadonnées. . . . 7-5Visualisation des informations des colonnes

dans le pilote de base de données . . . . . . 7-5Optimisation d’une requête . . . . . . . . . . . . 7-7

Définition des propriétés d’une colonne . . . 7-7Définition des propriétés des colonnes

en utilisant les outils de conception visuelle de JBuilder . . . . . . . . . . . . 7-7

Définition des propriétés dans le code . . 7-7Colonnes persistantes . . . . . . . . . . . . . . 7-8Combinaison de métadonnées dynamiques

et de colonnes persistantes . . . . . . . . . . 7-9Suppression des colonnes persistantes . . . . 7-9

Utilisation de colonnes persistantes pour ajouter des colonnes vides à un ensemble de données . . . . . . . 7-10

Contrôle de l’ordre des colonnes dans un ensemble de données . . . . . . . 7-11

Page 5: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

iii

Chapitre 8Enregistrement des modifications dans la source de données 8-1

Enregistrement des modifications d’un QueryDataSet. . . . . . . . . . . . . . . . 8-3

Ajout d’un bouton pour enregistrer des modifications depuis un QueryDataSet . . 8-4

Enregistrement des modifications dans la source de données par une procédure stockée . . . . 8-6

Enregistrement des modifications avec un QueryResolver . . . . . . . . . . . 8-6

Codage de procédures stockées pour gérer la résolution de données . . . . . . 8-8

Enregistrement des modifications avec un ProcedureResolver . . . . . . . . . 8-9

Exemple : Utilisation de procédures stockées InterBase avec paramètres de retour . . . . 8-12

Résolution des données de plusieurs tables . . 8-12Remarques sur les types de liaisons

entre les tables d’une requête . . . . . . . . 8-13Références (alias) de tables et de colonnes

dans une chaîne de requête . . . . . . . . . 8-14Contrôle du paramétrage des propriétés

de colonne . . . . . . . . . . . . . . . . . . . 8-14Que faire si une table

n’est pas modifiable ? . . . . . . . . . . . . 8-15Comment spécifier qu’une table

ne doit pas être actualisée ? . . . . . . . . . 8-15Utilisation des ensembles de données avec RMI

(mise en flux) . . . . . . . . . . . . . . . . . . .8-15Exemple : Utilisation de flux

d’ensembles de données . . . . . . . . . . .8-16Utilisation des méthodes de flux

d’ensemble de données . . . . . . . . . . . 8-16Personnalisation de la logique de résolution

par défaut . . . . . . . . . . . . . . . . . . . . . 8-17Explication de la résolution par défaut . . .8-18

Ajout d’un composant QueryResolver . . 8-19Interception des événements

de résolution. . . . . . . . . . . . . . . . 8-19Utilisation des événements

de résolution. . . . . . . . . . . . . . . . 8-21Ecriture d’un résolveur de données

personnalisé . . . . . . . . . . . . . . . . . . 8-22Gestion des erreurs de résolution . . . . . 8-23Résolution des relations maître-détail . . 8-24

Chapitre 9Etablissement d’une relation maître-détail 9-1

Définition d’une relation maître-détail . . . . . . 9-2Création d’une application

avec une relation maître-détail . . . . . . . . 9-3Lecture des détails . . . . . . . . . . . . . . . . . 9-7

Lecture de tous les détails en une seule fois . 9-8Lecture des enregistrements détail

sélectionnés à la demande . . . . . . . . . . 9-8Modification des données dans les ensembles

de données maître-détail . . . . . . . . . . . . 9-10Etapes de la création d’une relation

maître-détail . . . . . . . . . . . . . . . . . . . 9-10Enregistrement des modifications

dans une relation maître-détail . . . . . . . . 9-11Résolution des ensembles de données

maître-détail avec une source JDBC . . . . 9-13

Chapitre 10Utilisation des modules de données pour simplifier l’accès aux données 10-1

Création d’un module de données en utilisant les outils de conception . . . . . . 10-2

Création du module de donnéesavec l’expert . . . . . . . . . . . . . . . . . 10-2

Ajout de composants données à un module de données . . . . . . . . . . 10-3

Ajout de la logique métier au module de données . . . . . . . . . . . 10-5

Utilisation d’un module de données . . . . 10-5Ajout d’une bibliothèque nécessaire

à un projet. . . . . . . . . . . . . . . . . 10-6Référencement d’un module de données

dans votre application . . . . . . . . . . 10-7La boîte de dialogue Expert utilisation

d’un module de données . . . . . . . . 10-8Création de modules de données

en utilisant le modeleur de données . . . . . 10-9Création des requêtes

avec le modeleur de données. . . . . . . 10-10Ouverture d’une URL . . . . . . . . . . .10-11Début d’une requête . . . . . . . . . . . .10-11Ajout d’une clause Group By. . . . . . 10-13Sélection des lignes ayant

des valeurs de colonnes uniques . . . 10-14Ajout d’une clause Where. . . . . . . . 10-14Ajout d’une clause Order By . . . . . . 10-16

Page 6: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

iv

Modification directe de la requête . . . 10-17Test de votre requête . . . . . . . . . . . 10-17Construction de requêtes multiples. . . 10-17Spécification d’une relation

maître-détail . . . . . . . . . . . . . . . 10-17Enregistrement de vos requêtes . . . . . 10-19

Génération d’applications de bases de données . . . . . . . . . . . . 10-20

Utilisation dans votre code d’un module de données généré . . . 10-22

Chapitre 11Filtrage, tri et recherche de données 11-1

Accès aux données des exemples . . . . . . . . 11-2Filtrage des données . . . . . . . . . . . . . . . . 11-5

Ajout et suppression de filtres . . . . . . . . 11-6Tri des données. . . . . . . . . . . . . . . . . . . 11-9

Tri des données dans un composant JdbTable . . . . . . . . . . . . . . . . . . . 11-10

Tri des données en utilisant les outils de conception visuelle de JBuilder . . . . 11-11

Tri et indexation. . . . . . . . . . . . . . 11-12Codage du tri . . . . . . . . . . . . . . . . . 11-14

Recherche de données . . . . . . . . . . . . . . 11-14Recherche de données avec le composant

JdbNavField. . . . . . . . . . . . . . . . . 11-15Recherche de données par programme . . 11-17Recherche de données au moyen

d’un DataRow. . . . . . . . . . . . . . . . 11-18Utilisation des options de recherche . . . . 11-18Recherches gérant tous les types

de données . . . . . . . . . . . . . . . . . 11-20L’ordre des colonnes dans le DataRow

et le DataSet . . . . . . . . . . . . . . . . . 11-20

Chapitre 12Ajout de fonctionnalités aux applications de bases de données 12-1

Création de références . . . . . . . . . . . . . . . 12-2Saisie de données avec une liste

de sélection . . . . . . . . . . . . . . . . . . 12-2Ajout d’un champ à liste de sélection . . . . 12-3Suppression d’un champ

à liste de sélection . . . . . . . . . . . . . .12-4Création d’une référence en utilisant

une colonne calculée . . . . . . . . . . . . .12-5Utilisation de colonnes calculées . . . . . . . . . 12-8

Création d’une colonne calculée dans le concepteur . . . . . . . . . . . . . . 12-9

Agrégation de données avec des champs calculés . . . . . . . . . .12-11

Exemple : Agrégation de données avec des champs calculés . . . . . . . 12-12

Définition des propriétés de AggDescriptor . . . . . . . . . . . . . 12-15

Création d’un gestionnaire d’événement d’agrégation personnalisé . . . . . . . . 12-16

Ajout de modèles d’affichage ou de modification pour formater les données . . . . . . . . . . 12-16

Masques d’affichage . . . . . . . . . . . . 12-18Masques de saisie . . . . . . . . . . . . . . 12-18Utilisation de masques pour l’importation

et l’exportation de données. . . . . . . . 12-19Modèles dépendant du type de données . 12-19

Modèles pour les données numériques . . . . . . . . . . . . . . . 12-19

Modèles des données date et heure . . 12-21Modèles de données chaîne. . . . . . . 12-21Modèles des données booléennes . . . 12-22

Présentation de plusieurs vues des données. 12-23Garantie de la persistance des données . . . 12-25

Rendre des colonnes persistantes . . . . . 12-25Utilisation de types de données variant . . . 12-28

Stockage d’objets Java. . . . . . . . . . . . 12-28

Chapitre 13Utilisation d’autres contrôles et événements 13-1

Synchronisation des composants visuels. . . . 13-1Accès aux données et aux informations de modèle

depuis un composant d’interface utilisateur . 13-2Affichage d’informations d’état . . . . . . . . . 13-3

Ajout d’un composant JdbStatusLabel à une application . . . . . . . . . . . . . . 13-3

Exécution de l’application JdbStatusLabel . 13-4Gestion des erreurs et des exceptions. . . . . . 13-5

Remplacement de la gestion par défaut des exceptions DataSetException dans les contrôles . . . . . . . . . . . . . . 13-6

Chapitre 14Création d’une application de base de données distribuée à l’aide de DataSetData 14-1

Explication de l’exemple d’application de base de données distribuée (utilisant Java RMI et DataSetData) . . . . . . 14-2

Installation de l’application exemple . . . . 14-3Que se passe-t-il ? . . . . . . . . . . . . . 14-4

Page 7: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

v

Transmission des métadonnées par DataSetData . . . . . . . . . . . . . . 14-5

Déploiement de l’application sur plusieurs niveaux. . . . . . . . . . .14-5

Chapitre 15Administration d’une base de données 15-1

Exploration des tables et métadonnées des bases de données en utilisant le pilote de base de données . . . . . . . . . . 15-1

Parcourir les objets de schéma d’une base de données . . . . . . . . . . . . 15-2

Configuration des pilotes pour accéder à des bases de données distantes ou locales . . . 15-3

Exécution d’instructions SQL . . . . . . . . . 15-4Utilisation de l’explorateur pour visualiser

ou modifier les données des tables . . . . . 15-6Utilisation du pilote de base de données

pour l’administration de bases de données . . 15-7Création de la source de données SQL. . . . 15-8Remplissage d’une table SQL en utilisant

JBuilder . . . . . . . . . . . . . . . . . . . 15-10Suppression de tables dans JBuilder . . . . 15-10

Surveillance des connexions aux bases de données . . . . . . . . . . . . . 15-11

A propos du Moniteur JDBC . . . . . . . . 15-11Utilisation du Moniteur JDBC

dans une application en exécution . . . . 15-12Ajout du MonitorButton à la palette . . 15-12Utilisation de la classe MonitorButton

dans le code . . . . . . . . . . . . . . . 15-13Propriétés de MonitorButton . . . . . . 15-13

Chapitre 16Tutoriel : Importation et exportation des données d’un fichier texte 16-1

Etape 1 : Création du projet . . . . . . . . . . . . 16-2Etape 2 : Création du fichier texte . . . . . . . . 16-3Etape 3 : Génération d’une application . . . . . 16-3

Etape 4 : Ajout de composants DataExpress à votre application . . . . . . . . . . . . . . . 16-4

Etape 5 : Ajout de composants dbSwing pour créer l’interface utilisateur . . . . . . . . 16-6

Etape 6 : Ajout d’un composant Swing JButton 16-8Etape 7 : Compilation et exécution

de votre application. . . . . . . . . . . . . . 16-10Etape 8 : Utilisation de modèle

pour l’exportation de champs numériques, date/heure et texte . . . . . . . . . . . . . . 16-12

Chapitre 17Tutoriel : Création d’une application de base de données élémentaire 17-1

Etape 1 : Création du projet . . . . . . . . . . . 17-3Etape 2 : Génération d’une application . . . . . 17-4Etape 3 : Ajout de composants DataExpress

à votre application . . . . . . . . . . . . . . . 17-4Etape 4 : Conception des colonnes

de l’application . . . . . . . . . . . . . . . . . 17-7Ajout de colonnes et modification

des propriétés des colonnes . . . . . . . . 17-7Spécification des calculs

des colonnes calculées. . . . . . . . . . . . 17-9Etape 5 : Ajout de composants dbSwing

pour créer l’interface utilisateur . . . . . . . 17-10Etape 6 : Agrégation de données

avec des champs calculés. . . . . . . . . . . 17-14

Chapitre 18Tutoriel : Extraction de données à l’aide de procédures stockées 18-1

Etape 1 : Création des tables et des procédures du tutoriel . . . . . . . . . . . . . . . . . . . . 18-2

Etape 2 : Ajout des composants DataSet . . . . 18-3Etape 3 : Ajout de composants visuels . . . . . 18-5

Index I-1

Page 8: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

vi

Page 9: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-1

C h a p i t r e

1Chapitre1Introduction

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Le Guide du développeur d’applications bases de données décrit la manière d’utiliser les fonctionnalités DataExpress de JBuilder pour développer des applications de bases de données. Il montre aussi comment utiliser les composants dbSwing pour créer l’interface utilisateur (IU) des applications. Les fonctionnalités standard d’une application de base de données sont présentées au travers d’exemples afin que vous puissiez apprendre en les réalisant. Des informations conceptuelles sont fournies et suivies, dès que possible, par des exemples, avec des renvois sur des informations plus détaillées quand cela est nécessaire.

Veuillez vérifier que vous êtes bien en possession des additifs à la documentation et de ses mises à jour, à l’adresse http://www.borland.com/techpubs/jbuilder. Vous pouvez aussi consulter l’aide en ligne de JBuilder. Les informations de l’aide en ligne sont plus récentes que celles de la documentation imprimée.

Si vous avez des questions en matière de création des applications de bases de données en utilisant JBuilder, visitez le groupe de discussion consacré aux bases de données, à l’adresse news://newsgroups.borland.com/borland.public.jbuilder.database. Ce groupe de discussion, dédié aux problèmes d’écriture des applications de bases de donnes avec JBuilder, est animé par nos ingénieurs support ainsi que par l’équipe de développement 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 l’aide lors de la création d’interfaces utilisateur d’applications de bases de données. Le site Web de la communauté Borland héberge les réponses aux questions fréquemment posées (FAQ) sur DataExpress à l’adresse http://community.borland.com/.

Page 10: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R é s u m é d e s c h a p i t r e s

Remarque Toutes les versions de JBuilder fournissent un accès direct aux données SQL via l’API JDBC de Sun. JBuilder Entreprise propose des composants DataExpress supplémentaires simplifiant grandement le développement des applications de bases de données, comme le montre ce manuel. Nombre de ces composants sont facilement accessibles via l’onglet DataExpress de la palette de composants.

DataExpress stocke les données en mémoire. La plupart des tutoriels et applications exemple décrits dans ce manuel utilisent des données exemple stockées dans un JDataStore et accessibles via un pilote JDBC. Le remplacement du module de stockage en mémoire de JDataStore fournit un stockage permanent des données. JDataStore peut être traité comme toute base de données SQL - vous pouvez vous y connecter comme à tout serveur, y exécuter des requêtes SQL, etc. Pour davantage d’informations sur JDataStore, voir le Guide du développeur JDataStore.

Pour connaître les conventions utilisées par la documentation, lisez “Conventions de la documentation”, page 1-9.

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.

Résumé des chapitresCe manuel décrit en détail comment les technologies et les outils sur les bases de données apparaissent dans JBuilder et comment vous travaillerez avec eux dans l’EDI et l’éditeur. Il explique également comment ces technologies s’ajustent dans une application de base de données. Pour avoir plus d’informations, choisissez l’une des rubriques suivantes :

• Chapitre 2, “Les applications de bases de données JBuilder”

Introduit les technologies, les composants et les outils utilisés pour créer des applications de bases de données dans JBuilder, notamment la bibliothèque de composants DataExpress, le pilote de base de données, le moniteur JDBC, les sources de données, JDataStore et InterBase.

• Chapitre 3, “Importation et exportation des données d’un fichier texte”

Explique comment alimenter en données une application depuis un fichier texte et comment enregistrer les données vers un fichier texte ou une source de données SQL.

• Chapitre 4, “Connexion à une base de données”

Décrit comment connecter vos composants de base de données à un serveur. Inclut des informations sur l’utilisation des pilotes de bases de données JDBC et ODBC, ainsi que des informations spécifiques à la connexion aux bases de données JDataStore et InterBase.

Page 11: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-3

R é s u m é d e s c h a p i t r e s

• Chapitre 5, “Extraction des données d’une source de données”

Décrit comment créer une copie locale des données de votre source de données et quels composants du paquet DataExpress utiliser. Cette phase (appelée acquisition ou fourniture des données) rend les données accessibles à l’application.

• Chapitre 6, “Utilisation des procédures stockées”

Décrit comment créer et utiliser des procédures stockées pour exécuter des instructions SQL effectuant l’acquisition ou la résolution des données.

• Chapitre 7, “Manipulation des colonnes”

Décrit la manière de rendre des colonnes persistantes, de contrôler l’aspect ou la saisie des données d’une colonne, d’obtenir les informations des métadonnées, d’ajouter une colonne à un ensemble de données et de définir l’ordre d’affichage des colonnes.

• Chapitre 8, “Enregistrement des modifications dans la source de données”

Décrit la manière d’enregistrer dans la source de données les modifications de données faites dans l’application JBuilder (ce processus est appelé résolution). Détaille plusieurs méthodes de résolution, notamment le mécanisme de résolution standard proposé par les composants DataExpress, l’enregistrement des modifications avec les procédures stockées, la résolution des données provenant de plusieurs tables, l’utilisation des objets DataSet avec RMI, la personnalisation de la logique de résolution par défaut.

• Chapitre 9, “Etablissement d’une relation maître-détail”

Décrit comment lier plusieurs ensembles de données pour créer une relation parent/enfant (ou maître-détail).

• Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”

Décrit comment utiliser des modules de données pour simplifier l’accès aux données de vos applications et, simultanément, standardiser la logique et les règles de fonctionnement de la base de données pour tous les développeurs accédant aux données. Fournit également des informations sur l’utilisation de l’expert Modeleur de données pour créer des modules de données.

• Chapitre 11, “Filtrage, tri et recherche de données”

Décrit comment implémenter le tri, le filtrage et la recherche de données dans les applications de bases de données, à l’aide des composants DataExpress standard et les outils de conception de JBuilder. Explique les différences entre ces fonctionnalités, et offre un tutoriel pour chacune d’elles.

Page 12: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

T u t o r i e l s s u r l e s b a s e s d e d o n n é e s

• Chapitre 12, “Ajout de fonctionnalités aux applications de bases de données”

Inclut des informations sur les tâches suivantes :

• Formatage et analyse de données avec des masques de saisie ou d’affichage

• Création de colonnes calculées

• Agrégation de données (minimum, maximum, somme, décompte)

• Création d’un champ de recherche

• Présentation de plusieurs vues des données

• Création de champs persistants ou prédéfinis

• Chapitre 13, “Utilisation d’autres contrôles et événements”

Expose les méthodes complémentaires facilitant le développement de la partie interface utilisateur de votre application. Discute de l’affichage des informations d’état dans votre application et du traitement des erreurs de l’application.

• Chapitre 14, “Création d’une application de base de données distribuée à l’aide de DataSetData”

Décrit l’utilisation des composants DataExpress dans un environnement informatique à objet distribué (à l’aide de Java RMI).

• Chapitre 15, “Administration d’une base de données”

Inclut des informations sur les tâches suivantes :

• Parcours et modification des données, des tables et des schémas de base de données en utilisant le pilote de base de données

• Création et suppression de tables

• Remplissage de tables par des données

• Surveillance du trafic JDBC avec le moniteur JDBC

Tutoriels sur les bases de donnéesLes tutoriels suivants illustrent les techniques de développement d’applications de bases de données les plus utiles.

• Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”

Présente l’utilisation du composant TableDataSet permettant d’importer et d’exporter les données d’un fichier texte. Ce tutoriel montre d’autre part comment se servir des composants dbSwing et des outils de

Page 13: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-5

E x e m p l e s d e b a s e s d e d o n n é e s

conception de JBuilder pour construire l’interface utilisateur de vos applications de bases de données.

• Chapitre 17, “Tutoriel : Création d’une application de base de données élémentaire”

Montre comment construire une application de base de données simple se connectant à une base SQL. Vous verrez comment définir les propriétés de connexion à la base de données, ajouter un champ de recherche pour localiser des données et ajouter des champs calculés pour générer des totaux dans une colonne.

• Chapitre 18, “Tutoriel : Extraction de données à l’aide de procédures stockées”

Démontre comment utiliser le composant ProcedureDataSet dans une application de base de données pour extraire les données d’une base. Dans ce tutoriel, vous apprendrez à créer des procédures stockées et à les invoquer avec votre application.

Exemples de bases de donnéesIl existe de nombreux exemples démontrant les technologies et techniques spécifiques aux applications de bases de données. La majorité des exemples spécifiques aux bases de données se trouvent dans les répertoires suivants :

• <jbuilder>/samples/DataExpress : contient une grande variété de projets démontrant les techniques d’utilisation des composants DataExpress pour le développement des applications de bases de données.

• <jbuilder>/samples/dbSwing : contient des projets illustrant l’utilisation des composants dbSwing pour la création des interfaces utilisateur des applications de bases de données.

• <jbuilder>/samples/JDataStore : contient le code exemple, les fichiers des bases et les projets JBuilder démontrant l’utilisation des bases de données JDataStore et des pilotes de bases de données JDataStore avec JBuilder. Ces fichiers exemple complètent les tutoriels et les exemples traités dans le Guide du développeur JDataStore.

Beaucoup d’applications accèdent aux données de la base JDataStore exemple, employee.jds ou de la base exemple InterBase, employee.gdb. Pour plus d’informations sur JDataStore, voir le Guide du développeur JDataStore Pour davantage d’informations sur InterBase Server, consultez sa documentation en ligne.

Dans ce guide, les exemples sont mentionnés lorsqu’ils démontrent le concept spécifique présenté par le texte.

Page 14: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

D o c u m e n t a t i o n a n n e x e

Remarque Si vous souhaitez examiner les applications exemple dans le concepteur de JBuilder, il vous faudra construire le projet correspondant à chaque exemple avant de l’amener dans le concepteur. Pour construire un projet, choisissez Projet|Reconstruire le projet.

Documentation annexeLa documentation Borland contient des informations utiles au développement des applications de bases de données :

• La Référence de la bibliothèque de composants DataExpress est la documentation en ligne sur l’API des paquets DataExpress utilisés pour l’accès aux données. Elle inclut les références des paquets de composants suivants :

• Référence DataExpress :

Contient la documentation de l’API pour les paquets fournissant un accès aux données élémentaire. Le paquet com.borland.dx.dataset fournit les routines générales de connectivité, gestion et manipulation des données. Le paquet com.borland.dx.sql.dataset procure les fonctions de connectivité aux données spécifiques à JDBC. Le paquet com.borland.dx.text contient des classes et des interfaces qui contrôlent l’alignement et le formatage des objets, ainsi que le formatage des données et des valeurs. Ce paquet gère en outre le formatage et l’analyse des exceptions comme la validation de la saisie.

• Référence dbSwing:

Contient la documentation API pour le paquet com.borland.dbswing ; les composants contenus dans ce paquet permettent à des composants Swing d’accéder à des bases de données au travers des ensembles de données DataExpress (DataSets).

• Référence JDataStore :

Contient la documentation API pour les paquets servant à la connexion aux bases de données JDataStore ainsi qu’à la exécution 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 données JDataStore locales. Le paquet com.borland.datastore.jdbc contient l’interface JDBC avec le DataStore, y compris le pilote JDBC lui-même, en même temps que les classes permettant d’implémenter votre propre serveur DataStore pour les connexions multi-utilisateurs au même DataStore. Le paquet com.borland.datastore.javax.sql apporte le support des transactions distribuées (XA). Les classes de ce paquet sont utilisées en interne par d’autres classes Borland. Vous ne devez jamais utiliser directement les classes de ce paquet.

Page 15: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-7

D o c u m e n t a t i o n a n n e x e

• Référence des classes Javax :

Contient la documentation API pour le paquet com.borland.javax.sql qui fournit les implémentations des DataSource JDBC 2.0 et les composants pour la mise en pool des connexions. Ces classes peuvent servir avec n’importe quel pilote JDBC mais possèdent des fonctionnalités supplémentaires spécifiques au pilote JDBC JDataStore.

• Référence InternetBeans Express :

Contient la documentation API pour les paquets com.borland.internetbeans et com.borland.internetbeans.taglib qui fournissent des composants et une bibliothèque de balises JSP permettant de générer la couche présentation d’une application web, et d’y répondre.

• Référence des classes adaptateur pour SQL :

Contient la documentation API pour le paquet com.borland.sql. Ce paquet contient l’interface SQLAdapter pouvant être implémentée par n’importe quelle classe JDBC “adaptable” en vue de l’amélioration des performances.

• Référence des classes des outils SQL :

Contient la documentation API pour le paquet com.borland.sqltools contenant les classes pour récupérer la sortie d’un rapport en utilisant les requêtes SQL spécifiées dans le format XML.

• Référence CORBA Express :

Contient la documentation API pour le paquet com.borland.cx contenant les classes de connexion CORBA pour les applications distribuées basées sur CORBA.

• Référence DataExpress EJB :

Contient la documentation API pour le paquet com.borland.dx.ejb. Ce paquet contient les composants DataExpress pour EJB qui permettent d’utiliser des beans entité avec les DataSet DataExpress pour la résolution et l’acquisition des données. Certains de ces composants peuvent être ajoutés depuis la page EJB de la palette de composants dans le concepteur d’interface utilisateur.

• Référence des composants de bases de données XML :

Contient la documentation API pour les composants de bases de données 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 ajoutés depuis la page XML de la palette de composants dans le concepteur d’interface utilisateur.

Page 16: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

D o c u m e n t a t i o n a n n e x e

• Le Guide du développeur d’applications web contient des informations sur l’utilisation des composants InternetBeans Express pour créer des applications web accédant aux données. Le Guide du développeur d’applications web comprend des tutoriels qui montrent comment utiliser les composants InternetBeans Express avec des JSP et des servlets.

• Le Guide du développeur XML explique comment utiliser les composants bean modèle et template de XML pour créer des requêtes sur une base de données et comment transférer des données entre des documents XML et des bases de données. Le Guide du développeur XML comprend également des tutoriels qui illustrent l’utilisation des composants de bases de données XML.

• Le Guide du développeur Enterprise JavaBeans explique comment utiliser les composants DataExpress pour EJB afin de transférer des données depuis les beans entité déployés sur un serveur vers une application client et vice-versa.

• Le Guide du développeur JDataStore contient une référence complète qui vous aidera à utiliser JDataStore avec les applications de base de données que vous développez.

Page 17: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-9

C o n v e n t i o n s d e l a d o c u m e n t a t i o n

Conventions de la documentationLa documentation Borland sur JBuilder utilise les polices et les symboles décrits dans le tableau suivant pour signaler du texte particulier.

Tableau 1.1 Polices et symboles

Police Signification

Police à espacement fixe

La police à espacement fixe représente :• du texte tel qu’il apparaît à l’écran• du texte que vous devez taper, comme dans “Tapez Hello

World dans le champ Titre de l’expert Application.”• des noms de fichiers• des noms de chemins• des noms de répertoires ou de dossiers• des commandes, comme SET PATH• du code Java• des types de données Java, comme boolean, int et long.• des identificateurs Java, comme des noms de variables,

classes, noms de paquets, interfaces, composants, propriétés, méthodes et événements

• des noms d’argument• des noms de champs• des mots clés Java, comme void et static

Gras Le gras est utilisé pour désigner les outils java, bmj (Borland Make for Java), bcj (Borland Compiler for Java) et les options du compilateur. Par exemple : javac, bmj, -classpath.

Italiques L’italique est utilisé pour les termes nouveaux, les titres des manuels et, parfois, pour la mise en valeur.

Touches Cette police indique les touches du clavier, comme dans “Appuyez sur Echap pour quitter le menu.”

[ ] Les crochets droits dans le texte ou dans la syntaxe entourent les éléments facultatifs. Ne tapez pas ces crochets.

Page 18: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o n v e n t i o n s d e l a d o c u m e n t a t i o n

JBuilder est disponible sur plusieurs plates-formes. Reportez-vous au tableau suivant pour une description des conventions associées aux diverses plates-formes.

< > Les crochets angulaires indiquent des variables dans les chemins de répertoire, les options de commande et les exemples de code.Par exemple, <filename> peut être utilisé pour indiquer l’emplacement où vous devez fournir un nom de fichier (y compris l’extension du fichier) et <username> indique généralement que vous devez fournir votre nom d’utilisateur.Lorsque vous remplacez des variables dans les chemins de répertoire, les options de commande et les exemples de code, remplacez toute la variable, y compris les crochets angulaires (< >). Par exemple, vous pouvez remplacer <filename> par le nom d’un fichier, comme employee.jds, et omettre les crochets.Remarque : Les crochets angulaires sont utilisés dans les fichiers HTML, XML, JSP et d’autres fichiers basés sur des balises pour démarquer les éléments des documents, comme <font color=red> et <ejb-jar>. La convention suivante décrit comment les chaînes variables sont spécifiées dans les exemples de code qui utilisent déjà des crochets angulaires comme délimiteurs.

Italiques, serif Ce formatage permet d’indiquer les chaînes variables des exemples de code qui utilisent déjà des crochets angulaires comme délimiteurs. Par exemple, <url="jdbc:borland:jbuilder\\samples\\guestbook.jds">

... Dans les exemples de code, les points de suspension (...) indiquent le code qui a été omis dans l’exemple pour gagner de la place et améliorer la compréhension. Sur un bouton, les points de suspension indiquent que ce bouton ouvre une boîte de dialogue de sélection.

Tableau 1.2 Conventions des plates-formes

Elément Signification

Chemins Les chemins d’accès mentionnés dans la documentation sont indiqués par une barre oblique (/).Pour Windows, utilisez une barre oblique inversée (\).

Répertoire de base L’emplacement du répertoire de base standard dépend de la plate-forme et sera indiqué par la variable <home>.• Pour UNIX et Linux, le répertoire de base peut varier. Par

exemple, ce peut être /user/<nomutilisateur> ou /home/<username>

• Pour Windows NT, le répertoire de base est C:\Winnt\Profiles\<nomutilisateur>

• Pour Windows 2000, le répertoire de base est C:\Document and Settings\<nomutilisateur>

Captures d’écran Les captures d’écran reflètent l’apparence Metal sur diverses plates-formes.

Tableau 1.1 Polices et symboles (suite)

Police Signification

Page 19: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-11

S u p p o r t e t r e s s o u r c e s d e s t i n é s a u x d é v e l o p p e u r s

Support et ressources destinés aux développeursBorland fournit de nombreuses options de support et ressources d’information pour aider les développeurs à tirer le meilleur parti de leurs produits Borland. Ces options comprennent des programmes de support technique Borland, ainsi que des services gratuits sur Internet, où vous pouvez consulter notre importante base d’informations et entrer en contact avec d’autres utilisateurs de produits Borland.

Comment contacter le support technique de Borland

Borland propose divers programmes de support destinés aux clients et aux futurs clients. Vous pouvez choisir parmi plusieurs catégories de support, allant de l’installation des produits Borland au support tarifé de niveau consultant, en passant par une assistance complète.

Pour obtenir des informations sur les services Borland de support aux développeurs, veuillez consulter notre site Web, à l’adresse http://www.borland.fr/support/.

Quand vous contacterez le support, préparez des informations complètes sur votre environnement, la version du produit que vous utilisez et une description détaillée du problème.

Pour avoir de l’aide sur les outils tiers, ou leur documentation, contactez votre fournisseur.

Ressources en ligne

Vous pouvez obtenir des informations depuis les sources ci-après :

World Wide Web http://www.borland.fr/

FTP ftp://ftp.borland.com/

Documents techniques accessibles par anonymous ftp.

Listserv Pour vous abonner aux bulletins électroniques, utilisez le formulaire en ligne : http://info.borland.com/contact/listserv.html

ou, pour l’international,http://info.borland.com/contact/intlist.html

Page 20: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

S u p p o r t e t r e s s o u r c e s d e s t i n é s a u x d é v e l o p p e u r s

World Wide Web

Consultez régulièrement www.borland.fr/jbuilder. L’équipe produit de JBuilder y place notes techniques, analyses des produits concurrents, réponses aux questions fréquemment posées, exemples d’applications, mises à jour du logiciel et informations sur les produits existants ou nouveaux.

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 d’informations web pour les développeurs)

Groupes de discussion Borland

Vous pouvez vous inscrire à JBuilder et participer à de nombreux groupes de discussion dédiés à JBuilder. Les groupes de discussion Borland permettent à la communauté mondiale d’utilisateurs d’échanger des astuces et des techniques concernant les produits Borland, ainsi que les outils et technologies associés.

Vous trouverez des groupes de discussion, animés par les utilisateurs, pour JBuilder et d’autres produits Borland, à l’adresse http://www.borland.com/newsgroups/.

Groupes de discussion Usenet

Les groupes Usenet suivants sont dédiées à Java et concernent la programmation :

• 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

Remarque Ces groupes de discussion sont maintenus par les utilisateurs et ne sont pas des sites Borland officiels.

Page 21: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n t r o d u c t i o n 1-13

S u p p o r t e t r e s s o u r c e s d e s t i n é s a u x d é v e l o p p e u r s

Rapports de bogues

Si vous pensez avoir trouvé un bogue dans le logiciel, merci de le signaler dans la page du support développeur de JBuilder, à l’adresse http://www.borland.com/devsupport/emea/. Cliquez sur “this form” dans “Reporting Borland Product Defects” pour afficher le formulaire de saisie.

Quand vous signalez un bogue, indiquez toutes les étapes nécessaires à la reproduction de ce bogue, ainsi que tout paramètre spécial de votre environnement et les autres programmes utilisés avec JBuilder. Précisez bien le comportement attendu et ce qui s’est réellement passé.

Si vous avez des commentaires (compliments, suggestions ou questions) destinés aux rédacteurs de la documentation de JBuilder, vous pouvez envoyer un e-mail à [email protected]. Uniquement pour la documentation. Les questions de support doivent être adressées au support développeur.

JBuilder est fait par des développeurs pour des développeurs. Nous apprécions vraiment vos remarques.

Page 22: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

1-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 23: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-1

C h a p i t r e

2Chapitre2Les applications de bases

de données JBuilderLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

On appelle application de base de données toute application accédant à des données stockées et permettant de les visualiser et, éventuellement, de les modifier ou de les manipuler. Le plus souvent, ces données sont stockées dans une base de données. Les données peuvent cependant être stockées dans des fichiers texte ou dans d’autres formats. JBuilder permet d’accéder à ces informations et de les manipuler en utilisant les propriétés, les méthodes et les événements définis dans les paquets DataSet de la bibliothèque de composants DataExpress et dans le paquet dbSwing.

Une base de données demandant des informations à une telle source de données est appelée une application client. Un gestionnaire de bases de données gérant les demandes de données de divers clients est appelé un serveur de bases de données.

Architecture des applications de bases de donnéesL’architecture DataExpress de JBuilder est centrée sur la construction entièrement Java d’applications client-serveur, d’applets, de servlets et de pages JavaServer (JSP) pour Internet ou intranet. Comme les applications réalisées avec JBuilder sont entièrement en Java à l’exécution, elles sont multiplates-formes.

Les applications JBuilder communiquent avec les serveurs de bases de données en utilisant l’API JDBC, la spécification de connectivité de base de données Sun. JDBC est l’API standard entièrement Java permettant d’accéder aux données des bases de données et de les manipuler. Les applications de bases de données JBuilder peuvent se connecter à toutes les bases de données disposant d’un pilote JDBC.

Page 24: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o m p o s a n t s D a t a E x p r e s s

Le diagramme suivant illustre l’organisation d’une base de données standard et les différentes couches entre l’application de base de données client DataExpress JBuilder et la source de données :

Figure 2.1 Diagramme d’une application de base de données standard

La section suivante, “Composants DataExpress”, présente les composants de l’architecture DataExpress avec plus de détails.

Composants DataExpressDataExpress est un paquet, com.borland.dx.dataset, de classes et d’interfaces Borland qui apportent les fonctions basiques d’accès aux données. Ce paquet définit également les classes de base fournisseur et résolveur, ainsi qu’une classe DataSet abstraite étendue aux autres objets DataSet. Ces classes fournissent l’accès aux informations stockées dans les

Page 25: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-3

C o m p o s a n t s D a t a E x p r e s s

bases de données ou les autres sources de données. Ce paquet comprend les fonctionnalités couvrant les trois phases principales de la gestion des données :

• Acquisition

Fonction générale qui obtient les données et gère les ensembles de données locaux. Les connexions à des serveurs distants spécifiques à JDBC sont gérées par des classes du paquet com.borland.dx.sql.dataset.

• Manipulation

Navigation et modification des données en local.

• Résolution

Routines générales de mise à jour des données, du DataSet local vers la source originelle des données. La résolution sur des serveurs distants des modifications des données via JDBC est gérée par des classes du paquet com.borland.dx.sql.dataset.

Principales fonctionnalités et avantages

Les composants DataExpress sont modulaires afin de permettre la séparation des fonctionnalités. Cette conception permet aux composants DataExpress de gérer une grande variété d’applications. La modularité de l’architecture DataExpress repose sur les caractéristiques suivantes :

• Fonctionnalité de DataSet intégrée

C’est une collection de fonctions de gestion des données, accessibles aux applications avec DataExpress. Beaucoup de ces fonctions peuvent être appliquées par la définition explicite de propriétés et d’événements. Parmi ces fonctions : la navigation, l’accès aux données et leur mise à jour, le classement et le filtrage des données, le support des relations maître-détail, les références, les contraintes, les valeurs par défaut, etc.

• Indépendance par rapport aux sources de données

La lecture et l’actualisation des données d’une source de données comme un serveur Oracle ou Sybase sont isolées dans deux principales interfaces : Provider, l’acquisition, et Resolver, la résolution. Isoler la recherche et la mise à jour des données facilite la création des nouveaux composants Provider/Resolver destinés aux nouvelles sources de données. Il existe deux implémentations Provider/Resolver pour les pilotes JDBC standard ; elles fournissent un accès aux bases de données telles Oracle, Sybase, Informix, InterBase, DB2, MS SQL Server, Paradox, dBase, FoxPro, Access, et bien d’autres. Vous pouvez aussi créer les implémentations des composants Provider/Resolver personnalisées pour les EJB, les serveurs d’application, SAP, BAAN, IMS, CICS, etc.

Page 26: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o m p o s a n t s D a t a E x p r e s s

• Stockage intégré

Lorsque les données sont récupérées à partir d’un processus d’acquisition, elles sont mises en cache dans le DataSet. Toutes les modifications apportées au DataSet caché sont suivies de sorte que les implémentations du processus de résolution savent celles qui demandent une mise à jour dans la source de données. DataExpress fournit deux options pour ce stockage en cache : MemoryStore (par défaut) et JDataStore.

MemoryStore met en cache toutes les données et en mémoire les modifications. JDataStore utilise une base de données entièrement Java, à faible encombrement, ultra-performante et incorporable pour mettre en cache les données et leurs modifications. Le JDataStore est idéal pour l’informatique déconnectée ou mobile, la réplication non synchrone des données et les applications de bases de données à faible encombrement.

• Support de la liaison de données pour les composants visuels

Les composants DataSet de DataExpress fournissent une puissante interface de programmation ainsi que le support de la liaison de données directe pour les composants orientés données grâce à la définition de propriétés par simple pointer-cliquer dans le concepteur visuel. JBuilder est livré avec des composants visuels basés sur Swing qui se lient directement aux composants DataSet.

L’utilisation de l’architecture modulaire de DataExpress présente les avantages suivants :

• Informatique en réseau

Comme indiqué précédemment, l’approche Acquisition/Résolution isole les interactions des sources de données en deux points exactement définis. Cette approche offre deux autres avantages :

• Le processus d’acquisition/résolution peut facilement être décomposé en faveur d’un niveau intermédiaire. La logique d’acquisition/résolution possédant typiquement une nature transactionnelle est idéalement adaptée au partitionnement sur un niveau intermédiaire.

• C’est un modèle de traitement “sans état” idéalement adapté à l’informatique en réseau. La connexion entre le client composant DataSet et la source de données peut être interrompue après l’acquisition. Lorsque les modifications doivent être enregistrées dans la source, la connexion n’a besoin d’être rétablie que pour la durée de la transaction de résolution.

Page 27: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-5

C o m p o s a n t s D a t a E x p r e s s

• Développement rapide des interfaces utilisateur

Les composants DataSet pouvant être liés aux composants orientés données par la simple définition d’une propriété, ils sont idéalement adaptés à la construction rapide des interfaces utilisateur des applications de bases de données.

• Informatique mobile

Avec l’introduction du composant DataStore, les applications DataExpress disposent d’une base de données persistante et portable. Le DataStore peut contenir plusieurs composants DataSet, des fichiers quelconques et des objets Java. Cela permet de conserver l’état complet d’une application dans un seul fichier. Les composants DataSet intègrent des techniques de réplication des données, permettant que les modifications apportées aux données répliquées soient enregistrées et réconciliées dans leur source.

• Applications imbriquées

Le faible encombrement, les hautes performances de la base de données JDataStore supportent idéalement l’incorporation des applications et acceptent toutes les fonctionnalités et toute la sémantique du composant DataSet.

Pour plus d’informations sur l’architecture DataExpress, visitez le site Web Borland, à l’adresse http://www.borland.fr/jbuilder/.

Présentation des composants DataExpress

Les fonctionnalités de base nécessaires à la connexion de données sont proposées par les paquets com.borland.dx.dataset, com.borland.dx.sql.dataset et com.borland.datastore. Les composants de ces paquets encapsulent la connexion de l’application avec la source de données et les comportements nécessaires à la manipulation des données. Les caractéristiques proposées par ces paquets gèrent la connexion avec les bases de données ainsi que les fonctionnalités d’un ensemble de données.

Les classes et les composants principaux des paquets Borland consacrés aux bases de données sont énumérés dans le tableau ci-dessous avec une brève description. La colonne de droite du tableau indique les propriétés les plus couramment utilisées de la classe ou du composant. Certaines propriétés sont elles-mêmes des objets regroupant plusieurs propriétés. Le nom de ces objets propriété complexe se termine par le mot Descriptor et ces objets contiennent des propriétés essentielles qui doivent, généralement, être initialisées pour que le composant soit utilisé.

Page 28: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o m p o s a n t s D a t a E x p r e s s

Composant/Classe Description Propriétés couramment utilisées

Database Ce composant est nécessaire pour accéder aux données stockées dans un serveur distant, le composant Database gère la connexion JDBC avec la base de données d’un serveur SQL.Pour davantage d’informations sur ce composant et son utilisation, voir Chapitre 4, “Connexion à une base de données”.

L’objet ConnectionDescriptor stocke les propriétés de connexion spécifiant le pilote, l’URL, le nom d’utilisateur et le mot de passe. On accède à cet objet via la propriété connection.

DataSet Une classe abstraite qui définit le comportement par défaut d’un ensemble de données, DataSet sert également d’infrastructure au stockage de données en gérant un tableau à deux dimensions organisé en lignes et en colonnes. Elle implémente le concept de position de la ligne en cours, ce qui permet de parcourir les lignes de données et de gérer un “pseudo enregistrement” contenant un enregistrement nouveau ou modifié jusqu’à ce qu’il soit validé dans le DataSet. Etant donné qu’il étend ReadWriteRow, DataSet dispose de méthodes de lecture et d’écriture de valeurs de champ.

L’objet SortDescriptor contient des propriétés affectant l’ordre dans lequel on accède aux données et celui de leur affichage dans un composant d’interface utilisateur. On accède à cet objet via la propriété sort. Voir “Tri des données”, page 11-9, pour des informations d’utilisation.L’objet MasterLinkDescriptor contient des propriétés gérant une relation maître-détail entre deux composants DataSet. On accède à cet objet via la propriété masterLink du DataSet détail. Voir Chapitre 9, “Etablissement d’une relation maître-détail”, pour des instructions d’utilisation.

StorageDataSet Une classe qui étend DataSet en fournissant une implémentation du stockage des données et de la manipulation de la structure du DataSet.Un composant StorageDataSet est rempli avec les données en extrayant des informations d’une base de données distante (par exemple, InterBase ou Oracle) ou en important les données stockées dans un fichier texte. Pour ce faire, il faut instancier l’une de ses sous-classes : QueryDataSet, ProcedureDataSet ou TableDataSet.

La propriété tableName spécifie la source de données du composant StorageDataSet.La propriété maxRows définit le nombre maximum de lignes contenues initialement dans le DataSet.La propriété readOnly contrôle l’accès en écriture aux données.

DataStore Le composant DataStore propose un remplacement de MemoryStore qui offre un stockage permanent des données. Un JDataStore offre un cache des données performant et une persistance compacte pour des DataSets DataExpress, des fichiers quelconques ou des objets Java. Le composant DataStore utilise un seul fichier pour stocker un ou plusieurs flux de données. Un fichier JDataStore utilise une structure de répertoire associant un nom et un état de répertoire à chaque flux de données. JDataStore peut être traité comme toute base de données SQL - vous pouvez vous y connecter comme à tout serveur, y exécuter des requêtes SQL, etc.Voir “JDataStore et JBuilder”, page 2-13, et le Guide du développeur JDataStore pour plus d’informations sur le composant DataStore.

Le stockage et la mise en cache des composants StorageDataSet dans un DataStore s’effectuent grâce à la définition de deux propriétés du StorageDataSet : store et storeName. Par défaut, quand la propriété store n’est pas définie, tous les StorageDataSet utilisent un MemoryStore. Actuellement MemoryStore et DataStore sont les seules implémentations possibles de la propriété store. La propriété storeName contient le nom unique associé à ce StorageDataSet dans DataStore.

Page 29: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-7

C o m p o s a n t s D a t a E x p r e s s

DataStoreDriver DataStoreDriver est le pilote JDBC pour le JDataStore. Le pilote gère l’accès local et distant. Ces deux types d’accès nécessitent un nom d’utilisateur (toute chaîne sans configuration nécessaire). Le mot de passe peut être vide si le JDataStore n’est pas crypté. Sinon, un mot de passe non nul doit être fourni.

QueryDataSet Le composant QueryDataSet stocke le résultat d’une chaîne de requête exécutée sur un serveur distant. Ce composant fonctionne avec le composant Database pour se connecter aux bases de données d’un serveur SQL et pour exécuter la requête spécifiée avec ou sans paramètres. Lorsque les données résultantes sont stockées dans le composant QueryDataSet, vous pouvez manipuler les données en utilisant l’API duDataSet.Pour davantage d’informations sur ce composant et son utilisation, voir “Interrogation d’une base de données”, page 5-2.

L’objet QueryDescriptor contient l’instruction de la requête SQL, les paramètres de la requête et les informations sur la connexion à la base de données. On accède à cet objet en utilisant la propriété query.

ProcedureDataSet Le composant ProcedureDataSet contient le résultat d’une procédure stockée exécutée sur une base de données distante. Associé au composant Database, ce composant fonctionne de la même manière que le composant QueryDataSet.Pour plus d’informations sur ce composant et des instructions d’utilisation, voir Chapitre 6, “Utilisation des procédures stockées”, et le tutorial associé, Chapitre 18, “Tutoriel : Extraction de données à l’aide de procédures stockées”.

L’objet ProcedureDescriptor contient l’instruction SQL, les paramètres, le composant base de données et d’autres propriétés. On accède à cet objet via la propriété procedure du composant ProcedureDataSet.

TableDataSet Utilisez ce composant pour importer des données d’un fichier texte. Ce composant étend la classe DataSet. Il simule les fonctionnalités d’un serveur SQL sans passer par une connexion avec un serveur SQL.Pour plus d’informations sur ce composant et des instructions d’utilisation, voir Chapitre 3, “Importation et exportation des données d’un fichier texte”, et le tutoriel associé, Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”.

La propriété (héritée) dataFile spécifie le nom de fichier dans lequel se trouve les données à charger dans le DataSet et dans lequel les enregistrer.

DataSetView Ce composant propose une autre “vue” des données d’un objet StorageDataSet existant. Il dispose de sa propre propriété (héritée) sort, ce qui permet une présentation des données dans un ordre différent. Il dispose également de fonctionnalités de tri et de navigation indépendantes de son StorageDataSet associé.Pour plus d’informations sur ce composant et des instructions d’utilisation, voir “Présentation de plusieurs vues des données”, page 12-23.

La propriété storageDataSet indique le composant contenant les données dont le DataSetView présente une vue.

Composant/Classe Description Propriétés couramment utilisées

Page 30: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o m p o s a n t s D a t a E x p r e s s

Colonne Un objet Colonne représente la collection de toutes les lignes d’un élément de données particulier, par exemple toutes les valeurs du champ Nom d’une table. Une colonne obtient ses valeurs quand un ensemble de données est instancié ou comme résultat d’un calcul.L’objet Column est géré par son composant StorageDataSet.Pour plus d’informations sur ce composant et des instructions d’utilisation, voir “Manipulation des colonnes”, page 7-1.

Il est pratique de définir des propriétés au niveau de la colonne afin que le paramétrage de toute la colonne de données soit défini en une seule fois, par exemple la fonte (font). Les outils de conception de JBuilder permettent d’accéder aux propriétés de colonne en double-cliquant sur un StorageDataSet dans le volet contenu, puis en sélectionnant la colonne sur laquelle vous voulez travailler. Les propriétés et les événements du composant Column sélectionné apparaissent soit dans le concepteur de colonne (propriétés uniquement), soit dans l’inspecteur, et peuvent être modifiés dans l’un ou dans l’autre.

DataRow Le composant DataRow est une collection de toutes les données des colonnes pour une seule ligne, en considérant que chaque ligne contient un enregistrement d’informations complet. Le composant DataRow utilise les mêmes 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 données dans un DataSet. Il peut être utilisé dans toutes les méthodes de DataSet qui attendent un ReadRow ou un ReadWriteRow.

ParameterRow Le composant ParameterRow possède une Column pour chaque colonne de l’ensemble de données associé que vous pouvez vouloir dans la requête. Placez les valeurs qui devront être utilisées par la requête dans le ParameterRow et associez-les à la requête par les noms de leurs paramètres (qui sont les noms des colonnes ParameterRow).Pour davantage d’informations sur ce composant et son utilisation, voir “Utilisation de requêtes paramétrées pour obtenir des données d’une base de données”, page 5-13.

Composant/Classe Description Propriétés couramment utilisées

Page 31: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-9

C o m p o s a n t s D a t a E x p r e s s p o u r E J B

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 d’autres paquets comme les paquets util ou view. Vous trouverez des informations détaillées sur les paquets et les classes de la bibliothèque DataExpress dans la Référence de la bibliothèque de composants DataExpress.

Composants DataExpress pour EJBLe paquet DataExpress pour EJB, com.borland.dx.ejb contient les composants DataExpress pour EJB. Ces composants permettent d’acquérir des données à partir de beans entité EJB dans des ensembles de données DataExpress, puis d’effectuer la résolution des modifications apportées aux ensembles de données dans les beans entité.

Le paquet DataExpress pour EJB n’est pas traité dans ce manuel. Pour davantage d’informations sur l’utilisation de composants appartenant au paquet DataExpress pour EJB afin de développer des applications d’entreprise orientées données, voir “Utilisation des composants DataExpress pour EJB” dans le Guide du développeur Enterprise JavaBeans. Pour les informations de référence, reportez-vous à la documentation API du paquet com.borland.dx.ejb.

DataModule Le module de données est une interface du paquet com.borland.dx.dataset. Une classe qui implémente DataModule sera reconnue par le concepteur JBuilder comme une classe contenant divers composants dataset groupés en un modèle de données. Un module de données vide est créé en sélectionnant l’icône Module de données dans la boîte de dialogue Fichier|Nouveau. En utilisant ensuite la palette des composants et le volet contenu, vous pouvez y placer divers objets dataset et définir des connexions, des requêtes, des tris ou la logique de règles de gestion personnalisées. Les modules de données simplifient la réutilisation et le partage de collections de composants dataset. Par exemple, plusieurs classes d’interface utilisateur d’une application peuvent utiliser une instance partagée d’un module de données personnalisé.Pour davantage d’informations sur ce composant et son utilisation, voir Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”.

Composant/Classe Description Propriétés couramment utilisées

Page 32: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r n e t B e a n s E x p r e s s

InternetBeans ExpressLe paquet InternetBeans Express, com.borland.internetbeans, fournit des composants et une bibliothèque de balises JSP, permettant de générer la couche présentation d’une application web, et d’y répondre.

Le paquet InternetBeans Express n’est pas traité dans ce manuel. Pour davantage d’informations sur l’utilisation de composants appartenant au paquet InternetBeans Express afin de développer des applications JSP et servlets orientés données, voir “InternetBeans Express” dans le Guide du développeur d’applications web. Pour les informations de référence, reportez-vous à la documentation API du paquet com.borland.internetbeans.

Composants de bases de données XMLLes composants de bases de données XML de JBuilder supportent le développement des applications de bases de données XML. Les composants peuvent être ajoutés depuis la page XML de la palette de composants dans le concepteur d’interface utilisateur. Il existe des composants basés sur des modèles et des composants basés sur des templates. Les composants basés sur des modèles utilisent un document d’affectation qui détermine la façon dont les données sont transférées entre une structure XML et les métadonnées d’une base de données. Pour utiliser des composants basés sur des templates, vous fournissez une instruction SQL et le composant génère un document XML. L’instruction SQL fournie sert de template remplacé dans le document XML en tant que résultat de l’application du template.

L’utilisation des composants de bases de données XML n’est pas traitée dans ce manuel. Pour plus d’informations, voir “Utilisation des composants de bases de données XML de JBuilder” dans le Guide du développeur XML. Pour les informations de référence, reportez-vous à la documentation API des paquets com.borland.jbuilder.xml.database.common, com.borland.jbuilder.xml.database.template, com.borland.jbuilder.xml.database.xmldbms.

dbSwingLe paquet dbSwing vous permet de concevoir une application de base de données tirant profit de l’architecture des composants Swing Java. En plus de sous-classes orientées données prédéfinies pour la plupart des composants Swing, dbSwing propose également divers composants utilitaires conçus spécifiquement pour le développement d’application utilisant DataExpress et JDataStore.

Page 33: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-11

d b S w i n g

Pour créer une application de base de données, vous devez d’abord établir une connexion à une base de données et fournir des données à un ensemble de données. “Accès aux données des exemples”, page 11-2, permet de définir une requête utilisable comme point de départ pour la création d’une application de base de données et d’une interface utilisateur élémentaire.

Pour utiliser les composants dbSwing orientés données,

1 Ouvrez le fichier Cadre puis sélectionnez l’onglet Conception.

2 Sélectionnez un des onglets dbSwing : dbSwing, dbSwing supplémentaires ou Modèles dbSwing.

3 Cliquez sur un composant de la palette puis cliquez dans le concepteur d’interface utilisateur afin de placer le composant dans l’application.

4 Sélectionnez le composant dans l’arborescence des composants ou dans le concepteur d’interface utilisateur.

Selon le type de composant et la valeur de la propriété layout du contentPane contenant le composant, le concepteur affiche des poignées de redimensionnement de couleur noire sur les bords du composant.

Certains composants (JdbNavToolBar et JdbStatusLabel) se lient automatiquement aux données ayant la focalisation. Pour d’autres (comme JdbTable), initialisez leurs propriétés dataSet et/ou columnName dans l’inspecteur 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 grâce à des fonctionnalités améliorées et à une orientation données. De plus, dbSwing est totalement léger, fournit une prise en charge de l’apparence pour plusieurs plates-formes et se conforme aux normes Swing. En utilisant des composants dbSwing, vous êtes sûr que tous vos composants sont compacts.

Pour davantage d’informations sur le paquet dbSwing, reportez-vous à la documentation API du paquet dbSwing.

Page 34: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

M o d u l e s d e d o n n é e s e t m o d e l e u r d e d o n n é e s

Modules de données et modeleur de donnéesLes modules de données fournissent un conteneur aux composants d’accès aux données. Les modules de données simplifient le développement des applications de bases de données car ils permettent de décomposer le code en modules et de séparer les règles de fonctionnement et la logique d’accès aux bases de données d’avec la logique de l’interface utilisateur de vos applications. Vous pouvez également garder le contrôle sur l’utilisation du module de données, en fournissant seulement les fichiers classe aux développeurs d’application.

Le Modeleur de données est un expert qui aide à construire des modules de données encapsulant une connexion à une base et les requêtes à exécuter sur cette base.

Pour plus d’informations sur les modules de données et le Modeleur de données, voir Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”.

Pilote de base de donnéesLe pilote de base de données (Outils|Pilote de base de données) est un navigateur de bases de données hiérarchique, possédant des capacités d’édition.

Le pilote de base de données présente les méta-informations JDBC des bases de données dans une fenêtre à deux volets. Le volet gauche contient une arborescence qui affiche de façon hiérarchique un ensemble de bases de données et ses tables, vues, procédures stockées et métadonnées associées. Le volet droit affiche sur plusieurs pages des informations qui décrivent chaque nœud de l’arborescence. Dans certains cas, il vous est également possible de modifier les données du volet droit.

Pour plus d’informations sur le pilote de base de données, voir Chapitre 15, “Administration d’une base de données”.

Moniteur JDBCLe moniteur JDBC (Outils|Moniteur JDBC) est un outil graphique servant à surveiller le trafic JDBC. Le moniteur JDBC suivra tous les pilotes JDBC (c’est-à-dire toute sous-classe de java.sql.Driver ) utilisés par JBuilder. Le moniteur JDBC suit toutes les sorties directement depuis le pilote JDBC.

Pour davantage d’informations sur le moniteur JDBC, y compris des instructions d’utilisation, voir “Surveillance des connexions aux bases de données”, page 15-11.

Page 35: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-13

J D a t a S t o r e e t J B u i l d e r

JDataStore et JBuilderJDataStore est une solution de stockage de données de faible encombrement, 100% entièrement Java. [JDataStore est :

• Une base de données relationnelle incorporée, avec des interfaces JDBC et DataExpress, qui gère des transactions multi-utilisateurs non bloquantes avec récupération des erreurs.

• Un stockage objet qui permet de stocker des objets sérialisés, des ensembles de données et d’autres flux de fichier.

• Un composant JavaBean qui peut être manipulé par des outils de conception visuelle comme JBuilder.

L’explorateur JDataStore tout-Java vous permet de gérer vos DataStores.

Pour davantage d’informations sur l’utilisation d’un DataStore, voir le Guide du développeur JDataStore.

Utilisation d’un JDataStore ou d’un pilote JDBC

Les avantages à configurer une application de base de données pour qu’elle accède à un système de gestion de base de données relationnelles avec des pilotes JDBC et à configurer l’application pour qu’elle utilise JDataStore sont uniques. Les sections suivantes présentent quelques avantages associés à chacune des approches.

Vous pouvez utiliser un pilote JDBC pour :

• Utiliser une API JDBC s’appuyant sur les standards

• Manipuler des données SQL dynamiques — vous pouvez utiliser un QueryProvider pour interroger une base de données SQL, manipuler des données dynamiques et enregistrer les modifications en cas de nécessité

• Tirer parti de l’accès à distance avec RemoteJDBC

Remarque 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” du Guide du développeur JDataStore montre comment utiliser un composant DataStore pour la modification des données hors connexion, plutôt que d’établir un connexion JDBC à un serveur JDataStore.

Vous pouvez utiliser un JDataStore pour :

• Travailler hors connexion — vous pouvez enregistrer et modifier des données dans le système de fichiers JDataStore et résoudre les modifications lorsque vous vous reconnectez à la source de données

• Stocker des objets ainsi que des données

Page 36: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

J D a t a S t o r e e t J B u i l d e r

• Manipuler des ensembles de données volumineux

Avantages supplémentaires apportés par JDataStore

Vous pouvez vouloir utiliser un JDataStore pour une des raisons suivantes :

• Organisation.

Pour organiser les composants StorageDataSet d’une application, les fichiers et l’état des objets ou des JavaBean sérialisés, à l’aide d’un unique stockage persistant, ultra-performant, compact, portable et entièrement Java.

• Réplication de données asynchrone.

Pour des modèles informatiques mobile/hors connexion, les StorageDataSet gèrent la résolution/réconciliation des données modifiées obtenues depuis une source de données quelconque (c’est-à-dire JDBC, serveur d’application, SAP, BAAN, etc.).

• Applications embarquées.

L’encombrement du JDataStore est très réduit. Les composants StorageDataSet procurent également un excellent support de la liaison de données pour les composants d’interface utilisateur orientés données.

• Performance.

Pour améliorer les performances et économiser la mémoire pour des StorageDataSet volumineux. Avec un petit nombre de lignes de données, les composants StorageDataSet utilisant le MemoryStore offrent un léger gain de performance par rapport au DataStore. DataStore stocke les données et index d’un StorageDataSet dans un format très compact. Dès que le nombre de lignes d’un StorageDataSet augmente, un StorageDataSet utilisant un DataStore offre de meilleurs performances et nécessite beaucoup moins de mémoire qu’un StorageDataSet utilisant un MemoryStore.

Pour davantage d’informations sur l’utilisation des JDataStore, voir le Guide du développeur JDataStore.

Utilisation de l’explorateur JDataStore

En utilisant l’explorateur JDataStore, vous pouvez :

• Examiner le contenu d’un DataStore. Le répertoire du stockage est affiché dans un contrôle arborescence, chaque ensemble de données étant regroupé avec ses index. Quand un flux de données est sélectionné dans l’arborescence, son contenu est affiché (dans la mesure

Page 37: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

L e s a p p l i c a t i o n s d e b a s e s d e d o n n é e s J B u i l d e r 2-15

J D a t a S t o r e e t J B u i l d e r

où l’explorateur peut afficher son contenu : fichier texte, .gif ou ensemble de données).

• Effectuer des opérations sur le stockage sans écrire de code. Vous pouvez créer un nouveau JDataStore, importer des fichiers texte délimité dans un ensemble de données, importer des fichiers dans des flux de fichier, supprimer des index et des ensembles de données ou vérifier l’intégrité du JDataStore.

• Gérer les requêtes qui fournissent des données aux ensembles de données du stockage, modifier les ensembles de données et enregistrer les modifications dans les tables d’un serveur.

Utilisez la commande Outils|Explorateur JDataStore pour démarrer l’explorateur JDataStore.

Figure 2.2 Explorateur JDataStore

Opérations avec l’explorateur JDataStorePour créer un nouveau JDataStore,

1 Ouvrez l’explorateur JDataStore en sélectionnant 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 l’explorateur.

Pour importer un fichier texte dans un ensemble de données,

1 Choisissez Outils|Importer|Texte vers table.

2 Spécifiez le nom du fichier texte en entrée et le nom dans le stockage de l’ensemble de données à créer.

Page 38: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

2-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r B a s e e t J B u i l d e r

Le contenu du fichier texte doit être au format délimité dans lequel JBuilder exporte et il doit y avoir dans le répertoire un fichier SCHEMA (.schema) portant le même nom pour définir la structure de l’ensemble de données destination (pour créer un fichier .schema, voir “Exportation des données”, page 3-3). Le nom de stockage par défaut est celui du fichier d’entrée, y compris l’extension. Comme cette opération crée un ensemble de données et non un flux de fichier, il est préférable d’omettre l’extension dans le nom de stockage.

3 Cliquez sur OK.

Pour importer un fichier dans un flux de fichier,

1 Choisissez Outils|Importer|Fichier.

2 Fournissez un nom de fichier d’entrée et le nom de stockage. Cliquez sur OK.

Pour vérifier l’intégrité du JDataStore ouvert, choisissez Outils|Vérifier le JDataStore ou choisissez le bouton Vérifier le JDataStore.

La totalité du stockage est vérifiée et le résultat est affiché dans la fenêtre Historique du vérificateur. Une fois la fenêtre historique fermée, vous pouvez la réafficher en choisissant Voir|Historique du vérificateur.

Pour davantage d’informations sur l’utilisation de l’explorateur JDataStore, voir le Guide du développeur JDataStore.

InterBase et JBuilderBorland InterBase est une base de données relationnelles conforme aux standards SQL haute performance et interplate-forme. InterBase inclut sa propre version de la base de données employee, employee.gdb, afin que vous utilisiez facilement InterBase au lieu de JDataStore dans les exemples et les tutoriels. Pour plus d’informations sur la configuration de Interbase et de InterClient dans le cadre des tutoriels, voir “Connexion à une base de données en utilisant des pilotes JDBC InterClient”, page 4-13.

Pour davantage d’informations sur InterBase ou pour télécharger une version d’essai gratuite, voir le site web de Borland, à l’adresse http://www.borland.fr/interbase/index.html.

Page 39: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 3-1

C h a p i t r e

3Chapitre3Importation et exportation

des données d’un fichier texteLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Dans JBuilder, un composant TableDataSetpermet de stocker les données importées d’un fichier texte. Une fois les données fournies à l’ensemble de données, 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 données d’un fichier texte, utilisez un composant TextDataFile pour spécifier l’emplacement du fichier texte et les paramètres spécifiques à sa structure. Utilisez un StorageDataSet, par exemple un composant TableDataSet, pour stocker localement les données afin de les consulter et de les modifier. Créez des objets Column afin que le composant TableDataSet connaisse le type de données et le nom de champ pour chaque colonne de données.

Pour définir les colonnes d’un composant TableDataSet, ajoutez des colonnes dans la fenêtre Source, utilisez le concepteur d’interface utilisateur ou chargez un fichier texte disposant d’un fichier SCHEMA (.schema) valide. Cette section décrit les deux premières possibilités. L’importation des données en utilisant un fichier SCHEMA existant est traitée au Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”. Votre fichier texte ne dispose d’un fichier SCHEMA valide que s’il a été préalablement exporté par JBuilder.

Cette section traite les sujets suivants :

• “Ajout de colonnes à un TableDataSet en utilisant l’éditeur”, page 3-2

• “Importation des données formatées d’un fichier texte”, page 3-2

• “Récupération de données d’une source JDBC”, page 3-3

• “Exportation des données”, page 3-3

Page 40: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

3-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d e c o l o n n e s à u n T a b l e D a t a S e t e n u t i l i s a n t l ’ é d i t e u r

Ajout de colonnes à un TableDataSet en utilisant l’éditeurIl est possible d’ajouter des colonnes au TableDataSet de deux manières : visuellement dans le concepteur d’interface utilisateur ou avec du code dans l’éditeur de l’onglet Source. L’ajout de colonnes dans le concepteur d’interface utilisateur est traité au Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”. Si vous avez déjà exporté vers un fichier texte, JBuilder a créé un fichier SCHEMA qui indique les définitions de colonnes quand le fichier texte est ouvert et il n’est pas nécessaire d’ajouter manuellement des colonnes.

Pour ajouter des colonnes en utilisant l’éditeur, définissez de nouveaux objets Column dans la définition de classe de Cadre1.java, de la manière suivante :

1 Sélectionnez Cadre1.java dans le volet contenu, puis sélectionnez l’onglet Source. La définition de classe est affichée dans la fenêtre Source. Ajoutez les lignes de code suivantes :

Column column1 = new Column();Column column2 = new Column();

2 Trouvez la méthode jbInit() dans le code source. Définissez le nom de la colonne et le type des données qui sont stockées dedans, de la manière 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 même fenêtre source et dans la même méthode jbInit(), de la manière suivante :

tableDataSet1.setColumns(new Column[] { column1,column2 } );

4 Compilez l’application pour lier les nouveaux objets Column à l’ensemble de données, puis ajoutez tout composant visuel adéquat.

Importation des données formatées d’un fichier texteLes données d’une colonne d’un fichier texte peuvent être formatées pour Exporter les données de telle manière qu’il n’est pas possible de les importer correctement. Ce problème peut être résolu en spécifiant le modèle à utiliser pour lire les données dans la propriété exportDisplayMask. La propriété exportDisplayMask est utilisée pour importer des données lorsqu’il n’y a pas de fichier SCHEMA associé au fichier texte. S’il existe un fichier SCHEMA, ses paramètres ont la priorité. La syntaxe des modèles est définie à la section “Modèles basés sur des chaînes (masques)” de la Référence de la bibliothèque de composants DataExpress.

Page 41: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 3-3

R é c u p é r a t i o n d e d o n n é e s d ’ u n e s o u r c e J D B C

Les colonnes date et numériques ont des modèles d’affichage et de modification par défaut. Si vous ne définissez pas ces propriétés, des modèles de saisie par défaut sont utilisés. Les modèles par défaut proviennent du fichier java.text.resources.LocaleElements qui correspond aux valeurs locales par défaut des colonnes. Si la localisation de la colonne n’est pas spécifiée, la localisation de l’ensemble de données est utilisée. Si la localisation de l’ensemble de données n’est pas définie, la localisation par défaut du système est utilisée. L’affichage d’un nombre à virgule flottante comprend par défaut trois chiffres après la virgule. Si vous voulez plus de décimales, spécifiez un masque.

Récupération de données d’une source JDBCLe code suivant est un exemple de récupération de données depuis une source de données JDBC vers un TextDataFile. Une fois que les données sont dans un TextDataFile, vous pouvez utiliser un StorageDataSet, par exemple un composant TableDataSet, pour stocker les données en local afin de les visualiser ou de les modifier. Pour plus d’informations sur la façon de le faire, voir Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”.

Database db = new Database();db.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor("jdbc:oracle:thin:@" + datasource, username, password));QueryDataSet qds = new QueryDataSet();qds.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(db, "SELECT * FROM THETABLE", null, true, Load.ALL));TextDataFile tdf = new TextDataFile();tdf.setFileName("THEDATA.TXT");tdf.save(qds);

Ce code produit un fichier de données et le fichier SCHEMA associé.

Vous pouvez utiliser ce type d’accès aux données pour créer une application de sauvegarde et de restauration d’une table de base de données qui fonctionne depuis la ligne de commande. Pour enregistrer cette information dans la source de données JDBC, voir “Enregistrement dans une source de données JDBC des modifications chargées depuis un TextDataFile”, page 3-5.

Exportation des donnéesL’exportation de données, ou l’enregistrement de données dans un fichier texte, enregistre toutes les données de la vue en cours dans un fichier texte, en remplaçant les données existantes. Cette section présente plusieurs manières d’exporter les données. Vous pouvez réexporter des données,

Page 42: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

3-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p o r t a t i o n d e s d o n n é e s

qui ont été importées depuis un fichier texte, dans ce fichier ou dans un autre fichier. Vous pouvez exporter les données d’un QueryDataSet ou d’un ProcedureDataSet dans un fichier texte. Il est également possible de résoudre les données d’un TableDataSet dans une table SQL existante.

L’exportation des données dans un fichier texte est gérée différemment de la résolution dans une table SQL. QueryDataSet et TableDataSet sont des composants StorageDataSet. Quand des données sont fournies à l’ensemble de données, le StorageDataSet surveille les informations d’état des lignes (supprimée, insérée ou modifiée) pour toutes les lignes. Quand les données sont résolues dans une source de données comme un serveur SQL, les informations d’état des lignes sont utilisées pour déterminer comment les lignes sont ajoutées, retirées ou modifiées dans la table SQL. Quand une ligne a été correctement résolue, elle passe à l’état résolue (RowStatus.UPDATE_RESOLVED, RowStatus.DELETE_RESOLVED ou RowStatus.INSERT_RESOLVED). Si le StorageDataSet est une nouvelle fois résolu, les lignes déjà résolues ne sont pas prises en compte, sauf si des modifications leur ont été apportées depuis la précédente résolution. Quand des données sont exportées dans un fichier texte, toutes les données de la vue en cours sont écrites dans un fichier texte et les informations d’état des lignes ne sont pas modifiées.

L’exportation des données dans un fichier texte prend en compte les critères de tri et de filtre en cours. Si un critère de tri est spécifié, les données sont enregistrées dans le fichier texte dans l’ordre spécifié par le critère de tri. Si l’ordre des lignes est important, retirez le critère de tri avant d’exporter les données. Si un critère de filtre est spécifié, seules les données vérifiant le critère de filtre sont enregistrées. Cela est utile pour enregistrer des sous-ensembles de données dans des fichiers distincts, mais cela peut provoquer une perte de données si un fichier filtré remplace malencontreusement un fichier de données existant.

Avertissement Retirez les critères de filtre avant d’enregistrer si vous voulez réenregistrer toutes les données dans le fichier d’origine.

Exportation des données d’un QueryDataSet dans un fichier texte

L’exportation des données d’un QueryDataSet dans un fichier texte est identique à l’exportation des données d’un composant TableDataSet, comme indiqué au Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”. JBuilder crée un fichier SCHEMA qui définit chaque colonne, son nom et son type de données afin que le fichier puisse être réimporté plus facilement dans JBuilder.

Remarque Les colonnes BLOB ne sont pas exportées, elles sont ignorées lorsque d’autres champs sont exportés.

Page 43: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 3-5

E x p o r t a t i o n d e s d o n n é e s

Enregistrement des modifications d’un TableDataSet dans une table SQL

Utilisez un objet QueryResolver pour résoudre les modifications dans une table SQL. Pour davantage d’informations sur l’utilisation de QueryResolver pour enregistrer des modifications dans une table SQL, voir “Personnalisation de la logique de résolution par défaut”, page 8-17.

Avant de résoudre les modifications dans une table SQL, définissez le nom de la table et les noms des colonnes de la table SQL, comme l’indique l’extrait de code suivant. La table SQL et le fichier SCHEMA doivent déjà exister. Le fichier SCHEMA applicable au TableDataSet doit correspondre à la structure de la table SQL. Les types de données variant des colonnes de TableDataSet doivent correspondre aux types JDBC de la table du serveur. Par défaut, toutes les lignes ont l’état INSERT.

tabledataset1.setTableName(string);tableDataSet1.SetRowID(columnName);

Enregistrement dans une source de données JDBC des modifications chargées depuis un TextDataFile

Par défaut, les données sont chargées à partir d’un TextDataFile avec le statut deRowStatus.Loaded. L’appel de la méthode saveChanges() d’un QueryDataSet ou d’un ProcedureDataSet n’enregistrera pas les modifications faites dans un TextDataFile car ces lignes ne sont pas encore considérées comme insérées. Pour permettre aux modifications d’être enregistrées et pour que toutes les lignes chargées depuis TextDataFile aient le status INSERTED, définissez la propriété TextDataFile.setLoadAsInserted(true). Désormais, quand la méthode saveChanges() d’un QueryDataSet ou d’un ProcedureDataSet sera appelée, les données seront enregistrées par retour dans la source de données.

Pour davantage d’informations sur l’utilisation de QueryResolver pour enregistrer des modifications dans une table SQL, voir “Personnalisation de la logique de résolution par défaut”, page 8-17.

Page 44: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

3-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 45: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-1

C h a p i t r e

4Chapitre4Connexion à une base

de donnéesLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Pour vous servir des tutoriels portant sur les bases de données décrits dans cette documentation, vous devez installer le pilote JDBC JDataStore. Le pilote JDBC InterClient peut également être utilisé. Cette section présente la configuration de JDataStore et d’InterClient dans le cadre des tutoriels.

Sun a travaillé en association avec des fournisseurs de bases de données et d’outils de bases de données pour créer une API indépendante du gestionnaire de bases de données. Comme ODBC (l’équivalent Microsoft du JDBC), JDBC est basé sur la norme X/Open SQL CLI (Call Level Interface). Il y a certaines différences entre JDBC et ODBC :

• JDBC est une API entièrement Java qui est réellement multiplate-forme. ODBC est une interface en langage C qui doit être implémentée de manière native. La plupart des implémentations ne fonctionnent que sur des plates-formes Microsoft.

• La plupart des pilotes ODBC nécessitent l’installation d’un ensemble complexe de modules et de paramètres de registre sur la station de travail client. JDBC est une implémentation entièrement en Java qui peut s’exécuter directement en local ou depuis un serveur distant centralisé. JDBC permet une maintenance et un déploiement plus simple que ODBC.

JDBC est reconnu par les principaux fournisseurs de bases de données, de connectivité et d’outils, dont Oracle, Sybase, Informix, InterBase, DB2. Plusieurs sociétés, dont Borland, ont des pilotes JDBC. Il est possible d’utiliser des pilotes ODBC existants grâce au lien JDBC-ODBC fourni par Sun. L’utilisation de ce lien JDBC-ODBC n’est cependant pas une solution idéale car elle nécessite l’installation de pilotes ODBC et d’entrées de

Page 46: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o n n e x i o n a u x b a s e s d e d o n n é e s

registre. Les pilotes ODBC sont également implémentés de manière native ce qui compromet la gestion multiplate-forme et la sécurité des applets.

Les composants DataExpress de JBuilder sont implémentés en utilisant l’API de connexion de base de données Sun (JDBC). Pour créer une application de données Java, le paquet JDBC sql de Sun doit être accessible. Si la connexion avec le serveur de base de données se fait via un pilote ODBC, le logiciel de lien JDBC-ODBC de Sun est également nécessaire.

Pour davantage d’informations sur JDBC ou le lien JDBC-ODBC, visitez la page JDBC Database Access API à l’adresse http://java.sun.com/products/jdbc/.

Connexion aux bases de donnéesVous pouvez connecter les applications JBuilder à des tables SQL locales ou distantes, ou aux bases de données créées par d’autres applications Borland comme C++ Builder ou Delphi.

Pour se connecter à une base de données distante SQL, vous pouvez utiliser l’une ou l’autre des solutions suivantes :

• Un pilote JDBC pour le serveur. Certaines versions de JBuilder proposent des pilotes JDBC. L’un de ces pilotes est InterClient. Consultez le site web Borland, à l’adresse http://www.borland.fr/jbuilder/, pour des informations sur la disponibilité des pilotes JDBC dans votre version de JBuilder ou contactez le support technique de l’éditeur de votre logiciel serveur pour savoir s’il existe des pilotes JDBC.

• Un pilote ODBC pour votre serveur utilisé avec le logiciel de lien JDBC-ODBC.

Remarque Le pilote ODBC se trouve dans une DLL non portable. Cela peut convenir pour un développement local, mais ne convient pas pour des applets ou des solutions entièrement Java.

Lors de la connexion à une base de données locale non SQL, comme celles de Paradox ou de Visual dBASE, utilisez un pilote ODBC approprié au type de table et au niveau d’accès en conjonction avec le logiciel de lien JDBC-ODBC.

Remarque Quand vous n’avez plus besoin d’une connexion à une base de données, appelez explicitement, dans l’application, la méthode Database.closeConnection(). Ainsi, la connexion JDBC n’est pas laissée ouverte lorsque cela n’est pas nécessaire et le recyclage de l’instance de cette connexion JDBC devient possible.

Page 47: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-3

C o n n e x i o n a u x b a s e s d e d o n n é e s

Ajout d’un composant Database à votre application

Le composant Database est un composant spécifique JDBC qui gère une connexion JDBC. Pour accéder aux données avec un composant QueryDataSet ou un composant ProcedureDataSet, vous devez définir la propriété database du composant par un composant Database instancié. Plusieurs ensembles de données peuvent utiliser, et utilisent fréquemment, la même base de données.

Dans une application de base de données réelle, vous placeriez vraisemblablement le composant Database dans un module de données. Car cela permet à toutes les applications qui accèdent à la base de données d’avoir une connexion commune. Pour en savoir plus sur les modules de données, voir Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”.

Pour ajouter un composant Database à une application,

1 Créez un nouveau projet et les fichiers de l’application en utilisant l’expert Application. Vous pouvez également suivre ces instructions pour ajouter la connexion de données à un projet et une application existant déjà. Pour créer un nouveau projet et les fichiers de l’application :

a Choisissez Fichier|Fermer dans le menu JBuilder afin de fermer les applications ouvertes.

Si vous n’effectuez pas cette étape avant la suivante, les fichiers de la nouvelle application sont ajoutés au projet existant.

b Choisissez Fichier|Nouveau et double-cliquez sur l’icône Application pour lancer l’expert application.

Acceptez ou modifiez les valeurs par défaut pour les adapter à vos besoins.

2 Ouvrez le concepteur d’interface utilisateur en sélectionnant le fichier cadre (par exemple, Cadre1.java) dans le volet contenu, puis en sélectionnant l’onglet Conception en bas de l’AppBrowser.

3 Sélectionnez l’onglet DataExpress de la palette de composants et cliquez sur le composant Database (base de données).

4 Cliquez dans la fenêtre du concepteur pour ajouter le composant Database à l’application.

Ceci ajoute la ligne de code suivante dans la classe Cadre :

Database database1 = new Database();

Page 48: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o n n e x i o n a u x b a s e s d e d o n n é e s

Le composant Database apparaît dans le volet contenu, en présentant l’aspect suivant :

Figure 4.1 Composant base de données affiché dans le volet contenu

Définition des propriétés de connexion du composant Database

La propriété connection du composant Database spécifie le pilote JDBC, l’URL de connexion, le nom d’utilisateur et le mot de passe. L’URL de la connexion JDBC est le moyen utilisé par le JDBC pour spécifier l’emplacement d’un fournisseur de données JDBC (par exemple, le serveur SQL). Il contient en fait toutes les informations nécessaires pour effectuer une connexion y compris le nom d’utilisateur et le mot de passe.

Il est possible d’accéder à l’objet ConnectionDescriptor par programme, ou de définir les propriétés de connexion via l’inspecteur. Si vous accédez par programme à l’objet ConnectionDescriptor, respectez la procédure suivante :

• Si vous définissez promptPassword par true, vous devez également appeler openConnection() pour votre base de données. openConnection() détermine le moment où le dialogue du mot de passe s’affiche et le moment où la connexion à la base s’exécute.

• Obtenez le nom d’utilisateur et le mot de passe dès que s’ouvre l’application. Pour cela, appelez openConnection() à la fin de la méthode jbInit() du cadre principal.

Si vous n’ouvrez pas la connexion de manière explicite, l’ouverture sera tentée la première fois qu’un composant ou un ensemble de données aura besoin de données.

Page 49: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-5

C o n n e x i o n a u x b a s e s d e d o n n é e s

Les étapes suivantes décrivent la manière de procéder pour définir via le concepteur d’interface utilisateur les propriétés de connexion à la base de données JDataStore exemple, Employee.

Remarque Pour utiliser la base de données exemple, vous devez vous assurer que votre système est configuré pour JDataStore. Si ce n’est déjà fait, voir “Configuration de JDataStore”, page 4-7.

1 Sélectionnez database1 dans l’arborescence des composants.

2 Sélectionnez la valeur de la propriété connection dans l’inspecteur et cliquez sur les points de suspension (...) pour ouvrir l’éditeur de la propriété Connection.

3 Définissez les propriétés suivantes :

Propriété Description

Driver Le nom de la classe du pilote JDBC correspondant à l’URL ; pour cet exemple, sélectionnez dans la liste com.borland.datastore.jdbc.DataStoreDriver.

URL L’URL (Universal Resource Locator) de la base de données, pour cet exemple. La valeur par défaut est jdbc:borland:dslocal:directoryAndFile.jds. Cliquez sur le bouton Parcourir pour sélectionner la base de données JDataStore locale, qui se trouve dans /<jbuilder>/samples/JDataStore/datastores/employee.jds. Utilisez le bouton Parcourir pour sélectionner ce fichier afin d’éviter les erreurs de frappe. Une fois sélectionné, l’URL a l’aspect suivant :Unix :jdbc:borland:dslocal:/usr/local/<jbuilder>/samples/JDataStore/datastores/employee.jds

Windows :jdbc:borland:dslocal:C:\jbuilder\samples\JDataStore\datastores\employee.jds

Username Le nom d’utilisateur autorisé à accéder au serveur de bases de données. Pour les tutoriels exemple, n’importe quel nom fonctionne.

Password Le mot de passe de l’utilisateur autorisé. Pour les tutoriels, aucun mot de passe n’est requis.

Demander le mot de passe

Précise s’il faut demander à l’utilisateur un mot de passe à l’ouverture de la connexion à la base de données.

Page 50: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o n n e x i o n a u x b a s e s d e d o n n é e s

Le dialogue se présente ainsi :

Figure 4.2 Boîte de dialogue du descripteur de connexion

4 Cliquez sur le bouton Tester la connexion pour vérifier que les propriétés de connexion ont été correctement définies.

Les résultats de l’essai de connexion sont affichés à côté du bouton Tester la connexion.

Si JDataStore a été installé avec JBuilder, vous devrez fournir vos numéro de série et mot de passe à sa première utilisation. Si vous ne disposez pas de ces informations à ce moment-là, vous pourrez les saisir ultérieurement en choisissant Outils|Explorateur JDataStore, puis en choisissant Gestionnaire de licence dans le menu Fichier.

Si vous ne parvenez pas à vous connecter à la base de données exemple, veillez à configurer votre ordinateur pour qu’il utilise la base de données JDataStore exemple. Voir “Configuration de JDataStore”, page 4-7, pour plus d’informations.

5 Une fois la connexion réussie, cliquez sur OK pour sortir de la boîte de dialogue et écrire les propriétés de connexion dans le code source.

Si vous avez suivi l’exemple, le code source doit avoir l’aspect suivant :

database1.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor( "jdbc:borland:dslocal: <jbuilder>/samples/JDataStore/datastores/employee.jds", , , false, "com.borland.datastore.jdbc.DataStoreDriver"));

6 Sélectionnez un composant DBDisposeMonitor dans l’onglet dbSwing supplémentaires et cliquez sur le volet Contenu pour l’ajouter à l’application.

Le DBDisposeMonitor fermera le JDataStore lorsque la fenêtre sera fermée.

Page 51: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-7

C o n f i g u r a t i o n d e J D a t a S t o r e

7 Définissez la propriété dataAwareComponentContainer du DBDisposeMonitor sur this.

Astuce Lorsqu’une connexion à une URL de base de données réussit, vous pouvez utiliser le pilote de base de données pour examiner les méta-informations JDBC de la base de données ou ses objets schéma dans le JDataStore, comme vous pouvez exécuter des instructions SQL pour examiner et modifier les données des tables existantes.

Configuration de JDataStorePour afficher et explorer le contenu du JDataStore, utilisez l’Explorateur JDataStore. Pour démarrer l’Explorateur JDataStore, sélectionnez Outils|Explorateur DataStore. Pour ouvrir le JDataStore exemple, naviguez jusqu’à <jbuilder>/samples/JDataStore/datastores/employee.jds.

Pour plus d’informations sur l’explorateur JDataStore, voir le Guide du développeur JDataStore.

Configuration d’InterBase et InterClientInterBase est un logiciel de gestion de bases de données relationnelles compatible SQL qui est facile à utiliser. InterBase est indépendant du client et des outils ; il supporte la majorité des clients bureautiques et des environnements de construction d’applications.

InterClient est un pilote JDBC entièrement Java JDBC pour les bases de données InterBase. InterClient contient une bibliothèque de classes Java qui implémentent la majorité de l’API JDBC et une partie de ses extensions. Elle agit avec le gestionnaire de pilotes JDBC pour permettre aux applications et aux applets Java côté client d’interagir avec les bases de données InterBase.

InterClient inclut un pilote côté serveur, appelé InterServer. Ce middleware côté serveur fait fonction d’interprète entre les clients InterClient et le serveur de bases de données InterBase. Il comprend les classes de développement d’applications Java un kit de déploiement pour serveur web.

Les développeurs peuvent déployer leurs clients InterClient de deux façons :

• Les applets Java sont des programmes Java inclus dans une page HTML avec la balise <APPLET>. Ils sont servis par un serveur web, visualisés et utilisés sur un système client dans un navigateur web compatible Java. Cette méthode de déploiement ne nécessite pas d’installation manuelle du paquet InterClient sur le système client. En revanche, elle

Page 52: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o n f i g u r a t i o n d ’ I n t e r B a s e e t I n t e r C l i e n t

nécessite la présence d’un navigateur web compatible Java sur le système client.

• Les applications Java sont des programmes Java autonomes exécutés sur un système client. Cette méthode de déploiement requiert l’installation du paquet InterClient et du JRE (Java Runtime Environment) sur le système client. Le JRE inclut le gestionnaire de pilotes JDBC.

Comme API entièrement Java pour InterBase, InterClient permet le développement client/serveur indépendamment de la plate-forme pour l’Internet ou les intranets d’entreprises. Un pilote entièrement Java présente par rapport à un pilote en code natif l’avantage de pouvoir déployer une applet InterClient sans charger de pilote JDBC spécifique à la plate-forme sur chaque système client (les serveurs web envoient automatiquement les classes InterClient avec les applets). De plus, il n’est pas nécessaire de gérer des bibliothèques de bases de données natives ce qui simplifie l’administration et la maintenance des applications. Comme partie d’une applet Java, InterClient peut être actualisé dynamiquement ce qui diminue encore le coût du déploiement et de la maintenance d’une application.

Utilisation d’InterBase et d’InterClient avec JBuilder

Pour utiliser InterBase et InterClient avec JBuilder, installez InterBase et InterClient en suivant les instructions fournies par la documentation InterBase, puis démarrez InterBase Server et ensuite InterServer d’InterClient.

Si vous ne parvenez pas à vous connecter, vérifiez que la base de données InterBase et qu’InterServer s’exécutent tous les deux. InterServer et la base de données peuvent s’exécuter sur la même machine que votre application, ou sur une machine différente. En conséquence, il y a de nombreuses configurations possibles. Il est important que votre version InterClient soit compatible avec la version de votre base de donnée et de votre JDK. Pour davantage d’informations sur ces sujets, veuillez vous reporter à la documentation InterBase et InterClient.

Si InterBase Server et InterServer sont sur une plate-forme différente de celle de JBuilder, vous devez :

• Vérifiez qu’InterBase et InterServer s’exécutent sur le serveur.

• Vérifiez qu’InterClient est installé sur le client.

• Vérifiez que, sur le client, l’URL du Connection Descriptor contient l’adresse IP du serveur exécutant InterBase et InterServer.

Une fois InterClient installé, ajoutez-le à JBuilder en utilisant Outils|Configuration Entreprise, puis ajoutez-le à la liste des bibliothèques nécessaires de votre projet dans Projet|Propriétés. Pour plus d’informations, voir “Ajout d’un pilote JDBC à JBuilder”, page 4-10.

Page 53: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-9

C o n f i g u r a t i o n d ’ I n t e r B a s e e t I n t e r C l i e n t

Astuces pour l’utilisation des tables InterBase exemple

Pour de meilleurs résultats, veuillez noter les astuces suivantes concernant le travail avec les tables exemple :

• Faites une copie de sauvegarde de la base de données exemple.

Les bases de données exemple sont installées par le programme de configuration. Vous pouvez faire une copie du fichier de la base de données, employee.jds, afin de restaurer le fichier à son état initial après vos essais de programmation des bases de données.

• Ne transgressez pas les contraintes de la base de données.

Les bases de données exemple mettent en œuvre de nombreuses contraintes sur les valeurs des données, comme c’est le cas dans une application réelle. Ces contraintes interviennent dans tous les exemples où vous ajoutez, insérez ou modifiez les données de la table employee et essayez d’enregistrer les modifications dans la table du serveur.

• La table EMPLOYEE est fréquemment utilisée dans les exemples de ce manuel. Les contraintes suivantes s’appliquent à la table employee :

• Tous les champs sont obligatoires (il faut saisir des données) sauf PHONE_EXT.

• EMP_NO est généré, il n’est donc pas nécessaire de le saisir pour les nouveaux enregistrements. C’est également la clé primaire, il ne faut donc pas le modifier.

• Intégrité référentielle.

• DEPT_NO doit exister dans la table Department.

• JOB_CODE, JOB_GRADE, JOB_COUNTRY doivent exister dans la table JOB.

• SALARY doit être supérieur 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 généré par la requête, il n’est donc pas nécessaire de le saisir.

• La table CUSTOMER est également utilisée dans les tutoriels de bases de données. CUST_NO est généré, 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.

Page 54: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d ’ u n p i l o t e J D B C à J B u i l d e r

Pour voir les métadonnées des tables exemple,

1 Choisissez Outils|Pilote de base de données.

Le pilote de base de données est utilisé pour les tâches d’administration de base de données.

2 Double-cliquez sur l’URL de la base de données pour ouvrir une connexion à la base.

3 Développez le nœud Tables pour voir les informations relatives à chacune des tables exemple.

Ajout d’un pilote JDBC à JBuilderAprès avoir installé votre pilote JDBC en suivant les instructions du constructeur, utilisez les étapes ci-dessous pour le configurer afin de l’utiliser avec JBuilder.

Remarque Les pilotes désinstallés sont présentés en rouge dans la liste Pilotes de la boîte de dialogue Propriétés de la connexion et ne peuvent pas être sélectionnés pour être utilisés dans JBuilder. Vous devez les installer en suivant les instructions du fabricant avant de les configurer dans JBuilder.

Création des fichiers .library et .config

L’ajout d’un pilote de base de données à JBuilder se fait en trois étapes :

• Création d’un fichier bibliothèque contenant les classes du pilote, généralement un fichier JAR, et tout autre fichier auxiliaire, comme la documentation et le source.

• Dérivation d’un fichier .config à partir du fichier bibliothèque que JBuilder ajoute au démarrage à son chemin des classes.

• Ajout d’une nouvelle bibliothèque à votre projet, ou au projet par défaut si vous voulez la rendre disponible à tous les nouveaux projets.

Les deux premières étapes s’effectuent dans une boîte de dialogue :

1 Ouvrez JBuilder et choisissez Outils|Configuration Entreprise.

2 Cliquez sur l’onglet Pilotes base de données dans la boîte de dialogue Configuration Entreprise.

L’onglet Pilotes base de données affiche les fichiers .config de tous les pilotes des bases de données alors définis.

3 Cliquez sur Ajouter pour ajouter un nouveau pilote, puis sur Nouveau pour créer un nouveau fichier de bibliothèque pour le pilote. Le fichier

Page 55: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-11

A j o u t d ’ u n p i l o t e J D B C à J B u i l d e r

bibliothèque est utilisé pour ajouter le pilote à la liste des bibliothèques nécessaires aux projets.

Remarque Vous pourriez aussi créer une nouvelle bibliothèque en utilisant Outils|Configurer les bibliothèques, mais, comme vous devez ensuite utiliser Configuration Entreprise pour dériver le fichier .config, il est plus simple de tout faire au même endroit.

4 Tapez le nom et sélectionnez l’emplacement du nouveau fichier dans la boîte de dialogue Création d’une nouvelle bibliothèque.

5 Cliquez sur Ajouter et naviguez jusqu’à l’emplacement du pilote. Vous pouvez sélectionner le répertoire contenant le pilote et tous ses fichiers associés ou sélectionner seulement le fichier archive du pilote. Les deux fonctionnent. JBuilder extraira les informations dont il a besoin.

6 Cliquez sur OK pour fermer le navigateur de fichiers. La nouvelle bibliothèque s’affiche en bas de la liste des bibliothèques, sélectionnée.

7 Cliquez sur OK. JBuilder crée un nouveau fichier .library dans le répertoire /lib de JBuilder, en utilisant le nom que vous avez indiqué (par exemple, InterClient.library). Il vous ramène à la page Pilotes base de données qui affiche le nom du fichier .config correspondant, dérivé du fichier bibliothèque (par exemple, InterClient.config).

8 Sélectionnez le nouveau fichier .config dans la liste des pilotes de base de données, et cliquez sur OK. Le fichier .config est placé dans le répertoire /lib/ext de JBuilder.

9 Fermez JBuilder et relancez-le pour que les modifications apportées aux pilotes de bases de données 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 après la génération du fichier .config, vous devrez régénérer le fichier .config à l’aide de Configuration Entreprise, puis redémarrer JBuilder.

Ajout du pilote JDBC aux projets

Un projet exécuté dans JBuilder utilise uniquement le chemin des classes défini pour ce projet. Donc, pour être certain que le pilote JDBC soit disponible pour tous les nouveaux projets qui en auront besoin, définissez la bibliothèque et ajoutez-la à votre liste par défaut des bibliothèques nécessaires. Cela se fait dans JBuilder en utilisant les étapes suivantes :

1 Démarrez JBuilder et fermez tous les projets ouverts.

2 Choisissez Projet|Propriétés du projet par défaut.

3 Sélectionnez l’onglet Bibliothèques nécessaires sur la page Chemins et cliquez sur Ajouter.

Page 56: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d ’ u n p i l o t e J D B C à J B u i l d e r

4 Sélectionnez le nouveau pilote JDBC dans la liste des bibliothèques et cliquez sur OK.

5 Cliquez sur OK pour fermer la boîte de dialogue Propriétés du projet par défaut.

Remarque Vous pouvez aussi ajouter le pilote JDBC à un projet existant. Il suffit d’ouvrir le projet, de choisir Projet|Propriétés et d’utiliser la méthode précédente.

Maintenant, JBuilder et le nouveau pilote JDBC sont configurés pour fonctionner ensemble. L’étape suivante consiste à créer ou à ouvrir un projet utilisant ce pilote, à lui ajouter un composant Database et à définir sa propriété connection afin qu’il puisse utiliser ce pilote pour accéder aux données. Pour un exemple sur la façon de le faire, voir “Connexion à une base de données en utilisant des pilotes JDBC InterClient”, page 4-13.

Le composant Database gère la connexion JDBC avec un serveur SQL. Il est nécessaire à toute application de base de données utilisant les données d’un serveur. JDBC, l’API d’application de base de données Sun, est une bibliothèque de composants et de classes développée par Sun pour accéder à des sources de données distantes. Les composants sont rassemblés dans le paquet java.sql et représentent un cadre générique d’accès de bas niveau aux bases de données SQL.

L’API JDBC définit des classes Java représentant les connexions de bases de données, les instructions SQL, les ensembles de résultats, les métadonnées de bases de données, etc. Elle permet au programmeur Java de produire des instructions SQL et de traiter les résultats. JDBC est l’API principale d’accès aux bases de données en Java. L’API JDBC est implémentée via un gestionnaire de pilotes qui peut gérer plusieurs pilotes se connectant à différentes bases de données. Pour davantage d’informations sur JDBC, visitez le site de Sun consacré à l’API d’accès aux bases de données JDBC, à l’adresse http://java.sun.com/products/jdbc/.

JBuilder utilise l’API JDBC pour accéder aux informations stockées dans les bases de données. La plupart des composants et classes d’accès aux données de JBuilder utilisent l’API JDBC. Ces classes doivent donc être correctement installées pour utiliser les composants de connexion aux bases de données JBuilder. De plus, pour connecter votre application de base de données à un serveur distant, un pilote JDBC approprié est nécessaire. Les pilotes peuvent être regroupés en deux catégories : les pilotes implémentés en utilisant des méthodes natives qui font le lien entre les bibliothèques d’accès existantes et les pilotes entièrement Java. Les pilotes qui ne sont pas entièrement réalisés en Java doivent s’exécuter sur le système client (local). Les pilotes entièrement Java peuvent être chargés sur le serveur ou localement. Un pilote entièrement écrit en Java présente l’avantage de pouvoir être téléchargé comme partie d’une applet et, de plus, il est indépendant de la plate-forme.

Page 57: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-13

C o n n e x i o n à u n e b a s e d e d o n n é e s e n u t i l i s a n t d e s p i l o t e s J D B C I n t e r C l i e n t

Certaines versions de JBuilder proposent des pilotes JDBC. Consultez le site web Borland, à l’adresse http://www.borland.fr/jbuilder/, pour des informations sur la disponibilité des pilotes JDBC dans les différentes versions de JBuilder ou contactez le support technique de l’éditeur de votre logiciel serveur pour savoir s’il existe des pilotes JDBC. Certaines versions de JBuilder proposent les options de pilote suivantes :

• DataStoreDriver

DataStoreDriver est le pilote JDBC de la base de données JDataStore. Le pilote gère l’accès local et distant. Les deux types d’accès demandent un nom d’utilisateur.

Remarque Le nom d’utilisateur peut être n’importe quelle chaîne. Si aucun utilisateur n’a été ajouté à la table des utilisateurs du store, il est inutile d’en fournir un. Cependant, pour un store transactionnel, une chaîne non nulle doit être fournie comme nom d’utilisateur.

Pour savoir comment se connecter à une base de données en utilisant le pilote JDataStore, voir Chapitre 17, “Tutoriel : Création d’une application de base de données élémentaire”.

• InterClient

InterClient est un pilote JDBC qui vous permet de vous connecter à InterBase. InterClient peut être installé en exécutant le programme d’installation InterClient. Une fois installé, InterClient peut accéder aux données exemples InterBase à l’aide du ConnectionDescriptor.

Pour plus d’informations sur la connexion à une base de données en utilisant InterClient, voir “Connexion à une base de données 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 données créées par d’autres applications Borland comme C++ Builder ou Delphi. Pour ce faire, déterminez la base de données à laquelle votre application doit se connecter et connectez-vous à cette base de données en utilisant sa connexion URL.

Connexion à une base de données en utilisant des pilotes JDBC InterClient

Cette section décrit l’ajout d’un composant Database, qui est un composant spécifique à JDBC gérant une connexion JDBC. Elle décrit également la définition des propriétés de ce composant qui vous permettent d’accéder aux données InterBase exemple.

Dans une application de base de données réelle, vous placeriez vraisemblablement le composant Database dans un module de données. Car cela permet à toutes les applications qui accèdent à la base de données

Page 58: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o n n e x i o n à u n e b a s e d e d o n n é e s e n u t i l i s a n t d e s p i l o t e s J D B C I n t e r C l i e n t

d’avoir une connexion commune. Pour en savoir plus sur les modules de données, voir Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”.

Pour ajouter le composant Database à votre application et vous connecter aux fichiers InterBase exemple,

1 Veillez à suivre les étapes de “Configuration d’InterBase et InterClient”, page 4-7, et de “Ajout d’un pilote JDBC à JBuilder”, page 4-10, afin que votre système soit en mesure d’accéder aux fichiers InterBase exemple.

2 Assurez-vous que InterServer est en cours d’exécution (il doit l’être).

3 Fermez tous les projets et créez une nouvelle application, ou ajoutez la connectivité à un projet et à une application existants.

Vous pouvez créer les fichiers d’un nouveau projet et d’une nouvelle application en sélectionnant Fichier|Nouveau et en double-cliquant sur l’icône Application. Acceptez toutes les valeurs par défaut. JBuilder crée les fichiers nécessaires et les affiche dans le volet projet de l’AppBrowser. Le fichier Cadre1.java s’ouvre dans le volet contenu. Cadre1.java contiendra les composants de l’interface utilisateur de l’application.

4 Cliquez sur l’onglet Conception, en bas du volet contenu, Cadre1.java étant sélectionné.

5 Sélectionnez l’onglet DataExpress de la palette de composants et cliquez sur le composant Database.

6 Cliquez à un endroit quelconque du volet contenu, ou concepteur d’interface utilisateur, pour ajouter le composant Database à votre application.

7 Définissez la propriété connection du composant Database pour spécifier le pilote JDBC, l’URL de connexion, le nom d’utilisateur et le mot de passe.

L’URL de connexion JDBC est la façon qu’utilise JDBC pour spécifier l’emplacement d’un fournisseur de données JDBC (ex., un serveur SQL). Elle peut contenir absolument toutes les informations nécessaires à l’établissement de la connexion, y compris le nom d’utilisateur et le mot de passe.

Pour définir la propriété connection,

a Assurez-vous que l’objet Database est sélectionné dans le volet contenu.

Double-cliquez sur la propriété connection dans l’inspecteur, pour ouvrir l’éditeur de propriété connection. Dans cet exemple, les données résident sur un serveur InterBase local. Si les vôtres résident

Page 59: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-15

C o n n e x i o n à u n e b a s e d e d o n n é e s e n u t i l i s a n t d e s p i l o t e s J D B C I n t e r C l i e n t

sur un serveur distant, tapez l’adresse IP du serveur au lieu de “localhost” comme ici.

b Définissez les propriétés suivantes :

La boîte de dialogue se présente ainsi :

Figure 4.3 Boîte de dialogue décrivant la connexion

c Cliquez sur le bouton Tester la connexion pour vérifier que les propriétés de connexion ont été correctement définies.

Le résultat de la tentative de connexion est affiché à côté du bouton Tester la connexion. Voir “Messages d’erreur de connexion courants”, page 4-23, pour connaître les solutions à certains problèmes de connexion courants.

d Une fois la connexion réussie, cliquez sur OK pour sortir de la boîte de dialogue et écrire les propriétés de connexion dans le code source.

Propriété Valeur

Driver interbase.interclient.Driver

URL Naviguez jusqu’au fichier exemple InterBase, employee.gdb, situé dans votre répertoire InterBase/examples. L’entrée du champ URL doit ressembler à : UNIX :jdbc:interbase://nom_hôte//usr/interbase/examples/employee.gdb

Windows :jdbc:interbase://localhost/D:\InterBaseCorp\InterBase\examples\database\employee.gdb

Username SYSDBA

Password masterkey

Page 60: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d u c o m p o s a n t D a t a b a s e d a n s v o t r e a p p l i c a t i o n

Astuce Lorsqu’une connexion à une URL de base de données réussit, vous pouvez utiliser le pilote de base de données pour parcourir les méta-informations JDBC de la base de données ou ses objets schéma, comme vous pouvez exécuter des instructions SQL pour parcourir et modifier les données des tables existantes.

Utilisation du composant Database dans votre applicationLe composant Database figurant désormais dans votre application, vous pouvez ajouter un autre composant DataExpress qui extrait des données de la source de données à laquelle vous êtes connecté. JBuilder utilise des requêtes et des procédures stockées pour renvoyer un ensemble de données. Les composants implémentés à cet effet sont QueryDataSet et ProcedureDataSet. Ces composants fonctionnent avec le composant Database pour accéder à la base de données du serveur SQL. Pour connaître la façon d’utiliser ces composants, voir les sections suivantes :

• “Interrogation d’une base de données”, page 5-2

• “Utilisation de requêtes paramétrées pour obtenir des données d’une base de données”, page 5-13

• Chapitre 6, “Utilisation des procédures stockées”

La plupart des tutoriels et des applications exemples utilisent une connexion Database au JDataStore EMPLOYEE exemple, comme décrit ici. Certains des tutoriels et applications exemple, particulièrement ceux utilisant des procédures stockées pour extraire ou enregistrer des données, utilisent une connexion à la base de données InterBase employee via le pilote JDBC InterClient.

Pour la plupart des applications de bases de données, vous encapsulerez probablement le Database et d’autres composants DataExpress dans un module de données plutôt que de les ajouter directement dans le cadre d’une application. Pour davantage d’informations sur l’utilisation du module de données du paquet DataExpress, voir Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”.

Sollicitation d’un nom d’utilisateur et d’un mot de passeLors du développement d’une application de base de données, il est pratique d’inclure un nom d’utilisateur et un mot de passe dans le ConnectionDescriptor afin qu’il ne soit pas nécessaire de préciser ces informations à chaque utilisation du concepteur ou à chaque exécution de l’application. Si vous définissez le ConnectionDescriptor via le concepteur, le concepteur écrit le code à votre place. Avant de déployer votre application, vous pouvez retirer du code le nom d’utilisateur et le mot de

Page 61: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-17

M i s e e n p o o l d e s c o n n e x i o n s J D B C

passe et demander à l’utilisateur de préciser ces informations lors de l’exécution, en particulier si vous distribuez le code source ou si les utilisateurs ont des droits d’accès différents. Vous disposez de plusieurs options pour inviter un utilisateur à préciser ses nom d’utilisateur et mot de passe à l’exécution.

• Activez la case à cocher Demander le mot de passe de l’utilisateur dans l’éditeur de la propriété connection de Database, ou écrivez du code pour affecter la valeur true au paramètre promptPassword de ConnectionDescriptor.

A l’exécution et lorsque des données dynamiques doivent s’afficher dans le concepteur, une boîte de dialogue de saisie du nom d’utilisateur et du mot de passe s’affichera. Un nom d’utilisateur et un mot de passe corrects doivent être saisis pour que les données s’affichent.

• Ajoutez une instance du composant dbSwing DBPasswordPrompter à votre application.

Cette option vous offre une meilleure emprise sur la gestion du nom d’utilisateur et du mot de passe. Vous pouvez spécifier les informations requises (uniquement le nom d’utilisateur, uniquement le mot de passe, ou les deux), le nombre de tentatives accordées à l’utilisateur pour saisir les informations, et d’autres propriétés. Le bouton OK demeure désactivé tant que les informations nécessaires ne sont pas fournies. La boîte de dialogue s’affiche lorsque vous appelez sa méthode showDialog(). Cela vous permet de déterminer le moment auquel elle s’affiche. Veillez à la présenter tôt dans votre application, avant que tout composant visuel ne tente d’ouvrir votre base de données et d’afficher des données. Le concepteur n’appelle pas showDialog(), si bien que vous devez spécifier les informations sur le nom d’utilisateur et le mot de passe dans le ConnectionDescriptor lors de l’activation du concepteur.

Mise en pool des connexions JDBCPour les applications nécessitant de nombreuses connexions aux bases de données, vous pouvez envisager la mise en pool des connexions. La mise en pool des connexions génère des gains de performance significatifs, en particulier lorsqu’un très grand nombre de connexions aux bases de données sont ouvertes et fermées.

JDataStore fournit plusieurs composants pour gérer les sources de données JDBC 2.0 et la mise en pool des connexions. L’utilisation de ces composants nécessite J2EE. Si votre version de JBuilder ne contient pas J2EE.jar, vous devrez le télécharger de chez Sun, et l’ajouter à votre projet en tant que bibliothèque nécessaire. Voir “Ajout d’une bibliothèque

Page 62: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-18 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

M i s e e n p o o l d e s c o n n e x i o n s J D B C

nécessaire à un projet”, page 10-6, pour savoir comment ajouter une bibliothèque nécessaire.

L’idée de mise en pool des connexions est très simple. Dans une application qui ouvre et ferme de nombreuses connexions aux bases de données, il est plus efficace de garder les objets Connection inutilisés dans un pool pour les réutiliser plus tard. Cela économise le temps d’ouverture d’une nouvelle connexion physique à chaque fois.

Voici les principaux composants DataSource et de mise en pool des connexions fournis par JDataStore :

• JDBCDataSource est une implémentation de l’interface javax.sql.DataSource. JDBCDataSource peut créer une connexion à un JDataStore, ou à tout autre pilote JDBC, en fonction de ses propriétés de connexion JDBC, mais il ne met pas en pool les connexions. Comme c’est une implémentation de javax.sql.DataSource, il peut être recensé par un service d’annuaire JNDI. Pour plus d’informations sur les services d’annuaire JNDI, consultez la documentation JDK ou le site http://www.javasoft.com.

• JDBCConnectionPool est aussi une implémentation de javax.sql.DataSource et peut, de ce fait, être recensé par un service d’annuaire JNDI. JDBCConnectionPool peut assurer la mise en pool des connexions avec n’importe quel pilote JDBC. Il crée les connexions en fonction de ses propriétés de connexion JDBC. JDBCConnectionPool possède plusieurs propriétés consacrées à la gestion du pool de connexions, par exemple, les propriétés spécifiant les nombres maximal et minimal de connexions.

Lorsque vous utilisez JdbcConnectionPool, vous devez définir la propriété connectionFactory. Cela permet à JdbcConnectionPool de créer des objets javax.sql.PooledConnection. La définition de la propriété connectionFactory doit faire référence à une implémentation de javax.sql.ConnectionPoolDataSource (comme JdbcConnectionFactory). La propriété connectionFactory peut également être définie avec la propriété dataSourceName. La propriété dataSourceName accepte une String, qui sera recherchée dans le service d’annuaire JNDI pour fournir l’implémentation de javax.sql.ConnectionPoolDataSource.

Pour obtenir une connexion à partir du pool, vous appellerez habituellement JdbcConnectionPool.getConnection(). La connexion renvoyée par cette méthode ne supporte pas les transactions distribuées mais peut fonctionner avec n’importe quel pilote JDBC.

JDBCConnectionPool fournit également le support des transactions distribuées (XA), mais cette fonctionnalité n’est disponible que si JDBCConnectionPool est utilisé en conjonction avec le pilote JDBC JDataStore, et n’est utile que combiné à un gestionnaire de transactions distribuées tel que Borland Enterprise Server. Pour plus d’informations sur le support XA de JDBCConnectionPool’s, voir “Mise en pool des

Page 63: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-19

M i s e e n p o o l d e s c o n n e x i o n s J D B C

connexions et support des transactions distribuées” dans le Guide du développeur JDataStore.

• JdbcConnectionFactory est une implémentation de javax.sql.ConnectionPoolDataSource. Il sert à créer des objets javax.sql.PooledConnection pour l’implémentation d’un pool de connexions, comme JDBCConnectionPool.

JDBCConnectionPool et JDBCConnectionFactory fonctionnent habituellement ensemble, mais chacun peut être utilisé séparément. Le désappariement 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 stratégie différente de JDBCConnectionPool. JDBCConnectionFactory peut être utilisé avec n’importe quelle implémentation JDBC 2.0 du pool de connexions permettant d’implémenter javax.sql.ConnectionPoolDataSource (comme JDBCConnectionFactory) afin de fournir les javax.sql.PooledConnections.

D’autre part, la stratégie de mise en pool utilisée par JDBCConnectionPool peut servir avec une autre implémentation de factory de connexion. JDBCConnectionPool peut être utilisé avec n’importe quel pilote JDBC s’il fournit un composant factory de connexion implémentant javax.sql.ConnectionPoolDataSource.

Maintenant que vous avez une vue générale des classes impliquées dans la mise en pool des connexions, il est temps de vous en dire plus sur leur fonctionnement :

• La méthode JdbcConnectionPool.getConnection() essaie d’éviter la charge associée à l’ouverture d’une nouvelle connexion en utilisant une connexion déjà présente dans le pool. Lorsqu’une connexion est recherchée dans le pool, la recherche aboutit si le nom d’utilisateur est égal au nom d’utilisateur qui a servi à créer la connexion existant dans le pool. Le mot de passe n’est pas pris en compte dans cette recherche de l’utilisateur. Une nouvelle connexion est sollicitée de la factory uniquement si la recherche dans le pool échoue.

• La mise en pool des connexions est une API relativement simple mais très puissante. La majorité du travail difficile, comme le suivi des connexions du pool et la décision d’utiliser une connexion existant dans le pool ou d’en ouvrir une nouvelle, est pris en charge de manière totalement interne.

• Lorsqu’une application utilise la mise en pool des connexions, chaque connexion doit toujours être fermée explicitement lorsqu’elle ne sert plus. Cela lui permet de retourner au pool pour une utilisation ultérieure, ce qui améliore les performances.

• La factory qui créé les connexions pour le pool doit utiliser les mêmes propriétés pour toutes les connexions, à l’exception du nom

Page 64: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-20 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

M i s e e n p o o l d e s c o n n e x i o n s J D B C

d’utilisateur et du mot de passe. Il s’en suit qu’un pool de connexions accède à une seule base de données et que toutes ses connexions partagent les même définitions de propriétés de connexion JDBC (mais peuvent différer sur les noms d’utilisateur/mots de passe).

Optimisation des performances de JConnectionPool

Le mécanisme de recherche d’une connexion du pool utilisant le même nom d’utilisateur est un balayage rapide qui évalue les références aux chaînes nom d’utilisateur. Il faut, si possible, passer la même instance String pour toutes les demandes de connexion. Une façon d’y parvenir est de toujours utiliser pour le pool de connexions un nom de constante spécifiée de la manière suivante :

public static final String POOL_USER = "CUSTOMER_POOL_USER";

Sorties historiques

JdbcConnectionPool et JdbcConnectionFactory possèdent des propriétés PrintWriter. La majorité des sorties historiques prennent la forme suivante :

[<hashcode de l’instance de la classe>]:<nom de la classe>.<nom de la méthode>(...)

Toutes les valeurs hexadécimales affichées entre les crochets droits ([ ]) dans les fichiers historiques sont les valeurs hashCode() pour un Object.

Exemple de mise en pool

Voici un exemple simple d’utilisation de la mise en pool des connexions. Ce fragment de code de module de données présente les principales lignes de code nécessaires à une application utilisant la mise en pool des connexions, indépendamment de ce que l’application veut spécifiquement faire de cette technologie. Pour voir un exemple de mise en pool des connexions moins trivial, reportez-vous à l’exemple Web Bench dans samples/JDataStore/WebBench. Pour plus d’informations sur les modules de données, voir Chapitre 10, “Utilisation des modules de données pour simplifier l’accès aux données”.

import com.borland.dx.dataset.*;import com.borland.dx.sql.dataset.*;import com.borland.javax.sql.*;import java.sql.*;

public class ModuleDeDonnees1 implements DataModule {

private static ModuleDeDonnees1 myDM; private static final String POOL_USER = "POOL_USER";

Page 65: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-21

M i s e e n p o o l d e s c o n n e x i o n s J D B C

private static JdbcConnectionFactory factory; private static JdbcConnectionPool pool;

public ModuleDeDonnees1() { try{ jbInit(); } catch(Exception e){ e.printStackTrace(); } }

private void jbInit() throws Exception { // Instancie la factory de connexion factory = new JdbcConnectionFactory();

// La ligne suivante définit l’URL // d’un fichier JDataStore local. L’URL // spécifique dépendra de l’emplacement // de votre fichier JDataStore. factory.setUrl("jdbc:borland:dslocal:<chemin d’accès><nom du fichier>"); factory.setUser(POOL_USER); factory.setPassword("");

// Instancie le pool de connexions pool = new JdbcConnectionPool(); // Assigne la factory de connexion // comme factory du pool pool.setConnectionFactory(factory);

}

public Connection getConnection() {

Connection con = null;

try{ con = pool.getConnection(); } catch (Exception ex) { ex.printStackTrace(); }

return con; }

public static ModuleDeDonnees1 getDataModule() { if (myDM == null) { myDM = new ModuleDeDonnees1(); } return myDM; }

Page 66: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-22 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

M i s e e n p o o l d e s c o n n e x i o n s J D B C

public static JdbcConnectionPool getPool() { return pool; }

}

Vous écrirez sans doute le code de la logique de l’application dans un fichier source séparé. Le fragment de code suivant montre comment solliciter des connexions auprès du pool et, ensuite, comment être certain que les connexions sont renvoyées au pool. Il montre également comment être certain que le pool est arrêté quand l’application se termine.

public class doSomething {

static ModuleDeDonnees dm = null;

public doSomething() { }

public static void main(String args[]) {

// Plusieurs des méthodes appelées ici // sont susceptibles de déclencher des exceptions, // la gestion de celles-ci est donc nécessaire.

try{ // Instancie le module de données 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{

Page 67: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C o n n e x i o n à u n e b a s e d e d o n n é e s 4-23

E n c a s d e p r o b l è m e l o r s d e s c o n n e x i o n s d e J D a t a S t o r e e t d ’ I n t e r B a s e

// Arrête le pool avant que // l’application ne se ferme. dm.getPool().shutdown(); } catch(Exception ex) { ex.printStackTrace(); } }

}}

En cas de problème lors des connexions de JDataStore et d’InterBase

La connexion à un serveur SQL en utilisant JDBC peut afficher des messages d’erreur générés par JDBC. Pour obtenir de l’aide sur la résolution des problèmes de connexion JDataStore dans les tutoriels,

• Reportez-vous à la section “Débogage d’applications JDataStore” du Guide du développeur de JDataStore.

• Consultez les FAQ JDataStore de Borland à l’adresse http://community.borland.com/article/0,1410,19685,00.html.

• Reportez-vous à la section “Messages d’erreur de connexion courants”, page 4-23, pour connaître les problèmes de connexion à InterBase via InterClient.

Messages d’erreur de connexion courants

Voici certaines des erreurs de connexion courantes et les solutions correspondantes :

• Unable to locate the InterClient driver. InterClient n’a pas été ajouté comme bibliothèque nécessaire au projet. Choisissez Projet|Propriétés, puis ajoutez InterClient en tant que Bibliothèque nécessaire.

• Driver could not be loaded. InterClient n’a pas été ajouté au chemin des classes. Ajoutez le fichier interclient.jar au CLASSPATH du script de démarrage de JBuilder, ou au CLASSPATH de votre environnement avant de lancer JBuilder.

Page 68: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

4-24 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 69: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-1

C h a p i t r e

5Chapitre5Extraction des donnéesd’une source de données

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Ce chapitre est consacré à l’utilisation de l’architecture DataExpress de JBuilder pour extraire des données d’une source de données et fournir des données à une application. Les composants dans les paquets DataExpress encapsulent à la fois la connexion entre l’application et sa source de données, et le comportement requis pour manipuler les données.

Pour créer une application de base de données, vous devez extraire les données stockées dans la source de données et en créer une copie que l’application puisse manipuler localement. Lorsque les données sont trouvées par un processus d’acquisition, elles sont mises en cache dans le DataSet. Toutes les modifications apportées au DataSet caché sont suivies de sorte que les implémentations du processus de résolution connaissent celles qui demandent une insertion, une mise à jour ou une suppression dans la source de données. Dans JBuilder, un sous-ensemble des données de la source de données est extrait dans une sous-classe du StorageDataSet de JBuilder. La sous-classe de StorageDataSet utilisée dépend de la manière d’obtenir les informations.

Selon l’approche acquisition/résolution, seules deux interactions sont requises entre l’application de base de données et la source de données : la connexion initiale pour acquérir les données et la connexion finale pour enregistrer (résoudre) les modifications dans la source de données. La connexion entre le client composant DataSet et la source de données peut être interrompue après l’acquisition, et n’a besoin d’être rétablie que pour la durée de la transaction de résolution.

Les composants DataExpress fournissent également le support de la liaison de données directe pour les composants dbSwing. Il suffit de

Page 70: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

définir une propriété dans l’inspecteur pour lier les données aux composants visuels.

Dans certains exemples de ce chapitre, un pilote JDataStore est utilisé pour accéder aux données d’un JDataStore. Dans d’autres, un pilote JDBC est utilisé pour accéder aux données de tables InterBase. Ces deux options présentent des avantages. Votre choix dépend des besoins de votre application. Avec les deux options,

• Vous pouvez directement connecter des composants visuels.

• Vous disposez d’un accès aux données offrant toutes les fonctionnalités, dont maître-détail, tri, filtrage et contraintes.

• Vous pouvez suivre les modifications apportées aux données extraites de sorte qu’elles puissent être correctement résolues dans la source de données.

Interrogation d’une base de donnéesUn composant QueryDataSet est un ensemble de données spécifique JDBC qui gère un fournisseur de données JDBC, tel que défini dans la propriété query. Vous pouvez utiliser un composant QueryDataSet de JBuilder pour extraire les données d’une source de données et les placer dans un composant StorageDataSet. Cette action est appelée “acquisition”. Une fois les données acquises, vous pouvez visualiser et manipuler les données localement dans des composants orientés données. Lorsque vous voulez enregistrer les modifications dans votre base de données, vous devez résoudre les données. L’architecture DataExpress est décrite en détail au Chapitre 2, “Les applications de bases de données JBuilder”.

Les composants QueryDataSet permettent d’utiliser des instructions SQL pour accéder aux données de la base (ou les acquérir). Vous pouvez ajouter un composant QueryDataSet directement à votre application, ou l’ajouter à un module de données afin de centraliser l’accès aux données et de contrôler la logique métier.

Pour interroger une table SQL, vous devez utiliser les composants suivants que ce soit à l’aide de code ou des outils de conception visuelle de JBuilder :

• Base de données

Le composant Database encapsule une connexion de base de données via JDBC avec un serveur SQL et propose également une gestion simplifiée des transactions.

• QueryDataSet

Le composant QueryDataSet propose les caractéristiques permettant d’exécuter une instruction de requête (avec ou sans paramètres) portant

Page 71: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-3

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

sur les tables d’une base de données SQL et de stocker l’ensemble de résultats de la requête.

• QueryDescriptor

L’objet QueryDescriptor stocke les propriétés de la requête, y compris la base de données à interroger, la chaîne de requête à exécuter et éventuellement les paramètres de la requête.

Le composant QueryDataSet dispose de caractéristiques prédéfinies permettant de lire les données d’une source de données JDBC. Toutefois, les caractéristiques prédéfinies (sous la forme du résolveur par défaut) vont au-delà de la simple lecture des données. Elles génèrent également les requêtes SQL INSERT, UPDATE et DELETE adéquates afin d’enregistrer les modifications dans la source de données après l’opération de lecture.

Les propriétés suivantes de l’objet QueryDescriptor affectent l’exécution de la requête. Ces propriétés peuvent être initialisées visuellement en utilisant l’éditeur de la propriété query. Pour une description de l’éditeur de la propriété query et de ses outils et propriétés, voir “Définition des propriétés dans la boîte de dialogue query”, page 5-4.

Propriété Effet

database Spécifie sur quel objet de connexion Database appliquer la requête.

query Une instruction SQL, généralement une instruction SELECT.

parameters Un ReadWriteRow optionnel utilisé pour renseigner les paramètres, s’utilise avec les requêtes paramétrées.

executeOnOpen Oblige le QueryDataSet à exécuter la requête lors de son ouverture. Cette option est utile pour afficher des données réelles à la conception. Cette option peut également être activée à l’exécution.

loadOption Une valeur entière optionnelle qui définit la méthode de chargement des données dans l’ensemble de données. Les options possibles sont :• Charger toutes les lignes : charge toutes les données en une

seule fois.• Charger les lignes de façon asynchrone : provoque la lecture

des lignes de l’ensemble de données dans un thread distinct. Cela permet d’accéder aux données de l’ensemble de données et de les afficher alors que le composant QueryDataSet est en train de lire des lignes dans la connexion de base de données.

• Charger si nécessaire : charge les lignes quand elles sont nécessaires.

• Charger une ligne à la fois : charge à la demande et remplace la ligne précédente par la ligne en cours. Option utile pour les applications traitant de gros volumes de données par lots.

Page 72: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

Un QueryDataSet peut être utilisé de trois manières différentes pour lire les données :

• Requêtes sans paramètres. La requête est exécutée et les lignes sont lues dans le QueryDataSet.

• Les requêtes paramétrées : Des variables sont utilisées dans l’instruction SQL et des valeurs sont spécifiées pour s’y substituer. Pour plus d’informations sur les requêtes paramétrées, voir “Utilisation de requêtes paramétrées pour obtenir des données d’une base de données”, page 5-13.

• Lecture dynamique de groupes de détail. Les enregistrements d’un ensemble de données détail sont lus à la demande et stockés dans l’ensemble de données détail. Pour plus d’informations, voir “Lecture des détails”, page 9-7.

Définition des propriétés dans la boîte de dialogue query

L’éditeur de la propriété Query s’affiche quand vous cliquez sur le bouton points de suspension dans le champ valeur de la propriété query d’un composant QueryDataSet. Cet éditeur peut s’utiliser pour définir visuellement les propriétés de l’objet QueryDescriptor mais il a également d’autres rôles. L’éditeur de la propriété Query est montré ci-après. Chacune de ses options est décrite par la suite.

Figure 5.1 Editeur de la propriété Query

Pour davantage d’informations, voir la rubrique com.borland.dx.sql.dataset.QueryDescriptor de la documentation sur la Référence DataExpress.

Page 73: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-5

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

La page RequêteLa page Requête propose les options suivantes :

• La liste déroulante Base de données affiche le nom de tous les objets Database instanciés auxquels peut se lier ce composant QueryDataSet. Cette propriété doit être initialisée pour que la requête s’exécute. Pour instancier un composant Database, voir Chapitre 4, “Connexion à une base de données”.

La sélection d’un 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 représentation visuelle de la base de données, et permet de créer une instruction SQL en sélectionnant les colonnes, en ajoutant une clause Where, Order By ou Group By, et en affichant et testant l’instruction SQL générée. Lorsque vous cliquez sur OK, l’instruction SQL créée avec le constructeur SQL est placée dans le champ Instruction de la boîte de dialogue Requête.

• Cliquez sur le bouton Parcourir les tables pour afficher la boîte de dialogue Tables et colonnes disponibles. Cette boîte de dialogue montre la liste des tables de la Database spécifiée et les colonnes de la table sélectionnée. Les boutons Coller la table et Coller la colonne permettent de créer rapidement l’instruction de requête en collant dedans le nom de la table sélectionnée (en cliquant sur le bouton Coller la table) ou de la colonne sélectionnée (en cliquant sur le bouton Coller la colonne) à la position en cours du curseur d’insertion.

Ce bouton est estompé et inaccessible lorsque le champ Base de données affiche la valeur “<aucun>”. Sélectionnez un objet Database dans cette zone pour rendre ce bouton disponible.

• Instruction SQL est la représentation sous la forme d’une chaîne Java de l’instruction SQL (généralement une instruction SELECT). Entrez l’instruction de requête portant sur la base de données désignée par la liste déroulante Base de données. Utilisez le bouton Parcourir les tables pour coller rapidement les noms de table ou de colonne dans l’instruction de requête. C’est une propriété obligatoire qui doit contenir une instruction SQL correcte. Si l’instruction SQL ne renvoie pas d’ensemble résultat, une exception est générée.

L’exemple suivant d’instruction SQL simple est utilisé fréquemment dans cette documentation. Cette instruction sélectionne trois champs de la table EMPLOYEE :

SELECT emp_no, last_name, salary FROM employee

L’instruction SQL suivante sélectionne tous les champs de la table EMPLOYEE.

SELECT * FROM employee

Page 74: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

• L’option Exécuter la requête dès l’ouverture détermine si la requête est exécutée automatiquement quand le composant QueryDataSet est ouvert. Cette option est cochée par défaut, ce qui permet l’affichage de données réelles dans le concepteur d’interface utilisateur quand le composant QueryDataSet est lié à un composant orienté données.

• Options de chargement sont des valeurs entières définissant la méthode de chargement des données dans l’ensemble de données. Les options possibles sont :

a Charger toutes les lignes : charge toutes les données en une seule fois.

b Charger les lignes de façon asynchrone : provoque la lecture des lignes de l’ensemble de données dans un thread distinct. Cela permet d’accéder aux données de l’ensemble de données et de les afficher alors que le composant QueryDataSet est en train de lire des lignes dans la connexion de base de données.

c Charger si nécessaire : charge les lignes quand elles sont nécessaires.

d Charger une ligne à la fois : charge à la demande et remplace la ligne précédente par la ligne en cours. Option utile pour les applications traitant de gros volumes de données par lots.

• Lorsque Placer le texte SQL dans l’ensemble de ressources est coché, au moment de sortir de l’éditeur de la propriété query, la boîte de dialogue Création d’un ResourceBundle s’affiche. Sélectionnez 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. Voir “Placer le texte SQL dans l’ensemble de ressources”, page 5-7, pour une description de cette fonctionnalité.

Si cette option n’est pas cochée, la chaîne SQL est écrite dans l’objet QueryDescriptor sous la forme d’une chaîne placée dans le code source.

• Cliquez sur le bouton Tester la requête pour tester l’instruction de requête et les autres propriétés de la boîte de dialogue pour la base de données spécifiée. Le résultat (“Succès” ou “Echec”) est affiché dans la zone grisée en dessous du bouton Tester la requête. Si la zone en dessous du bouton indique Succès, la requête peut s’exécuter. Si elle indique Echec, recherchez parmi les informations saisies dans la requête s’il y a des erreurs de frappe ou des oublis.

La page ParamètresDans la page Paramètres, vous pouvez sélectionner un ReadWriteRow ou un ensemble de données qui servira à renseigner les paramètres utilisés dans les requêtes paramétrées. Les valeurs de paramètre sont spécifiées par l’instanciation d’un objet ReadWriteRow. Dans la liste déroulante,

Page 75: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-7

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

sélectionnez l’objet ReadWriteRow (ou la sous-classe ReadWriteRow) contenant les valeurs à appliquer aux paramètres de votre requête.

Figure 5.2 Page Paramètres

Tout ReadWriteRow, tel un ParameterRow, un DataSet et un DataRow, peut être utilisé comme paramètres de requête ou de procédure. Dans un ParameterRow, les colonnes sont simplement configurées avec les méthodes addColumns et setColumns. Les DataSet et DataRow ne doivent être utilisés que s’ils contiennent déjà les colonnes avec les données voulues. Voir un exemple dans “Utilisation de requêtes paramétrées pour obtenir des données d’une base de données”, page 5-13.

Placer le texte SQL dans l’ensemble de ressourcesUn java.util.ResourceBundle contient les objets spécifiques à la locale. Quand votre programme a besoin d’une ressource spécifique à la locale, il peut la charger depuis le bundle de ressources approprié à la locale de l’utilisateur en cours. De cette façon, vous pouvez écrire du code largement indépendant de la locale de l’utilisateur : il suffit d’isoler la majorité, sinon la totalité, des informations spécifiques aux locales dans des bundles de ressources.

La boîte de dialogue Création d’un ResourceBundle apparaît à la fermeture de l’éditeur de la propriété query, si une instruction SQL a été définie dans l’éditeur de reequête et que l’option “Placer le texte SQL dans l’ensemble de ressources” a été cochée. La boîte de dialogue Création d’un ResourceBundle a l’aspect suivant :

Figure 5.3 Boîte de dialogue du bundle de ressources

Page 76: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

Pour utiliser un bundle de ressources dans votre application,

1 Sélectionnez un type de ResourceBundle.

Pour simplifier les choses, le JDK propose deux sous-classes ResourceBundle pratiques à utiliser : ListResourceBundle et PropertyResourceBundle. La classe ResourceBundle même est une classe abstraite. Pour créer effectivement un bundle, il faut donc dériver ResourceBundle et spécifier l’implémentation concrète des fonctions qui lisent dans l’élément employé pour stocker vos ressources, par exemple une chaîne. Vous pouvez stocker des ressources dans ce bundle en cliquant avec le bouton droit de la souris sur une propriété et en spécifiant la clé. JBuilder écrit alors les chaînes dans le fichier ressource en utilisant le format approprié au type.

• Si vous sélectionnez ListResourceBundle, un fichier .java est généré et ajouté au projet. Avec ListResourceBundle, les messages (ou les autres ressources) sont stockés dans un tableau à deux dimensions dans un fichier source java. ListResourceBundle est également une classe abstraite. Pour créer un bundle qui puisse être chargé, il faut dériver de ListResourceBundle et implémenter la méthode getContents(), qui généralement se contente de pointer sur un tableau à deux dimensions de la forme “clé-objet”. Pour l’exemple précédent, il faut créer la classe :

package myPackage;public class myResource extends ListResourceBundle {Object[][] contents = {{"Hello_Message", "Comment allez-vous?"}}public Object[][] getContents() {return contents;}}

• Si vous sélectionnez PropertyResourceBundle, un fichier de propriétés est créé. PropertyResourceBundle est une classe concrète, ce qui signifie qu’il n’est pas nécessaire de créer une autre classe pour l’utiliser. Pour les bundles de ressources qui sont des propriétés, le stockage des ressources s’effectue dans des fichiers portant l’extension .properties. Quand vous implémentez un bundle de ressources ayant cette forme, il suffit de fournir un fichier de propriétés portant le nom correct et de le stocker au même endroit que les fichiers de classe du paquet. Pour l’exemple ci-dessus, il faut créer 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 chaînes mais elles sont chargées beaucoup plus lentement qu’avec une implémentation basée sur une classe comme ListResourceBundle. Cette solution est néanmoins appréciée car elle ne nécessite pas de manipulation du

Page 77: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-9

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

code source ni de recompilation. Le contenu du fichier des propriétés à la forme suivante :

# commentsHello_message=Comment allez-vous ?

2 Cliquez sur Annuler ou sur OK :

Le clic sur le bouton Annuler (ou la désélection de l’option “Placer le texte SQL dans l’ensemble de ressources” du dialogue query), écrit dans le fichier cadre un objet QueryDescriptor de la forme suivante. Le texte SQL est écrit dans une chaîne incorporée dans le code source :

queryDataSet1.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database1, "select * from employee", null, true, LOAD.ALL));

Le clic sur le bouton OK crée un objet queryDescriptor de la forme suivante :

queryDataSet1.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database1, sqlRes.getString("employee"), null, true, LOAD.ALL));

A chaque fois que vous enregistrez le texte SQL d’un QueryDescriptor, JBuilder crée automatiquement un nouveau fichier appelé SqlRes.java. Il place le texte de la chaîne SQL dans SqlRes.java et crée une balise sous forme d’une chaîne unique qui est insérée dans le texte. Par exemple, pour l’instruction de sélection "SELECT * FROM employee", comme saisie précédemment, 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 l’instruction SQL est modifiée, les modifications sont enregistrées dans SqlRes.java. Aucune modification du code à l’intérieur de jbInit() ne sera nécessaire car la chaîne “balise” est invariante.

Pour davantage d’informations sur les bundles de ressources, voir la description JavaDoc de java.util.ResourceBundle dans l’aide de JBuilder en sélectionnant Aide|Référence Java. Sélectionnez ensuite le paquet java.util et la classe ResourceBundle.

Page 78: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

Interrogation d’une base de données : trucs & astuces

Cet ensemble de rubriques contient des conseils pour

• Améliorer les performances des ensembles de données

• Ouvrir et fermer les ensembles de données de façon plus efficace

• Vous assurer qu’une requête est modifiable

Amélioration des performances des ensembles de donnéesCette section propose quelque astuces pour améliorer les performances des QueryDataSet et QueryProvider. Pour améliorer les performances lors de l’acquisition des données, éliminez l’analyse de la requête effectuée par défaut par le QueryProvider lors de la première exécution de la requête. Pour plus d’informations sur la façon de le faire, voir “Persistance des métadonnées d’une requête”, page 5-11.

• Initialisez la propriété loadOption des composants Query/ProcedureDataSet à Load.ASYNCHRONOUS ou à Load.AS_NEEDED. Vous pouvez également initialiser cette propriété à Load.UNCACHED si vous ne lisez les données qu’une seule fois et en ordre séquentiel.

• Pour de gros ensembles de résultats, utilisez un JDataStore afin d’améliorer les performances. Avec cette option, les données sont enregistrées sur disque et non en mémoire.

• Instructions SQL cachées. Par défaut, DataExpress place dans un cache les instructions préparées des requêtes et procédures stockées si java.sql.Connection.getMetaData().getMaxStatements() renvoie une valeur supérieure à 10. Vous pouvez imposer l’utilisation du cache des instructions dans JBuilder en appelant Database.setUseStatementCaching(true).

Les instructions préparées placées dans le cache ne sont pas fermées avant ceci :

• La modification de certaines propriétés dépendant du fournisseur, comme la propriété query.

• Le recyclage d’un composant DataSet (l’instruction est fermée par la méthode finalize()).

• L’appel de QueryDataSet.closeStatement(), ProcedureDataSet.closeStatement(), QueryProvider.closeStatement() ou ProcedureProvider.closeStatement().

Page 79: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-11

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

Pour améliorer les performances lors des insertions/suppressions/modifications des données :

• Pour les modifications et les suppressions :

a Initialisez la propriété Resolver avec un QueryResolver.

b Initialisez la propriété UpdateMode de ce QueryResolver à UpdateMode.KEY_COLUMNS.

Ces actions limitent la méthode optimiste utilisée pour les accès simultanés mais réduit le nombre de paramètres définis pour une opération de modification/suppression.

• Définissez la propriété useTransactions de votre Database par false. Par défaut, cette propriété est à true lorsque la base de données supporte les transactions. Quand elle est à true, chaque instruction d’insertion, de suppression ou de mise à jour est traitée comme une transaction distincte, validée automatiquement. Quand vous définissez useTransactions par false, les instructions sont toutes traitées en une seule transaction.

Remarque Appelez la méthode commit() de la connexion pour terminer la transaction (ou appelez rollback() pour abandonner toutes les modifications).

• Désactivez l’indicateur resetPendingStatus dans la méthode Database.saveChanges() afin d’obtenir davantage de gains en performances. Si cet indicateur est désactivé, DataExpress n’efface pas l’état RowStatus pour toutes les lignes insérées/ supprimées/modifiées. Cela n’est souhaitable que si vous n’appelez pas saveChanges() pour de nouvelles modifications de l’ensemble de données sans appeler d’abord refresh.

Persistance des métadonnées d’une requêtePar défaut, une requête est analysée lors de sa première exécution. Cette analyse implique l’analyse de la chaîne de la requête et l’appel de plusieurs méthodes du pilote JDBC. Cette analyse peut s’avérer très coûteuse. Il est possible d’éviter cette perte de temps à l’exécution en effectuant l’analyse lors de la conception d’une fiche ou d’un modèle de données.

Pour ce faire,

1 Sélectionnez 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 métadonnées dans le concepteur de colonnes.

La requête est alors analysée et plusieurs affectations de propriétés sont ajoutées au code. Pour davantage d’informations sur le bouton Continuer

Page 80: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

I n t e r r o g a t i o n d ’ u n e b a s e d e d o n n é e s

toutes les métadonnées, voir “Utilisation du concepteur de colonne pour rendre persistantes des métadonnées”, page 7-4. Pour initialiser ces propriétés sans utiliser le concepteur,

1 Initialisez à NONE la propriété metaUpdate du StorageDataSet.

2 Attribuez à la propriété tableName du StorageDataSet le nom de la table pour les requêtes monotables.

3 Initialisez la propriété rowID de Column des colonnes afin qu’elles identifient les lignes de manière unique et cohérente.

4 Modifiez la chaîne de la requête afin d’inclure les colonnes nécessaires à l’identification des lignes (voir le point précédent) si elles n’y apparaissent pas déjà. De telles colonnes doivent être marquées comme invisibles à l’aide de la propriété visible ou de la propriété hidden de Column.

5 Initialisez les propriétés de colonne precision, scale et searchable. Ces propriétés ne sont pas nécessaires si la propriété metaDataUpdate est définie par autre chose que NONE.

6 Définissez la propriété tableName de Column pour une requête multitable.

7 Définissez la propriété serverColumnName de Column par le nom de la colonne de la table physique correspondante si la requête utilise des alias pour les colonnes.

Ouverture et fermeture des ensembles de donnéesLes composants Database et DataSet sont ouverts implicitement quand des composants qui leur sont associés s’ouvrent. Quand vous n’utilisez pas de composant visuel, vous devez ouvrir l’ensemble de données explicitement. “L’ouverture” se propage vers le haut et la “fermeture” vers le bas, ainsi l’ouverture de l’ensemble de données ouvre implicitement la base de données. Un composant Database n’est jamais fermé explicitement.

Comment s’assurer qu’une requête est modifiableQuand JBuilder exécute une requête, il tente de vérifier que la requête est modifiable et qu’elle peut être résolue dans la base de données. Si JBuilder détermine que la requête n’est pas modifiable, il tente de changer la requête pour la rendre modifiable, généralement en ajoutant des colonnes à la clause SELECT.

Si une requête s’avère ne pas être modifiable et si JBuilder ne peut la rendre modifiable en changeant la requête, l’ensemble de résultats sera en lecture seule.

Pour que tout ensemble de données soit modifiable, affectez la valeur NONE à la propriété updateMetaData et spécifiez le nom de la table et les colonnes identifiant les lignes de manière unique (un groupe de colonnes qui peuvent identifier de manière unique une ligne, comme un index

Page 81: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-13

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

primaire ou unique). Pour plus d’informations sur la façon de le faire, voir “Persistance des métadonnées d’une requête”, page 5-11.

Vous pouvez interroger une vue SQL, mais comme JBuilder n’indique pas si les données proviennent d’une vue SQL ou d’une table SQL, il y a donc un risque que les données ne soient pas modifiables. Vous pouvez régler ce problème en écrivant un résolveur personnalisé.

Utilisation de requêtes paramétrées pour obtenir des données d’une base de données

Une instruction SQL paramétrée contient des variables, appelées paramètres, dont la valeur peut changer à l’exécution. Une requête paramétrée utilise ces variables à la place de valeurs de données littérales, comme celles utilisées dans une clause WHERE pour la comparaison, qui apparaissent dans une instruction SQL. Ces variables sont appelées paramètres. Généralement, les paramètres remplacent les valeurs de données spécifiées dans l’instruction. Il faut spécifier la valeur de ce paramètre avant d’exécuter la requête. L’exécution de la requête en spécifiant différents jeux de valeurs permet d’obtenir différents ensembles de données pour une même requête.

Pour comprendre les requêtes paramétrées, il est indispensable de comprendre comment les données sont fournies à un DataSet ; lisez donc, si ce n’est déjà fait, le Chapitre 2, “Les applications de bases de données JBuilder”, et “Interrogation d’une base de données”, page 5-2. Ce qui suit traite spécifiquement des requêtes paramétrées.

En plus des instructions fournies par la section “Paramétrage d’une requête”, les aspects suivants des requêtes paramétrées seront abordés :

• “Utilisation de paramètres”, page 5-19

• “Ré-exécution d’une requête avec des paramètres modifiés”, page 5-22

• “Requêtes paramétrées dans les relations maître-détail”, page 5-22

Paramétrage d’une requête

L’exemple suivant décrit la manière de fournir des données à une application en utilisant un composant QueryDataSet. Cet exemple ajoute un ParameterRow avec des valeurs minimum et maximum pouvant être modifiées lors de l’exécution. Quand les valeurs du ParameterRow sont modifiées, la table est automatiquement rafraîchie pour n’afficher que les enregistrements respectant le critère spécifié à l’aide des paramètres.

Remarque Avant de poursuivre par les étapes ci-dessous, il est nécessaire que vous vous soyez familiarisé avec l’utilisation des outils de conception. Pour ce

Page 82: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

faire, nous vous recommandons d’exécuter le tutoriel du Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”.

La version finale de l’application créée par les étapes suivantes est disponible dans le projet exemple ParameterizedQuery.jpr, situé dans le répertoire /samples/DataExpress/ParameterizedQuery de l’installation de JBuilder.

Création de l’applicationPour créer l’application,

1 Choisissez Fichier|Tout fermer.

2 Choisissez Fichier|Nouveau et double-cliquez sur l’icône Application.

3 Acceptez toutes les valeurs par défaut pour créer une nouvelle application.

4 Sélectionnez l’onglet Conception pour activer le concepteur d’interface utilisateur.

5 Cliquez sur le composant Database de l’onglet DataExpress de la palette de composants, puis cliquez dans le concepteur d’interface utilisateur pour ajouter le composant à l’application.

Ouvrez l’éditeur de la propriété Connection du composant Database en cliquant dans l’inspecteur sur les points de suspension (...) situés à côté de la valeur de la propriété connection.

6 Définissez les propriétés de la connexion à la table exemple JDataStore comme suit :

La boîte de dialogue Connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vérifier que les propriétés de connexion sont correctement définies. Les résultats de la tentative de connexion s’affichent à côté du bouton. Quand la connexion réussit, cliquez sur OK.

Si vous souhaitez voir le code qui a été généré, cliquez sur l’onglet Source et cherchez le code de ConnectionDescriptor. Cliquez sur l’onglet Conception pour continuer.

Nom de la propriété Valeur

Driver com.borland.datastore.jdbc.DataStoreDriver

URL Naviguez jusqu’à <jbuilder>/samples/JDataStore/datastores/employee.jds dans le champ URL local.

Username Entrez votre nom

Password non obligatoire

Page 83: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-15

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

Pour plus d’informations sur la connexion aux bases de données, voir Chapitre 4, “Connexion à une base de données”.

Ajout d’un composant ParameterRowAjoutez ensuite un ParameterRow ayant deux colonnes : low_no et high_no. Lorsque vous avez lié le ParameterRow à un QueryDataSet, vous pouvez utiliser des composants JdbTextField pour changer les valeurs du ParameterRow afin d’actualiser la requête avec ces nouvelles valeurs.

1 Ajoutez un composant ParameterRow de la page DataExpress à l’application.

2 Cliquez sur l’icône d’extension, à gauche de parameterRow1 dans l’arborescence des composants, pour afficher les colonnes contenues dans ParameterRow.

3 Sélectionnez <nouvelle colonne> et définissez dans l’inspecteur les propriétés suivantes pour la nouvelle colonne :

Pour voir le code généré par le concepteur pour cette étape, cliquez sur l’onglet Source et cherchez la méthode jbInit(). Cliquez sur l’onglet Conception pour continuer.

4 Sélectionnez à nouveau <nouvelle colonne> pour ajouter la deuxième colonne du ParameterRow et définissez les propriétés suivantes de cette colonne :

Ajout d’un QueryDataSet1 Ajoutez un composant QueryDataSet de la page DataExpress à

l’application.

2 Cliquez sur le bouton points de suspension (...) de la propriété query pour ouvrir l’éditeur de la propriété Query.

Nom de la propriété Valeur

columnName low_no

dataType INT

default 15

Nom de la propriété Valeur

columnName high_no

dataType INT

default 50

Page 84: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

3 Définissez la propriété query du QueryDataSet comme suit :

4 Cliquez sur l’onglet Paramètres de l’éditeur de la propriété Query.

5 Sélectionnez parameterRow1 dans la liste déroulante afin de lier l’ensemble de données au ParameterRow.

6 Sélectionnez l’onglet Requête et cliquez sur le bouton Tester la requête pour vérifier que la requête est exécutable. Quand la zone à côté du bouton indique Succès, cliquez sur OK pour fermer le dialogue.

Le code suivant pour le queryDescriptor est ajouté à la méthode jbInit() :

queryDataSet1.setQuery(new com.borland.dx.sql.dataset. QueryDescriptor(database1, "select emp_no, first_name, last_name from employee where emp_no <= :low_no and emp_no >= :high_no", parameterRow1, true, Load.ALL));

7 Ajoutez un composant DBDisposeMonitor de la page dbSwing supplémentaires. Le DBDisposeMonitor fermera le JDataStore lorsque la fenêtre sera fermée.

8 Définissez la propriété dataAwareComponentContainer du DBDisposeMonitor par this.

Ajout des composants d’interface utilisateurCe qui suit suppose que vous ayez effectué le tutoriel d’introduction aux bases de données et que vous soyez familiarisé avec l’ajout de composants d’interface utilisateur dans le concepteur.

Pour ajouter les composants qui vous permettront de visualiser et de manipuler les données de votre application,

1 Cliquez sur un composant TableScrollPane dans l’onglet dbSwing de la palette. Déposez-le au centre du panneau dans le concepteur d’interface utilisateur.

Vérifiez que sa propriété constraints est définie par CENTER.

2 Déposez un composant JdbTable de l’onglet dbSwing au centre du composant tableScrollPane1 et définissez sa propriété dataSet par queryDataSet1.

Vous remarquerez que la table dans le concepteur affiche des données dynamiques.

Nom de la propriété Valeur

Database database1

Instruction SQL select emp_no, first_name, last_name from employee where emp_no >= :low_no and emp_no <= :high_no

Page 85: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-17

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

3 Choisissez Exécuter|Exécuter le projet pour exécuter l’application et parcourir l’ensemble de données.

4 Fermez l’application exécutée.

Pour ajouter les composants permettant de paramétrer la requête à l’exécution,

1 Sélectionnez le composant JPanel dans l’onglet Conteneurs Swing de la palette et placez-le dans l’arborescence des composants, directement sur l’icône à gauche de contentPane(BorderLayout).

Cela garantit que le JPanel (jPanel1) sera bien ajouté à l’interface utilisateur principale et non au tableScrollPane1 qui occupe actuellement tout le panneau de l’interface utilisateur.

2 Assurez-vous que sa propriété constraints est définie par NORTH.

Si tableScrollPane1 se rapetisse subitement, vérifiez que sa propriété constraints vaut toujours CENTER.

3 Sélectionnez jPanel1 et définissez sa propriété preferredSize par 200,100.

Cela lui permettra d’être suffisamment grand pour contenir le reste des composants de l’interface utilisateur.

4 Placez un composant JdbTextField de l’onglet dbSwing dans jPanel1.

Ce composant stocke la valeur minimum.

5 Remarquez que jdbTextField1 se trouve au milieu du panneau, en haut.

C’est parce que la disposition par défaut des composants JPanel est FlowLayout. Si vous essayez de placez le composant ailleurs, il n’y restera pas et retournera à sa position initiale.

Pour pouvoir contrôler le positionnement des composants d’interface utilisateur dans ce panneau, changez la propriété layout de jPanel1 en ’null’. Ensuite, faites glisser jdbTextField1 vers la gauche du panneau.

6 Donnez à la propriété columns de jdbTextField1 la valeur 10 pour qu’il ait une largeur fixe. Donnez à sa propriété text la valeur 10 pour correspondre à la valeur minimale par défaut précédemment saisie.

7 Ajoutez un JLabel de la page Swing à jPanel1. Cela permet d’identifier jdbTextField1 comme champ minimum.

8 Cliquez sur jLabel1 dans le concepteur d’interface utilisateur et faites-le glisser juste au-dessus de jdbTextField1.

9 Définissez la propriété text de jLabel1 par Valeur minimum. Tirez sur la poignée de redimensionnement noire au milieu du côté gauche et augmentez la largeur du libellé jusqu’à ce que l’on voie tout le texte.

Page 86: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-18 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

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 Définissez la propriété columns de jdbTextField2 par 10, et sa propriété text par 50.

12 Définissez la propriété text de jLabel2 par Valeur maximum et augmentez sa largeur pour voir tout le texte.

13 Alignez les quatre composants.

Maintenez enfoncée la touche CTRL et cliquez sur les deux composants jLabel1 et jdbTextField1. Cliquez avec le bouton droit et choisissez Aligner à gauche pour aligner les côtés gauches. (Quand vous utilisez la disposition null pendant le prototypage d’une interface utilisateur, les options d’alignement sont accessibles dans le menu contextuel.)

Alignez à gauche jLabel2 et jdbTextField2. Alignez en haut les deux champs de texte et les deux libellés.

14 Ajoutez un JButton de la page Swing à jPanel1. Placez ce bouton au milieu, à mi-chemin des deux champs de texte. Définissez sa propriété text par Mise à jour.

Cliquer sur ce bouton permet de mettre à jour les résultats de la requête paramétrée à partir des valeurs entrées dans les champs de saisie des valeurs minimum et maximum.

15 Sélectionnez l’onglet Evénements de l’inspecteur, sélectionnez le champ actionPerformed et double-cliquez sur la valeur du champ pour créer un événement actionPerformed() dans le code source. Le volet Source s’affiche et le curseur apparaît entre les accolades ouvrante et fermante du nouvel événement actionPerformed().

Ajoutez le code suivant pour obtenir ceci :

void jButton1_actionPerformed(ActionEvent e) { try{ // modifie les valeurs dans la ligne de paramètres // et rafraîchit l’affichage parameterRow1.setInt("low_no", Integer.parseInt(jdbTextField1.getText())); parameterRow1.setInt("high_no", Integer.parseInt(jdbTextField2.getText())); queryDataSet1.refresh(); } catch(Exception ex) { ex.printStackTrace(); } }}

Page 87: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-19

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

16 Enregistrez votre travail et exécutez l’application. Elle doit ressembler à ceci :

Pour tester l’exemple, entrez une nouvelle valeur dans le champ de saisie de la valeur minimum, puis cliquez sur le bouton Mise à jour. La table n’affiche que les valeurs supérieures à la nouvelle valeur minimum. Entrez une nouvelle valeur dans le champ de saisie de la valeur maximum, puis appuyez sur le bouton Mise à jour. La table n’affiche que les valeurs inférieures à la nouvelle valeur maximum.

Pour enregistrer vos modifications dans la source des données, vous devrez ajouter un QueryResolver. Voir “Enregistrement des modifications d’un QueryDataSet”, page 8-3, pour savoir comment ajouter un bouton avec du code de résolution, ou ajouter un composant JdbNavToolbar au volet Contenu et utiliser son bouton Enregistrer les modifications comme résolveur de requête par défaut.

Requêtes paramétrées trucs & astuces

Cet ensemble de rubriques contient des conseils pour

• Utiliser les paramètres nommés et les marqueurs de paramètres

• Ré-exécuter la requête avec de nouveaux paramètres

• Utiliser une requête paramétrée dans une relation maître-détail

Utilisation de paramètresPour affecter des valeurs aux paramètres d’une requête paramétrée, il faut d’abord créer un ParameterRow et ajouter des colonnes nommées qui contiendront les valeurs à transmettre à la requête.

Tout ReadWriteRow, tel un ParameterRow, un DataSet et un DataRow, peut être utilisé comme paramètres de requête ou de procédure. Dans un ParameterRow, les colonnes sont simplement configurées avec les méthodes addColumns et setColumns. Les DataSet et DataRow ne doivent être utilisés que s’ils contiennent déjà les colonnes avec les données voulues.

Page 88: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-20 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

Les classes Row sont utilisées de manière extensive dans l’API DataExpress. Les classes ReadRow et ReadWriteRow sont utilisées comme interfaces indiquant l’utilisation voulue. En utilisant une hiérarchie de classes, l’implémentation est partagée et il y a un léger avantage en performances par rapport à l’utilisation d’interfaces.

Le texte suivant illustre la hiérarchie des classes associée aux méthodes 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 méthodes StorageDataSet traitent la structure des ensembles de données

• Les méthodes DataSet gèrent la navigation

• Les méthodes ReadWriteRow permettent de modifier les valeurs des colonnes (c’est-à-dire les champs) de la ligne en cours

• Les méthodes ReadWriteRow donnent accès aux valeurs des colonnes (c’est-à-dire aux champs) de la ligne en cours

• TableDataSet et QueryDataSet héritent de toutes ces méthodes.

Les classes Row donnent accès aux valeurs des colonnes par indice ou par nom de colonne. La spécification des colonnes par leur nom permet d’écrire un code plus fiable et plus lisible. L’accès aux colonnes par nom n’est pas aussi rapide que l’accès par indice, mais reste raisonnable tant que le nombre des colonnes de l’ensemble de données ne dépasse pas 20 grâce à l’utilisation d’algorithmes propriétaires de mise en correspondance rapide du nom avec l’indice. Il est préférable d’utiliser les mêmes chaînes pour tous les accès à une même colonne. Cela économise de la mémoire et simplifie la saisie quand il y a de nombreuses références à la même colonne.

Le ParameterRow est transmis dans le QueryDescriptor. L’éditeur de propriété query permet de sélectionner une ligne de paramètres. L’édition d’un composant ParameterRow, que ce soit l’ajout de colonnes ou la modification de ses propriétés, peut s’effectuer dans l’inspecteur ou dans le code.

Vous pouvez, par exemple, créer un composant ParameterRow contenant deux champs, low_no et high_no. Il est possible de faire référence à low_no et à high_no dans la requête paramétrée et de les comparer à la valeur de n’importe quel champ de la table. Voir l’exemple ci-dessous pour une illustration de l’utilisation de ces valeurs.

Les requêtes paramétrées JBuilder peuvent s’exécuter en utilisant des paramètres nommés, des marqueurs de paramètres ou une relation maître-détail. Les sections suivantes décrivent brièvement ces trois cas.

Page 89: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-21

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

• En utilisant des paramètres nommés :

Quand les marqueurs de paramètres de la requête sont spécifiées par le caractère deux points (:) suivi d’un nom alphanumérique, la mise en correspondance des noms de paramètres a lieu. La colonne du ParameterRow portant le même nom que le marqueur de paramètre est utilisée pour définir la valeur du paramètre. Dans l’instruction SQL suivante, les valeurs à sélectionner sont transmises en utilisant des paramètres nommés :

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 à l’instruction lors de l’exécution de la requête par l’application. La valeur de ce champ peut provenir d’un composant visuel ou avoir été générée par du code. En mode conception, la valeur par défaut de la colonne sera utilisée. Quand un nom est affecté à un paramètre, il peut être transmis à la requête sans tenir compte de l’ordre. JBuilder associe les paramètres à l’ensemble de données dans le bon ordre au moment de l’exécution.

Dans “Paramétrage d’une requête”, page 5-13, deux colonnes sont ajoutées au ParameterRow afin de contenir les valeurs minimum et maximum. Le descripteur de la requête spécifie que la requête ne doit renvoyer que les valeurs supérieures à la valeur minimum et inférieures à la valeur maximum.

• Avec les marqueurs de paramètres JDBC “?” :

Quand le marqueur de paramètre JDBC point d’interrogation (?) est utilisé, la définition de la valeur des paramètres doit s’effectuer strictement de gauche à droite.

Dans l’instruction SQL suivante, les valeurs à sélectionner sont transmises avec les marqueurs de paramètres JDBC “?” :

SELECT * FROM employee WHERE emp_no > ?

Dans cette instruction SQL, la valeur “?” est le substitut de la valeur effectivement fournie par l’application à l’instruction lors de son exécution. La valeur de ce champ peut provenir d’un composant visuel ou avoir été générée par du code. Lorsqu’un marqueur de paramètre JDBC “?” est utilisé, les valeurs doivent être transmises à la requête en allant de la gauche vers la droite. A l’exécution, JBuilder associe les paramètres à la source des valeurs (un ReadWriteRow) dans cet ordre. La liaison des paramètres se traduit par l’allocation de ressources pour l’instruction et ses paramètres, à la fois en local et sur le serveur, afin d’améliorer les performances lors de l’exécution d’une requête.

• Avec une relation maître-détail :

Par définition, les ensembles de données maître et détail ont au moins un champ en commun. Ce champ est utilisé comme une requête

Page 90: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-22 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

paramétrée. Pour plus d’informations sur la fourniture de paramètres de cette façon, voir “Requêtes paramétrées dans les relations maître-détail”, page 5-22.

Ré-exécution d’une requête avec des paramètres modifiésPour ré-exécuter la requête avec de nouveaux paramètres, définissez de nouvelles valeurs dans le ParameterRow puis appelez QueryDataSet.refresh() pour forcer l’exécution de la requête en utilisant les nouvelles valeurs des paramètres. Par exemple, pour employer un composant de l’interface utilisateur dans le but de définir la valeur d’un paramètre, utilisez une instruction SQL de la forme suivante :

SELECT * FROM phonelist WHERE lastname LIKE :searchname

Dans cet exemple, la valeur du paramètre :searchname peut être définie par un composant de l’interface utilisateur. Pour ce faire, votre code doit :

1 Obtenir la valeur du composant à chaque fois qu’elle change.

2 La placer dans une colonne d’un objet ParameterRow.

3 Fournir cet objet au QueryDataSet.

4 Appeler refresh() pour le QueryDataSet.

Voir “Paramétrage d’une requête”, page 5-13, pour un exemple de cette procédure avec des fichiers exemple JBuilder.

Si les valeurs que vous voulez affecter au paramètre query se trouvent dans une colonne d’un ensemble de données, vous pouvez utiliser cet ensemble de données en tant que votre ReadWriteRow dans le QueryDescriptor, naviguer dans l’ensemble de données et ré-exécuter la requête pour chaque valeur.

Requêtes paramétrées dans les relations maître-détailQuand, dans une relation maître-détail, DelayedDetailFetch a la valeur true (pour ne lire les données que lorsque c’est nécessaire), vous pouvez spécifier une instruction SQL de la forme :

SELECT * FROM employee WHERE country = :job_country

Dans cet exemple, :job_country correspond au champ que cet ensemble de données détail utilise pour se relier à l’ensemble de données maître. Il est possible de spécifier autant de paramètres et de champs de liaison maître que nécessaire. Dans une relation maître-détail, le nom du paramètre doit toujours correspondre au nom de la colonne. Pour davantage d’informations sur les relations maître-détail et le paramètre DelayedDetailFetch, voir Chapitre 9, “Etablissement d’une relation maître-détail”.

Dans un descripteur de relation maître-détail, la liaison s’effectue implicitement. Liaison implicite signifie que les valeurs des données ne

Page 91: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E x t r a c t i o n d e s d o n n é e s d ’ u n e s o u r c e d e d o n n é e s 5-23

U t i l i s a t i o n d e r e q u ê t e s p a r a m é t r é e s p o u r o b t e n i r d e s d o n n é e s d ’ u n e b a s e d e d o n n é e s

sont pas fournies explicitement par le programmeur, elles sont obtenues de la ligne en cours de l’ensemble de données maître et implicitement liées quand la requête détail est exécutée. La liaison des paramètres se traduit par l’allocation de ressources pour l’instruction et ses paramètres, à la fois en local et sur le serveur, afin d’améliorer les performances lors de l’exécution d’une requête.

Si les valeurs que vous voulez affecter au paramètre query se trouvent dans une colonne d’un ensemble de données (l’ensemble de données maître), vous pouvez utiliser cet ensemble de données en tant que votre ReadWriteRow dans le QueryDescriptor, naviguer dans l’ensemble de données et ré-exécuter la requête pour chaque valeur affichée dans l’ensemble de données détail.

Page 92: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

5-24 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 93: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s 6-1

C h a p i t r e

6Chapitre6Utilisation

des procédures stockéesLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Dans une procédure stockée, une ou plusieurs instructions SQL sont encapsulées en un seul endroit du serveur et peuvent s’exécuter en groupe. Dans la version Client/Serveur de JBuilder, les composants ProcedureDataSet permettent d’accéder ou d’acquérir les données de la base de données à l’aide de procédures stockées existantes, en les appelant avec des séquences d’échappement de procédure JDBC ou en utilisant une syntaxe spécifique au serveur pour les appels de procédure. Pour exécuter une procédure stockée sur une table SQL dont le résultat est un ensemble de lignes, il faut les composants suivants. Il est possible de spécifier ces informations par code ou en utilisant les outils de conception JBuilder.

• Le composant Database encapsule une connexion de base de données via JDBC avec un serveur SQL et propose également une gestion simplifiée des transactions.

• Le composant ProcedureDataSet permet d’exécuter la procédure stockée (avec ou sans paramètres) sur la base de données SQL et stocke le résultat de l’exécution dans la procédure stockée.

• L’objet ProcedureDescriptor stocke les propriétés de la procédure stockée, y compris la base de données à interroger, les séquences d’échappement ou les appels des procédures stockées et tous les paramètres optionnels de la procédure stockée.

Quand il fournit les données de sources JDBC, le composant ProcedureDataSet dispose de fonctions prédéfinies pour lire les données dans une procédure stockée qui renvoie un curseur sur un ensemble

Page 94: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

6-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s

de résultats. Les propriétés suivantes de l’objet ProcedureDescriptor affectent l’exécution des procédures stockées :

Un ProcedureDataSet peut s’utiliser pour exécuter des procédures stockées avec ou sans paramètres. Une procédure stockée avec paramètres peut obtenir la valeur de ses paramètres de tout DataSet ou ParameterRow. “Utilisation de paramètres avec des procédures stockées Oracle PL/SQL”, page 6-7, propose un exemple.

Utilisez le Pilote de base de données pour parcourir ou modifier les objets schéma spécifiques aux serveurs de bases de données, y compris les tables, les champs, les définitions de procédure stockée ou les index. Pour davantage d’informations sur le pilote de base de données, sélectionnez Outils|Pilote de base de données et reportez-vous à son aide en ligne.

Les sujets suivants, relatifs aux procédures stockées, sont abordés dans cette rubrique :

• “Séquences d’échappement, instructions SQL et appels de procédure spécifiques au serveur”

• “Utilisation de procédures stockées InterBase”

Propriété But

database Spécifie l’objet de connexion Database sur lequel exécuter la procédure.

procedure Une représentation sous forme d’une chaîne Java de la séquence d’échappement ou de l’instruction SQL de la procédure stockée provoquant l’exécution de la procédure stockée.

parameters Un ReadWriteRow optionnel utilisé pour remplir les paramètres. Ces valeurs peuvent provenir de tout DataSet ou ReadWriteRow.

executeOnOpen Entraîne l’exécution de la procédure dès l’ouverture du ProcedureDataSet. Cette option est utile pour afficher des données réelles à la conception. Cette option peut également être activée à l’exécution. La valeur par défaut est true.

loadOption Une valeur entière optionnelle qui définit la méthode de chargement des données dans l’ensemble de données. Les options possibles sont :1 Charger toutes les lignes : charge toutes les données en une

seule fois.2 Charger les lignes de façon asynchrone : provoque la lecture

des lignes de l’ensemble de données dans un thread distinct. Cela permet d’accéder aux données de l’ensemble de données et de les afficher alors que le composant QueryDataSet est en train de lire des lignes dans la connexion de base de données.

3 Charger si nécessaire : charge les lignes quand elles sont nécessaires.

4 Charger une ligne à la fois : charge à la demande et remplace la ligne précédente par la ligne en cours. Option utile pour les applications traitant de gros volumes de données par lots.

Page 95: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s 6-3

P r o c é d u r e s s t o c k é e s : t r u c s & a s t u c e s

• “Utilisation de paramètres avec des procédures stockées Oracle PL/SQL”

• “Utilisation des procédures stockées Sybase”

Le tutoriel du Chapitre 18, “Tutoriel : Extraction de données à l’aide de procédures stockées”, est fourni pour vous aider à mieux comprendre les concepts présentés dans les sections ci-dessous.

Procédures stockées : trucs & astucesCette section peut vous aider à :

• Comprendre les options d’utilisation d’une procédure stockée• Créer les procédures utilisées dans le tutoriel

Séquences d’échappement, instructions SQL et appels de procédure spécifiques au serveur

Quand vous saisissez des informations dans la zone Instruction SQL ou Escape de procédure stockée de l’éditeur de la propriété procedure ou dans le code, vous pouvez saisir trois types d’instructions. Les voici :

• Sélectionner une procédure existante.

Pour rechercher dans la base de données une procédure existante, cliquez sur Parcourir les procédures dans l’éditeur de propriété procedure. Une liste des noms des procédures disponibles dans la base de données à laquelle vous êtes connecté est affichée. Si le serveur est InterBase et si vous avez sélectionné une procédure ne renvoyant pas de données, vous en êtes informé. Si vous sélectionnez une procédure renvoyant des données, JBuilder tente de générer la syntaxe d’échappement correcte pour l’appel de la procédure. Il peut être néanmoins nécessaire de modifier l’instruction générée automatiquement afin qu’elle corresponde exactement à la syntaxe de votre serveur. Pour d’autres bases de données, seul le nom de la procédure est inséré depuis la boîte de dialogue de sélection d’une procédure.

Si la procédure attend des paramètres, vous devez les faire correspondre avec les noms de colonne des paramètres.

• Saisir une séquence d’échappement de procédure JDBC.

Pour ce faire, utilisez les formatage suivants :

{call PROCEDURENAME (?,?,?,...)} pour les procédures

{?= call FUNCTIONNAME (?,?,?,...)} pour les fonctions

Page 96: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

6-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P r o c é d u r e s s t o c k é e s : t r u c s & a s t u c e s

• Saisir une syntaxe spécifique au serveur pour les appels de procédure.

Quand un serveur reconnaît une syntaxe distincte pour les appels de procédure, vous pouvez utiliser cette syntaxe au lieu d’une procédure stockée existante ou d’une séquence d’échappement de procédure JDBC. Ainsi, une syntaxe spécifique au serveur peut avoir l’aspect suivant :

execute procedure PROCEDURENAME ?,?,?

Dans les deux derniers exemples, les indicateurs de paramètres (les points d’interrogation) peuvent être remplacés par des paramètres nommés ayant la forme :NomParam. Pour un exemple d’utilisation de paramètres nommés, voir “Utilisation de paramètres avec des procédures stockées Oracle PL/SQL”, page 6-7. Pour un exemple d’utilisation de procédures stockées InterBase, voir “Utilisation de procédures stockées InterBase”, page 6-7.

Création manuelle des tables et procédures de ce tutoriel

Les procédures stockées sont des groupes d’instructions SQL. Ces instructions peuvent facilement être écrites et compilées dans JBuilder ; il faut créer un fichier Java, saisir les instructions et compiler le code. Si vous n’avez pas accès au projet exemple SimpleStoredProcedure ou si vous souhaitez apprendre à créer une table et des procédures d’insertion, de modification et de suppression dans JBuilder, exécutez les étapes suivantes :

1 Sélectionnez Fichier|Tout fermer dans le menu.

2 Choisissez Fichier|Nouveau projet.

Cela ouvre l’expert projet.

3 Dans l’expert projet, changez le répertoire et le nom du projet en SimpleStoredProcedure/ProcSetUp/ProcSetUp.jpx.

4 Choisissez Fichier|Nouveau et double-cliquez sur l’icône Class dans la page Général de la galerie d’objets.

5 Changez le Nom de classe en ProcSetUp dans l’expert Classe, et cliquez sur OK pour créer le fichier ProcSetUp.java.

6 Modifiez le code dans la fenêtre Source ou faites un copier-coller depuis l’aide en ligne afin d’obtenir le code suivant :

package ProcSetUp;

import com.borland.dx.dataset.*;import com.borland.dx.sql.dataset.*;import java.sql.*;

public class CreateProcedures {

Page 97: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s 6-5

P r o c é d u r e s s t o c k é e s : t r u c s & a s t u c e s

public static void main(String[] args) throws DataSetException {Database database1 = new Database(); database1.setConnection(new ConnectionDescriptor("jdbc:interbase://

<adresse IP ou localhost>/<chemin du fichier .gdb>", "SYSDBA","masterkey", false, "interbase.interclient.Driver"));

try { database1.executeStatement("DROP PROCEDURE GET_COUNTRIES"); } catch (Exception ex) {}; try { database1.executeStatement("DROP PROCEDURE UPDATE_COUNTRY"); } catch (Exception ex) {}; try { database1.executeStatement("DROP PROCEDURE INSERT_COUNTRY"); } catch (Exception ex) {}; try { database1.executeStatement("DROP PROCEDURE DELETE_COUNTRY"); } catch (Exception ex) {}; database1.executeStatement(getCountriesProc); database1.executeStatement(updateProc); database1.executeStatement(deleteProc); database1.executeStatement(insertProc); database1.closeConnection(); }

static final String getCountriesProc =

"CREATE PROCEDURE GET_COUNTRIES RETURNS ( /r/n"+" COUNTRY VARCHAR(15), /r/n"+" CURRENCY VARCHAR(10) ) AS /r/n"+"BEGIN /r/n"+" FOR SELECT c.country, c.currency /r/n"+" FROM country c /r/n"+" INTO :COUNTRY,:CURRENCY /r/n"+" DO /r/n"+"BEGIN /r/n"+" SUSPEND; /r/n"+" END /r/n"+"END;";

static final String updateProc =

"CREATE PROCEDURE UPDATE_COUNTRY( /r/n"+" OLD_COUNTRY VARCHAR(15), /r/n"+" NEW_COUNTRY VARCHAR(15), /r/n"+" NEW_CURRENCY VARCHAR(20) ) AS /r/n"+"BEGIN /r/n"+" UPDATE country /r/n"+" SET country = :NEW_COUNTRY /r/n"+" WHERE country = :OLD_COUNTRY; /r/n"+"END;";

static final String insertProc =

Page 98: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

6-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s s p é c i f i q u e s à u n f o u r n i s s e u r

"CREATE PROCEDURE INSERT_COUNTRY( /r/n"+" NEW_COUNTRY VARCHAR(15), /r/n"+" NEW_CURRENCY VARCHAR(20) ) AS /r/n"+"BEGIN /r/n"+" INSERT INTO country(country,currency) /r/n"+" VALUES (:NEW_COUNTRY,:NEW_CURRENCY); /r/n"+"END;";

static final String deleteProc =

"CREATE PROCEDURE DELETE_COUNTRY( /r/n"+" OLD_COUNTRY VARCHAR(15) ) AS /r/n"+"BEGIN /r/n"+" DELETE FROM country /r/n"+" WHERE country = :OLD_COUNTRY; /r/n"+"END;";}

7 Cliquez avec le bouton droit sur ProcSetUp.java dans le volet projet et choisissez Exécuter.

Cette étape crée les tables et procédures sur le serveur.

8 Sélectionnez Fichier|Fermer dans le menu.

Il s’agit d’une procédure très simple. Pour avoir des conseils sur l’écriture de procédures stockées plus complexes, consultez la documentation de votre base de données.

Utilisation des procédures stockées spécifiques à un fournisseurCette section contient des informations qui vous aideront à utiliser des procédures stockées avec des fournisseurs de bases de données spécifiques. Ces informations servent à l’utilisation des types de procédures stockées suivants :

• Procédures stockées et fonctions définies par l’utilisateur pour JDataStore

• Procédures stockées InterBase

• Procédures stockées Oracle PL/SQL

• Procédures stockées Sybase

Page 99: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s 6-7

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s s p é c i f i q u e s à u n f o u r n i s s e u r

Utilisation avec JDataStore de procédures stockées et de fonctions définies par l’utilisateur

JDataStore 6 prend en charge l’utilisation des procédures stockées et des fonctions définies par l’utilisateur (FDU) Les procédures stockées et les FDU doivent être ajoutées au CLASSPATH du processus serveur. JDataStore. Les procédures stockées et les FDU pour JDataStore doivent être écrites en Java. Les FDU sont des fonctions définies par l’utilisateur destinées à servir dans les sous-expressions d’une instruction SQL.

Pour plus d’informations, comprenant les instructions d’utilisation et des exemples, voir “FDU et procédures stockées” dans le Guide du développeur JDataStore.

Utilisation de procédures stockées InterBase

Dans InterBase, les procédures SELECT peuvent être utilisées pour générer un DataSet. Dans la base de données exemple InterBase, employee.gdb, la procédure stockée ORG_CHART en est une illustration. Pour appeler cette procédure depuis JBuilder, entrez la syntaxe suivante dans la zone Instruction SQL ou Escape de procédure stockée de l’éditeur de la propriété procedure ou dans votre code :

select * from ORG_CHART

Pour des exemples de procédures stockées InterBase plus complexes, utilisez le pilote de base de données pour parcourir les procédures de ce serveur. ORG_CHART est un exemple intéressant. Il renvoie un ensemble de résultats combinant les données de plusieurs tables. ORG_CHART est écrit avec le langage InterBase de procédures et de déclencheurs qui contient les instructions SQL de manipulation de données, des structures de contrôle et la gestion des exceptions.

Les paramètres de sortie de ORG_CHART deviennent des colonnes de l’ensemble de données produit.

Voir la documentation du serveur InterBase pour davantage d’informations sur l’écriture de procédures stockées InterBase, ou “Création manuelle des tables et procédures de ce tutoriel”, page 6-4, pour un exemple de procédure stockée écrite en InterBase.

Utilisation de paramètres avec des procédures stockées Oracle PL/SQL

Habituellement, un ProcedureDataSet ne peut être rempli par des procédures stockées Oracle PL/SQL que si vous utilisez les pilotes JDBC Oracle de type 2 ou 4. La procédure stockée qui est appelée doit être une fonction dont le type de retour est un CURSOR REF.

Page 100: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

6-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s s p é c i f i q u e s à u n f o u r n i s s e u r

Respectez les principes suivants pour utiliser les procédures stockées Oracle dans JBuilder :

1 Définissez la fonction en utilisant PL/SQL.

Le code suivant est un exemple de description de fonction défini en PL/SQL renvoyant un CURSOR REF. Cet exemple suppose l’existence d’une table nommée MyTable1.

create or replace function MyFct1(INP VARCHAR2) RETURN rcMyTable1 as type rcMyTable1 is ref cursor return MyTable1%ROWTYPE; rc rcMyTable;begin open rc for select * from MyTable1; return rc;end;

2 Définissez un ParameterRow à transmettre au ProcedureDescriptor.

Le paramètre de saisie INP doit être spécifié dans le ParameterRow, mais pas la valeur spéciale renvoyée comme CURSOR REF. JBuilder utilise la valeur renvoyée pour remplir de données le ProcedureDataSet. Le code suivant illustre la manière d’employer un ParameterRow.

ParameterRow row = new ParameterRow();

row.addColumn( "INP", Variant.STRING, ParameterType.IN);

row.setString("INP", "Input Value");

String proc = "{?=call MyFct1(?)}";

3 Sélectionnez le fichier cadre dans le volet projet puis sélectionnez l’onglet Conception.

4 Placez dans le volet contenu un composant ProcedureDataSet de l’onglet Data Express.

5 Sélectionnez la propriété procedure afin d’afficher la boîte de dialogue ProcedureDescriptor.

6 Sélectionnez database1 dans la liste déroulante Base de données.

7 Entrez la syntaxe d’échappement suivante dans la zone Instruction SQL ou Escape de procédure stockée ou dans le code :

{?=call MyFct1(?)}

8 Sélectionnez l’onglet Paramètres de la boîte de dialogue. Sélectionnez le ParameterRow défini en tant que row.

Consultez la documentation de votre serveur Oracle pour davantage d’informations sur le langage Oracle PL/SQL.

Page 101: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s 6-9

E c r i t u r e d ’ u n f o u r n i s s e u r d e d o n n é e s p e r s o n n a l i s é

Utilisation des procédures stockées Sybase

Les procédures stockées créées sur des serveurs Sybase le sont en mode transaction chaînée. Pour que les procédures stockées Sybase puissent être appelées en tant que partie d’un ProcedureResolver, elles doivent être modifiées pour s’exécuter en mode transaction non chaînée. Pour ce faire, utilisez la procédure système sp_procxmode de Sybase pour changer le mode de transaction en “anymode” ou “unchained”. Pour plus de détails, voir la documentation Sybase.

Exemple d’application avec des procédures stockées spécifiques au serveur de la base de données

Une application exemple, située dans le répertoire <jbuilder>/samples/DataExpress/ServerSpecificProcedures, contient un exemple de code intégrant des procédures stockées pour les bases de données Sybase, InterBase et Oracle.

Ecriture d’un fournisseur de données personnaliséJBuilder simplifie l’écriture d’un fournisseur personnalisé de données quand vous utilisez une source de données personnalisée comme SAP, BAAN, IMS, OS/390, CICS, VSAM, DB2, etc.

La lecture et l’actualisation des données d’une source de données comme un serveur Oracle ou Sybase sont isolées dans deux principales interfaces : fournisseurs et résolveurs. Les fournisseurs remplissent un ensemble de données à partir de la source de données. Les résolveurs écrivent en retour les modifications dans la source de données. Séparer nettement l’acquisition et la résolution des données en deux interfaces facilite la création de nouveaux composants d’acquisition/résolution pour de nouvelles sources de données. JBuilder fournit des implémentations pour les pilotes JDBC standard qui donnent accès à des bases de données courantes comme Oracle, Sybase, Informix, InterBase, DB2, MS SQL Server, Paradox, dBASE, FoxPro, Access, et d’autres bases de données répandues. Notamment,

• OracleProcedureProvider• ProcedureProvider• ProcedureResolver• QueryProvider• QueryResolver

Vous pouvez créer des implémentations de composants fournisseur/résolveur personnalisés pour EJB, des serveurs d’applications, SAP, BAAN, IMS, CICS, etc.

Page 102: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

6-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E c r i t u r e d ’ u n f o u r n i s s e u r d e d o n n é e s p e r s o n n a l i s é

Un projet exemple ayant un fournisseur et un résolveur personnalisés se trouve dans le répertoire /samples/DataExpress/CustomProviderResolver de votre installation de JBuilder. Le fichier exemple TestFrame.java est une application avec un cadre contenant un JdbTable et un JdbNavToolBar. Ces deux composants visuels sont connectés à un composant TableDataSet dont les données sont fournies par un fournisseur personnalisé (défini dans le fichier ProviderBean.java), et sont enregistrées avec un résolveur personnalisé (défini dans le fichier ResolverBean.java). Cette application exemple lit les données et enregistre les modifications dans le fichier texte data.txt, un fichier simple, non délimité. La structure de data.txt est décrite dans le fichier interface DataLayout.java.

Cette rubrique décrit les fournisseurs de données personnalisés et explique comment ils peuvent être utilisés comme fournisseurs d’un TableDataSet et de tout DataSet dérivé de TableDataSet. La méthode principale à implémenter est provideData(com.borland.dx.dataset.StorageDataSet dataSet, boolean toOpen). Cette méthode accède aux métadonnées et charge les données réelles dans l’ensemble de données.

Obtention des métadonnées

Les métadonnées sont des informations sur les données. Par exemple, le nom de la colonne, le nom de la table, si la colonne fait partie de l’identificateur de ligne unique, sa précision, son échelle, etc. Ces informations sont généralement obtenues depuis la source de données. Les métadonnées sont ensuite stockées dans les propriétés Column des composants pour chaque colonne du StorageDataSet et dans le StorageDataSet lui-même.

Lorsque vous obtenez des données d’une source de données et que vous les stockez dans une des sous-classes du StorageDataSet, vous récupérez généralement les métadonnées en plus des lignes de données. Par exemple, la première fois que vous demandez à un QueryDataSet d’exécuter une requête, il en exécute deux par défaut : une pour découvrir les métadonnées et l’autre pour extraire les lignes de données que votre application affichera et manipulera. Les requêtes suivantes lancées par cette instance du QueryDataSet ne récupéreront que les données. Une fois que les métadonnées sont découvertes, le composant QueryDataSet crée automatiquement les objets Column à l’exécution, dès qu’ils sont nécessaires. Un objet Column est créé pour chaque colonne de la requête qui n’est pas encore dans le QueryDataSet. Chaque Column obtient ses propriétés des métadonnées, comme columnName, tableName, rowId, searchable, precision, scale, etc.

Quand vous implémentez la méthode abstraite provideData() à partir de la classe Provider, des colonnes issues des données fournies peuvent avoir besoin d’être ajoutées à votre DataSet. Cela peut être fait par l’appel de la

Page 103: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s p r o c é d u r e s s t o c k é e s 6-11

E c r i t u r e d ’ u n f o u r n i s s e u r d e d o n n é e s p e r s o n n a l i s é

méthode ProviderHelp.initData() depuis votre implémentation de provideData(). Votre fournisseur doit construire un tableau de colonnes à passer à la méthode ProviderHelp.initData(). Voici la liste des propriétés Column qu’un Provider doit initialiser :

• columnName• dataType

et, de façon facultative,

• sqlType• precision (utilisée par DataSet)• scale (utilisée par DataSet)• rowId• searchable• tableName• schemaName• serverColumnName

Les propriétés facultatives sont utiles lorsque vous enregistrez en retour vos modifications dans la source de données. Les propriétés precision et scale sont également utilisées par les composants DataSet à des fins de contrainte et d’affichage.

Appel de initDataLes arguments de la méthode ProviderHelp.initData(com.borland.dx.dataset.StorageDataSet dataSet, com.borland.dx.dataset.Column[], boolean, boolean, boolean) sont expliqués ci-après.

• dataSet est le StorageDataSet à qui nous fournissons les données

• metaDataColumns est le tableau de Column créé avec les propriétés qui n’ont pas besoin d’être ajoutées/intégrées aux colonnes existant déjà dans le DataSet

• updateColumns spécifie s’il faut intégrer les colonnes dans des colonnes persistantes existantes de même columnName

• keepExistingColumns spécifie s’il faut garder les colonnes non persistantes

Si keepExistingColumns est true, les colonnes non persistantes sont également retenues. Plusieurs propriétés du tableau de colonnes sont intégrées aux colonnes existantes du StorageDataSet qui ont la même valeur de la propriété name. Si le nombre, le type et la position des colonnes sont différents, cette méthode peut fermer le StorageDataSet associé.

La propriété metaDataUpdate du StorageDataSet est examinée lors de l’appel de ProviderHelp.initData. Cette propriété contrôle quelles propriétés de Column redéfinissent les propriétés des colonnes persistantes présentes dans le TableDataSet avant l’appel de ProviderHelp.initData. Les valeurs correctes pour cette propriété sont définies dans l’interface MetaDataUpdate.

Page 104: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

6-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E c r i t u r e d ’ u n f o u r n i s s e u r d e d o n n é e s p e r s o n n a l i s é

Obtention des données réelles

Certaines méthodes DataSet ne peuvent pas être utilisées quand la méthode Provider.provideData a été appelée pour ouvrir un DataSet, pendant que le DataSet est en train d’être ouvert, en particulier la méthode StorageDataSet.insertRow().

Afin de charger les données, utilisez la méthode StorageDataSet.startLoading. Cette méthode renvoie un tableau d’objets Variant pour toutes les colonnes d’un DataSet. Vous définissez les valeurs dans le tableau (les valeurs ordinales des colonnes sont renvoyées par la méthode ProviderHelp.initData), puis chargez chaque ligne en appelant la méthode StorageDataSet.loadRow() puis vous terminez en appelant la méthode StorageDataSet.endLoading().

Conseils pour la conception d’un fournisseur de données personnaliséUn fournisseur bien conçu reconnaît les propriétés maxRows et maxDesignRows d’un StorageDataSet. Les valeurs de ces propriétés sont :

Pour déterminer si la méthode provideData() a été appelée pendant la conception, appelez java.beans.Beans.isDesignTime().

Explication de la méthode provideData() dans des ensembles de données maître-détailLa méthode Provider.provideData() est appelée

• la première fois que le StorageDataSet est ouvert (toOpen est true)

• quand StorageDataSet.refresh() est appelée

• quand un ensemble de données détail dont la propriété fetchAsNeeded vaut true a besoin d’être chargé

Quand un ensemble de données détail avec la propriété fetchAsNeeded à true a besoin d’être chargé, le fournisseur ignore provideData pendant l’ouverture des données, ou fournit seulement les métadonnées. Le fournisseur utilise également les valeurs des champs masterLink pour fournir les lignes d’un ensemble de données détail spécifique.

Valeur Description

0 fournit seulement les métadonnées

-1 fournit toutes les données

n fournit un maximum de n lignes

Page 105: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

M a n i p u l a t i o n d e s c o l o n n e s 7-1

C h a p i t r e

7Chapitre7Manipulation des colonnes

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Une colonne est une collection d’informations de même type, par exemple une collection de numéros de téléphone ou d’intitulés de postes professionnels. Une collection de composants colonne (Column) est gérée par un composant StorageDataSet.

Un objet colonne peut être créé explicitement dans du code ou généré automatiquement quand vous instanciez une sous-classe de StorageDataSet, par exemple un composant QueryDataSet lors de l’exécution d’une requête. Chaque objet Column possède des propriétés qui décrivent ou gèrent la colonne de données. Certaines des propriétés d’une colonne contiennent des métadonnées (voir la définition plus bas) généralement obtenues de la source de données. D’autres propriétés contrôlent l’aspect et l’édition de la colonne pour les composants orientés données.

Remarque Les noms de classes abstraites ou de classes supérieures sont fréquemment utilisés pour désigner toutes leurs sous-classes. Par exemple, une référence à un objet StorageDataSet désigne une ou, selon les cas, toutes ses sous-classes : QueryDataSet, TableDataSet, ProcedureDataSet et DataSetView.

Présentation des propriétés et métadonnées de colonneLa plupart des propriétés d’une colonne peuvent être modifiées sans nécessité de fermer puis de réouvrir le DataSet. Cependant, les propriétés suivantes ne peuvent être définies que si le DataSet est fermé :

• columnName• dataType• calcType• pickList• preferredOrdinal

Page 106: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

7-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P r é s e n t a t i o n d e s p r o p r i é t é s e t m é t a d o n n é e s d e c o l o n n e

Le concepteur d’interface utilisateur fera des mises à jour dynamiques pour les propriétés d’affichage du composant Column, comme color, width et caption. Pour plus d’informations sur l’obtention des métadonnées, voir “Obtention des métadonnées”, page 6-10. Pour plus d’informations sur l’obtention des données réelles, voir “Obtention des données réelles”, page 6-12.

Propriétés d’une colonne qui ne sont pas des métadonnées

Les colonnes ont d’autres propriétés qui ne sont pas obtenues des métadonnées et que vous pouvez initialiser comme caption, editMask, displayMask, les couleurs background et foreground ou alignment. Généralement, ce type de propriété est conçu pour contrôler l’aspect que prend par défaut l’élément de données dans les composants orientés données ou pour contrôler comment il peut être modifié par l’utilisateur. Les propriétés définies dans une application sont généralement de type non métadonnées.

Visualisation des informations de colonnes dans le concepteur de colonne

Utiliser le concepteur de colonne est une des façons d’examiner les informations relatives aux propriétés des colonnes. Le concepteur de colonne affiche les informations pour les propriétés sélectionnées, par exemple le type de données de la colonne, dans une table navigable. Modifier ou définir une propriété dans le concepteur de colonne rend persistante cette colonne. Les propriétés des colonnes peuvent être modifiées dans le concepteur de colonne ou dans l’inspecteur. Vous pouvez modifier les propriétés à afficher dans le concepteur de colonne en cliquant sur le bouton Propriétés.

Pour afficher le concepteur de colonne,

1 Ouvrez un projet incluant un objet DataSet.

Dans notre exemple, ouvrez /samples/DataExpress/QueryProvider/QueryProvider.jpx dans le répertoire où est installé JBuilder.

2 Double-cliquez sur le fichier Frame1.java dans le volet projet et cliquez sur l’onglet Conception en bas du volet droit de l’AppBrowser.

3 Cliquez avec le bouton droit sur l’objet queryDataSet1 dans le volet contenu, choisissez Activer le concepteur dans le menu contextuel.

Page 107: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

M a n i p u l a t i o n d e s c o l o n n e s 7-3

P r é s e n t a t i o n d e s p r o p r i é t é s e t m é t a d o n n é e s d e c o l o n n e

Cela affiche le concepteur de colonne pour l’ensemble de données présent dans la fenêtre de conception. Pour la table exemple EMPLOYEE, le concepteur de colonne ressemble à ce qui suit :

Pour définir une propriété d’une colonne, sélectionnez cette Column et entrez, ou sélectionnez, la nouvelle valeur de la propriété. L’inspecteur reflète les propriétés (et les événements) de la colonne sélectionnée. Par exemple,

1 Cliquez sur le bouton Propriétés pour ouvrir la boîte de dialogue Propriétés à afficher.

2 Cochez la propriété min pour qu’elle s’affiche dans le concepteur de colonne et cliquez sur OK.

3 Faites défiler jusqu’à la colonne min, entrez la date du jour dans le champ HIRE_DATE.

4 Appuyez sur Entrée pour modifier la valeur.

Pour fermer le concepteur de colonne, sélectionnez n’importe quel composant de l’interface utilisateur dans le volet contenu, ou cliquez avec le bouton droit sur un autre composant, et sélectionnez Activer le concepteur. En d’autres termes, la seule façon de fermer un concepteur est d’en ouvrir un autre.

Voir la rubrique “Garantie de la persistance des données”, page 12-25, pour plus d’informations sur l’utilisation du concepteur de colonne.

Bouton Créer une classe RowIterator

Le générateur de RowIterator du concepteur de colonne peut servir à créer une nouvelle classe RowIterator ou à mettre à jour une classe RowIterator existante pour un DataSet. Il prend en compte la propriété columnName de toutes les Columns du DataSet et il génère des méthodes get et set pour chacune d’entre elles.

Page 108: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

7-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P r é s e n t a t i o n d e s p r o p r i é t é s e t m é t a d o n n é e s d e c o l o n n e

La sélection du bouton générateur de RowIterator ouvre une boîte de dialogue qui offre des fonctionnalités d’itération allégées (faible consommation de mémoire et liaison rapide) garantissant un accès statique aux colonnes avec sécurité des types.

Les options de la boîte de dialogue RowIterator présentent les fonctions suivantes :

Pour davantage d’informations sur les RowIterator, voir la Référence de la bibliothèque des composants DataExpress.

Utilisation du concepteur de colonne pour rendre persistantes des métadonnées

Choisissez le bouton Continuer toutes les métadonnées dans le concepteur de colonne afin de rendre persistantes toutes les métadonnées nécessaires à l’ouverture d’un QueryDataset à l’exécution.

Le code source est modifié avec les initialisations suivantes :

• La requête du QueryDataSet est modifiée pour inclure les colonnes d’identification de ligne.

• La propriété metaDataUpdate de QueryDataSet prend la valeur NONE.

• Les propriétés tableName, schemaName et resolveOrder du QueryDataSet sont initialisées si nécessaire.

Tableau 7.1 Boîte de dialogue Création d’un RowIterator

Option Description

Etendre RowIterator Lorsque cette option est définie, la classe générée étendra RowIterator. Cela exposera toutes les méthodes de RowIterator. Si l’option n’est pas sélectionnée, sera créée une nouvelle classe avec un membre RowIterator qui est délégué pour toutes les opérations. L’intérêt à ne pas étendre RowIterator est que votre classe itérateur peut contrôler ce qui sera exposé. L’intérêt à étendre RowIterator est qu’il y a moins de code à générer car les méthodes de lien et de navigation sont héritées et de n’ont pas besoin d’être déléguées.

Retirer les soulignés ; mettre en majuscules la lettre suivante

Cela affecte la façon dont sont générés les noms des méthodes get et set à partir de la propriété columnName de la Column. Si cette option est définie, les soulignés sont retirés et le caractère qui suivait le souligné avant le retrait passe en majuscule.

Générer les méthodes de lien Génère les méthodes déléguées pour appeler les méthodes de lien du RowIterator imbriqué.

Générer les méthodes de navigation

Génère les méthodes déléguées pour appeler les méthodes de navigation du RowIterator imbriqué.

Page 109: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

M a n i p u l a t i o n d e s c o l o n n e s 7-5

P r é s e n t a t i o n d e s p r o p r i é t é s e t m é t a d o n n é e s d e c o l o n n e

• Toutes les colonnes deviennent persistantes avec diverses propriétés initialisées. Ces propriétés sont precision, scale, rowId, searchable, tableName, schemaName, hidden, serverColumnName et sqlType.

JBuilder extrait les métadonnées automatiquement. Etant donné que certains pilotes JDBC sont lents pour répondre aux demandes de métadonnées, vous pouvez rendre les métadonnées persistantes et indiquer à DataExpress de ne pas les extraire. Si JBuilder paramètre ceci à la conception et génère le code nécessaire pour l’exécution, les performances sont améliorées.

Voir aussi

• “Persistance des métadonnées d’une requête”, page 5-11

Utilisation du concepteur de colonne pour rendre dynamiques des métadonnées

Avertissement Appuyer sur le bouton Rendre toutes les métadonnées dynamiques SUPPRIME LE CODE du fichier source. Cela retirera tout le code des définitions des propriétés mentionnées dans la rubrique précédente, ainsi que toutes les définitions des propriétés concernant les métadonnées énoncées ci-dessus. En revanche, d’autres propriétés, comme editMask, ne sont pas modifiées.

Remarque Pour actualiser une requête après une modification de la table sur le serveur, vous devez tout d’abord rendre dynamiques les métadonnées puis les rendre persistantes afin d’utiliser les nouveaux index créés dans la table de la base de données.

Visualisation des informations des colonnes dans le pilote de base de données

Le pilote de base de données est un navigateur de base de données entièrement Java, vous permettant de modifier les données. Il présente les méta-informations basées sur JDBC dans une fenêtre à deux volets. Le volet gauche contient une arborescence qui affiche de façon hiérarchique un ensemble de bases de données et ses tables, vues, procédures stockées et métadonnées associées. Le volet droit affiche sur plusieurs pages des informations qui décrivent chaque nœud de l’arborescence.

Page 110: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

7-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P r é s e n t a t i o n d e s p r o p r i é t é s e t m é t a d o n n é e s d e c o l o n n e

Pour afficher le pilote de base de données, sélectionnez Outils|Pilote de base de données dans le menu JBuilder.

Lorsqu’une URL de base de données est ouverte, vous pouvez développer l’arborescence pour afficher les objets enfant. Les colonnes sont les objets enfant d’une table particulière dans la base de données. Comme dans la figure précédente, lorsque l’objet Column est sélectionné pour une table, la page Résumé du volet droit contient la liste des colonnes avec leurs types de données, tailles et autres.

Sélectionnez une colonne dans le volet gauche pour voir uniquement les informations concernant ce champ, comme dans la figure ci-dessous.

Pour avoir plus d’informations sur l’utilisation du pilote de base de données, voir l’aide qui lui est consacrée.

Page 111: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

M a n i p u l a t i o n d e s c o l o n n e s 7-7

O p t i m i s a t i o n d ’ u n e r e q u ê t e

Optimisation d’une requêteCette section explique comment utiliser les colonnes pour améliorer les performances des requêtes.

Définition des propriétés d’une colonne

Les propriétés d’un objet Column peuvent être définies via les outils de conception visuelle de JBuilder ou, manuellement par du code. Toute colonne définie ou modifiée en utilisant les outils de conception visuelle devient une colonne persistante.

Définition des propriétés des colonnes en utilisant les outils de conception visuelle de JBuilderL’inspecteur permet de manipuler les propriétés d’un objet Column. Pour affecter les propriétés d’une colonne :

1 Ouvrez (ou créez) un projet contenant l’objet StorageDataSet que vous voulez manipuler. Si vous créez un nouveau projet, vous pouvez suivre l’exemple donné dans “Interrogation d’une base de données”, page 5-2.

2 Ouvrez le concepteur d’interface utilisateur en double-cliquant sur l’objet conteneur cadre dans le volet projet, puis en cliquant sur l’onglet Conception de l’AppBrowser.

3 Dans le volet contenu, sélectionnez le composant StorageDataSet.

4 Cliquez sur l’icône d’extension à côté du StorageDataSet pour afficher ses colonnes.

5 Sélectionnez l’objet Column que vous voulez manipuler. L’inspecteur affiche les propriétés et événements de la colonne. Définissez les propriétés de votre choix.

Définition des propriétés dans le codePour affecter manuellement, dans votre code source, les propriétés d’une ou de plusieurs colonnes d’un composant StorageDataSet :

1 Fournissez des données au StorageDataSet.

Par exemple, exécutez une requête en utilisant un composant QueryDataSet. Voir “Interrogation d’une base de données”, page 5-2, pour voir un exemple.

2 Obtenez un tableau de références aux objets Column existants dans le StorageDataSet en appelant la méthode getColumn(java.lang.String) du ReadRow.

Page 112: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

7-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

O p t i m i s a t i o n d ’ u n e r e q u ê t e

3 Identifiez la ou les colonnes du tableau que vous voulez utiliser en lisant leurs propriétés, par exemple en utilisant la propriété getColumnName() du composant Column.

4 Affectez les propriétés des colonnes appropriées.

Remarque Si vous voulez que l’initialisation de la propriété soit conservée à la prochaine lecture des données, affectez la valeur true à la propriété persist de la colonne. Ces étapes sont décrites dans les chapitres suivants.

Colonnes persistantes

Une colonne persistante est un objet Column qui faisait déjà partie d’un StorageDataSet et dont la propriété persist a été définie à true avant la fourniture de données. Si la propriété persist est définie après la fourniture des données, vous devez exécuter une autre commande setQuery avec un nouveau queryDescriptor, pour que l’application reconnaisse la persistance des colonnes. Un objet Column persistant permet de conserver le paramétrage des propriétés de l’objet Column durant une opération de fourniture de données. Une colonne persistante ne provoque pas le gel des données des lignes pour cette colonne durant les opérations de fourniture de données.

Normalement, un objet StorageDataSet crée automatiquement de nouveaux objets Column pour chaque colonne trouvée dans les données fournies par la source de données. Il ne tient pas compte des objets Column ajoutés explicitement au préalable ou créés automatiquement pour un lot précédent de données. Cet abandon des objets Column antérieurs peut provoquer la perte du paramétrage de propriétés de l’ancien objet Column que vous vouliez conserver.

Pour éviter cela, marquez une colonne comme persistante en affectant la valeur true à sa propriété persist. Quand une colonne est persistante, l’objet Column n’est pas abandonné lorsque de nouvelles données sont fournies à l’objet StorageDataSet. Au contraire, l’objet Column existant est ré-utilisé pour contrôler la même colonne dans les données nouvellement fournies. La correspondance de colonne se base sur le nom de colonne.

Toute colonne définie ou modifiée en utilisant les outils de conception visuelle devient une colonne persistante. Les colonnes persistantes sont traitées plus en détail dans “Garantie de la persistance des données”, page 12-25. Vous pouvez créer 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 définir la colonne comme persistante avant d’obtenir les données de la source ; vous perdriez sinon toutes les propriétés de la colonne lors de la lecture des nouvelles données. La

Page 113: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

M a n i p u l a t i o n d e s c o l o n n e s 7-9

O p t i m i s a t i o n d ’ u n e r e q u ê t e

propriété persist est initialisée automatiquement par la méthode setColumns.

Remarque Le concepteur d’interface utilisateur appelle la méthode StorageDataSet.setColumns() pour manipuler des colonnes. Si vous voulez charger et modifier votre application dans le concepteur d’interface utilisateur, utilisez la méthode setColumns afin que les colonnes soient reconnues à la conception. A l’exécution, il n’y a pas de différences entre setColumns et addColumn.

Combinaison de métadonnées dynamiques et de colonnes persistantes

Lors de la phase de lecture des données, un objet StorageDataSet commence, si c’est possible, par obtenir des métadonnées de la source de données. Ces métadonnées sont utilisées pour actualiser les éventuelles colonnes persistantes et pour créer les autres colonnes nécessaires. La propriété metaDataUpdate de la classe StorageDataSet contrôle la portée de l’actualisation des métadonnées effectuées sur les colonnes persistantes.

Suppression des colonnes persistantes

Cette section décrit comment annuler la persistance des colonnes afin qu’une requête modifiée ne renvoie plus les colonnes (non voulues) d’un StorageDataSet.

Lorsque vous disposez d’un QueryDataSet ou d’un TableDataSet avec des colonnes persistantes, vous déclarez que ces colonnes existent dans le DataSet résultant indépendamment de leur existence dans la source de données correspondante. Mais qu’advient-il si vous ne voulez plus de ces colonnes persistantes ?

Lorsque vous modifiez la chaîne de requête d’un QueryDataSet, vos anciennes colonnes persistantes ne sont pas perdues. Les nouvelles colonnes issues de l’exécution de la requête sont ajoutées à votre liste de colonnes. Vous pouvez rendre persistantes ces nouvelles colonnes en définissant certaines de leurs propriétés.

Remarque Lorsque vous étendez un StorageDataSet en cliquant sur son icône d’extension dans le volet contenu, la liste des colonnes ne change pas automatiquement lorsque vous modifiez la chaîne de requête. Pour rafraîchir la liste des colonnes en fonction des résultats de la requête modifiée, double-cliquez sur le QueryDataSet dans le volet contenu. Cela exécute de nouveau la requête et ajoute toute nouvelle colonne trouvée dans la requête modifiée.

Pour supprimer une colonne persistante inutile, sélectionnez-la dans le volet contenu et appuyez sur la touche Suppr. Vous pouvez aussi

Page 114: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

7-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

O p t i m i s a t i o n d ’ u n e r e q u ê t e

sélectionner la colonne dans le concepteur de colonne et cliquer sur le bouton Supprimer dans la barre d’outils. Les actions suivantes sont déclenchées :

• La colonne est marquée comme non persistante ;

• Tout code qui définit les propriétés de cette colonne est supprimé ;

• Toute logique de gestionnaire d’événement placée sur cette colonne est retirée.

Pour vérifier qu’une colonne persistante supprimée ne fait plus partie du QueryDataSet, double-cliquez sur l’ensemble de données dans le volet contenu. Cela ré-exécute la requête et affiche toutes les colonnes dans le QueryDataSet résultant.

Utilisation de colonnes persistantes pour ajouter des colonnes vides à un ensemble de donnéesVous pouvez, dans certains cas, ajouter au composant StorageDataSet une ou plusieurs colonnes qui ne sont pas fournies par la source de données et qui ne doivent pas être résolues avec la source de données. Par exemple, vous pouvez ajouter des colonnes supplémentaires dans les circonstances suivantes ou des façons suivantes :

• Ajouter une colonne supplémentaire pour des besoins internes à l’application. Pour cacher ces colonnes à l’affichage dans les composants orientés données, affectez la valeur false à la propriété visible de Column.

• Construire un nouvel ensemble de données manuellement en ajoutant les colonnes nécessaires avant de calculer les données qui vont être placées dans ses lignes.

• Construire un nouvel ensemble de données pour une source de données personnalisée qui n’est pas gérée par les modules d’acquisition de JBuilder et ne peut donc pas fournir automatiquement de métadonnées.

Dans de tels cas, vous pouvez ajouter explicitement un objet Column à l’ensemble de données avant ou après la fourniture de données. La valeur de columnName doit être unique et ne peut dupliquer un nom déjà existant dans les données fournies. De plus, si les données sont fournies après l’ajout de la colonne, marquez la colonne comme persistante afin qu’elle ne soit pas abandonnée quand de nouvelles données 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 premières étapes de la section “Définition des propriétés des colonnes en utilisant les outils de conception visuelle de JBuilder”,

Page 115: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

M a n i p u l a t i o n d e s c o l o n n e s 7-11

O p t i m i s a t i o n d ’ u n e r e q u ê t e

page 7-7, afin d’obtenir les métadonnées des colonnes énumérées dans le volet contenu.

Vous pouvez sauter ces étapes si vous voulez ajouter des colonnes à un ensemble de données vide.

2 Sélectionnez <nouvelle colonne>.

Cette option apparaît en bas de la liste des colonnes.

3 Dans l’inspecteur, définissez la valeur de columnName, en vous assurant que la valeur saisie est différente des noms de colonne existants.

4 Affectez les autres propriétés nécessaires à cette nouvelle colonne.

JBuilder crée du code source pour un nouvel objet Column persistant et l’attache à l’ensemble de données. La nouvelle colonne existe avant même que des données soient fournies. Comme son nom est différent des noms de colonne fournis, cette colonne n’est pas remplie avec les données lors de la phase d’acquisition ; dans toutes les lignes, cette colonne contient une valeur null.

Contrôle de l’ordre des colonnes dans un ensemble de données

Lorsque des données sont fournies au StorageDataSet, il accomplit les actions suivantes :

• Supprime les colonnes non persistantes en déplaçant les colonnes persistantes vers la gauche ;

• Fusionne les colonnes des données fournies avec les colonnes persistantes. Si une colonne persistante porte le même nom et a le même type de données qu’une colonne fournie, le système considère qu’il s’agit de la même colonne ;

• Place les colonnes fournies dans l’ensemble de données dans l’ordre spécifié par la requête ou la procédure ;

• Ajoute les colonnes restantes - celles définies uniquement dans l’application - dans l’ordre défini dans la méthode setColumns() de l’ensemble de données ;

• Essaie de déplacer chaque colonne dont la propriété preferredOrdinal est définie à l’endroit spécifié. (Cela est impossible si la position définie dans la propriété preferredOrdinal est la même pour deux colonnes.)

Cela implique que :

• Les colonnes définies dans votre application mais non fournies par la requête ou la procédure apparaissent après les colonnes fournies.

Page 116: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

7-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

O p t i m i s a t i o n d ’ u n e r e q u ê t e

• Le fait de définir des propriétés sur certaines colonnes (aussi bien les colonnes fournies que les colonnes définies dans l’application), mais pas sur d’autres, ne change pas leur ordre.

• Il est possible de modifier la position d’une colonne en définissant sa propriété preferredOrdinal. Les colonnes pour lesquelles la propriété preferredOrdinal n’est pas définie conservent leur position par rapport aux autres

Page 117: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-1

C h a p i t r e

8Chapitre8Enregistrement

des modifications dans la sourcede données

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Après avoir extrait les données d’une source de données et les avoir modifiées dans le StorageDataSet, vous pouvez enregistrer les modifications dans la source de données. Toutes les modifications mémorisées dans un ensemble de données peuvent être enregistrées dans la source de données (par exemple un serveur SQL). Ce processus est appelé résolution. Un mécanisme sophistiqué de réconciliation permet de gérer les problèmes potentiels de modification.

Entre le moment où le sous-ensemble de données local est extrait d’une source de données et le moment où vous essayez d’enregistrer les données dans la source de données, diverses situations peuvent se produire et être gérées par la logique de résolution. Par exemple, au moment d’enregistrer les données, il est possible que les mêmes informations aient été modifiées sur le serveur par un autre utilisateur. La résolution doit-elle enregistrer les nouvelles informations sans en tenir compte ? Doit-elle afficher les informations modifiées sur le serveur et les comparer avec vos modifications ? Doit-elle annuler vos modifications ? Selon l’application, la logique des règles de résolution varie.

La logique intervenant dans la résolution des modifications peut être assez complexe. Des erreurs peuvent se produire lors de l’enregistrement, par exemple des violations de contrainte d’intégrité du serveur ou des conflits de résolution. Un conflit de résolution peut se produire, par exemple, lors de la suppression d’une ligne déjà supprimée ou de la modification d’une ligne déjà modifiée par un autre utilisateur. JBuilder propose une gestion par défaut de ces erreurs en positionnant l’ensemble

Page 118: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s

de données sur la ligne posant problème (si elle n’est pas supprimée) et en affichant l’erreur qui a eu lieu dans une boîte de message.

Lors de la résolution des modifications dans la source de données, ces modifications sont normalement regroupées dans ce qu’on appelle des transactions. DataExpress utilise par défaut une seule transaction pour enregistrer dans la source de données toutes les insertions, suppressions et mises à jour de l’ensemble de données. Pour disposer d’un meilleur contrôle, JBuilder permet de modifier le traitement par défaut des transactions.

DataExpress propose également un mécanisme standard de résolution composé de classes de base et d’interfaces. Vous pouvez les étendre en spécifiant une logique personnalisée de résolution si vous avez besoin d’un contrôle plus fin de la phase de résolution. Ce mécanisme générique peut également s’adapter à des sources de données non JDBC qui, généralement, ne gèrent pas l’utilisation de transactions.

Ce chapitre décrit les différents modes de résolution :

• “Enregistrement des modifications d’un QueryDataSet”, page 8-3, décrit le mécanisme de résolution standard proposé par DataExpress et son traitement par défaut des transactions.

Quand une relation maître-détail a été établie entre des ensembles de données, il faut utiliser des procédures de résolution particulières. Pour plus d’informations, voir “Enregistrement des modifications dans une relation maître-détail”, page 9-11.

• “Enregistrement des modifications dans la source de données par une procédure stockée”, page 8-6, décrit la résolution dans sa source de données des modifications apportées à un ProcedureDataSet.

• “Résolution des données de plusieurs tables”, page 8-12, indique les paramétrages nécessaires à la résolution des modifications quand une requête implique plusieurs tables.

• “Utilisation des ensembles de données avec RMI (mise en flux)”, page 8-15, propose un moyen de placer les données d’un ensemble de données dans un flux en créant un objet Java (DataSetData) contenant les données d’un ensemble de données.

• “Personnalisation de la logique de résolution par défaut”, page 8-17, décrit comment définir des règles personnalisées de résolution en utilisant le composant QueryResolver et les événements de résolution.

• “Exportation des données”, page 3-3, décrit comment exporter des données dans un fichier texte.

Page 119: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-3

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d ’ u n Q u e r y D a t a S e t

Enregistrement des modifications d’un QueryDataSetVous pouvez utiliser différentes implémentations de Resolver pour enregistrer les modifications apportées à vos sources de données. QueryDataSets utilise par défaut un QueryResolver pour enregistrer les modifications. Le résolveur par défaut peut être remplacé en définissant la propriété StorageDataSet.resolver. Quand des données sont fournies à l’ensemble de données, le StorageDataSet surveille les informations d’état des lignes (supprimée, insérée ou modifiée) pour toutes les lignes. Quand les données sont résolues dans une source de données comme un serveur SQL, les informations d’état des lignes sont utilisées pour déterminer comment les lignes sont ajoutées, retirées ou modifiées dans la table SQL. Quand une ligne a été correctement résolue, elle passe à l’état résolue (RowStatus.UPDATE_RESOLVED, RowStatus.DELETE_RESOLVED ou RowStatus.INSERT_RESOLVED). Si le StorageDataSet est une nouvelle fois résolu, les lignes déjà résolues ne sont pas prises en compte, sauf si des modifications leur ont été apportées depuis la précédente résolution.

Cette section décrit les caractéristiques du mécanisme standard de résolution proposé par le paquet DataExpress. Elle poursuit l’exemple de “Interrogation d’une base de données”, page 5-2, jusqu’à la phase de résolution pendant laquelle les modifications sont enregistrées dans la source de données.

Pour cet exemple, vous pouvez démarrer avec les fichiers exemple achevés, situés dans le répertoire /samples/DataExpress/QueryProvider ou créer l’application en suivant les étapes de “Accès aux données des exemples”, page 11-2.

“Interrogation d’une base de données”, page 5-2, a décrit la phase d’acquisition des données pendant laquelle les données sont fournies par une source de données. Ce passage expliquait comment instancier un composant QueryDataSet et les composants d’interface utilisateur qui lui sont associés, pour afficher les données extraites du JDataStore employee. Le bouton Enregistrer du JdbNavToolBar pouvait servir à enregistrer les modifications dans le fichier employee. Dans la section ci-dessous, nous ajouterons un bouton servant, lui aussi, à exécuter le code de résolution standard. Quand le bouton personnalisé ou le bouton Enregistrer de la barre d’outils est choisi, les modifications apportées au QueryDataSet sont enregistrées dans le fichier de données employee en utilisant le QueryResolver par défaut du QueryDataSet.

Page 120: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d ’ u n Q u e r y D a t a S e t

Ajout d’un bouton pour enregistrer des modifications depuis un QueryDataSet

Les fichiers achevés de l’application se trouvent dans le répertoire /samples/DataExpress/QueryResolver de votre installation JBuilder. L’application en train de s’exécuter ressemble à ceci :

Figure 8.1 Interface utilisateur pour enregistrer des modifications depuis un QueryDataSet

Pour créer cette application,

1 Créez une application de base de données simple, comme décrit dans “Accès aux données des exemples”, page 11-2.

Si vous avez déjà créé l’application de base de données simple, il vous suffit de l’ouvrir. Si vous n’avez pas terminé les étapes créant l’application, vous pouvez accéder aux fichiers du projet complet dans le répertoire /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 d’autres exemples de ce manuel utilisent comme point de départ l’application de base de données créée dans “Accès aux données des exemples”, page 11-2.

2 Sélectionnez le fichier cadre dans le volet contenu.

3 Ajoutez un composant JButton de la page Swing de la palette des composants. Définissez la propriété text du bouton par le texte Enregistrer les modifications. Reportez-vous à l’image de l’application achevée au début de cet exemple pour avoir une idée de l’emplacement des contrôles dans l’interface utilisateur.

4 Vérifiez que le bouton JButton est toujours sélectionné, puis cliquez dans l’onglet Evénements de l’inspecteur. Sélectionnez puis double-cliquez sur la méthode actionPerformed(). Cela fait passer la

Page 121: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-5

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d ’ u n Q u e r y D a t a S e t

focalisation dans l’AppBrowser du concepteur d’interface utilisateur au volet Source et affiche le squelette de la méthode actionPerformed().

Ajoutez le code suivant à la méthode actionPerformed() :

try { database1.saveChanges(queryDataSet1); System.out.println("Modifications enregistrées"); } catch(Exception ex) {// affiche l’exception de JdbStatusLabel// si l’application en contient une,// ou sinon affiche une boîte de dialogue d’erreur DBExceptionHandler.handleException(ex); }

Si vous avez utilisé d’autres noms pour les instances des objets, par exemple database1, remplacez-les en conséquence.

5 Exécutez l’application en sélectionnant Exécuter|Exécuter le projet. L’application se compile et affiche une fenêtre séparée. Les données sont affichées dans une table, avec un bouton Enregistrer les modifications, la barre d’outils et un libellé barre d’état indiquant la position de la ligne en cours et le nombre de lignes.

Si des erreurs ont lieu à la compilation, un volet apparaît indiquant les lignes de code erronées. Dans ce cas, l’erreur provient probablement du code du bouton personnalisé, vous devez donc vérifier si le code ci-dessus a été correctement saisi. Faites les corrections nécessaires et exécutez l’application.

En exécutant l’application, vous pouvez remarquer les comportements suivants :

• Utilisez le clavier, la souris ou la barre d’outils pour faire défiler les données affichées dans la table. Le libellé d’état s’actualise en conséquence.

• Vous pouvez redimensionner la fenêtre pour afficher davantage de champs ou les faire défiler en utilisant la barre de défilement horizontale.

Modifiez les données affichées dans la table en insérant, supprimant et modifiant des données. 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 données sont définies dans la table employee, la sauvegarde peut échouer en fonction des modifications effectuées. Comme d’autres modifications peuvent entraîner des erreurs, ne modifiez que les valeurs des colonnes FIRST_NAME et LAST_NAME dans les lignes existantes tant que vous n’êtes pas plus familier avec les contraintes définies sur cette table.

Page 122: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s p a r u n e p r o c é d u r e

Enregistrement des modifications dans la source de données par une procédure stockée

Vous pouvez utiliser différentes implémentations de Resolver pour enregistrer les modifications apportées à vos sources de données. QueryDataSets utilise par défaut un QueryResolver pour enregistrer les modifications. Le résolveur par défaut peut être remplacé en définissant la propriété StorageDataSet.resolver.

Cette section décrit les fonctions de résolution de base proposées par DataExpress pour les composants ProcedureDataSet. Elle développe les concepts présentés au Chapitre 6, “Utilisation des procédures stockées”, en explorant les différentes méthodes d’enregistrement des modifications dans une source de données.

Le Chapitre 18, “Tutoriel : Extraction de données à l’aide de procédures stockées”, décrit l’exécution d’une procédure stockée afin d’extraire des données. Le tutoriel crée une table sur le serveur, puis crée des procédures d’ajout, de modification et de suppression qui fournissent des informations sur la façon de résoudre les modifications dans la source. A l’aide de l’EDI de JBuilder, le tutoriel instancie un composant ProcedureDataSet avec ses composants d’interface utilisateur associés, puis affiche les données renvoyées du JDataStore dans une table. Le bouton Enregistrer du JdbNavToolBar permet d’enregistrer les modifications de données dans le fichier employee lorsque certaines propriétés ont été définies.

Dans cette section, le tutoriel d’extraction est étendu en ajoutant un mécanisme de base de résolution. Pour un composant ProcedureDataSet cela peut s’effectuer de deux manières. Les sections suivantes décrivent ces deux méthodes de manière plus détaillées.

• Un bouton activant le code de résolution de base, ou un JdbNavToolBar dont le bouton Enregistrer effectue également l’opération de résolution de requête de base. Voir “Enregistrement des modifications avec un QueryResolver”, page 8-6.

• Un ProcedureResolver nécessitant le codage spécifique d’une procédure stockée dans la base de données pour laquelle les données doivent être résolues. Vous en trouverez un exemple dans la section “Enregistrement des modifications avec un ProcedureResolver”, page 8-9.

Enregistrement des modifications avec un QueryResolver

Si la propriété resolver d’un ProcedureDataSet n’est pas définie, le résolveur par défaut est un QueryResolver qui générera des requêtes INSERT, UPDATE et DELETE pour enregistrer les modifications. Le QueryResolver

Page 123: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-7

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s p a r u n e p r o c é d u r e

requiert la définition des propriétés tableName et rowID. Cet exemple explique la procédure à suivre.

L’application complète décrite dans cet exemple est disponible sous la forme d’un projet dans le répertoire /samples/DataExpress/SimpleStoredProcedure/ de votre installation JBuilder. D’autres applications exemple utilisant des procédures stockées sur divers serveurs sont disponibles dans le répertoire /samples/DataExpress/ServerSpecificProcedures/.

Pour achever l’application et enregistrer les modifications dans la table COUNTRY :

1 Sélectionnez Fichier|Fermer si des projets sont ouverts. Sélectionnez Fichier|Ouvrir. Ouvrez le fichier projet créé dans le tutoriel du Chapitre 18, “Tutoriel : Extraction de données à l’aide de procédures stockées”. Vous allez ajouter la phase de résolution au projet existant.

Arrivé à ce stade, vous pouvez exécuter l’application, visualiser et parcourir les données. Mais pour pouvoir réellement ajouter, supprimer ou modifier des enregistrements, il faut donner davantage d’informations au QueryResolver, comme indiqué ci-dessous. Le QueryResolver est appelé par défaut à moins qu’un ProcedureResolver ne soit défini (voir “Enregistrement des modifications avec un ProcedureResolver”, page 8-9). Continuez ensuite avec les étapes suivantes :

2 Dans le volet projet, sélectionnez Cadre1.java. Sélectionnez l’onglet Conception pour activer le concepteur d’interface utilisateur.

3 Sélectionnez procedureDataSet1 dans l’arborescence des composants.

4 Affectez à la propriété tableName de procedureDataSet1 la valeur “COUNTRY” dans l’inspecteur.

5 Vérifiez que la propriété resolvable du procedureDataSet1 a pour valeur True.

6 Cliquez sur le glyphe d’extension à gauche de procedureDataSet1 dans le volet projet afin de développer les colonnes de l’ensemble de données.

7 Sélectionnez la colonne clé, appelée COUNTRY

8 Affectez à la propriété rowID de la colonne COUNTRY la valeur True.

9 Sélectionnez Exécuter|Exécuter le projet afin d’exécuter l’application.

L’application se compile et affiche une fenêtre séparée. Les données sont affichées dans la table ainsi que la barre d’outils et un libellé d’état indiquant la ligne en cours et le nombre de lignes. Vous pouvez insérer, modifier ou supprimer des enregistrements et enregistrer les modifications dans la base de données.

Page 124: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o d a g e d e p r o c é d u r e s s t o c k é e s p o u r g é r e r l a r é s o l u t i o n d e d o n n é e s

En exécutant l’application, vous pouvez remarquer les comportements suivants :

• Utilisez le clavier, la souris ou la barre d’outils pour faire défiler les données affichées dans la table. Le libellé d’état s’actualise en conséquence.

• Vous pouvez redimensionner la fenêtre pour afficher davantage de champs ou les faire défiler en utilisant la barre de défilement horizontale.

Dans cet exemple, il est possible d’utiliser un JButton avec du code pour gérer l’enregistrement à la place du JdbNavToolBar. Pour davantage d’informations à cet sujet, voir “Ajout d’un bouton pour enregistrer des modifications depuis un QueryDataSet”, page 8-4. Le contrôle bouton sélectionné dans l’arborescence des composants, choisissez l’onglet Evénements dans l’inspecteur et sélectionnez la méthode actionPerformed(), double-cliquez dans la zone valeur et ajoutez le code suivant dans la fenêtre Source :

try { database1.saveChanges(procedureDataSet1); System.out.println("Modifications enregistrées"); } catch(Exception ex) {// affiche l’exception de JdbStatusLabel// si l’application en contient une,// ou sinon affiche une boîte de dialogue d’erreur DBExceptionHandler.handleException(ex); }

Si vous avez employé des noms différents pour les instances d’objets, par exemple database1, modifiez le code en conséquence.

Codage de procédures stockées pour gérer la résolution de données

Pour utiliser un ProcedureResolver, vous devez implémenter trois procédures stockées dans la base de données et les spécifier comme propriétés du ProcedureResolver. Ces trois procédures sont :

• insertProcedure est appelée pour chaque ligne à insérer dans le DataSet. Les paramètres utilisables dans un appel d’une insertProcedure sont :

• La ligne insérée telle qu’elle apparaît dans l’ensemble de données.• Le ParameterRow optionnel dans le ProcedureDescriptor.

La procédure stockée doit être conçue pour insérer un enregistrement dans la, ou les tables appropriées en fonction des données de cette ligne. Le ParameterRow peut être utile pour un état des sorties ou des paramètres d’entrée optionnels.

Page 125: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-9

C o d a g e d e p r o c é d u r e s s t o c k é e s p o u r g é r e r l a r é s o l u t i o n d e d o n n é e s

• updateProcedure est appelée pour chaque ligne modifiée dans le DataSet. Les paramètres utilisables dans un appel d’une updateProcedure sont :

• La ligne modifiée telle qu’elle apparaît dans le DataSet.• La ligne d’origine telle qu’elle était quand les données ont été

fournies au DataSet.• Le ParameterRow optionnel dans le ProcedureDescriptor.

La procédure stockée doit être conçue pour actualiser un enregistrement dans la ou les tables appropriées en fonction des données d’origine et des données modifiées. Comme la ligne d’origine et la ligne modifiée ont les mêmes noms de colonne, la syntaxe des paramètres nommés a été étendue afin d’indiquer la ligne de données voulue. Le paramètre nommé “:ORIGINAL.CUST_ID” indique ainsi le champ CUST_ID de la ligne des données d’origine alors que “:CURRENT.CUST_ID” désigne ce même champ dans la ligne des données modifiées. De même, un paramètre “:parameter.CUST_ID” indique le champ CUST_ID dans un ParameterRow.

• deleteProcedure est appelée pour chaque ligne supprimée du DataSet. Les paramètres utilisables dans un appel d’une deleteProcedure sont :

• La ligne d’origine telle qu’elle était quand les données ont été fournies au DataSet.

• Le ParameterRow optionnel dans le ProcedureDescriptor.

La procédure stockée doit être conçue pour supprimer un enregistrement dans la ou les tables appropriées en fonction des données de cette ligne.

Un exemple de code utilisant cette méthode pour la résolution de données dans une base de données se trouve ci-dessous dans la section “Enregistrement des modifications avec un ProcedureResolver”, page 8-9. Dans le cas d’InterBase, voir également “Exemple : Utilisation de procédures stockées InterBase avec paramètres de retour”, page 8-12.

Enregistrement des modifications avec un ProcedureResolver

L’exemple suivant décrit la manière d’enregistrer les modifications dans la base de données en utilisant le concepteur d’interface utilisateur JBuilder, un composant ProcedureDataSet et un composant ProcedureResolver. Certaines applications exemple utilisant des procédures stockées sur divers serveurs sont disponibles dans le répertoire /samples/DataExpress/ServerSpecificProcedures/.

Pour compléter l’application et enregistrer les modifications dans la table COUNTRY avec une définition personnalisée des procédures d’insertion, d’actualisation et de suppression : ouvrez d’abord le fichier projet créé

Page 126: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C o d a g e d e p r o c é d u r e s s t o c k é e s p o u r g é r e r l a r é s o l u t i o n d e d o n n é e s

au Chapitre 18, “Tutoriel : Extraction de données à l’aide de procédures stockées”. La phase de résolution sera ajoutée au projet existant.

Le projet en cours contient un composant JdbNavToolBar. En plus de donner la possibilité de se déplacer dans la table, la barre d’outils propose un bouton Enregistrer. A ce stade, ce bouton utilisera un QueryResolver. Une fois spécifié un système de résolution personnalisé via un ProcedureResolver, le bouton Enregistrer les modifications y appellera les procédures d’insertion, d’actualisation et de suppression.

Arrivé à ce point de l’application, vous pouvez exécuter l’application et visualiser ou parcourir les données. Mais pour pouvoir insérer, supprimer ou modifier les enregistrements, il faut spécifier les informations suivantes indiquant comment gérer ces processus. Le projet ouvert,

1 Sélectionnez le fichier cadre dans le volet contenu, puis sélectionnez l’onglet Conception pour activer le concepteur d’interface utilisateur.

2 Sélectionnez un composant ProcedureResolver de l’onglet Data Express de la palette des composants du volet contenu. Cliquez dans le volet contenu pour ajouter le composant à l’application.

3 Affectez à la propriété database du ProcedureResolver la base de données instanciée, database1, dans l’inspecteur.

4 Affectez la valeur DELETE_COUNTRY à la propriété deleteProcedure, comme suit :

a Sélectionnez procedureResolver1 dans l’arborescence des composants et cliquez sur sa propriété deleteProcedure dans l’inspecteur.

b Double-cliquez sur la valeur de la propriété deleteProcedure afin d’afficher la boîte de dialogue DeleteProcedure.

c Affectez la valeur database1 à la propriété Database.

d Cliquez sur Parcourir les procédures puis double-cliquez sur la procédure nommée DELETE_COUNTRY.

L’instruction suivante est écrite dans le champ Instruction SQL ou Escape de procédure stockée :

execute procedure DELETE_COUNTRY :OLD_COUNTRY

e Modifiez cette instruction pour obtenir :

execute procedure DELETE_COUNTRY :COUNTRY

Consultez le texte de la procédure dans “Création manuelle des tables et procédures de ce tutoriel”, page 6-4, ou utilisez le pilote de base de données (Outils|Pilote de base de données).

Remarque Ne cliquez pas sur Tester la procédure, car cette procédure ne renvoie aucun résultat.

Page 127: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-11

C o d a g e d e p r o c é d u r e s s t o c k é e s p o u r g é r e r l a r é s o l u t i o n d e d o n n é e s

5 Affectez la valeur INSERT_COUNTRY à la propriété insertProcedure, comme suit :

a Sélectionnez, puis double-cliquez sur la propriété insertProcedure du ProcedureResolver pour ouvrir la boîte de dialogue insertProcedure.

b Affectez la valeur database1 au champ Database.

c Cliquez sur Parcourir les procédures puis double-cliquez dans la procédure nommée INSERT_COUNTRY.

d Modifiez le code généré pour obtenir :

execute procedure INSERT_COUNTRY :COUNTRY, :CURRENCY

Remarque Ne cliquez pas sur Tester la procédure, car cette procédure ne renvoie aucun résultat.

6 Affectez la valeur UPDATE_COUNTRY à la propriété updateProcedure, comme suit :

a Sélectionnez, puis double-cliquez sur la propriété updateProcedure du ProcedureResolver pour ouvrir la boîte de dialogue updateProcedure.

b Affectez la valeur database1 à la propriété Database.

c Cliquez sur Parcourir les procédures puis double-cliquez dans la procédure nommée UPDATE_COUNTRY.

d Modifiez le code généré pour obtenir :

execute procedure UPDATE_COUNTRY :ORIGINAL.COUNTRY, :CURRENT.COUNTRY, :CURRENT.CURRENCY

Remarque Ne cliquez pas sur Tester la procédure, car cette procédure ne renvoie aucun résultat.

7 Sélectionnez procedureDataSet1 dans le volet projet. Affectez la valeur procedureResolver1 à la propriété resolver.

8 Sélectionnez procedureDataSet1. Définissez sa propriété metaDataUpdate par Aucun.

9 Sélectionnez Exécuter|Exécuter le projet afin d’exécuter l’application.

Quand vous exécutez l’application, vous pouvez parcourir, modifier, ajouter ou supprimer des données dans la table. Enregistrez les modifications effectuées en utilisant le bouton Enregistrer les modifications de la barre d’outils. Toutefois, il n’est pas possible dans cet exemple de supprimer une valeur existante de la colonne COUNTRY en raison de l’intégrité référentielle. Pour tester la procédure DELETE, ajoutez une nouvelle valeur à la colonne COUNTRY puis supprimez-la.

Page 128: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R é s o l u t i o n d e s d o n n é e s d e p l u s i e u r s t a b l e s

Exemple : Utilisation de procédures stockées InterBase avec paramètres de retour

Une procédure stockée InterBase renvoyant des valeurs est appelée différemment par les différents pilotes. La liste ci-dessous donne la syntaxe, selon le pilote, de la fonction suivante :

CREATE PROCEDURE fct (x SMALLINT)RETURNS (y SMALLINT) ASBEGIN y=2*x; END

Appel de la procédure fct depuis différents pilotes :

• Visigenic et InterClient version 1.3 ou précédentes

execute procedure fct ?

Si la procédure est appelée via un pilote JDBC pur, la sortie est capturée dans un ensemble de résultats comportant une seule ligne. JBuilder autorise la syntaxe suivante pour gérer les valeurs en sortie :

execute procedure fct ? returning_values ?

JBuilder capture alors l’ensemble de résultats et initialise la valeur du paramètre spécifié par le second marqueur de paramètre.

• InterClient version 1.4 ou suivantes :

{call fct(?,?)}

Où les marqueurs de paramètre doivent être placés après les paramètres d’entrée.

Résolution des données de plusieurs tablesIl est possible de spécifier une requête portant sur plusieurs tables dans un QueryDataSet, JBuilder est capable de résoudre les modifications d’un tel DataSet. SQLResolver est capable de résoudre les requêtes SQL faisant référence à plusieurs tables. La recherche des métadonnées détecte à quelle table appartient chaque colonne et suggère un ordre de résolution des tables. Les propriétés définies par la recherche des métadonnées sont :

• Column - columnName• Column - schemaName• Column - serverColumnName• StorageDataSet - tableName• StorageDataSet - resolveOrder

La propriété tableName du StorageDataSet n’est pas initialisée. La propriété tableName est identifiée par colonne.

Page 129: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-13

R é s o l u t i o n d e s d o n n é e s d e p l u s i e u r s t a b l e s

La propriété resolveOrder est un tableau de chaînes qui spécifie l’ordre de résolution dans le cas d’une résolution multitable. Les requêtes INSERT et UPDATE utilisent l’ordre de ce tableau, les requêtes DELETE utilisent l’ordre inverse de celui du tableau. Si une table est retirée de la liste, les colonnes de cette table ne sont pas résolues.

Remarques sur les types de liaisons entre les tables d’une requête

Une requête SQL multitable définit généralement un lien entre des tables dans la clause WHERE de la requête. Selon la nature du lien et la structure des tables, il y a quatre types différents de lien (en appelant la table primaire T1 et la table liée T2) :

• 1:1

Il y a exactement un enregistrement de T2 correspondant à un enregistrement de T1 et inversement. Une base de données relationnelle peut employer cette organisation pour certaines tables soit dans un souci de clarté ou à cause d’une 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 même enregistrement de T2. Exemple : chaque commande peut avoir un code produit qui est associé à un nom de produit dans la table des produits. C’est un exemple de référence exprimée directement en SQL.

• M:M

Le cas le plus général.

JBuilder adopte une approche simplifiée pour la résolution de plusieurs tables liées : JBuilder ne résout que des liens de type 1:1. Néanmoins, comme il est difficile de détecter le type de lien décrit par une requête SQL donnée, JBuilder suppose que toutes les requêtes multitables sont de type 1:1. Si les tables liées ne le sont pas par un lien de type 1:1, la résolution doit être gérée de la manière suivante :

• 1:M

Généralement, il n’est pas intéressant de répliquer les champs maître de chaque enregistrement détail de la requête. A la place, créez un

Page 130: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R é s o l u t i o n d e s d o n n é e s d e p l u s i e u r s t a b l e s

ensemble de données détail séparé, ce qui permet une résolution correcte des modifications.

• M:1

En général, ce cas se gère en utilisant le mécanisme de référence. Cependant, si la référence est utilisée uniquement pour l’affichage (sans modifications de ces champs) elle peut être gérée par une requête multitable. Spécifiez dans le rowId d’au moins une des colonnes de la table de référence qu’elle ne doit pas être résolue.

• M:M

Ce type de relation entre tables se produit très rarement, c’est généralement le résultat d’une erreur dans les spécifications.

Références (alias) de tables et de colonnes dans une chaîne de requête

Une chaîne de requête peut inclure des références de table ou de colonne appelées également alias.

• Généralement, les alias de table ne s’utilisent pas dans les requêtes monotables, ils sont fréquemment employés dans les requêtes multitables pour simplifier la chaîne de requête ou pour différencier des tables portant le même nom mais détenues par différents utilisateurs.

SELECT A.a1, A.a2, B.a3 FROM Table_Called_A AS A, Table_Called_B AS B

• Les références de colonne s’emploient fréquemment pour nommer une colonne calculée mais également pour différencier des colonnes provenant de différentes tables et portant le même nom.

SELECT T1.NO AS NUMBER, T2.NO AS NR FROM T1, T2

• Si l’alias de colonne est spécifié dans la chaîne de requête, il définit la valeur de la propriété columnName de l’objet Column dans JBuilder. Le nom physique, tel que défini dans la table d’origine, est affecté à la propriété serverColumnName. Le QueryResolver utilise serverColumnName lors de la génération des requêtes de résolution.

• Si un alias de table est spécifié dans la chaîne de requête, il définit la valeur de la propriété tableName d’un objet Column. Le nom d’origine n’est pas lui-même exposé par l’API JBuilder.

Contrôle du paramétrage des propriétés de colonne

Les propriétés tableName, schemaName et serverColumnName sont initialisées par le QueryProvider pour les composants QueryDataSet sauf si la propriété metaDataUpdate n’inclut pas metaDataUpdate.TABLENAME.

Page 131: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-15

U t i l i s a t i o n d e s e n s e m b l e s d e d o n n é e s a v e c R M I ( m i s e e n f l u x )

Que faire si une table n’est pas modifiable ?

S’il n’y a pas de rowId dans une table d’une requête, aucune modification apportée à cette table n’est enregistrée quand la méthode saveChanges() est appelée.

Remarque La possibilité d’actualisation dépend d’autres facteurs, qui sont décrits plus en détail dans “Interrogation d’une base de données”, page 5-2.

Comment spécifier qu’une table ne doit pas être actualisée ?

Pour une requête multitable, l’un des tables peut être actualisable quand l’autre ne l’est pas. La propriété resolveOrder du StorageDataSet est un tableau de chaînes qui spécifie l’ordre de résolution dans le cas d’une résolution multitable. Les requêtes INSERT et UPDATE utilisent l’ordre de ce tableau, les requêtes DELETE utilisent l’ordre inverse de celui du tableau. Si une table est retirée de la liste, les colonnes de cette table ne sont pas résolues.

Pour une table unique, affectez à la propriété metaDataUpdate la valeur NONE, et ne définissez aucune des propriétés de résolution (rowID, tableName, etc.).

Utilisation des ensembles de données avec RMI (mise en flux)Les flux d’ensembles de données permettent de créer un objet Java (DataSetData) contenant toutes les données d’un DataSet. A l’inverse, un objet DataSetData peut être utilisé pour définir les informations de colonne et les données d’un DataSet.

Les objets DataSetData implémentent l’interface java.io.Serializable et peuvent dont être sérialisés en utilisant writeObject dans java.io.ObjectOutputStream et lus en utilisant readObject dans java.io.ObjectInputStream. Cette manière de procéder transforme les données en un tableau d’octets et les transmet via des sockets ou certains autres moyens de transport. Il est aussi possible de transmettre l’objet via RMI Java, ce qui effectuera la sérialisation directement.

Au lieu d’effectuer l’enregistrement de toutes les informations d’un DataSet, il est possible de n’enregistrer que les modifications apportées à l’ensemble de données. Cette fonctionnalité permet d’implémenter un serveur de niveau intermédiaire qui communique avec un gestionnaire de bases de données et un client léger qui est capable d’éditer un DataSet.

Page 132: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e s e n s e m b l e s d e d o n n é e s a v e c R M I ( m i s e e n f l u x )

Exemple : Utilisation de flux d’ensembles de données

Il peut être intéressant de placer un DataSet dans un flux dans le contexte d’un système à trois niveaux avec un serveur d’application Java qui répond aux demandes des clients avec les données de certaines sources de données. Le serveur peut utiliser des composants QueryDataSet ou ProcedureDataSet de JBuilder pour fournir les données à la machine serveur. Les données peuvent être extraites en utilisant DataSetData.extractDataSet et envoyées au client. Du côté client, les données peuvent être chargées dans un TableDataSet et modifiées avec les contrôles DataSet de JBuilder ou avec des appels de l’API Java DataSet. L’application serveur peut ensuite retirer toutes les données de son DataSet afin d’être prête à répondre aux demandes d’autres applications client.

Quand l’utilisateur de l’application client veut enregistrer les modifications, les données peuvent être extraites en utilisant DataSetData.extractDataSetChanges et envoyées au serveur. Avant de charger ces modifications, le serveur doit obtenir le type physique des colonnes du gestionnaire de bases de données en utilisant les métadonnées du DataSet. Puis, le DataSet est chargé avec les modifications et le mécanisme de résolution classique de JBuilder est appliqué pour résoudre les données dans la source de données.

S’il y a des erreurs de résolution, elles peuvent ne pas être détectées par des actions de l’interface utilisateur mais quand la résolution est effectuée sur une machine serveur distant. Le mécanisme de résolution doit gérer les erreurs en créant un DataSet des erreurs. Chaque message d’erreur doit être marqué par la valeur INTERNALROW de la ligne dans laquelle l’erreur a eu lieu. DataSetData peut transmettre ces erreurs à l’application client. Si le DataSet est toujours actif, l’application client peut aisément joindre les erreurs au DataSet et afficher un texte d’erreur pour chaque ligne.

Utilisation des méthodes de flux d’ensemble de données

Les méthodes statiques extractDataSet et extractDataSetChanges remplissent un DataSetData avec des données membre privées permanentes qui spécifient :

1 Les informations de métadonnées composées de

• columnCount• rowCount• columnNames• dataTypes• rowId, hidden, internalRow (propriétés de colonne)

Les propriétés sont actuellement stockées dans les trois bits de poids fort de chaque type de données. Chaque type de données est codé sur

Page 133: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-17

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

un octet. La propriété columnCount est stockée implicitement comme longueur du tableau columnNames.

2 Les bits d’états de chaque ligne. Une valeur short est stockée pour chaque ligne.

3 Les bits indicateurs de Null pour chaque élément de données. 2 bits sont stockés pour chaque élément de données. Les valeurs possibles sont :

• 0) Données normales• 1) Null assigné• 2) Null non assigné• 3) Null non modifié

La dernière valeur est utilisée exclusivement pour extractDataSetChanges. Les valeurs non modifiées dans la version UPDATED sont stockées sous la forme de null ce qui économise de l’espace pour les données binaires volumineuses, etc.

4 Les données elles-mêmes, organisées en un tableau des données de colonne. Si une colonne de données est de type Variant.INTEGER, un tableau de int est utilisé pour les valeurs de cette colonne.

5 Pour extractDataSetChanges, une colonne spéciale, INTERNALROW, est ajoutée à la section des données. Cette colonne de données contient des valeurs entières longues qui désignent la ligne interne (internalRow) du DataSet dont les données sont extraites. Cette colonne de données doit être utilisée pour l’état des erreurs quand les modifications ne peuvent être résolues dans la source de données.

La méthode loadDataSet charge les données dans un DataSet. Toute colonne qui n’existe pas dans le DataSet doit être ajoutée. Attention, les informations sur le type physique et les propriétés comme sqlType, precision et scale ne sont pas contenues dans l’objet DataSetData. Ces propriétés doivent être recherchées directement dans la source de données. Cependant, ces propriétés ne sont pas nécessaires pour la modification. La colonne spéciale, INTERNALROW s’affiche comme n’importe qu’elle autre colonne de l’ensemble de données.

Personnalisation de la logique de résolution par défautJBuilder simplifie l’écriture d’un mécanisme personnalisé de résolution de vos données quand vous accédez aux données d’une source de données personnalisée comme EJB, les serveurs d’applications, SAP, BAAN, IMS, OS/390, CICS, VSAM, DB2, etc.

La lecture et l’actualisation des données d’une source de données comme un serveur Oracle ou Sybase sont isolées dans deux principales interfaces : fournisseurs et résolveurs. Les fournisseurs extraient les données d’une

Page 134: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-18 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

source de données et les placent dans un StorageDataSet. Les résolveurs écrivent en retour les modifications dans la source de données. Séparer nettement l’acquisition et la résolution des données en deux interfaces facilite la création de nouveaux composants d’acquisition/résolution pour de nouvelles sources de données. JBuilder fournit des implémentations pour les pilotes JDBC standard qui donnent accès à des bases de données courantes comme Oracle, Sybase, Informix, InterBase, DB2, MS SQL Server, Paradox, dBASE, FoxPro, Access, et d’autres bases de données répandues. Parmi lesquelles :

• OracleProcedureProvider• ProcedureProvider• ProcedureResolver• QueryProvider• QueryResolver

Un projet exemple ayant un fournisseur et un résolveur personnalisés se trouve dans le répertoire /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 connectés à un composant TableDataSet dont les données sont fournies par un fournisseur personnalisé (défini dans le fichier ProviderBean.java), et sont enregistrées avec un résolveur personnalisé (défini dans le fichier ResolverBean.java). Cette application exemple lit les données et enregistre les modifications dans le fichier texte data.txt, un fichier simple, non délimité. La structure de data.txt est décrite dans le fichier interface DataLayout.java.

Un exemple décrivant l’écriture d’un ProcedureResolver personnalisé se trouve dans la rubrique “Enregistrement des modifications avec un ProcedureResolver”, page 8-9.

Explication de la résolution par défaut

Si vous n’avez pas explicitement instancié de composant QueryResolver quand des modifications sont résolues dans la source de données, la logique de résolution par défaut crée un composant QueryResolver par défaut. Cette section décrit l’utilisation d’un QueryResolver pour personnaliser le processus de résolution.

Le QueryResolver est un composant DataExpress qui implémente l’interface SQLResolver. Cette interface SQLResolver est utilisée par le ResolutionManager durant le processus de résolution des modifications dans la base de données. Comme son nom l’implique, la classe ResolutionManager gère la phase de résolution.

Chaque StorageDataSet dispose d’une propriété resolver. Si cette propriété n’a pas été initialisée lors de l’appel de la méthode Database.saveChanges(), elle crée un composant QueryResolver par défaut et tente d’enregistrer les modifications d’un DataSet particulier.

Page 135: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-19

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

Ajout d’un composant QueryResolverPour ajouter un composant QueryResolver à une application en utilisant les outils de conception visuelle de JBuilder, procédez de la manière suivante :

1 Ouvrez un projet existant auquel vous voulez ajouter une logique personnalisée de résolution.

Le projet devrait inclure un objet Database et un objet QueryDataSet. Pour plus d’informations, voir “Interrogation d’une base de données”, page 5-2.

2 Sélectionnez le fichier cadre dans le volet contenu, puis sélectionnez l’onglet Conception pour afficher le concepteur d’interface utilisateur.

3 Cliquez sur le composant QueryResolver de la page DataExpress de la palette de composants.

4 Cliquez n’importe où dans le concepteur d’interface utilisateur ou dans l’arborescence des composants pour l’ajouter à l’application.

Le concepteur d’interface utilisateur génère du code source qui crée un objet QueryResolver par défaut.

5 Associez le composant QueryResolver au DataSet.

Pour ce faire, utilisez l’inspecteur pour définir la propriété resolver du StorageDataSet, par exemple queryDataSet1, par la valeur QueryResolver appropriée, qui est queryResolver1 par défaut.

Le même QueryResolver peut être connecté à plusieurs ensembles de données si les différents objets DataSet partagent la même gestion d’événement. Si chaque ensemble de données nécessite une gestion personnalisée des événements, créez un composant QueryResolver distinct pour chaque StorageDataSet.

Interception des événements de résolutionLe processus de résolution est contrôlé en interceptant les événements du Resolver. Quand l’objet QueryResolver est sélectionné dans le volet contenu, la page Evénements de l’inspecteur affiche ses événements. Trois groupes d’événements (définis dans l’interface ResolverListener) peuvent être contrôlés :

• Notification d’une action qui va être effectuée. Toutes les erreurs seront traitées comme exceptions normales, et non comme des événements erreur.

• deletingRow()• insertingRow()• updatingRow()

Page 136: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-20 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

• Notification d’une action qui a été effectuée.

• deletedRow()• insertedRow()• updatedRow()

• Erreurs conditionnelles ayant eu lieu. Ce sont des erreurs internes, et non des erreurs serveur.

• deleteError()• insertError()• updateError()

Quand le gestionnaire de résolution va effectuer une action suppression, insertion ou modification, l’événement de notification correspondant du premier groupe d’événements (deletingRow, insertingRow ou updatingRow) est généré. L’un des paramètres transmis avec la notification à ces événements est un objet ResolverResponse. C’est au gestionnaire d’événements (appelé également auditeur d’événements) de déterminer si l’action est appropriée et de renvoyer l’une des réponses (ResolverResponse) suivantes :

• resolve() indique au gestionnaire de résolution de poursuivre la résolution de cette ligne.

• skip() indique au gestionnaire de résolution de sauter cette ligne et de poursuivre.

• abort() indique au gestionnaire de résolution d’arrêter la résolution.

Si la réponse de l’événement est resolve() (réponse par défaut), un événement approprié du deuxième groupe (deletedRow, insertedRow ou updatedRow) est généré. Aucune réponse n’est attendue de ces événements. Ils n’existent que pour informer l’application que l’action a été effectuée.

Si la réponse de l’événement est skip(), la ligne en cours n’est pas résolue et le processus de résolution se poursuit avec la ligne de données suivante.

Si l’événement termine le processus de résolution, la méthodeinserting est appelée, qui à son tour appelle response.abort(). Aucun événement d’erreur n’est généré car les événements erreur sont déclenchés pour répondre aux erreurs internes. Cependant une exception générique ResolutionException est déclenchée pour annuler le processus de résolution.

Quand une erreur se produit pendant le processus de résolution, si par exemple, le serveur n’autorise pas la suppression d’une ligne, l’événement d’erreur approprié event (deleteError, insertError ou updateError) est généré. Les paramètres suivants sont transmis à l’événement :

• Le DataSet original impliqué dans la résolution

• Un DataSet temporaire filtré pour n’afficher que les lignes concernées

Page 137: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-21

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

• L’Exception qui a eu lieu

• Un objet ErrorResponse

C’est au gestionnaire d’événements :

• d’examiner l’Exception ;

• de déterminer quoi faire ;

• de communiquer cette décision au gestionnaire de résolution. Cette décision est transmise en utilisant l’une des réponses ErrorResponse suivantes :

• abort() indique au gestionnaire de résolution d’arrêter toutes les résolutions

• retry() indique au gestionnaire de résolution d’essayer de recommencer la dernière opération

• ignore() indique au gestionnaire de résolution de ne pas tenir compte de l’erreur et de poursuivre

Si le gestionnaire d’événements déclenche une exception DataSetException, elle est traitée comme l’appel de ResolverResponse.abort(). De plus, elle déclenche l’événement erreur en transmettant le paramètre Exception utilisateur.

Utilisation des événements de résolutionPour un exemple de gestion des événements de résolution, voir le projet ResolverEvents.jpx et les fichiers associés dans le répertoire /samples/DataExpress/ResolverEvents de votre installation JBuilder. Dans l’application ResolverEvents,

• Une table est liée à la table Customer de la base de données exemple JDataStore.

• Le bouton Enregistrer les modifications crée un objet QueryResolver personnalisé qui prend le contrôle du processus de résolution.

Quand l’application est exécutée, vous pourrez constater les comportements suivants :

• La suppression de ligne est interdite. Toute tentative de suppression de ligne est systématiquement bloquée. Cela illustre l’utilisation de l’événement deletingRow.

• L’insertion de ligne est autorisée uniquement si le client est situé aux Etats-Unis. Si le client en cours n’est pas situé aux Etats-Unis, le processus est interrompu. Cela illustre l’utilisation de l’événement insertingRow avec une réponse ResolverResponse de abort().

Page 138: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-22 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

• La mise à jour des lignes est effectuée en ajoutant l’ancienne et la nouvelle valeur du nom du client à un contrôle ListControl. Cela illustre, pendant le processus de résolution, l’accès simultané aux nouvelles valeurs, ainsi qu’aux anciennes données.

Ecriture d’un résolveur de données personnalisé

Cette rubrique traite des résolveurs de données personnalisés et explique comment ils peuvent être utilisés comme résolveurs d’un TableDataSet et de tout DataSet dérivé de TableDataSet. La méthode principale à implémenter est resolveData(). Cette méthode collecte les modifications dans un StorageDataSet et résout ces modifications en retour vers la source des données.

Afin de résoudre les modifications de données vers la source des données,

1 Vérifiez que le StorageDataSet est bloqué pour des modifications dans le fournisseur pendant la phase de résolution. Cela est fait par l’appel des méthodes :

• ProviderHelp.startResolution(dataSet, true);• ProviderHelp.endResolution(dataSet);

Important Placez tout ce qui suit entre ces deux appels de méthodes.

2 Localisez les modifications de données en créant un DataSetView pour chacune des lignes insérées, supprimées et mises à jour. Pour ce faire, utilisez les appels de méthodes suivants :

• StorageDataSet.getInsertedRows(DataSetView);• StorageDataSet.getDeletedRows(DataSetView);• StorageDataSet.getUpdatedRows(DataSetView);

Il est important de noter que :

• Les lignes insérées peuvent contenir des lignes supprimées (qui ne doivent pas être résolues).

• Les lignes supprimées peuvent contenir des lignes insérées (qui ne doivent pas être résolues).

• Les lignes mises à jour peuvent contenir des lignes supprimées et des lignes insérées (qui ne doivent pas être gérées comme des mises à jour).

3 Fermez chaque DataSetView après la résolution des données ou après le déclenchement d’une exception pendant la résolution. Si les composants DataSetView ne sont pas fermés, le StorageDataSet garde des références vers lui et la vue ne fera jamais partie de la collecte des données périmées (garbage collection).

Page 139: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s l a s o u r c e d e d o n n é e s 8-23

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

Gestion des erreurs de résolutionLes erreurs peuvent être gérées de nombreuses manières, mais il faut indiquer au DataSet de changer l’état des lignes modifiées. Pour ce faire,

1 Changez chaque ligne pour qu’elle soit marquée RowStatus.PENDING_RESOLVED:.

Le code qui permet de marquer ainsi la ligne en cours est :

DataSet.markPendingStatus(true);

Appelez cette méthode pour chaque ligne insérée, supprimée ou mise à jour à résoudre.

2 Appelez une ou plusieurs des méthodes suivantes pour réinitialiser le bit RowStatus.PENDING_RESOLVED.

La méthode à appeler dépend du type de gestion d’erreur :

• markPendingStatus(false);

La méthode markPendingStatus réinitialise la ligne en cours.

• resetPendingStatus(boolean resolved);

La méthode resetPendingStatus réinitialise toutes les lignes du DataSet.

• resetPendingStatus(long internalRow, boolean resolved);

La méthode resetPendingStatus réinitialise la ligne dont l’identificateur internalRow est spécifié.

3 Redéfinissez le paramètre resolved par true, en utilisant une des méthodes resetPendingStatus, pour les lignes dont les modifications ont été réellement effectuées dans la source des données.

Quand le bit PENDING_RESOLVED est réinitialisé, les lignes gardent l’état de modifications enregistrées. Elles doivent être réinitialisées et résolues pour que :

• Les lignes INSERTED & UPDATED passent à l’état LOADED.

• Les lignes DELETED soient supprimées du DataSet.

Les modifications de lignes qui n’ont pas été effectuées effaceront le bit PENDING_RESOLVED, mais les modifications resteront encore enregistrées dans le DataSet.

Certains résolveurs choisiront d’abandonner toutes les modifications à la moindre erreur. En fait, c’est le comportement par défaut du QueryDataSet. D’autres résolveurs choisiront de valider certaines modifications et de traiter les modifications en échec par des messages d’erreur.

Page 140: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

8-24 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P e r s o n n a l i s a t i o n d e l a l o g i q u e d e r é s o l u t i o n p a r d é f a u t

Résolution des relations maître-détailLa résolution des relations maître-détail nécessite certaines considérations. Si la source des données possède des règles d’intégrité référentielle, les composants DataSet peuvent devoir être résolus dans un certain ordre. Lorsque vous utilisez JDBC, JBuilder fournit la classe SQLResolutionManager. Cette classe garantit d’une part que l’ensemble de données maître résout ses lignes insérées avant de permettre à un ensemble de données détail de résoudre ses lignes insérées et d’autre part que les ensembles de données détail résolvent leurs lignes supprimées avant que l’ensemble de données maître ne résolve les siennes. Pour davantage d’informations sur la résolution des relations maître-détail, voir “Enregistrement des modifications dans une relation maître-détail”, page 9-11.

Page 141: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-1

C h a p i t r e

9Chapitre9Etablissement d’une relation

maître-détailLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Les bases de données bien conçues comportent plusieurs tables. Le but de la conception de table est de stocker toutes les informations nécessaires d’une manière accessible et efficace. Il est donc nécessaire de décomposer une base de données en tables identifiant des entités distinctes (comme des personnes, des lieux ou des objets) et des activités (comme des événements ou des transactions) importantes dans l’application. Pour mieux définir les tables, il est nécessaire d’identifier et de comprendre comment ces entités sont reliées entre elles. La création de plusieurs petites tables reliées réduit la quantité de données redondantes, ce qui limite les possibilités d’erreur et simplifie l’actualisation des données.

Dans JBuilder, il est possible de joindre, ou de relier, deux ou plusieurs ensembles de données ayant au moins un champ en commun en utilisant un MasterLinkDescriptor. Habituellement, une relation maître/détail est une relation un-à-plusieurs entre des ensembles de données. Vous pouvez, par exemple, avoir un ensemble de données des clients et un ensemble de données des commandes passées par eux, le numéro de client constituant le champ commun aux deux ensembles de données. Vous pouvez créer une relation maître-détail qui permet de parcourir l’ensemble de données des clients et de n’afficher pour l’ensemble de données détail que les commandes passées par le client en cours.

Vous pouvez lier un ensemble de données maître à plusieurs ensembles de données détail, en établissant le lien sur le même champ ou sur des champs différents. Vous pouvez aussi créer une relation maître/détail qui se développe en cascade en une relation un-à-plusieurs-à-plusieurs. Les relations plusieurs-à-un ou un-à-un peuvent être gérées dans un contexte maître/détail, mais ces types de relations sont de préférence pris en compte par l’utilisation de champs de référence, afin de voir toutes les

Page 142: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

D é f i n i t i o n d ’ u n e r e l a t i o n m a î t r e - d é t a i l

données comme faisant partie d’un ensemble de données unique. Pour plus d’informations sur l’enregistrement des modifications apportées aux données de plusieurs ensembles de données, voir “Résolution des données de plusieurs tables”, page 8-12.

Les ensembles de données maître et détail n’ont pas besoin d’être des ensembles de données de même type. Par exemple, il est possible d’utiliser un QueryDataSet comme ensemble de données maître et un TableDataSet comme ensemble de données détail. QueryDataSet, TableDataSet et DataSetView peuvent s’utiliser indifféremment comme ensembles de données maître ou détail.

Cette section traite les sujets suivants :

• Définition d’une relation maître-détail• Lecture des détails• Modification des données dans les ensembles de données maître-détail• Etapes de la création d’une relation maître-détail• Enregistrement des modifications dans une relation maître-détail

Définition d’une relation maître-détailLors de la définition d’une relation maître-détail, il faut relier des colonnes de même type de données. Si, par exemple, les données de l’ensemble maître sont de type INT, les données de l’ensemble détail doivent également être de type INT. Si les données de l’ensemble de données détail sont de type LONG, les correspondances ne sont pas trouvées ou des correspondances incorrectes sont établies. Le nom des colonnes peut être différent. La relation n’est pas limitée aux colonnes ayant des index dans le serveur.

Les informations de l’ensemble de données maître peuvent être triées sans restriction. La relation entre les ensembles de données maître et détail utilise, comme les vues triées, un index maintenu. Cela implique que l’ensemble de données détail est toujours trié avec les colonnes de liaison, côté détail, comme colonnes de gauche du tri. D’éventuels critères de tri complémentaires doivent être compatibles avec les colonnes de liaison du détail. Pour être compatible, le descripteur de tri ne doit inclure aucune des colonnes de liaison du détail, ou si c’est le cas elles doivent être spécifiées dans le même ordre dans les colonnes de liaison du détail et dans le descripteur de tri. Si l’une des colonnes de liaison est incluse dans le descripteur de tri, elles doivent l’être toutes.

Il est possible de filtrer les données dans l’ensemble maître, dans l’ensemble détail ou dans les deux. Une relation maître-détail ressemble déjà en elle-même à un filtre appliqué à l’ensemble de données détail, cependant un filtre peut être ajouté, en plus de la relation maître-détail, sur l’un ou l’autre des ensembles de données.

Page 143: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-3

D é f i n i t i o n d ’ u n e r e l a t i o n m a î t r e - d é t a i l

Pour créer une relation maître-détail vous pouvez utiliser, à la place d’un MasterLinkDescriptor, une instruction SQL JOIN. Une instruction SQL JOIN est un opérateur 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 données. Le résultat constitue un seul ensemble de données contenant les lignes formées par la concaténation des lignes des deux ensembles de données quand les valeurs des colonnes de jointure correspondent. Pour actualiser des requêtes JOIN avec JBuilder, voir “Résolution des données de plusieurs tables”, page 8-12.

Création d’une application avec une relation maître-détail

Cet exemple décrit comment créer une relation maître-détail en utilisant les fichiers fournis avec JBuilder. L’application exemple suppose la création de deux requêtes, l’une sélectionnant toutes les valeurs distinctes de pays dans la table COUNTRY du fichier exemple employee et l’autre sélectionnant tous les employés. Cet exemple est disponible sous la forme du projet achevé dans le répertoire /samples/DataExpress/MasterDetail de votre installation JBuilder.

L’ensemble de données COUNTRY est l’ensemble de données maître, la colonne COUNTRY constituant le champ de liaison avec EMPLOYEE, l’ensemble de données détail. Ces deux ensembles de données sont associés à des JdbTables, ainsi quand l’utilisateur parcourt la table COUNTRY, la table EMPLOYEE affiche tous les employés vivant dans le pays désigné par l’enregistrement en cours.

Pour créer cette application,

1 Fermez tous les projets ouverts (Fichier|Fermer).

2 Choisissez Fichier|Nouveau et double-cliquez sur l’icône Application pour créer une nouvelle application.

Acceptez toutes les valeurs par défaut.

3 Sélectionnez l’onglet Conception du volet contenu.

4 Sélectionnez un composant Database dans la page DataExpress de la palette de composants, puis cliquez dans l’arborescence des composants ou dans le concepteur d’interface utilisateur pour ajouter le composant à votre application.

5 Ouvrez la propriété connection du composant Database dans l’inspecteur, et définissez les propriétés de la manière suivante en

Page 144: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

D é f i n i t i o n d ’ u n e r e l a t i o n m a î t r e - d é t a i l

supposant que votre système est configuré pour utiliser l’exemple JDataStore comme décrit dans “Configuration de JDataStore”, page 4-7.

La boîte de dialogue connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vérifier que les propriétés de connexion sont correctement définies. Les résultats de la tentative de connexion s’affichent à côté du bouton. Quand la connexion réussit, cliquez sur OK.

Remarque La bibliothèque JDataStore Server est ajoutée à votre projet lorsque vous vous connectez à une base de données JDataStore.

Le code généré par le concepteur pour cette étape peut être affiché en sélectionnant l’onglet Source et en recherchant le code de ConnectionDescriptor. Cliquez sur l’onglet Conception pour continuer.

6 Sélectionnez un composant QueryDataSet de la page Data Express, puis cliquez dans l’arborescence des composants pour ajouter le composant à votre application.

Ce composant définit la requête pour l’ensemble de données maître. Sélectionnez la propriété query du composant QueryDataSet dans l’inspecteur, puis effectuez le paramétrage suivant :

7 Cliquez sur Tester la requête pour vous assurer que la requête est exécutable et, lorsque la zone d’état indique Succès, cliquez sur OK pour fermer la boîte de dialogue.

8 Ajoutez un autre composant QueryDataSet à votre application, sélectionnez sa propriété query dans l’inspecteur, cliquez sur les points de suspension (...) pour ouvrir le dialogue Query et définissez les propriétés suivantes :

Nom de la propriété Valeur

Driver com.borland.datastore.jdbc.DataStoreDriver

URL Naviguez jusqu’à votre copie locale de <jbuilder>/samples/JDataStore/datastores/employee.jds

Username Entrez votre nom

Password non obligatoire

Nom de la propriété Valeur

Database database1

Instruction SQL SELECT * FROM COUNTRY

Nom de la propriété Valeur

Database database1

Instruction SQL SELECT * FROM EMPLOYEE

Page 145: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-5

D é f i n i t i o n d ’ u n e r e l a t i o n m a î t r e - d é t a i l

Cela permet de définir la requête pour l’ensemble de données détail.

9 Cliquez sur Tester la requête pour vous assurer que la requête est exécutable et, lorsque la zone d’état indique Succès, cliquez sur OK pour fermer la boîte de dialogue.

10 Sélectionnez sur la propriété masterLink de l’ensemble de données détail (queryDataSet2) dans l’inspecteur, cliquez sur le bouton points de suspension (...) pour ouvrir le dialogue MasterLink et définissez les propriétés suivantes :

a La propriété DataSet maître propose un menu déroulant des ensembles de données disponibles. Choisissez l’ensemble de données contenant les enregistrements maître pour l’ensemble de données détail en cours, c’est-à-dire queryDataSet1.

b Les champs de liaison décrivent les champs à utiliser pour déterminer les données se correspondant dans les composants ensemble de données maître et détail. Pour sélectionner une colonne dans l’ensemble de données maître à relier avec une colonne de l’ensemble de données détail : sélectionnez les noms de colonne, dans cet exemple COUNTRY (un champ chaîne), dans la liste Colonnes maître disponibles puis cliquez sur le bouton Ajouter aux liens maître. La colonne s’affiche dans la boîte Colonnes de lien maître.

c Pour sélectionner la colonne de l’ensemble de données détail à relier avec une colonne de l’ensemble de données maître, sélectionnez le nom de la colonne, dans cet exemple JOB_COUNTRY (un champ chaîne), dans la liste Colonnes détail disponibles puis cliquez sur le bouton Ajouter aux liens détail. La colonne s’affiche dans la boîte Colonnes liées détail.

d L’option “Retarder la lecture des enregistrements détail jusqu’à ce que cela soit nécessaire” détermine si les enregistrements de l’ensemble de données détail sont tous lus en une seule fois ou ne s’ils ne sont lus, pour un enregistrement maître donné, que lorsque celui-ci est activé. Ne cochez pas cette case pour affecter à la propriété fetchAsNeeded la valeur false. Pour plus d’informations sur la lecture, voir “Lecture des détails”, page 9-7.

e Cliquez sur Tester le lien.

Page 146: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

D é f i n i t i o n d ’ u n e r e l a t i o n m a î t r e - d é t a i l

Le dialogue doit ressembler à ceci si le test réussit.

f Cliquez sur OK pour fermer la boîte de dialogue MasterLink.

11 Ajoutez à votre application un composant DBDisposeMonitor de la page dbSwing supplémentaires.

Le DBDisposeMonitor fermera le JDataStore lorsque la fenêtre sera fermée.

12 Définissez la propriété dataAwareComponentContainer du DBDisposeMonitor sur this.

Pour créer une interface utilisateur pour cette application,

1 Sélectionnez contentPane (BorderLayout) dans l’arborescence des composants et définissez sa propriété layout par null.

2 Cliquez sur un composant JdbNavToolBar dans l’onglet dbSwing. Déposez-le dans la zone juste au-dessus du panneau dans le concepteur d’interface utilisateur.

JdbNavToolBar s’attache automatiquement au DataSet qui détient la focalisation.

3 Ajoutez un JdbStatusLabel et placez-le dans la partie inférieure du panneau, dans le concepteur d’interface utilisateur.

JdbStatusLabel s’attache automatiquement au DataSet qui détient la focalisation.

4 Sélectionnez un composantTableScrollPane de la page dbSwing, puis cliquez et faites glisser le contour du volet dans la partie supérieure du concepteur d’interface utilisateur pour l’ajouter à l’application juste en-dessous de jdbNavToolBar1.

Page 147: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-7

L e c t u r e d e s d é t a i l s

Le comportement de défilement n’est proposé par défaut dans aucun composant Swing ni dans leur extension dbSwing, il faut donc pour en disposer, ajouter un composant Swing ou dbSwing défilable à un JScrollPane ou à un TableScrollPane. Le composant TableScrollPane offre des possibilités spécifiques au JdbTable que n’offre pas le JScrollPane. Voir la documentation dbSwing pour plus d’informations.

5 Placez un JdbTable au centre du tableScrollPane1 dans le concepteur d’interface utilisateur et définissez sa propriété dataSet par queryDataSet1.

6 Ajoutez un autre TableScrollPane à la partie inférieure du volet, dans le concepteur d’interface utilisateur.

Il devient tableScrollPane2.

7 Placez un JdbTable dans tableScrollPane2 et donnez à sa propriété dataSet la valeur queryDataSet2.

8 Compilez et exécutez l’application en choisissant Exécuter|Exécuter le projet.

Vous pouvez maintenant parcourir les enregistrements maître (COUNTRY) et voir les enregistrements détail (EMPLOYEE) changer pour n’afficher que les employés du pays en cours.

Le résultat final ressemble à ceci :

Lecture des détailsDans une relation maître-détail, la valeur des champs maître détermine les enregistrements du détail qui sont affichés. Tous les enregistrements de l’ensemble de données détail peuvent être lus en une seule fois ou pour un enregistrement maître donné (quand l’enregistrement maître est parcouru).

Page 148: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

L e c t u r e d e s d é t a i l s

Soyez prudent lorsque vous utilisez les options de mises à jour ou de suppressions en cascade (cascadeUpdates et cascadeDelete) dans les relations maître-détail. En effet, si vous les utilisez, une ligne de l’ensemble de données détail peut être mise à jour ou supprimée alors que les autres peuvent ne pas l’être. Par exemple, un gestionnaire de l’événement deleting() d’un editListener peut autoriser la suppression de quelques lignes détail et la suppression d’autres par bloc. Dans le cas des mises à jour en cascade, vous risquez de vous retrouver avec des éléments détail orphelins si certaines lignes d’un ensemble détail ont été mises à jour et d’autres non. Pour davantage d’informations sur les options cascadeUpdates et cascadeDelete, voir la rubrique MasterLinkDescriptor dans la Référence DataExpress.

Lecture de tous les détails en une seule fois

Quand le paramètre fetchAsNeeded a la valeur false (ou si l’option “Retarder la lecture des enregistrements détail jusqu’à ce que cela soit nécessaire” n’est pas cochée dans la boîte de dialogue du masterLinkDescriptor), toutes les données du détail sont lues en une seule fois. Utilisez ce paramétrage quand l’ensemble de données détail n’est pas trop volumineux. Quand cette option est utilisée, un instantané des données est affiché, ce qui donne la vue la plus cohérente des données. Lorsque la méthode refresh() est appelée, tous les ensembles détail sont rafraîchis en une seule fois.

Par exemple, initialement, l’ensemble de données est rempli par toutes les données de l’ensemble de données détail. Quand la valeur false est affectée à l’option fetchAsNeeded, vous pouvez instancier un composant DataSetView, l’utiliser pour visualiser l’ensemble de données détail et vérifier que tous les enregistrements de l’ensemble de données détail sont présents mais filtrés en utilisant les informations de l’ensemble de données maître.

Lecture des enregistrements détail sélectionnés à la demande

Quand le paramètre fetchAsNeeded a la valeur true (ou si l’option “Retarder la lecture des enregistrements détail jusqu’à ce que cela soit nécessaire” est cochée dans la boîte de dialogue masterLinkDescriptor), les enregistrements du détail sont lus à la demande et stockés dans l’ensemble de données détail. Ce type de relation maître-détail fonctionne vraiment comme une requête paramétrée où la valeur des champs maître détermine les enregistrements du détail qui sont affichés. Cette option doit être utilisée pour améliorer les performances si la table de la base de données distante est volumineuse : les données de l’ensemble de données détail ne sont pas toutes placées en mémoire mais ne sont lues que si elles

Page 149: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-9

L e c t u r e d e s d é t a i l s

sont nécessaires. Vous pouvez également choisir cette option si vous n’êtes pas intéressé par la plupart des données du détail. Les données ainsi lues sont plus récentes mais peuvent ne pas être aussi cohérentes que l’instantané des données obtenu quand le paramètre fetchAsNeeded a la valeur false. En effet, à un moment donné, un ensemble d’enregistrements est lu et mis en mémoire cache, puis un autre ensemble d’enregistrements détail est lu et placé en mémoire. Or, entre temps, le premier ensemble d’enregistrements détail peut avoir été modifié dans la base de données distante, mais l’utilisateur ne peut voir ces modifications tant que vous n’avez pas relu le détail. Lorsque la méthode refresh() est appelée, seul les ensembles détail en cours sont rafraîchis.

Supposons, par exemple, que l’ensemble de données détail soit initialement vide. Quand vous accédez à un enregistrement maître, par exemple Jones, tous les enregistrements du détail pour Jones sont lus. Puis, quand vous accédez à un autre enregistrement maître, par exemple Cohen, tous les enregistrements du détail pour Cohen sont lus et ajoutés à l’ensemble de données détail. Si vous instanciez un composant DataSetView pour visualiser l’ensemble de données détail, tous les enregistrements de Jones et Cohen sont dans l’ensemble de données détail mais aucun des enregistrements correspondant aux autres noms.

Quand la propriété fetchAsNeeded a la valeur true, une clause WHERE définissant la relation des colonnes doit exister dans le QueryDataSet en cours avec un paramètre représentant la valeur d’une colonne dans l’ensemble de données maître. Si la requête paramétrée contient des marqueurs de paramètres nommés, les noms doivent correspondre à un nom de l’ensemble de données maître. Si des marqueurs JDBC “?” sont utilisés, les colonnes de liaison du détail sont liées aux marqueurs de paramètres de gauche à droite comme défini dans la propriété masterLink. La liaison des valeurs de paramètre est implicite quand le maître arrive sur une ligne pour la première fois. La requête est re-exécutée pour lire chaque nouveau groupe de détail. S’il n’y a pas de clause WHERE, JBuilder déclenche une exception DataSetException.NO_WHERE_CLAUSE. Quand la lecture est gérée de cette manière, s’il n’y a pas de transaction explicite active, les groupes de détail sont lus dans des transactions distinctes. Pour davantage d’informations sur les relations maître-détail dans des requêtes paramétrées, voir “Requêtes paramétrées dans les relations maître-détail”, page 5-22.

Si l’ensemble de données maître a plusieurs ensembles de données détail associés dont la propriété fetchAsNeeded a la valeur true, les détails conservent la trace des groupes détail déjà lus via une requête ou une procédure paramétrées par les colonnes de liaison du maître actif. Cette mémorisation peut être annulée en appelant la méthode StorageDataSet.empty(). Il n’y a pas de mémorisation pour les propriétés masterLink pour lesquelles fetchAsNeeded a la valeur true.

Page 150: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

M o d i f i c a t i o n d e s d o n n é e s d a n s l e s e n s e m b l e s d e d o n n é e s m a î t r e - d é t a i l

Quand l’ensemble de données détail est un TableDataSet, le paramètre fetchAsNeeded n’est pas pris en compte et toutes les données sont lues en une seule fois.

Modification des données dans les ensembles de données maître-détail

Il n’est pas possible de supprimer ou de modifier une valeur dans une colonne de liaison du maître (une colonne liée à l’ensemble de données détail) si l’enregistrement maître a des enregistrements détail associés.

Par défaut, les colonnes de liaison du détail ne sont pas affichées dans un composant d’interface utilisateur JdbTable, puisque ces colonnes contiennent les mêmes valeurs que les colonnes de liaison du maître qui sont, elles, affichées. Quand une nouvelle ligne est insérée dans l’ensemble de données détail, JBuilder insère les valeurs dans les champs non affichés.

Etapes de la création d’une relation maître-détailPour créer une relation maître-détail entres deux composants ensemble de données, l’un représentant l’ensemble de données maître et l’autre l’ensemble de données détail, vous devez passer par les étapes suivantes :

1 Créez ou ouvrez une application avec au moins deux composants ensemble de données, l’un représentant l’ensemble de données maître et l’autre l’ensemble de données détail.

Vous pouvez utiliser l’exemple d’application Maître-détail du projet MasterDetail.jpx situé dans le répertoire <jbuilder>/samples/DataExpress/MasterDetail.

2 Sélectionnez le fichier cadre dans le volet contenu. Sélectionnez l’onglet Conception pour activer le concepteur d’interface utilisateur.

3 Sélectionnez l’ensemble de données détail dans l’arborescence des composants, puis sa propriété masterLink dans la page Propriétés de l’inspecteur. Dans l’éditeur de propriété masterLink, spécifiez les propriétés suivantes de l’ensemble de données détail :

• La propriété Dataset maître propose un choix des ensembles de données disponibles. Choisissez l’ensemble de données contenant les enregistrements maître de l’ensemble de données détail en cours.

• Les colonnes de liaison décrivent quelles sont les colonnes à utiliser pour déterminer la correspondance des données entre les composants ensemble de données maître et détail. Pour sélectionner une colonne de l’ensemble de données maître à relier avec une

Page 151: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-11

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s u n e r e l a t i o n m a î t r e - d é t a i l

colonne de l’ensemble de données détail, double-cliquez sur un nom de colonne dans la liste Colonnes maître disponibles. Cette colonne est alors affichée dans la propriété Colonnes liées maître.

• Pour sélectionner la colonne de l’ensemble de données détail à relier à une colonne de l’ensemble de données maître, double-cliquez sur le nom de la colonne dans la liste Colonnes détail disponibles. Le type de données de chaque colonne est affiché. Si vous sélectionnez une colonne du détail dont le type n’est pas identique à celui de la colonne maître correspondante, il ne se passe rien car les colonnes de liaison doivent être de même type. Si la colonne sélectionnée est correcte, elle est affichée dans la propriété Colonnes de lien détail.

• Pour lier les deux ensembles de données sur plusieurs colonnes, répétez les deux étapes précédentes autant de fois que nécessaire.

• Pour retarder la lecture des enregistrements du détail jusqu’à ce qu’ils soient nécessaires, cochez la case “Retarder la lecture des enregistrements détail jusqu’à ce que cela soit nécessaire”. Voir “Lecture des détails”, page 9-7, pour en savoir davantage sur cette option.

• Pour vérifier que les ensembles de données sont correctement connectés, cliquez sur le bouton Tester le lien. La zone d’état indique alors Exécution, Succès ou Echec.

• Pour terminer les spécifications, cliquez sur OK.

4 Ajoutez des composants visuels (comme JdbTables) pour pouvoir visualiser et modifier les données. Affectez à la propriété dataSet de l’un, l’ensemble de données maître et à la propriété dataSet de l’autre, l’ensemble de données détail.

5 Compilez et exécutez l’application.

L’ensemble de données maître affiche tous les enregistrements. L’ensemble de données détail n’affiche que les enregistrements correspondant aux valeurs des colonnes liées de la ligne en cours de l’ensemble de données maître (sans afficher la valeur de ces colonnes liées).

Enregistrement des modifications dans une relation maître-détailDans JBuilder, les données sont extraites d’un serveur ou d’un fichier texte et placées dans un ensemble de données. Une fois les données “fournies” à l’ensemble de données, il est possible de les modifier et de travailler avec la copie locale des données par programme ou en utilisant les composants orientés données. Pour enregistrer les modifications dans la base de données ou le fichier texte, il faut “résoudre” les modifications dans la base de données ou exporter les modifications dans un fichier texte.

Page 152: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s u n e r e l a t i o n m a î t r e - d é t a i l

Les différentes options de résolution vers une base de données sont présentées au Chapitre 8, “Enregistrement des modifications dans la source de données”, et les options d’exportation des données dans un fichier texte dans la section “Exportation des données”, page 3-3.

Dans une relation maître-détail, deux sources de données (une combinaison de tables de base de données et/ou de fichiers texte) sont fournies à au moins deux ensembles de données. Il y a généralement trois moyens différents de résoudre les modifications dans une relation maître détail :

• Placez un JButton dans l’application et écrivez le code de résolution associé au bouton qui écrit les données pour chaque ensemble de données. Un exemple de cette manière de procéder est présenté par la rubrique “Enregistrement des modifications d’un QueryDataSet”, page 8-3.

Si les deux ensembles de données sont des QueryDataSet, vous pouvez enregistrer les modifications dans les ensembles de données maître et détail en utilisant la méthode saveChanges(DataSet[]) du composant Database au lieu d’utiliser la méthode saveChanges() de chacun des ensembles de données. Un appel de la méthode Database.saveChanges(DataSet[]) conserve la synchronisation des ensembles de données et valide toutes les données en une seule transaction. Au contraire, des appels séparés de la méthode DataSet.saveChanges() ne conservent pas la synchronisation des ensembles de données et valident les données dans des transactions distinctes. Voir “Résolution des ensembles de données maître-détail avec une source JDBC”, page 9-13, pour plus d’informations.

• Placez un composant QueryResolver dans l’application afin de personnaliser le processus de résolution. Voir “Personnalisation de la logique de résolution par défaut”, page 8-17, pour plus d’informations.

• Placez un JdbNavToolBar dans l’application et utilisez le bouton Enregistrer pour enregistrer les modifications.

Vous pouvez utiliser un seul navigateur JdbNavToolBar pour les deux ensembles de données. Le composant JdbNavToolBar s’attache automatiquement à l’ensemble de données qui détient la focalisation.

Voir aussi

• Chapitre 8, “Enregistrement des modifications dans la source de données”

Page 153: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

E t a b l i s s e m e n t d ’ u n e r e l a t i o n m a î t r e - d é t a i l 9-13

E n r e g i s t r e m e n t d e s m o d i f i c a t i o n s d a n s u n e r e l a t i o n m a î t r e - d é t a i l

Résolution des ensembles de données maître-détail avec une source JDBC

Comme, par définition, une relation maître-détail implique au moins deux ensembles de données, la manière la plus simple de résoudre les données dans la source de données consiste à utiliser la méthode saveChanges(DataSet[]) du composant Database (en supposant que des composants QueryDataSet sont utilisés comme source de données).

L’exécution de la méthode Database.saveChanges(DataSet[]) provoque par défaut l’enregistrement dans la source de données JDBC de toutes les insertions, suppressions et modifications effectuées sur les données des ensembles de données, le tout en une seule transaction. Quand la propriété masterLink a été utilisée pour définir une relation maître-détail entre deux ensembles de données, les modifications faites sur les deux ensembles de données ainsi associés sont enregistrées dans l’ordre suivant :

1 Les suppressions2 Les mises à jour3 Les insertions.

Pour les suppressions et les mises à jour, les données du détail sont traitées en premier. Pour les insertions, l’ensemble de données maître est traité en premier.

Si une application est en train d’utiliser un JdbNavToolBar pour les fonctionnalités d’enregistrement et de rafraîchissement, la propriété fetchAsNeeded doit être définie par false afin d’éviter la perte de modifications non enregistrées. Car, lorsque la propriété fetchAsNeeded vaut true, chaque ensemble détail est lu individuellement, et il est aussi rafraîchi individuellement. Si la méthode Database.saveChanges(DataSet[]) est utilisée à la place, toutes les modifications seront postées dans l’ordre qui convient au cours de la même transaction à tous les ensembles de données liés.

Page 154: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

9-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 155: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-1

C h a p i t r e

10Chapitre10Utilisation des modules

de données pour simplifierl’accès aux données

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Un module de données est un conteneur spécialisé pour les composants d’accès aux données. Les modules de données simplifient le développement de l’accès aux données dans vos applications. Les modules de données proposent un conteneur utilisable à la conception pour tous les composants d’accès aux données. Cela permet de décomposer le code en modules et de séparer les règles de fonctionnement et d’accès aux bases de données de vos applications d’avec la logique de l’interface utilisateur de l’application. Vous pouvez également garder le contrôle sur l’utilisation du module de données, en fournissant seulement les fichiers classe aux développeurs d’application.

Une fois que des composants ensemble de données (DataSet), et les colonnes (composant Column) associées, ont été définis dans un module de données, toutes les applications utilisant ce module ont un accès homogène aux ensembles de données et aux colonnes sans qu’il soit nécessaire de les recréer dans chaque application chaque fois qu’ils sont utilisés. Il n’est pas nécessaire que les modules de données se trouvent dans le même répertoire ou le même paquet que votre projet. Vous pouvez même les placer à un endroit permettant de les partager entre plusieurs développeurs ou entre différentes applications.

DataModule est une interface qui déclare le comportement de base d’un module de données. Pour manipuler par programme cette interface, il faut l’implémenter dans une classe de module de données et ajouter des composants d’accès aux données.

Page 156: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

Lorsque vous créez un module de données et ajoutez des composants qui apparaîtront automatiquement sous la section Accès aux données du volet contenu (Database, DataSet, DataStore), une méthode d’acquisition (a getter()) est générée. Cela signifie que chacun de ces composants sera disponible dans une liste de choix pour le projet qui référence le module de données. Par exemple, vous pouvez

• Ajouter un composant Database à un module de données.

• Compiler le module de données.

• Ajouter un composant QueryDataSet à l’application qui contient le module de données ou au module de données lui-même.

• Dans la boîte de dialogue de la propriété query, sélectionner “ModuleDeDonnees1.database1” (ou quelque chose de similaire) dans la boîte de choix Base de données.

Ce chapitre présente deux façons de créer un module de données :

• Utilisation des outils de conception visuelle de JBuilder

• Utilisation du modeleur de données

Création d’un module de données en utilisant les outils de conception

Les sections suivantes expliquent comment créer un module de données, en utilisant les outils de conception visuelle, comme l’expert Module de données et le concepteur d’interface utilisateur.

Création du module de données avec l’expert

Pour créer un module de données,

1 Créez un nouveau projet.

2 Sélectionnez Fichier|Nouveau et double-cliquez sur l’icône Module de données.

3 Spécifiez le paquet et le nom de la classe du module de données.

JBuilder remplit automatiquement le nom et le chemin d’accès du fichier Java en fonction de vos saisies. Pour créer le module de données en utilisant le concepteur JBuilder, désactivez Appeler le Modeleur de données.

4 Cliquez sur OK pour fermer la boîte de dialogue.

La classe du module de données est créée et ajoutée au projet.

Page 157: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-3

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

5 Double-cliquez sur le fichier du module de données dans le volet projet afin de l’ouvrir dans le volet Contenu.

6 Examinez le code source.

Le code généré par l’expert pour la classe du module de données diffère sensiblement du code généré par les autres experts. La méthode getDataModule() est définie comme public static. Cette méthode a pour fonction de permettre le partage d’une seule instance de ce module de données par plusieurs cadres. Le code généré pour cette méthode est :

public static ModuleDeDonnees1 getDataModule() {if (myDM == null){ myDM = new ModuleDeDonnees1();}return myDM; }

Le code de cette méthode,

• Déclare cette méthode comme static. Cela signifie qu’il est possible d’appeler cette méthode sans une instanciation en cours d’un objet classe DataModule.

• Renvoie une instance de la classe DataModule.

• Vérifie s’il y a déjà une instanciation d’un DataModule.

• Crée et renvoie un nouveau DataModule s’il n’existe pas déjà.

• Renvoie un objet DataModule s’il est déjà instancié.

La classe du module de données contient alors toutes les méthodes nécessaires à une classe de module de données personnalisée et un squelette de méthode pour jbInit(), auquel il faut ajouter des composants d’accès aux données et la logique de gestion personnalisée.

Ajout de composants données à un module de données

Pour personnaliser votre module de données en utilisant le concepteur d’interface utilisateur,

1 Double-cliquez sur le fichier du module de données dans le volet projet afin de l’ouvrir dans le volet Contenu.

2 Sélectionnez l’onglet Conception du volet Contenu pour activer le concepteur d’interface utilisateur.

3 Ajoutez les composants données à la classe du module de données.

Par exemple,

a Sélectionnez un composant Database de la page DataExpress de la palette des composants.

Page 158: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

b Cliquez dans l’arborescence des composants ou dans le concepteur d’interface utilisateur pour ajouter le composant Database au module de données (DataModule).

c Initialisez la propriété connection via le connectionDescriptor de la base de données. La définition de cette propriété dans l’inspecteur est décrite au Chapitre 4, “Connexion à une base de données”.

Les composants données sont ajoutés au module de données dès qu’ils sont ajoutés à un fichier cadre. Pour plus d’informations sur l’ajout de composants de données, voir Chapitre 5, “Extraction des données d’une source de données”.

Remarque JBuilder crée automatiquement le code d’une méthode publique qui “obtient” chaque composant DataSet placé dans le module de données. Ainsi les composants DataSet peuvent apparaître comme des propriétés (en lecture seule) du module de données (DataModule). Cela permet également aux composants DataSet d’être accessibles à la propriété dataSet des composants orientés données dans l’inspecteur quand des composants orientés données et des modules de données sont utilisés dans le même conteneur.

Une fois cette étape achevée, le module de données 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; } public com.borland.dx.sql.dataset.Database getDatabase1() { return database1;

Page 159: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-5

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

}}

Ajout de la logique métier au module de données

Une fois les composants d’accès aux données ajoutés et les propriétés correspondantes définies, vous pouvez définir vos règles de gestion personnalisées dans le module de données. Par exemple, certains utilisateurs peuvent avoir le droit de supprimer les enregistrements alors que d’autres ne l’ont pas. Pour ce faire, ajoutez du code aux différents événements des composants ensemble de données (DataSet) du module de données.

Remarque Le paramétrage des propriétés et le codage des règles de gestion définis dans le modèle de données ne peuvent être redéfinis dans une application utilisant le modèle de données. Si vous avez créé un comportement qui ne s’applique pas systématiquement à toutes les applications utilisant ce modèle de données, il vous faudra probablement créer plusieurs modèles de données adaptés aux besoins des divers groupes d’applications ou d’utilisateurs.

Pour ajouter du code aux événements d’un composant,

1 Double-cliquez sur le fichier du module de données dans le volet projet afin de l’ouvrir dans le volet Contenu.

2 Sélectionnez l’onglet Conception du volet Contenu pour activer le concepteur d’interface utilisateur.

3 Sélectionnez le composant auquel vous voulez ajouter des règles de gestion, puis cliquez sur l’onglet Evénements dans l’inspecteur.

4 Double-cliquez sur l’événement associé à la règle de gestion.

JBuilder crée le squelette dans le fichier source Java auquel vous pouvez ajouter le code de votre règle de gestion personnalisée.

Utilisation d’un module de données

Pour utiliser un module de données dans une application, il faut tout d’abord l’enregistrer et le compiler. Dans le module de données :

1 Choisissez Fichier|Tout enregistrer.

Notez le nom du projet, du paquet et du module de données.

2 Compilez la classe du module de données en sélectionnant Projet|Construire le projet.

Cela crée les fichiers de la classe du module de données dans le répertoire spécifié par Projet|Propriétés du projet, Chemin de sortie.

Page 160: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

3 Choisissez Fichier|Fermer.

Pour faire référence au module de données dans une application, vous devez d’abord l’ajouter à votre projet en tant que bibliothèque nécessaire.

Ajout d’une bibliothèque nécessaire à un projetCes instructions générales pour ajouter une bibliothèque nécessaire utilisent comme exemple un module de données, mais les mêmes étapes peuvent être suivies pour ajouter n’importe quelle bibliothèque nécessaire. Une bibliothèque peut être un fichier classe, comme un module de données, ou une archive, comme un fichier .jar.

Choisissez Projet|Propriétés du projet. Sélectionnez Bibliothèques nécessaires dans l’onglet Chemins et ajoutez un fichier classe ou un fichier archive comme nouvelle bibliothèque. Dans le cas particulier de l’ajout d’un module de données, ce sera le fichier classe du module de données que vous venez de compiler.

Pour ce faire,

1 Cliquez sur Ajouter.

2 Cliquez sur Nouveau.

3 Entrez le nom de la bibliothèque (comme ModuleDonnéesEmployés).

4 Sélectionnez l’emplacement où vous voulez mettre le fichier <nom bibliothèque>.library.

Vous avez le choix entre JBuilder, Projet et Home de l’utilisateur. Si vous exécutez JBuilder depuis un réseau, et que vous voulez rendre votre bibliothèque accessible à tous, vous devez sélectionner JBuilder. Cela placera le fichier <nom bibliothèque>.library dans le répertoire /lib de votre installation de JBuilder. Si vous êtes le seul développeur à accéder à votre bibliothèque, vous pouvez choisir une des autres options, pour que le fichier .library soit stocké en local.

5 Cliquez sur Ajouter.

6 Naviguez jusqu’au dossier contenant le chemin d’accès au fichier classe ou l’archive que vous voulez ajouter.

JBuilder détermine automatiquement les chemins d’accès aux fichiers classe, aux fichiers source et aux fichiers de documentation, à l’intérieur de ce dossier.

7 Cliquez sur OK.

8 Cliquez sur OK.

9 Cliquez sur OK.

A ce stade, vous voyez que votre nouvelle bibliothèque a été ajoutée à la liste des bibliothèques nécessaires.

Page 161: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-7

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

Référencement d’un module de données dans votre applicationMaintenant que vous avez ajouté le module de données en tant que bibliothèque nécessaire, voici les étapes à suivre pour référencer un module de données dans votre application :

1 Fermez tous les projets ouverts (Fichier|Fermer les projets).

2 Choisissez Fichier|Nouveau et double-cliquez sur l’icône Application dans la page Général de la galerie d’objets.

Cela crée et une application et un projet.

3 Entrez les informations appropriées relatives au paquet et à la classe.

4 Sélectionnez le fichier cadre de l’application dans le voler contenu.

5 Vérifiez que DataExpress est spécifié comme une des Bibliothèques nécessaires. Si DataExpress ne fait pas partie de la liste des Bibliothèques nécessaires dans la boîte de dialogue Propriétés du Propriétés du projet,

a Cliquez sur Ajouter.

b Sélectionnez DataExpress.

c Cliquez sur OK jusqu’à la fermeture de la boîte de dialogue Propriétés du projet.

6 Importez le paquet auquel appartient la classe du module de données (s’il est à l’extérieur de votre paquet) en choisissant Expert|Utiliser un module de données.

7 Cliquez sur les points de suspension (...) pour ouvrir la boîte de dialogue de sélection du module de données.

Une arborescence de tous les paquets et classes connus est affichée. Naviguez jusqu’à l’emplacement des fichiers classe générés lors de l’enregistrement et de la compilation du module de données (ce doit être sous le nœud de l’arborescence portant le même nom que votre paquet, si le module de données fait partie d’un paquet). Sélectionnez la classe du module de données. Si vous ne voyez pas la classe du module de données à cet emplacement, vérifiez que le projet du module de données s’est bien compilé sans erreurs et qu’il a été correctement ajouté aux bibliothèques nécessaires pour le projet.

8 Cliquez sur OK.

Si vous obtenez un message d’erreur à ce stade, vérifiez les bibliothèques nécessaires dans les propriétés du projet et l’emplacement du fichier classe de votre module de données.

Cliquez sur l’onglet Conception pour ouvrir le concepteur d’interface utilisateur ; l’instance du module de données apparaît dans le volet contenu. Cliquer sur l’entrée du module de données ne fait pas apparaître ses composants ensemble de données (DataSet) ni ses composants colonnes

Page 162: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d ’ u n m o d u l e d e d o n n é e s e n u t i l i s a n t l e s o u t i l s d e c o n c e p t i o n

(Column). Ce comportement est voulu car il empêche la modification des règles de gestion définies dans le module de données hors de celui-ci.

Lors de la conception de l’application, la propriété dataSet des composants d’interface utilisateur propose tous les composants DataSetView et StorageDataSet inclus dans le module de données. Vous y avez accès bien qu’ils n’apparaissent pas de manière distincte dans le volet contenu.

Si vous avez un modèle de données complexe et/ou des règles de gestion dont vous voulez interdire la modification par un autre développeur ou la manipulation par un utilisateur, l’encapsulation dans un composant réutilisable constitue le meilleur moyen de donner accès aux données tout en conservant la maîtrise des règles de gestion.

La boîte de dialogue Expert utilisation d’un module de donnéesLorsque vous choisissez Experts|Utiliser un module de données, vous faites apparaître le dialogue suivant :

Sélectionnez un module de données en sélectionnant les points de suspension dans le champ Classe DataModule. Une arborescence de tous les paquets et classes connus est affichée. Si vous ne trouvez pas la classe de votre module de données (DataModule) dans cette liste, utilisez Projet|Propriétés du projet pour ajouter le paquet ou l’archive à vos bibliothèques. Placez-vous sur l’emplacement des fichiers classe générés quand le module de données a été enregistré et compilé. Sélectionnez la classe du module de données.

Dans la zone Déclaration de champ Java, le nom de champ par défaut est le nom du module de données suivi d’un “1”. C’est le nom utilisé pour la variable membre générée dans le code. Le module de données sera également désigné par ce nom dans l’arborescence des composants. Saisissez un nom qui décrit les données du module de données, comme ModuleDonnéesEmployés.

Page 163: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-9

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Dans la section Déclaration de champ Java, vous pouvez choisir un des moyens suivants d’utiliser le DataModule dans votre application :

• Créer une nouvelle instance de DataModule

Si vous avez une seule sous-classe Frame dans votre application, sélectionnez cette option.

• Partager l’instance (statique) du DataModule

Si vous envisagez de faire référence au module de données dans plusieurs cadres de votre application et si vous voulez partager une seule instance de la classe DataModule personnalisée, sélectionnez cette option.

• L’appeleur définit une instance avec setModule()

Sélectionnez cette option lorsque vous disposez de plusieurs modules de données différents, par exemple, un module de données qui obtient les données localement et un autre qui les obtient à distance.

Choisissez OK pour ajouter le module de données au paquet et injecter le code approprié dans le fichier source en cours afin de créer une instance du module de données.

Selon les choix indiqués dans le dialogue précédent, le code suivant est ajouté à la méthode jbinit() du fichier du cadre. Notez que l’option Partager l’instance (statique) du DataModule est sélectionnée :

ModuleDeDonnées12 = com.borland.samples.dx.datamodule.ModuleDeDonnees1.getDataModule();

Si l’option Créer une nouvelle instance de DataModule est sélectionnée, le code suivant est ajouté à la méthode jbInit() du fichier du cadre :

ModuleDeDonnées12 = new com.borland.samples.dx.datamodule.ModuleDeDonnees1();

Si l’option L’appeleur définit une instance avec setModule() est sélectionnée, une méthode setModule() est ajoutée à la classe en cours de modification.

Création de modules de données en utilisant le modeleur de données

L’EDI de JBuilder fournit des outils qui facilitent et accélèrent la création des applications interrogeant une base de données. Le Modeleur de données peut construire des modules de données encapsulant une connexion à une base et les requêtes à exécuter sur cette base. L’expert Application Module de données peut ensuite utiliser ce module de données pour créer une application de base de données client-serveur.

Page 164: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Création des requêtes avec le modeleur de données

JBuilder peut largement simplifier les tâches de visualisation et de mise à jour des données de vos bases. Le modeleur de données JBuilder vous permet de créer visuellement vos requêtes SQL et les enregistre dans des modules de données Java JBuilder.

Pour commencer un nouveau projet,

1 Choisissez Fichier|Nouveau projet pour démarrer l’expert projet.2 Choisissez l’emplacement et le nom du projet.3 Cliquez sur le bouton Terminer.

Pour plus d’informations sur la création de projets, voir “Création et gestion des projets” dans Construction d’applications avec JBuilder.

Pour afficher le modeleur de données,

1 Choisissez Fichier|Nouveau.

2 Double-cliquez sur l’icône Module de données de la page Nouveau.

3 Entrez un nom de paquet et de classe pour le module de données que vous voulez créer, et cochez l’option Appeler le Modeleur de données.

4 Cliquez sur OK. Le modeleur de données apparaît.

Figure 10.1 Modeleur de données

Pour ouvrir un module de données Java existant dans le modeleur de données,

1 Cliquez avec le bouton droit sur le module dans le volet projet.

2 Choisissez Ouvrir avec le Modeleur de données.

Page 165: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-11

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Ouverture d’une URLPour commencer à construire une requête SQL, vous devez d’abord ouvrir une URL de connexion. Il y a plusieurs façons de le faire :

• Double-cliquer sur l’URL donnant accès à vos données.

• Choisir l’icône de développement.

• Sélectionner l’URL puis choisir Base de données|Ouvrir une URL de connexion.

Si la base de données à laquelle vous voulez accéder n’apparaît pas dans la liste URL base de données du modeleur de données, vous pouvez l’ajouter.

1 Choisissez Base de données|Ajouter une URL de connexion pour afficher la boîte de dialogue Nouvelle URL.

2 Sélectionnez un pilote installé dans la liste déroulante des pilotes, ou tapez le pilote souhaité.

Pour les exemples, vous pouvez sélectionner com.borland.datastore.jdbc.DataStoreDriver.

3 Tapez une URL ou utilisez le bouton Parcourir pour sélectionnez l’URL des données auxquelles vous voulez accéder.

Pour les exemples, vous pouvez sélectionner la base de données employee.jds située dans le répertoire samples de votre installation JBuilder, /samples/JDataStore/datastores/employee.jds. Utilisez le bouton Parcourir pour naviguer jusqu’à ce fichier afin d’éviter les fautes de frappe.

Début d’une requêteCommencez par effectuer ce qui suit :

1 Sélectionnez la table à interroger puis les colonnes à ajouter à la requête ou la fonction statistique opérant sur une colonne particulière.

a Double-cliquez sur le nœud Tables ou choisissez l’icône de développement Tables pour voir les tables.

b Dans la liste des tables, sélectionnez la table que vous voulez interroger et double-cliquez. Double-cliquez sur le nœud Colonnes pour voir toutes les colonnes de la table sélectionnée.

2 Ajoutez une ou plusieurs colonnes à une instruction SELECT de la requête

L’instruction SELECT est l’instruction de lecture (ou extraction) des données qui renvoie un nombre variable de lignes comportant un nombre de colonnes fixe. Le modeleur de données vous aide à

Page 166: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

construire votre instruction SELECT. La clause SELECT spécifie la liste des colonnes à extraire.

a Dans la table à laquelle vous voulez avoir accès, sélectionnez une colonne à ajouter.

b Cliquez sur le bouton Copier.

Le nom de la colonne sélectionnée apparaît dans la boîte Colonnes sélectionnées et le nom de la table en haut dans le panneau Requêtes. Continuez la sélection des colonnes jusqu’à avoir tout ce qui vous intéresse dans la table. Si vous voulez sélectionner toutes les colonnes, cliquez sur le bouton Tout copier.

Figure 10.2 Sélection des colonnes

3 Ajoutez une fonction statistique à la requête.

Les fonctions statistiques (ou d’agrégation) produisent une nouvelle valeur à partir d’un ensemble de valeurs. Les fonctions statistiques sont SUM, AVG, MIN, MAX et COUNT.

a Cliquez sur le bouton Statistiques pour afficher la boîte de dialogue ci-dessous.

Figure 10.3 Boîte de dialogue d’agrégation

Page 167: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-13

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

b Dans la liste Colonnes disponibles, cliquez sur la colonne dont vous souhaitez agréger les valeurs.

c Dans la liste Fonctions statistiques, cliquez sur la fonction que vous souhaitez utiliser sur la colonne sélectionnée.

d Cochez la case Distinct si vous souhaitez que la fonction n’opère que sur les valeurs uniques de la colonne sélectionnée.

e Choisissez Ajouter une fonction statistique pour ajouter la fonction à votre requête.

Au fur et à mesure que vous sélectionnez des colonnes, votre instruction SQL SELECT se construit. Lorsque vous agrégez des données, vous devez inclure une clause GROUP BY. Pour plus d’information sur les claues GROUP BY, voir “Ajout d’une clause Group By”, page 10-13.

Pour voir votre instruction SQL, cliquez sur l’onglet SQL.

Ajout d’une clause Group ByLa clause GROUP BY est utilisée pour grouper les données renvoyées par une instruction SELECT et souvent en conjonction avec les fonctions statistiques. Lors de son utilisation avec les fonctions statistiques, voici ce qui se passe :

• D’abord, les données sont limitées par une clause WHERE, lorsqu’elle existe.

• Les données sont ensuite groupées selon le champ indiqué par la clause GROUP BY.

• Puis, les fonctions statistiques sont appliquées aux groupes et une ligne de résultat est générée (une par groupe).

Pour ajouter une clause Group By à votre requête, cliquez sur l’onglet Group By afin d’afficher la page Group By.

Page 168: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Figure 10.4 Page Group By

La liste Colonnes disponibles contient les colonnes de la requête en cours dans le panneau Requêtes du modeleur de données. La boîte Group By contient les noms des colonnes sur lesquelles la requête effectuera le regroupement. Par défaut, la requête n’est pas groupée sur une colonne jusqu’à ce que vous en spécifiiez une.

Pour ajouter une clause Group By à votre requête,

1 Sélectionnez la colonne sur laquelle vous souhaitez regrouper la requête.

2 Cliquez sur le bouton d’ajout (>) afin de transférer le nom de colonne dans la boîte Group By.

Une clause Group By est ajoutée à votre instruction SQL SELECT. Pour la voir, cliquez sur l’onglet SQL.

Sélection des lignes ayant des valeurs de colonnes uniquesSi vous voulez ne voir que les lignes contenant des valeurs de colonne uniques, utilisez le mot clé DISTINCT. En ajoutant ce mot clé à l’instruction SELECT, seules les lignes ayant des valeurs uniques sont renvoyées. DISTINCT affecte toutes les colonnes de l’instruction SELECT.

Pour ajouter le mot clé DISTINCT, cochez l’option Distinct sur la page Colonnes.

Ajout d’une clause WhereAjouter une clause WHERE à une instruction SELECT spécifie la condition que doivent satisfaire les lignes pour entrer dans la table résultant de la requête. Pour ajouter une clause Where à votre requête SQL, cliquez sur l’onglet Where.

Page 169: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-15

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Figure 10.5 Page Where

A gauche, la liste Colonnes contient les colonnes des tables de la requête en cours dans le panneau Requêtes du modeleur de données.

Utilisez les listes Colonnes, Opérateurs et Fonctions pour construire la clause Where dans la boîte Clause Where comme ci-dessous :

1 Sélectionnez 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 boîte Clause Where.

2 Pour faire passer une colonne, en tant que paramètre d’une requête paramétrée, sélectionnez la colonne dans la liste Colonnes et cliquez sur le bouton Coller le paramètre.

3 Sélectionnez l’opérateur dont vous avez besoin dans la liste déroulante Opérateurs et cliquez sur le bouton Coller.

Chaque clause Where nécessite au moins un opérateur.

4 Si votre requête nécessite une fonction, sélectionnez-la dans la liste déroulante Fonctions et cliquez sur le bouton Coller.

En collant des sélections, vous créez une clause Where. Vous pouvez aussi modifier directement le texte dans la boîte Clause Where pour terminer votre requête. Par exemple, supposons que vous créez une clause Where comme celle-ci :

WHERE PAYS=’USA’

Vous devrez sélectionner et coller la colonne PAYS et l’opérateur =. Pour terminer la requête, vous pouvez saisir directement la valeur de données, qui dans ce cas est ’USA’.

Lorsque vous êtes satisfait de votre clause Where, cliquez sur le bouton Appliquer. La clause Where est ajoutée à l’instruction SQL SELECT entière. Pour la voir, cliquez sur l’onglet SQL.

Page 170: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Ajout d’une clause Order ByUne clause ORDER BY est utilisée pour trier ou modifier l’ordre des données de la table résultat. Pour spécifier comment trier les lignes d’une table,

1 Dans le panneau Requêtes, sélectionnez la requête que vous voulez trier.

2 Dans le panneau Requête en cours, cliquez sur l’onglet Order By.

Figure 10.6 Page Order By

3 Sélectionnez la colonne sur laquelle vous voulez que la requête soit triée dans la boîte Colonnes disponibles et cliquez sur le bouton d’ajout (>) pour transférer cette colonne dans la boîte Order By.

4 Sélectionnez la direction de l’ordre de tri dans les options de direction de l’ordre de tri sélectionné.

L’option Croissant trie la colonne spécifiée de la plus petite valeur à la plus grande, l’option Décroissant trie la colonne spécifiée de la plus grande valeur à la plus petite. Par exemple, si le tri est alphabétique, Croissant trie la colonne dans l’ordre alphabétique et Décroissant dans l’ordre inverse.

Vous pouvez trier la requête sur plusieurs colonnes en transférant plusieurs colonnes dans la boîte Order By. Sélectionnez d’abord la colonne de tri primaire, puis sélectionnez la secondaire, et ainsi de suite. Par exemple, si votre requête comprend une colonne Pays et une colonne Client et que vous voulez voir tous les clients d’un pays ensemble dans votre requête, vous devez d’abord transférer la colonne Pays dans la boîte Order By puis la colonne Client.

Page 171: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-17

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Modification directe de la requêteA tout moment pendant que vous utilisez le modeleur de données pour créer votre requête, vous pouvez voir l’instruction SQL SELECT et la modifier directement.

Pour visualiser l’instruction SELECT, cliquez sur l’onglet SQL. Pour la modifier, tapez directement les modifications dans l’instruction SELECT.

Test de votre requêteVous pouvez voir le résultat de votre requête dans le modeleur de données. La requête créée ici ne s’exécutera pas : ces rubriques ont été présentées de façon à favoriser leur compréhension, pas de façon à exécuter correctement la requête.

Pour voir le résultat de la requête que vous construisez,

1 Cliquez sur l’onglet Test.2 Cliquez sur le bouton Exécuter la requête.

Si votre requête est une requête paramétrée, une boîte de dialogue Spécification des valeurs de paramètres apparaît pour vous permettre de saisir la valeur de chaque paramètre. Lorsque vous choisissez OK, la requête s’exécute et les résultats s’affichent. Les valeurs entrées ne sont pas enregistrées dans le module de données.

Construction de requêtes multiplesPour construire des requêtes multiples, choisissez Requêtes|Ajouter. Le modeleur de données est alors prêt à entreprendre la construction d’une nouvelle requête. Au fur et à mesure que vous sélectionnez des colonnes dans une ou plusieurs tables, les noms des tables apparaissent à la place du champ <nouvelle requête>.

Spécification d’une relation maître-détailPour définir une relation maître-détail entre deux requêtes,

1 Affichez la boîte de dialogue Liaison entre requêtes par l’un des moyens suivants :

a Choisissez Requêtes|Lien.

b Dans le panneau Requêtes, cliquez et faites glisser le pointeur de la souris de la requête dont vous voulez faire la requête maître vers la requête dont vous voulez faire la requête détail.

Page 172: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-18 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Figure 10.7 Boîte de dialogue Liaison entre requêtes

2 Sélectionnez la requête qui sera la requête maître dans le champ Requête maître.

3 Sélectionnez la requête qui sera la requête détail dans le champ Requête détail.

Les champs Requête maître et Requête détail sont remplis par des champs proposés par le programme. S’ils ne vous conviennent pas, faites les modifications nécessaires.

4 Utilisez la table pour indiquer de manière visuelle les colonnes liant les requêtes maître et détail :

a Cliquez sur la première ligne située sous la colonne requête maître de la table pour afficher la liste déroulante de toutes les colonnes spécifiées dans la table maître. Sélectionnez la colonne sur laquelle vous voulez grouper les données détail.

b Cliquez sur la première ligne située sous la colonne requête détail de la table pour afficher la liste déroulante de toutes les colonnes ayant le même type de données et la même longueur que la colonne maître en cours. Sélectionnez la colonne souhaitée. Cela suffit à lier les tables maître et détail.

c Cliquez sur OK.

Lorsque la boîte de dialogue Liaison entre requêtes se ferme, une flèche apparaît entre les deux requêtes dans le panneau Requêtes pour figurer la relation établie entre elles.

Page 173: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-19

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Figure 10.8 Flèches montrant les relations entre les requêtes

Pour davantage d’informations sur les relations maître-détail, voir Chapitre 9, “Etablissement d’une relation maître-détail”.

Enregistrement de vos requêtesPour enregistrer le module de données que vous construisez,

1 Choisissez Fichier|Enregistrer dans le modeleur de données et spécifiez un nom avec l’extension .java.

2 Quittez le modeleur de données.

Le fichier résultant apparaît dans votre projet.

3 Compiler le module de données.

Double-cliquez sur le fichier dans le volet projet pour l’ouvrir dans le volet contenu et voir le code généré par le modeleur de données.

Page 174: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-20 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Figure 10.9 Editeur montrant le code généré par le Modeleur de données

Génération d’applications de bases de données

A partir du module de données compilé, JBuilder peut générer des applications client/serveur à 2 niveaux avec l’expert Application Module de données.

Pour afficher l’expert Application Module de données, sélectionnez l’icône Application Module de données dans la galerie d’objets :

1 Choisissez Fichier|Nouveau et sélectionnez l’onglet Général.

2 Double-cliquez sur l’icône Application Module de données.

Page 175: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-21

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Figure 10.10 Expert Application Module de données

3 Spécifiez dans la boîte de dialogue qui apparaît alors le fichier de module de données à partir duquel vous voulez générer une application.

Vous pouvez sélectionner n’importe quel module de données JBuilder disponible ou un de ceux créés par le modeleur de données.

4 Cliquez sur OK.

L’expert crée pour vous une application de base de données. L’expert génère plusieurs fichiers Java et un fichier HTML :

• Les fichiers constituant la partie client sont contenus dans le paquet clienttwotier :

• Un ou plusieurs UIBeans.java - Chaque bean implémente une interface utilisateur pour chaque DataSet particulier.

• ClientAboutBoxDialog.java - Implémente le dialogue A propos du menu Aide du client.

• ClientFrame.java - Le cadre de l’application client, c’est-à-dire le conteneur de l’interface utilisateur client par défaut. Implémente la barre de menus de l’application.

• ClientResources.java - Contient les chaînes de l’application client pour la localisation.

• <modulededonnées>TwoTierApp.java - L’application.

• <modulededonnées>AppGenFileList.html - Liste des fichiers générés comportant pour chacun une brève description.

Page 176: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-22 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

Utilisation dans votre code d’un module de données généréLorsque vous avez créé un module de données à l’aide du modeleur de données, vous pouvez l’utiliser dans les applications que vous écrivez. Suivez ces étapes :

1 Exécutez l’expert Utilisation d’un module de données.

Il ajoute, dans le code source du cadre de votre application, une méthode setModule() identifiant le module de données. La méthode setModule() créée par l’expert appelle la méthode jbInit() du cadre. L’expert supprime également l’appel de jbInit() dans le constructeur du cadre.

2 Dans le code source du fichier de votre application, appelez la méthode setModule() du cadre, en lui transmettant la classe du module de données.

Supposons, par exemple, que vous avez utilisé le modeleur de données pour créer un module de données appelé CountryDataModelModule. Pour accéder à la logique stockée dans ce module de données depuis l’application que vous écrivez, vous devez ajouter une méthode setModule() à la classe de votre cadre.

Pour ajouter la méthode setModule() et supprimer l’appel de la méthode jbInit() dans le constructeur de la classe,

1 Ajoutez le module de données à la liste des bibliothèques nécessaires (dans la boîte de dialogue Projet|Propriétés du projet).

2 Choisissez Experts|Utiliser un module de données alors que le code source du cadre est visible dans l’éditeur.

3 Spécifiez le module de données à utiliser avec l’expert.

4 Sélectionnez l’option L’application définit l’instance en appelant setModule().

5 Cliquez sur OK.

Le code obtenu pour le cadre doit avoir l’aspect 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 donnéesimport com.borland.samples.dx.datamodule.*;

public class Frame1 extends JFrame { BorderLayout borderLayout1 = new BorderLayout(); CountryDataModelModule countryDataModelModule1;

//Construit le cadre sans appeler jbInit() public Cadre1() {

Page 177: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d e s m o d u l e s d e d o n n é e s p o u r s i m p l i f i e r l ’ a c c è s a u x d o n n é e s 10-23

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

enableEvents(AWTEvent.WINDOW_EVENT_MASK); }

//Initialisation du composant private void jbInit() throws Exception { this.getContentPane().setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("Titre du cadre"); }

//Redéfinition pour pouvoir quitter à la fermeture du système protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } }

// L’expert Utilisation d’un module de données a ajouté le code suivant public void setModule(CountryDataModelModule countryDataModelModule1) { this.countryDataModelModule1 = countryDataModelModule1; try{ jbInit(); } catch(Exception e){ e.printStackTrace(); } }}

Remarquez comment la méthode jbInit() du cadre est maintenant appelée après la définition du module et non dans le constructeur.

Vous devez ensuite appeler la nouvelle méthode setModule() dans le code source principal de votre application. Dans le constructeur de l’application, appelez setModule() en lui transmettant la classe du module de données. Le code de l’application principale doit avoir l’aspect suivant :

package com.borland.samples.dx.myapplication;

import javax.swing.UIManager;

public class Application1 { boolean packFrame = false;

//Construit l’application public Application1() { Frame1 frame = new Frame1();

// Voici la ligne de code que vous devez ajouter frame.setModule(new sans_titre3.CountryDataModelModule());

Page 178: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

10-24 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e m o d u l e s d e d o n n é e s e n u t i l i s a n t l e m o d e l e u r d e d o n n é e s

//Valider les cadres ayant des tailles prédéfinies //Compacter les cadres ayant des infos de taille préférées - ex. depuis

//leur disposition if (packFrame) frame.pack();else frame.validate(); frame.setVisible(true); }

//Méthode principalepublic static void main(String[] args) { try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e){ } new Application1(); }}

Page 179: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-1

C h a p i t r e

11Chapitre11Filtrage, tri et recherche

de donnéesLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Dans une application, une fois achevée la phase d’acquisition des données, les données sont placées dans le composant ensemble de données (DataSet) approprié du paquet DataExpress. Il reste alors à définir les fonctions standard de l’application et son interface utilisateur. Ce chapitre présente les caractéristiques de filtrage, tri et recherche de données que propose généralement une application de base de données.

Un des principes fondamentaux du paquet DataExpress est que la manipulation des données est indépendante de la manière d’obtenir ces données. Quel que soit le type de composant ensemble de données utilisé pour obtenir les données, il est manipulé et connecté aux contrôles de la même manière. 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 l’application.

Tous les exemples exposés dans ce chapitre sont créés en utilisant l’AppBrowser JBuilder et les outils de conception. Chaque fois que c’est possible, ces outils sont utilisés pour générer le code source Java. Quand cela s’avère nécessaire, vous apprendrez à modifier le code pour que l’application effectue une action particulière.

Les informations présentées dans ce chapitre supposent que vous connaissez suffisamment l’utilisation de l’environnement de JBuilder. Les étapes détaillées sur la façon d’utiliser l’interface utilisateur ne sont pas mentionnées. Si ce n’est pas votre cas, lisez le Chapitre 16, “Tutoriel : Importation et exportation des données d’un fichier texte”, “Utilisation de l’AppBrowser” dans Introduction à JBuilder ou “Présentation du concepteur” dans Conception d’applications avec JBuilder.

Page 180: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A c c è s a u x d o n n é e s d e s e x e m p l e s

Tous le matériel mis en œuvre dans ce chapitre nécessite l’accès aux données SQL stockées dans une base de données locale. Pour des instructions sur l’installation et la configuration de JBuilder pour utiliser le pilote JDataStore exemple, voir “Ajout d’un pilote JDBC à JBuilder”, page 4-10.

Il est conseillé d’utiliser les exemples comme guide pour ajouter des fonctions à votre application. Des projets complets et des fichiers source Java, comprenant des commentaires lorsque c’est nécessaire, sont fournis pour la plupart des concepts présentés dans ce chapitre. Tous les fichiers référencés par ces exemples se trouvent dans le répertoire des exemples de JBuilder.

Pour créer une application de base de données, vous devez d’abord établir une connexion à une base de données et fournir des données à un ensemble de données. “Accès aux données des exemples”, page 11-2, permet de définir une requête utilisable pour certains exemples de ce chapitre. Les options de base de données de la liste suivante (filtre, tri, recherche de données) peuvent s’utiliser dans diverses combinaisons, vous pouvez ainsi choisir de masquer, temporairement, tous les employés dont le nom commence par une lettre comprise entre “M” et “Z”. Vous pouvez également trier les employés visibles par ordre alphabétique des prénoms.

• Le filtrage masque temporairement des lignes dans un ensemble de données.

• Le tri modifie l’ordre d’un ensemble de donnéesfiltré ou non filtré.

• La recherche positionne le curseur dans l’ensemble de données filtré ou non filtré.

Accès aux données des exemplesCette section donne les étapes nécessaires pour configurer une application de base de données simple qui peut être utilisée dans les exemples de ce chapitre. La requête utilisée dans ces exemples est :

SELECT * FROM EMPLOYEE

Cette instruction SQL sélectionne toutes les colonnes d’une table nommée EMPLOYEE, incluse dans le JDataStore exemple.

Pour configurer une application afin de pouvoir l’utiliser avec les exemples,

1 Fermez tous les projets ouverts (choisissez Fichier|Fermer les projets).

2 Choisissez Fichier|Nouveau projet.

3 Entrez le nom et l’emplacement du projet dans l’expert projet. Cliquez sur Terminer.

Page 181: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-3

A c c è s a u x d o n n é e s d e s e x e m p l e s

4 Choisissez Fichier|Nouveau dans le menu et double-cliquez sur l’icône Application dans la page Général de la galerie d’objets.

5 Spécifiez le nom du paquet et le nom de la classe dans l’expert application. Cliquez sur Terminer.

6 Sélectionnez l’onglet Conception pour activer le concepteur d’interface utilisateur.

7 Cliquez sur le composant Database de l’onglet Data Express de la palette des composants, puis cliquez dans l’arborescence des composants ou le concepteur d’interface utilisateur pour ajouter le composant à l’application.

8 Ouvrez l’éditeur de la propriété connection du composant Database en le sélectionnant, puis en cliquant sur les points de suspension (...) de la propriété connection dans l’inspecteur. Définissez les propriétés de connexion pour la table employee du JDataStore exemple, comme suit. La connexion URL pointe sur un emplacement d’installation particulier. Si vous avez installé JBuilder dans un autre répertoire, pointez sur l’emplacement de votre installation.

La boîte de dialogue connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vérifier que les propriétés de connexion sont correctement définies. Le résultat de la tentative de connexion est affiché dans la zone d’état. Quand la connexion réussit, cliquez sur OK. Si la connexion échoue, vérifiez que vous avez bien suivi toutes les étapes du Chapitre 4, “Connexion à une base de données”.

9 Ajoutez un composant QueryDataSet au concepteur en cliquant sur le composant QueryDataSet de l’onglet Data Express puis en cliquant dans l’arborescence des composants ou dans l’interface utilisateur.

Dans l’inspecteur, sélectionnez la propriété query du composant QueryDataSet, cliquez sur les points de suspension pour ouvrir le dialogue QueryDescriptor et définissez les propriétés de la manière suivante :

Nom de la propriété Valeur

Driver com.borland.datastore.jdbc.DataStoreDriver

URL Naviguez jusqu’à votre copie de /<jbuilder>/samples/JDataStore/datastores/employee.jds

Username Entrez votre nom

Password non obligatoire

Nom de la propriété Valeur

Database database1

Instruction SQL SELECT * FROM EMPLOYEE

Page 182: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A c c è s a u x d o n n é e s d e s e x e m p l e s

Cliquez sur Tester la requête pour vérifier qu’elle peut être exécutée. Si la zone d’état indique Succès, choisissez OK pour fermer la boîte de dialogue.

10 Ajoutez un composant DBDisposeMonitor de la page dbSwing supplémentaires. Le DBDisposeMonitor fermera le JDataStore lorsque la fenêtre sera fermée.

11 Définissez la propriété dataAwareComponentContainer du DBDisposeMonitor par this.

Pour visualiser les données dans votre application, ajoutez les composants d’interface utilisateur suivants et liez-les à l’ensemble de données :

1 Sélectionnez contentPane(BorderLayout) dans l’arborescence des composants et définissez sa propriété layout par null.

2 Placez un JdbNavToolBar dans la zone située au dessus du panneau dans le concepteur d’interface utilisateur. jdbNavToolBar1 s’attache lui-même automatiquement au DataSet qui détient la focalisation, de sorte qu’il n’est pas nécessaire de définir sa propriété dataSet.

3 Placez un JdbStatusLabel dans la zone située au dessous du panneau dans le concepteur d’interface utilisateur. jdbStatusLabel1 s’attache lui-même automatiquement au DataSet qui détient la focalisation, de sorte qu’il n’est pas nécessaire de définir sa propriété dataSet.

4 A partir de l’onglet dbSwing, ajoutez un TableScrollPane au centre du panneau dans le concepteur d’interface utilisateur.

5 Placez un JdbTable au centre du tableScrollPane1 et définissez sa propriété dataSet par queryDataSet1.

Vous remarquerez qu’à ce stade, le concepteur affiche des données réelles.

6 Choisissez Exécuter|Exécuter le projet pour exécuter l’application et parcourir l’ensemble de données.

L’ensemble de données EMPLOYEE contient 42 enregistrements et 11 champs. Dans le libellé d’état de cette application, vous verrez le nombre d’enregistrements affichés. La première fois que l’application sera exécutée, le libellé d’état indiquera Enregistrement 1 sur 42. Certains exemples supprimeront des lignes de l’affichage. Le libellé d’état montrera le nombre de lignes lues dans l’ensemble de données à chaque application.

Pour plus d’informations sur l’accès de l’application aux données, voir Chapitre 5, “Extraction des données d’une source de données”.

Page 183: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-5

F i l t r a g e d e s d o n n é e s

L’exécution de cette application doit donner le résultat suivant :

Figure 11.1 Exécution des applications de bases de données

Filtrage des donnéesLe filtrage masque temporairement des lignes de l’ensemble de données ce qui permet de sélectionner, visualiser et travailler sur un sous-ensemble des lignes d’un ensemble de données. Vous pouvez souhaiter visualiser toutes les commandes d’un client, tous les clients situés hors de France ou toutes les commandes non livrées dans un délai de 48 heures. Au lieu d’exécuter une nouvelle requête à chaque fois que votre critère change, vous pouvez utiliser un filtre pour afficher une nouvelle vue.

Dans JBuilder, le filtrage est spécifié par du code que l’ensemble de données appelle via un événement pour chaque ligne de données afin de déterminer s’il faut ou non l’inclure dans la vue en cours. A chaque fois que la méthode est appelée, elle doit examiner la ligne qui lui est transmise et indiquer si la ligne doit être ou non incluse dans la vue. La méthode indique cela en appelant les méthodes add() ou ignore() pour un objet RowFilterResponse qui lui est transmis.

Ce code doit être attaché à l’événement filterRow d’un ensemble de données en utilisant la page Evénements de l’inspecteur. Quand vous ouvrez l’ensemble de données, ou quand il est ouvert implicitement en exécutant un cadre contenant un contrôle lié à cet ensemble de données, le filtre est appliqué. Dans l’exemple de cette section, des composants d’interface utilisateur permettent à l’utilisateur de redéfinir dynamiquement un nouveau filtre.

Un filtre appliqué à un ensemble de données est un mécanisme permettant de restreindre les lignes de données visibles. L’ensemble de données sous-jacent n’est pas modifié, seule la vue en cours des données est changée et cette vue est transitoire. Une application peut changer dynamiquement les enregistrements appartenant à la vue en réponse

Page 184: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

F i l t r a g e d e s d o n n é e s

à une demande de l’utilisateur (comme dans l’exemple ci-dessous) ou en fonction de la logique de l’application (par exemple, en affichant toutes les lignes devant être supprimées avant d’enregistrer les modifications, afin de confirmer ou d’annuler l’opération). Quand vous utilisez une vue filtrée des données et validez une modification ne satisfaisant pas aux spécifications de filtre, la ligne disparaît de la vue mais reste dans l’ensemble de données.

Il est possible d’utiliser simultanément plusieurs vues des mêmes données en utilisant des composants DataSetView. Pour davantage d’informations sur l’utilisation de vues multiples d’un même ensemble de données, voir “Présentation de plusieurs vues des données”, page 12-23.

Le filtrage est parfois confondu avec le tri et la recherche.

• Le filtrage masque temporairement des lignes dans un ensemble de données.

• Le tri modifie l’ordre d’un ensemble de données filtré ou non filtré. Pour plus d’informations sur le tri des données, voir “Tri des données”, page 11-9.

• La recherche positionne le curseur dans l’ensemble de données filtré ou non filtré. Pour plus d’informations sur la localisation des données, voir “Recherche de données”, page 11-14.

Ajout et suppression de filtres

Cette section décrit comment utiliser l’auditeur RowFilterListener d’un ensemble de données pour ne visualiser que les lignes vérifiant le critère de filtre. Dans cet exemple, nous créons un JdbTextField permettant à l’utilisateur de spécifier la colonne à filtrer. Ensuite, nous créons un autre JdbTextField permettant à l’utilisateur de spécifier la valeur que doit contenir cette colonne pour que l’enregistrement soit affiché par la vue. Nous ajoutons également un bouton JButton permettant à l’utilisateur de décider quand appliquer le critère de filtre et ne montrer que les lignes dont la colonne spécifiée contient la valeur spécifiée.

Ce tutoriel utilise un composant QueryDataSet connecté à un composant Database pour lire les données, mais le filtrage peut s’appliquer à tout composant DataSet.

L’exemple terminé est disponible sous la forme d’un projet dans le sous-répertoire /samples/DataExpress/FilterRows de votre installation de JBuilder.

Pour créer cette application,

1 Créez une nouvelle application en suivant la procédure décrite dans “Accès aux données des exemples”, page 11-2. Cette étape vous permet de vous connecter à une base de données, de lire les données d’une

Page 185: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-7

F i l t r a g e d e s d o n n é e s

table, de voir et de modifier ces données dans un composant orienté données.

2 Cliquez sur l’onglet 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 exécutant le mécanisme de filtre. Le composant JButton exécute le mécanisme de filtre.

4 Définissez le nom de la colonne à filtrer et de son formateur. Sélectionnez le l’onglet Source et ajoutez les instructions import suivantes aux instructions import existantes :

import com.borland.dx.text.VariantFormatter;

5 Ajoutez les définitions de variables suivantes aux définitions de variables existantes dans la définition de classe :

Variant v = new Variant();String columnName = "Last_Name";String columnValue = "Young";VariantFormatter formatter;

6 Spécifiez le mécanisme de filtre. Il faut restreindre les lignes incluses dans la vue en ajoutant un RowFilterListener et en l’utilisant pour définir les lignes qui doivent être affichées. L’action par défaut d’un RowFilterListener consiste à exclure la ligne. Votre code doit donc appeler la méthode add() de RowFilterResponse pour chaque ligne qui doit être incluse dans la vue. Remarquez que, dans cet exemple, nous vérifions si les champs columnName et columnValue sont vierges. Si un champ est vierge, toutes les lignes sont ajoutées à la vue en cours.

Pour créer le RowFilterListener comme adaptateur d’événement en utilisant les outils de conception visuelle,

a Sélectionnez l’onglet Conception.

b Sélectionnez le composant queryDataSet1 dans l’arborescence des composants.

c Sélectionnez l’onglet Evénements de l’inspecteur.

d Sélectionnez l’événement filterRow.

e Double-cliquez dans la zone de valeur filterRow.

Un RowFilterListener est automatiquement généré en tant que classe inner. Il appelle une nouvelle méthode de votre classe appelée queryDataSet1_filterRow.

f Ajoutez le code de filtrage à l’événement queryDataSet1_filterRow. Vous pouvez copier le code de l’aide en ligne en sélectionnant le

Page 186: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

F i l t r a g e d e s d o n n é e s

code puis en choisissant le bouton Copier (ou en utilisant Ctrl+C ou Edition|Copier dans le Visualiseur d’aide) :

void queryDataSet1_filterRow(ReadRow row, RowFilterResponse response) { try{ if (formatter == null || columnName == null || columnValue == null || columnName.length() == 0 || columnValue.length() == 0) //l’utilisateur 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 chaîne 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 l’exemple de filtre"); }}

7 Redéfinissez l’événement actionPerformed pour le bouton JButton afin d’appliquer effectivement le filtrage des données. Pour ce faire,

a Sélectionnez l’onglet Conception.

b Sélectionnez le JButton dans l’arborescence des composants.

c Cliquez sur l’onglet Evénements de l’inspecteur.

d Sélectionnez l’événement actionPerformed et double-cliquez sur la zone de valeur pour cet événement.

L’onglet source affiche le squelette de la méthode jButton1_actionPerformed. Le code suivant réalise le filtrage des données en détachant et rattachant l’adaptateur d’événement rowFilterListener qui a été généré à l’étape précédente.

e Ajoutez ce code au stub généré.

void jButton1_actionPerformed(ActionEvent e) {

try{

// Obtient les nouvelles valeurs des variables utilisées par le filtre. // Puis rapplique le filtre à l’ensemble de données.

columnName = jdbTextField1.getText(); columnValue = jdbTextField2.getText(); Column column = queryDataSet1.getColumn(columnName);

Page 187: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-9

T r i d e s d o n n é e s

formatter = column.getFormatter();

// Déclenche un recalcul du filtre.

queryDataSet1.refilter();

// La table ne doit maintenant redessiner que les lignes // respectant ces critères } catch(Exception ex) { System.err.println("Echec de l’exemple de filtre"); }}

8 Compilez et exécutez l’application.

L’application en train de s’exécuter ressemble à ceci :

Figure 11.2 Application exécutant des filtres

Pour tester cette application,

1 Entrez le nom de la colonne sur laquelle filtrer (par exemple, Last_Name) dans le premier contrôle JdbTextField.

2 Entrez la valeur du filtre dans l’autre contrôle JdbTextField (par exemple, Young).

3 Cliquez sur le JButton.

Remarque Le filtre est annulé et toutes les lignes sont affichées si le nom de la colonne ou la valeur est laissé vide.

Tri des donnéesLe tri d’un ensemble de données définit un index qui permet l’affichage des données dans l’ordre de tri sans effectivement retrier les lignes dans la table du serveur.

Page 188: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

T r i d e s d o n n é e s

Il est possible de trier les ensembles de données selon plusieurs colonnes. Quand un tri est défini selon plusieurs colonnes, l’ensemble de données est trié comme suit :

• Tout d’abord selon la première colonne.

• Puis selon la seconde colonne définie dans la séquence de tri si le premier tri n’est pas unique.

• Les autres colonnes définies dans le trie répètent le processus.

• S’il reste encore des répétition après la dernière colonne du tri, les colonnes s’affichent dans l’ordre défini dans la table du serveur.

Il est possible de trier les données dans toute sous-classe de DataSet, y compris les composants QueryDataSet, ProcedureDataSet, TableDataSet et DataSetView. Quand les données sont triées :

• La différenciation majuscules/minuscules ne s’applique qu’au tri de données de type String.

• La différenciation majuscules/minuscules s’applique à toutes les colonnes String d’un tri multicolonne.

• Les directions de tri (ascendant/descendant) sont définies colonne par colonne.

• Les valeurs null sont placées au début dans un tri descendant et à la fin dans un tri ascendant.

Le tri et l’indexation sont intimement liés. Pour davantage d’informations sur les index, voir “Tri et indexation”, page 11-12.

Tri des données dans un composant JdbTable

Si une application contient un composant JdbTable associé à un ensemble de données, vous pouvez, lors de l’exécution de l’application, trier suivant une seule colonne en cliquant dans l’en-tête de la colonne. Cliquez à nouveau dans l’en-tête pour passer d’un tri ascendant à un tri descendant.

Figure 11.3 Cliquez sur l’en-tête de la colonne pour effectuer un tri à l’exécution

Page 189: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-11

T r i d e s d o n n é e s

En procédant ainsi, il n’est possible que de trier selon une seule colonne. Si vous cliquez sur un autre en-tête de colonne, vous remplacez le tri existant par un nouveau.

Tri des données en utilisant les outils de conception visuelle de JBuilder

Si l’application doit trier les données dans un ordre spécifique, les outils de conception visuelle de JBuilder permettent de définir simplement ces propriétés. La propriété sort de DataSet permet de :

• Visualiser les colonnes définissant actuellement l’ordre de tri.

• Sélectionner les colonnes de l’ensemble de données utilisables dans le tri.

• Ajouter ou de retirer des colonnes sélectionnées dans la spécification de tri.

• Spécifier la différenciation majuscules/minuscules dans le tri.

• Spécifier si le tri est ascendant ou descendant colonne par colonne.

• Définir des contraintes de tri unique afin de ne pouvoir ajouter ou modifier que les colonnes contenant des valeurs uniques de clé d’un DataSet.

• Créer un index réutilisable pour une table.

Cet exemple décrit comment trier les données d’un ensemble de données par ordre croissant de nom. Pour définir les propriétés de tri avec les outils de conception visuelle de JBuilder, procédez de la manière suivante :

1 Ouvrez ou créez un projet à partir de “Accès aux données des exemples”, page 11-2.

2 Cliquez sur l’onglet Conception. Sélectionnez le QueryDataSet dans le volet contenu.

3 Dans l’inspecteur, sélectionnez puis double-cliquez sur la zone à côté de la propriété sort. L’éditeur de la propriété sort s’affiche.

4 Spécifiez les valeurs des options affectant l’ordre de tri des données. Dans ce cas, sélectionnez le champ LAST_NAME dans la liste Colonnes disponibles et choisissez Ajouter au tri.

5 Si vous sélectionnez la mauvaise colonne, cliquez sur le bouton Retirer du tri et recommencez l’étape précédente.

Page 190: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

T r i d e s d o n n é e s

La boîte de dialogue ressemble à ceci :

Figure 11.4 Boîte de dialogue Sort

6 Cliquez sur le bouton OK.

Les valeurs des propriétés spécifiées dans la boîte de dialogue sont stockées dans un objet SortDescriptor.

7 Choisissez Exécuter|Exécuter le projet pour compiler et exécuter l’application. L’application doit avoir l’aspect suivant :

Figure 11.5 Application triée à l’exécution

Tri et indexationDeux options de la boîte de dialogue Sort nécessitent davantage d’explications : Unique et Index. Le tri et l’indexation sont étroitement liés. Voici une description détaillée de l’option Unique et des index nommés.

UniqueCochez l’option Unique pour créer un index unique qui met en place une contrainte sur les données d’un StorageDataSet. Avec cette contrainte, seules les lignes ayant des valeurs uniques pour les colonnes définies

Page 191: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-13

T r i d e s d o n n é e s

comme sortKeys dans le SortDescriptor peuvent être ajoutées ou mises à jour dans un ensemble de données.

• Unique est une contrainte sur l’ensemble de données, et non pas seulement sur l’index. Si vous définissez un index unique sur une colonne, vous affirmez qu’il n’existe pas deux lignes de l’ensemble de données ayant la même valeur dans cette colonne. S’il y a plusieurs lignes dans l’ensemble de données contenant une même valeur pour une colonne unique lorsque l’index est créé la première fois, les lignes dupliquées sont déplacées dans un autre ensemble de données de doublons.

• Quand une propriété sort unique est appliquée la première fois, les lignes qui violent la contrainte d’unicité sont copiées dans un ensemble de données distinct. Vous pouvez accéder à ce DataSet en appelant la méthode StorageDataSet.getDuplicates(). Vous pouvez supprimer le DataSet des doublons en appelant la méthode StorageDataSet.deleteDuplicates().

• Il est possible de définir en même temps plusieurs paramètres d’unicité dans la propriété sort d’un StorageDataSet. S’il existe déjà un DataSet des doublons pour une précédente définition d’unicité dans la propriété sort, il n’est pas possible de définir d’autres paramètres d’unicité pour la propriété sort tant que les doublons déjà existants n’ont pas été supprimés. Cette règle est définie pour empêcher la suppression involontaire de lignes de données correctes à la suite d’une définition incorrecte de la propriété sort.

• Si un index unique trie sur plusieurs colonnes, la contrainte porte sur les colonnes prises comme un tout : deux lignes peuvent contenir la même valeur pour une des colonnes du tri, mais il ne peut pas y avoir de lignes contenant les mêmes valeurs pour chacune des colonnes définissant le tri.

• L’option Unique est pratique lors de l’interrogation de données provenant d’une table d’un serveur ayant un index unique. Avant que l’utilisateur ne commence à modifier les données, il est possible de définir un index unique pour les colonnes qui sont indexées sur le serveur en sachant qu’il n’y aura pas de doublons. Ainsi, l’utilisateur ne peut pas créer de lignes qui seraient rejetées comme doublons lors de la sauvegarde sur le serveur.

Nom d’indexEntrez un nom dans ce champ pour créer un index nommé. Il s’agit du nom indiqué par l’utilisateur qui sera associé aux spécifications de tri (index) en cours de définition dans la boîte de dialogue.

• Un index nommé implémente les ordres de tri (donc les index) et la contrainte d’unicité reste appliquée même si vous arrêtez de visualiser les données dans cet ordre. Préserver signifie que l’index est actualisé

Page 192: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R e c h e r c h e d e d o n n é e s

afin de refléter les ajouts, suppressions et modifications effectués dans la ou les colonnes de tri. Si, par exemple, vous définissez un tri unique sur la colonne NumClient de votre ensemble de données Clients, même si vous décidez de visualiser les données par ordre de code postal et définissez l’ordre de tri correspondant, vous ne pouvez toujours pas créer un nouveau client ayant un NumClient dupliqué.

• Le rôle d’un nom d’index est de vous permettre de revenir à un tri précédemment défini. L’index à été préservé (tenu à jour) afin d’être réutilisé. Si vous définissez dans la propriété sort d’un ensemble de données un nouveau sortDescriptor utilisant exactement les mêmes paramètres qu’un tri existant, celui-ci est utilisé.

• Pour utiliser un ensemble de données dans l’ordre défini par un nom d’index existant, initialisez sa propriété sort à l’aide du constructeur sortDescriptor qui accepte seulement un nom d’index.

Codage du tri

Vous pouvez également coder le tri manuellement ou utiliser les outils de conception visuelle de JBuilder pour générer le code afin d’instancier un objet SortDescriptor. Le code généré automatiquement par les outils de conception visuelle de JBuilder a l’aspect 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 employés selon leur nom et leur prénom (LAST_NAME et FIRST_NAME), puis leur numéro (EMP_NO) est utilisé comme séparateur dans le cas d’employés portant le même nom. Le tri s’effectue en ordre ascendant en ne tenant pas compte de la différenciation majuscule/minuscule.

Pour revenir à une vue non triée des données, fermez l’ensemble de données et initialisez la propriété setSort à null, comme suit : Les données seront ensuite affichées dans l’ordre où elles ont été ajoutées à la table.

queryDataSet1.setSort(null);

Recherche de donnéesRechercher des données est une fonction élémentaire des applications de données. Cette rubrique présente les deux types de recherche suivants :

• La recherche interactive en utilisant un composant JdbNavField dans laquelle l’utilisateur peut saisir les valeurs à rechercher lors de l’exécution de l’application.

• La recherche de valeurs définies par programmation.

Page 193: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-15

R e c h e r c h e d e d o n n é e s

Recherche de données avec le composant JdbNavField

La bibliothèque dbSwing contient un composant JdbNavField qui propose des fonctionnalités de recherche dans un contrôle d’interface utilisateur. Le composant JdbNavField offre une fonction de recherche incrémentale pour les colonnes de type String. Sa propriété columnName spécifie la colonne où s’effectue la recherche. Si cette propriété n’est pas définie, la recherche est effectuée sur la dernière colonne visitée dans JdbTable.

Si vous incorporez un composant JdbStatusLabel dans une application, les messages du composant JdbNavField sont affichés dans le libellé d’état.

Le répertoire /samples/DataExpress/LocatingData de votre installation JBuilder contient l’exemple terminé d’une application utilisant un JdbNavField dont le nom de projet est LocatingData.jpx. Cet exemple montre comment définir une colonne pour l’opération de localisation et comment utiliser un composant JdbComboBox pour permettre à l’utilisateur de sélectionner la colonne où localiser une valeur. Une fois achevée, l’application a l’aspect suivant :

Figure 11.6 Exemple d’application utilisant JdbNavField

Pour créer cette application,

1 Créez une nouvelle application en suivant la procédure décrite dans “Accès aux données des exemples”, page 11-2.

Cette étape vous permet de vous connecter à une base de données, de lire les données d’une table, de voir et de modifier ces données dans un composant orienté données. Consultez la capture écran de l’application en cours d’exécution ci-dessus pour déterminer l’emplacement approximatif des composants.

2 Ajoutez un JdbNavField au concepteur d’interface utilisateur à partir de la page DbSwing supplémentaires de la palette de composants et définissez sa propriété dataSet par queryDataSet1.

3 Ajoutez un JdbComboBox au concepteur d’interface utilisateur à partir de la page dbSwing de la palette de composants.

Page 194: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R e c h e r c h e d e d o n n é e s

4 Initialisez la propriété items de jdbComboBox1 avec les valeurs des noms de colonnes EMP_NO, FIRST_NAME et LAST_NAME.

5 Sélectionnez l’onglet Evénements de l’inspecteur. Sélectionnez l’événement itemStateChanged() de jdbComboBox1, et double-cliquez sur son champ de valeur. Un stub pour l’événement itemStateChanged() est ajouté au source. Le positionnement du curseur permet d’insérer le code suivant, qui offre à l’utilisateur la possibilité de spécifier la colonne dans laquelle rechercher les données.

void jdbComboBox1_itemStateChanged(ItemEvent e) {jdbNavField1.setColumnName(jdbComboBox1.getSelectedItem().toString());jdbNavField1.requestFocus();}

Ce code teste si une modification est intervenue dans JdbComboBox. S’il détermine qu’une autre valeur de colonne est sélectionnée, la propriété columnName du JdbNavField prend pour valeur la colonne nommée dans le JdbComboBox. Cela indique au JdbNavField d’effectuer les recherches dans la colonne spécifiée (Column). La focalisation est ensuite attribuée au JdbNavField pour la saisie de la valeur à rechercher.

6 Ajoutez un composant JdbTextArea à partir de la page dbSwing.

Placez le composant JdbTextArea à côté du composant JdbComboBox dans le concepteur d’interface utilisateur. Initialisez sa propriété text pour indiquer à l’utilisateur qu’il peut sélectionner une colonne dans laquelle rechercher des données, par exemple : Sélectionnez la colonne dans laquelle effectuer la recherche. Entrez ensuite la valeur à rechercher. Observez les instructions de recherche affichées dans la barre d’état.

Si, par contre vous ne voulez rechercher que dans une colonne donnée (Column), vous pouvez affecter à la propriété columnName du composant JdbNavField la colonne du DataSet dans laquelle vous voulez rechercher des données, par exemple, LAST_NAME.

7 Ajoutez un composant JdbLabel à partir de la page dbSwing. Placez-le à côté de jdbNavField1. Initialisez sa propriété text à : Valeur à localiser.

Remarque Voir plus haut, dans l’écran de l’application en cours d’exécution, le texte des autres instructions.

8 Exécutez l’application.

Le libellé d’état est mis à jour pour refléter l’état courant de l’application. Par exemple,

• Sélectionnez dans le composant JdbComboBox le nom de colonne dans laquelle rechercher. La zone d’état affiche Entrez une valeur puis appuyez sur la touche Entrée pour commencer la recherche".

• Commencez à saisir la valeur à rechercher dans le composant JdbNavField. Si la recherche est effectuée dans une colonne String, au

Page 195: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-17

R e c h e r c h e d e d o n n é e s

fur et à mesure de la saisie, remarquez comment le JdbNavField effectue une recherche incrémentale sur les caractères déjà saisis. Pour tous les autres types de données, appuyez sur Entrée pour effectuer la recherche. Si aucune valeur n’est trouvée dans la table, la zone d’état affiche Impossible de trouver une valeur de colonne correspondante.

• Appuyez sur les touches Haut ou Bas pour, respectivement, rechercher “en arrière” ou “en avant”. Lorsqu’une valeur correspondante est trouvée, la zone d’état affiche Valeur trouvée. Appuyez sur les flèches haut/bas pour les autres correspondances.

Recherche de données par programme

Cette section présente la manière de rechercher des données par code ainsi que les conditions affectant les recherches.

Pour effectuer une recherche par programme,

1 Instanciez un DataRow basé sur l’ensemble de données dans lequel rechercher. Si vous ne voulez pas rechercher dans toutes les colonnes du DataSet, créez un DataRow restreint (un DataRow ne contenant que les colonnes pour lesquelles vous voulez spécifier des valeurs de recherche). (Voir “Recherche de données au moyen d’un DataRow”, page 11-18.)

2 Affectez les valeurs à rechercher aux colonnes appropriées du DataRow.

3 Appelez la méthode locate(ReadRow, int) en spécifiant les options de recherche voulues avec le paramètre int. Testez la valeur renvoyée pour déterminer si la recherche a réussi ou échoué.

4 Pour trouver d’autres occurrences, appelez de nouveau locate(), en spécifiant une option de recherche différente (par exemple, Locate.NEXT ou Locate.LAST). Voir Résumé des champs de la classe Locate pour davantage d’informations sur toutes les options de Locate.

La recherche est effectuée en utilisant la méthode locate(ReadRow, int). Le premier paramètre, ReadRow, est un type de classe abstrait. Vous utilisez généralement sa sous-classe instanciable, la classe DataRow. Le second paramètre représente l’option de recherche et il est défini dans le Résumé des champs de la classe Locate. Les champs de classe Locate représentent les options qui vous permettent de contrôler où démarre la recherche et comment elle fonctionne, par exemple si les majuscules et les minuscules sont différenciées. Pour plus d’informations, voir “Utilisation des options de recherche”, page 11-18. Si une correspondance est trouvée, la position de la ligne en cours passe à cette ligne. Tous les composants orientés données connectés au composant DataSet dans lequel la recherche est effectuée se déplacent ensemble sur la ligne trouvée.

Page 196: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-18 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R e c h e r c h e d e d o n n é e s

La méthode Locate() recherche dans la vue en cours du DataSet. Cela signifie que les ligne exclues de l’affichage par un RowFilterListener ne sont pas prises en compte dans la recherche.

La vue de l’ensemble de données peut être triée ou pas, mais, si elle est triée, la méthode locate() trouve les lignes correspondantes dans l’ordre de tri.

Pour rechercher une valeur null dans une colonne d’un ensemble de données, incluez la colonne dans le paramètre DataRow de la méthode locate() sans lui affecter de valeur.

Astuce Si la méthode locate() ne peut trouver de correspondance alors que vous pensez qu’elle le devrait, vérifiez s’il n’y a pas de valeurs null dans certaines colonnes ; n’oubliez pas que toutes les colonnes de DataRow font partie de la recherche. Pour empêcher ceci, utilisez un DataRow restreint ne contenant que les colonnes voulues.

Recherche de données au moyen d’un DataRow

Un DataRow est similaire à un ensemble de données en ce qu’il contient plusieurs composants Column. Mais il ne contient qu’une seule ligne de données. Les valeurs à rechercher sont spécifiées dans le DataRow.

Quand le DataRow est créé à partir de l’ensemble de données sur lequel la recherche est effectuée, le DataRow contient les mêmes noms de colonne et types de données que le DataSet sur lequel il est basé. Par défaut, toutes les colonnes du DataRow sont utilisées dans la recherche. Pour exclure certaines colonnes de la recherche, créez un DataRow restreint ne contenant que les colonnes spécifiées de l’ensemble de données. Un DataRow restreint est créé en utilisant l’un des constructeurs suivants de DataRow :

• DataRow(DataSet, String)

• DataRow(DataSet, String[])

DataRow et DataSet sont des classes dérivées de ReadWriteRow. Toutes les deux héritent des mêmes méthodes de manipulation de leur contenu, par exemple : getInt(String) et setInt(String, int). Il est donc possible d’utiliser les objets DataRow en employant beaucoup des mêmes méthodes que DataSet.

Utilisation des options de recherche

La recherche est contrôlée en utilisant les options de recherche. Ce sont des constantes définies dans la classe com.borland.dx.dataset.Locate. Il est possible de combiner les options de recherche en utilisant l’opérateur binaire OR ; plusieurs des combinaisons les plus utiles sont déjà définies comme constantes. Quatre des options de recherche ( FIRST, NEXT, LAST et PRIOR) déterminent comment les lignes du DataSet sont recherchées.

Page 197: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

F i l t r a g e , t r i e t r e c h e r c h e d e d o n n é e s 11-19

R e c h e r c h e d e d o n n é e s

Les options CASE_INSENSITIVE et PARTIAL) définissent comment une valeur est considérée comme correspondante. La constante FAST affecte la préparation de la recherche.

Il faut spécifier où la recherche commence et dans quel sens les lignes de l’ensemble de données sont parcourues. Choisissez l’une des options suivantes :

• FIRST commence à la première ligne, indépendamment de la position en cours, et se déplace vers le bas.

• LAST commence à la dernière ligne et va vers le haut.

• NEXT part de la position en cours et se déplace vers le bas.

• PRIOR part de la position en cours et va vers le haut.

Si aucune de ces constantes n’est spécifiée dans les options de recherche, une exception DataSetException de type NEED_LOCATE_START_OPTION est déclenchée.

Pour trouver toutes les lignes correspondantes d’un DataSet, appelez une fois la méthode locate() avec l’option de recherche FIRST. Si une correspondance est trouvée, ré-exécutez la recherche en utilisant l’option NEXT_FAST et appelez la méthode avec cette option de recherche jusqu’à ce qu’elle renvoie false. L’option FAST spécifie que les valeurs de recherche n’ont pas été modifiées et qu’il n’est donc pas nécessaire de les relire dans DataRow. Pour trouver toutes les lignes correspondantes en commençant par la fin de la vue, utilisez à la place les options LAST et PRIOR_FAST.

L’option CASE_INSENSITIVE spécifie que les valeurs chaînes sont considérées comme correspondantes même s’il y a des différences de majuscules-minuscules. Il n’est pas obligatoire de spécifier si la recherche est ou non CASE_INSENSITIVE et cela ne s’applique qu’aux colonnes String ; cette option n’est pas prise en compte pour les autres types de données. Si cette option est utilisée dans une recherche multicolonne, la différenciation majuscules-minuscules ne s’applique qu’aux colonnes String impliquées dans la recherche.

L’option PARTIAL spécifie qu’une valeur de ligne est considérée comme correspondante si elle commence par les mêmes premiers caractères que la valeur recherchée. Il est ainsi possible d’utiliser la valeur de recherche “M” pour trouver tous les noms commençant par “M”. Tout comme l’option CASE_INSENSITIVE, il n’est pas obligatoire de spécifier l’option PARTIAL qui n’a de sens que pour la recherche dans les colonnes String.

Les recherches multicolonnes utilisant PARTIAL fonctionnent différemment des autres recherches multicolonnes car l’ordre des colonnes est pris en compte. Le constructeur d’un DataRow restreint multicolonne attend comme paramètre un tableau de noms de colonne. Il n’est pas nécessaire que ces noms soient énumérés dans leur ordre d’apparition dans l’ensemble de données. Puisque l’option PARTIAL ne s’applique qu’à la

Page 198: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

11-20 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

R e c h e r c h e d e d o n n é e s

dernière colonne spécifiée, la dernière colonne énumérée dans le tableau est importante.

Pour qu’une recherche multicolonne utilisant l’option PARTIAL réussisse, une ligne de l’ensemble de données doit correspondre exactement à toutes les colonnes du DataRow sauf la dernière. Si la dernière colonne commence par la valeur recherchée, la méthode réussit. Sinon, la méthode échoue. Si la dernière colonne du DataRow n’est pas une colonne String, la méthode locate() déclenche une exception DataSetException de type PARTIAL_SEARCH_FOR_STRING.

Recherches gérant tous les types de données

Les données stockées dans des composants d’accès aux données DataExpress sont stockées dans des objets Variant. Lorsque les données sont affichées, une représentation String du variant est utilisée. Pour écrire du code effectuant une recherche généralisée gérant les colonnes de tout type de données, utilisez l’une des méthodes setVariant() ou l’une des méthodes getVariant().

Par exemple, vous souhaitez écrire une routine de recherche généralisée qui accepte une valeur et recherche la ligne du DataSet qui contient cette valeur. Le même bloc de code peut fonctionner pour tout type de données puisque les données sont représentées par un variant. Pour afficher les données, utilisez la classe formateur appropriée ou créez votre formateur personnalisé.

L’ordre des colonnes dans le DataRow et le DataSet

Alors qu’une colonne de l’ensemble de données ne peut apparaître qu’une seule fois dans le DataRow, l’ordre des colonnes peut être différent dans un DataRow restreint et dans le DataSet. Pour certaines recherches, l’ordre des colonnes peut jouer un rôle. Par exemple, il peut affecter les recherches multicolonnes si l’option PARTIAL est utilisée. Pour davantage d’informations, voir le paragraphe sur les recherches multicolonnes avec l’option PARTIAL dans la rubrique “Utilisation des options de recherche”, page 11-18.

Page 199: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-1

C h a p i t r e

12Chapitre12Ajout de fonctionnalités

aux applicationsde bases de données

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Dans une application, une fois achevée la phase d’acquisition des données, les données sont placées dans le composant ensemble de données (DataSet) approprié du paquet DataExpress. Il reste alors à définir les fonctions standard de l’application et son interface utilisateur. Le chapitre précédent, Chapitre 11, “Filtrage, tri et recherche de données”, présente le tri, le filtrage et la recherche de données dans un ensemble de données. Ce chapitre décrit d’autres fonctions standard des applications de bases de données.

Un des principes fondamentaux du paquet DataExpress est l’indépendance entre la manipulation des données et la manière d’obtenir ces données. Quel que soit le type de composant ensemble de données utilisé pour obtenir les données, il est manipulé et connecté aux contrôles de la même manière. 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 l’application.

Tous les exemples sont créés en utilisant l’AppBrowser et les outils de conception de JBuilder. A chaque fois que c’est possible, ces outils sont utilisés pour générer du code source Java. Quand cela s’avère nécessaire, vous apprendrez quel code il faut modifier et comment procéder afin d’exécuter une action particulière dans l’application.

Les exemples et les tutoriels auxquels ce chapitre fait référence nécessitent l’accès aux données SQL stockées dans un JDataStore local. Des projets entièrement réalisés sont fournis dans le répertoire exemple DataExpress

Page 200: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e r é f é r e n c e s

de JBuilder (/samples/DataExpress), le code source étant commenté quand c’est nécessaire. Il est conseillé d’utiliser les exemples comme guide pour ajouter des fonctions à votre application.

Pour créer une application de base de données, vous devez tout d’abord la connecter à une base de données et alimenter en données un ensemble de données (DataSet). Les étapes de la connexion à une base de données sont décrites au Chapitre 17, “Tutoriel : Création d’une application de base de données élémentaire”. Le tutoriel configure une requête utilisable pour les tâches de bases de données suivantes :

• “Création de références”, page 12-2, inclut des informations sur la création d’une référence à l’aide d’une liste de sélection.

• “Utilisation de colonnes calculées”, page 12-8

• “Agrégation de données avec des champs calculés”, page 12-11

• “Ajout de modèles d’affichage ou de modification pour formater les données”, page 12-16

• “Présentation de plusieurs vues des données”, page 12-23

• “Garantie de la persistance des données”, page 12-25

• “Utilisation de types de données variant”, page 12-28

Création de référencesA Une colonne (Column) peut obtenir ses valeurs de plusieurs façons :

• A partir des données d’une colonne de base de données.

• A partir du résultat de l’importation d’un fichier texte.

• A partir du résultat d’un calcul, ce qui inclut les colonnes calculées, les données agrégées, les données recherchées dans un autre ensemble de données ou les données sélectionnées via une liste de sélection.

Cette section décrit comment fournir des valeurs à l’aide d’une liste de sélection lors de la saisie d’une nouvelle valeur dans une colonne, et décrit également la création d’une référence affichant les valeurs d’une autre colonne.

Saisie de données avec une liste de sélection

Une liste de sélection est utilisée pour trouver dans une colonne appartenant à un autre ensemble de données la valeur à saisir. Ce type de référence peut ainsi présenter les choix possibles dans une liste déroulante. Ces listes de sélection accélèrent fortement la saisie des données.

Page 201: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-3

C r é a t i o n d e r é f é r e n c e s

La section suivante décrit comment créer (à l’aide des outils de conception de JBuilder) une liste de sélection servant à définir la valeur d’une colonne à partir d’une liste de valeurs accessibles dans un autre ensemble de données. Les instructions décrivent les étapes du référencement d’une valeur dans une liste de sélection lors de la saisie du pays d’un client ou d’un employé. Dans cet exemple, la propriété pickList d’une colonne vous permet de définir quelle colonne de quel ensemble de données servira à fournir les valeurs de la liste de sélection. Les choix seront disponibles pour la saisie dans une composant visuel, tel une table, lorsque l’application sera exécutée.

Lorsque l’application est exécutée, vous pouvez insérer une ligne dans la table et, lorsque vous saisissez une valeur pour le champ JOB_COUNTRY, vous pouvez la sélectionner dans la liste de sélection déroulante. Le pays sélectionné est automatiquement inséré dans le champ JOB_COUNTRY de l’ensemble de données EMPLOYEE.

Ajout d’un champ à liste de sélection

Les étapes suivantes décrivent comment créer une liste de sélection pour définir la valeur de la colonne JOB_COUNTRY à partir de la liste des pays de la table COUNTRY. Quand l’utilisateur sélectionne un pays dans la liste de sélection, la sélection effectuée est automatiquement écrite dans le champ en cours de la table. Le projet exemple, Picklist.jpx, situé dans le sous-répertoire /samples/DataExpress/Picklist de votre installation JBuilder, est une application achevée qui utilise la liste de sélection décrite par les étapes ci-dessous.

1 Créez une application de base de données simple, comme décrit dans “Accès aux données des exemples”, page 11-2.

2 Ajoutez un autre composant QueryDataSet à l’application.

Ce composant constitue la requête utilisée pour remplir la liste de sélection.

3 Cliquez sur la propriété query de queryDataSet2, dans l’inspecteur, cliquez sur le bouton points de suspension (...) pour ouvrir l’éditeur de la propriété Query et définissez la propriété query comme suit :

4 Cliquez sur Tester la requête. Lorsqu’elle est réussie, cliquez sur OK pour fermer la boîte de dialogue.

5 Développez le composant queryDataSet1 dans l’arborescence des composants pour voir toutes les colonnes et sélectionnez JOB_COUNTRY.

Option Valeur

Base de données database1

Instruction SQL select COUNTRY from COUNTRY

Page 202: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e r é f é r e n c e s

6 Sélectionnez la propriété pickList dans l’inspecteur, cliquez sur le bouton points de suspension (...) pour ouvrir l’éditeur de la propriété pickList et définissez la propriété comme suit :

Cliquez sur OK.

7 Cliquez sur l’onglet Source et entrez le code suivant après l’appel à jbInit() :

queryDataSet2.open();

Il permet d’ouvrir queryDataSet2, qui est attaché à la table EMPLOYEE_PROJECT. Normalement, un composant visuel orienté données tel que JdbTable ouvre automatiquement l’ensemble de données, mais dans ce cas, aucun composant visuel n’est attaché à cet ensemble de données qui doit donc être ouvert explicitement.

8 Exécutez l’application en choisissant Exécuter|Exécuter le projet.

Lorsque l’application est exécutée, vous pouvez insérer une ligne dans la table et, lorsque vous saisissez une valeur pour le champ JOB_COUNTRY, vous pouvez la sélectionner dans la liste de sélection déroulante. Le pays sélectionné est automatiquement inséré dans le champ JOB_COUNTRY de l’ensemble de données EMPLOYEE.

Suppression d’un champ à liste de sélection

Pour supprimer une liste de sélection,

1 Sélectionnez la colonne contenant la liste de sélection dans l’arborescence des composants.

2 Ouvrez le dialogue pickListDescriptor en cliquant sur la propriété pickList dans l’inspecteur.

3 Définissez le champ Ensemble de données PickList/Lookup par <aucune>.

Nom de la propriété Valeur

Ensemble de données Picklist/Lookup

queryDataSet2

queryDataSet2 COUNTRY

Type de données STRING

Afficher dans la liste de sélection

cochée

queryDataSet1 JOB_COUNTRY

Page 203: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-5

C r é a t i o n d e r é f é r e n c e s

Création d’une référence en utilisant une colonne calculée

Cette section décrit comment utiliser un champ de référence pour afficher des valeurs issues d’une colonne appartenant à un autre ensemble de données.

Ce type de référence recherche des valeurs dans la table spécifiée et selon les critères définis afin de les afficher en tant qu’éléments de la table en cours. Pour créer une colonne calculée, vous devez créer un nouvel objet Column dans le composant StorageDataSet, définir de manière appropriée son calcType et programmer le gestionnaire de l’événement calcFields. Les valeurs de référence ne sont visibles que lorsque l’application fonctionne. Les colonnes de référence peuvent être définies et visualisées dans JBuilder, mais les colonnes de référence définies par JBuilder ne sont pas résolues dans la source de données ni fournies par la source de données, bien qu’elles puissent être exportées dans un fichier texte.

Voici des exemples de référencement d’un champ dans une table différente pour des besoins d’affichage : le référencement d’un numéro d’article afin d’afficher une description dans une ligne de facture, le référencement d’un code postal correspondant à la ville et au pays spécifiés.

La méthode lookup() utilise les critères de recherche spécifiés et recherche la première ligne correspondant à ces critères. Lorsque la ligne est trouvée, les données sont renvoyées depuis cette ligne, mais le curseur n’est pas déplacé sur cette ligne. La méthode locate() est semblable à la méthode lookup(), à la différence qu’elle déplace le curseur sur la première ligne correspondant aux critères spécifiés. Pour plus d’informations sur la méthode locate(), voir “Recherche de données”, page 11-14.

La méthode lookup() peut utiliser une ligne de données (DataRow) restreinte (une ligne de données ayant moins de colonnes que l’ensemble de données) pour contenir les valeurs à rechercher et les options définies dans la classe Locate pour contrôler la recherche. Cette ligne de données restreinte ne contiendra que les colonnes sélectionnées et les données correspondant au critère de recherche en cours, s’il existe. Avec le référencement, vous référencez généralement des valeurs appartenant à une autre table, vous devrez donc instancier une connexion à cette table dans votre application.

Cet exemple décrit l’utilisation d’une colonne calculée pour rechercher et renvoyer le nom d’un employé (depuis la table EMPLOYEE) pour un numéro d’employé donné de la table EMPLOYEE_PROJECT. Ce type de champ de référence est utilisé uniquement pour l’affichage. Les données contenues dans cette colonne à l’exécution ne sont pas stockées car elles existent déjà par ailleurs dans la base de données. La structure physique de la table et les données sous-jacentes ne sont en rien modifiées. La colonne de référence est par défaut en lecture seule. La version achevée du projet peut être visualisée en exécutant le projet exemple Lookup.jpx, situé

Page 204: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

C r é a t i o n d e r é f é r e n c e s

dans le sous-répertoire /samples/DataExpress/Lookup de votre installation JBuilder.

Pour davantage d’informations sur l’utilisation de l’événement calcFields pour définir une colonne calculée, voir “Utilisation de colonnes calculées”, page 12-8.

1 Créez une nouvelle application en suivant la procédure décrite dans “Accès aux données des exemples”, page 11-2.

Cette étape vous permet de vous connecter à une base de données, de lire les données d’une table, de voir et de modifier ces données dans un composant orienté données.

2 Ajoutez un autre composant QueryDataSet à l’application.

C’est lui qui fournira les données qui rempliront la table dans laquelle des colonnes vont être ajoutées pour faire référence à d’autres tables. Définissez la propriété query de queryDataSet2 comme suit :

3 Cliquez sur Tester la requête. Lorsqu’elle est réussie, cliquez sur OK pour fermer la boîte de dialogue.

4 Sélectionnez JdbTable dans le volet contenu et modifiez sa propriété dataSet en queryDataSet2.

Cela vous permet de visualiser les données dans le concepteur et dans l’application exécutée.

5 Cliquez sur l’icône d’extension à gauche du composant queryDataSet2 dans l’arborescence des composants pour afficher toutes les colonnes, sélectionnez <nouvelle colonne> et définissez dans l’inspecteur les propriétés suivantes pour la nouvelle colonne :

La nouvelle colonne apparaît dans la liste des colonnes et dans le contrôle grille. Il est possible de modifier manuellement la position des colonnes en modifiant la méthode setColumns(). Aucune donnée n’est affichée dans la colonne de référence de la table du concepteur. Les références ne sont visibles que lors de l’exécution de l’application.

Pour cette option Choisissez

Base de données database1

Instruction SQL select * from EMPLOYEE_PROJECT

Nom de la propriété Valeur

calcType CALC

caption EMPLOYEE_NAME

columnName EMPLOYEE_NAME

dataType STRING

Page 205: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-7

C r é a t i o n d e r é f é r e n c e s

Le type de données STRING est utilisé ici car c’est le type de données de la colonne LAST_NAME servant de colonne de référence. Les colonnes calculées sont, toujours, en lecture seule.

6 Sélectionnez l’onglet Evénements de l’inspecteur (la nouvelle colonne étant toujours sélectionnée dans le volet contenu) puis, sélectionnez et double-cliquez sur l’événement calcFields.

Le curseur est correctement positionné dans le volet Source.

7 Saisissez le code suivant, qui effectue la recherche et place la valeur référencée dans la colonne nouvellement définie.

void queryDataSet2_calcFields(ReadRow changedRow, DataRow calcRow, boolean isPosted) throws DataSetException{ // Définit un DataRow pour conserver le numéro de l’employé à rechercher // dans queryDataSet1, et un autre pour conserver la ligne des données // de l’employé trouvées. DataRow lookupRow = new DataRow(queryDataSet1, "EMP_NO"); DataRow resultRow = new DataRow(queryDataSet1);

// Le EMP_NO de la ligne courante de queryDataSet2 est // le critère de recherche. // La première correspondance est recherchée, car EMP_NO est unique. // Si la recherche réussit, les champs nom sont concaténés à partir // des données de l’employé et le résultat 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 l’onglet Source et entrez le code suivant après l’appel à jbInit().

queryDataSet1.open();

Cela ouvre queryDataSet1, qui est attaché à la table EMPLOYEE. Normalement, un composant visuel orienté données tel que JdbTable ouvre automatiquement l’ensemble de données, mais dans ce cas, aucun composant visuel n’est attaché à cet ensemble de données qui doit donc être ouvert explicitement.

9 Choisissez Exécuter|Exécuter le projet afin d’exécuter l’application.

Page 206: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

L’application exécutée a l’aspect suivant :

Figure 12.1 Application de référence

Quand l’application s’exécute, les valeurs de la colonne de référence calculée s’adaptent automatiquement aux modifications des autres colonnes, dans cet exemple la colonne EMP_NO, qui est utilisée dans les valeurs calculées. Si le champ EMP_NO est modifié, la référence affiche la valeur associée à la valeur en cours quand cette valeur est validée.

Utilisation de colonnes calculéesHabituellement, une colonne (Column) dans un StorageDataSet obtient ses valeurs depuis une colonne de base de données ou comme résultat de l’importation d’un fichier texte. Une colonne peut également dériver ses valeurs du résultat d’une expression calculée. JBuilder gère deux types de colonnes calculées : calculées ou agrégées.

Pour créer une colonne calculée, créez un nouvel objet persistant Column dans le StorageDataSet et spécifiez l’expression dans le gestionnaire d’événement calcFields de l’objet StorageDataSet. Les colonnes calculées peuvent être définies et visualisées dans JBuilder. Les valeurs calculées ne sont visibles que lorsque l’application s’exécute. Les colonnes calculées définies par JBuilder ne sont pas résolues dans sa source de données ni fournies par sa source de données, bien qu’elles puissent être exportées dans un fichier texte. Pour davantage d’informations sur la définition de colonnes calculées dans le concepteur, voir “Création d’une colonne calculée dans le concepteur”, page 12-9. Pour davantage d’informations sur la manipulation des colonnes, voir Chapitre 7, “Manipulation des colonnes”.

La formule d’une colonne calculée utilise généralement des expressions faisant référence à d’autres colonnes de l’ensemble de données afin de générer une valeur pour chaque ligne de l’ensemble de données. Par exemple, un ensemble de données peut contenir des colonnes non calculées pour la quantité (QUANTITY) et le prix unitaire (UNIT_PRICE) et une colonne calculée pour le prix total (EXTENDED_PRICE). La

Page 207: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-9

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

colonne EXTENDED_PRICE est calculée en multipliant les valeurs de QUANTITY et de UNIT_PRICE.

Les colonnes agrégées (dites également colonnes statistiques) calculées peuvent être utilisées pour grouper et/ou récapituler les données, par exemple, pour récapituler les ventes totales par trimestre. Les calculs statistiques peuvent être spécifiés entièrement via des paramètres de propriétés et plusieurs colonnes peuvent être incluses dans le regroupement. Quatre types de fonctions statistiques sont supportés (sum, count, min et max) ainsi qu’un mécanisme de création de méthodes de calcul statistique personnalisées. Pour plus d’informations, voir “Agrégation de données avec des champs calculés”, page 12-11.

Les colonnes calculées sont également utiles pour stocker des références dans d’autres tables. Par exemple, un numéro de série peut être utilisé pour récupérer la description d’un objet afin de l’afficher dans un élément d’une ligne de commande. Pour davantage d’informations sur l’utilisation d’un champ calculé comme champ de référence, voir “Création de références”, page 12-2.

Les valeurs de toutes les colonnes calculées d’une ligne sont évaluées dans le même appel d’événement.

Cette section traite les sujets suivants :

• “Création d’une colonne calculée dans le concepteur”, page 12-9

• “Agrégation de données avec des champs calculés”, page 12-11

• L’aggDescriptor dans “Définition des propriétés de AggDescriptor”, page 12-15

• “Création d’un gestionnaire d’événement d’agrégation personnalisé”, page 12-16

Création d’une colonne calculée dans le concepteur

Cet exemple est basé sur l’exemple de la section “Accès aux données des exemples”, page 11-2. La table de base de données interrogée est EMPLOYEE. Le point de départ de cet exemple est l’attribution d’une augmentation de 10 % à tous les employés. Une nouvelle colonne, nommée NEW_SALARY est créée ainsi qu’une expression multipliant la valeur du salaire existante, SALARY, par 1.10 et plaçant la valeur résultante dans la colonne NEW_SALARY. Le projet complet est disponible dans le sous-répertoire /samples/DataExpress/CalculatedColumn de l’installation JBuilder sous le nom de projet CalculatedColumn.jpx.

1 Créez une nouvelle application en suivant la procédure décrite dans “Accès aux données des exemples”, page 11-2.

Page 208: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

Cette étape vous permet de vous connecter à une base de données, de lire les données d’une table, de voir et de modifier ces données dans un composant orienté données.

2 Cliquez sur l’icône d’extension à côté du composant queryDataSet1 dans l’arborescence des composants pour afficher toutes les colonnes, sélectionnez <nouvelle colonne> et définissez dans l’inspecteur les propriétés suivantes pour la nouvelle colonne :

Si vous ajoutez plusieurs colonnes, modifiez manuellement la méthode setColumns() pour changer la position des nouvelles colonnes et de toute autre colonne persistante. Aucune donnée n’est affichée dans la colonne calculée de la table du concepteur. Les calculs ne sont effectués qu’au moment de l’exécution de l’application. Le type de données BIGDECIMAL est employé ici car c’est le type de données de la colonne SALARY qui est utilisée dans l’expression de calcul. Les colonnes calculées sont toujours en lecture seule.

3 Sélectionnez l’objet queryDataSet1, sélectionnez l’onglet Evénements de l’inspecteur, sélectionnez le gestionnaire d’événement calcFields et double-cliquez sur sa valeur.

Cela crée le stub de la méthode de l’événement dans la fenêtre Source.

4 Modifiez la méthode d’événement afin de calculer l’augmentation de salaire, de la manière suivante :

void queryDataSet2_calcFields(ReadRow changedRow, DataRow calcRow, boolean isPosted) throws DataSetException{ //calcule le nouveau salaire calcRow.setBigDecimal("NEW_SALARY", changedRow.getBigDecimal("SALARY").multiply(new BigDecimal(1.1))); }

Cette méthode est appelée pour calcFields chaque fois qu’une valeur de champ est enregistrée et chaque fois qu’une ligne est validée. Cet événement reçoit une donnée représentant 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 booléen (isPosted) indiquant si la ligne est validée ou pas dans DataSet. Vous pouvez ne

Nom de la propriété Valeur

calcType CALC

caption NEW_SALARY

columnName NEW_SALARY

dataType BIGDECIMAL

currency true

Page 209: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-11

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

pas recalculer les champs pour les lignes qui n’ont pas encore été validées.

5 Importez la classe java.math.BigDecimal pour utiliser le type de données BIGDECIMAL. Ajoutez l’instruction suivante aux instructions import :

import java.math.BigDecimal;

6 Exécutez l’application pour visualiser le résultat de l’expression de calcul.

Quand l’application est exécutée, la valeur de la colonne calculée s’ajuste automatiquement aux modifications de toute autre colonne référencée dans l’expression calculée. Le colonnes NEW_SALARY affichent la valeur de (SALARY * 1.10). L’application en train de s’exécuter ressemble à ceci :

Figure 12.2 Colonnes calculées

Agrégation de données avec des champs calculés

Vous pouvez utiliser les possibilités d’agrégation des colonnes calculées pour résumer vos données de diverses façons. Les colonnes pour lesquelles calcType a la valeur aggregated ont la capacité de :

• Regrouper et de résumer les données pour déterminer les extrêmes

• Calculer une somme.

• Compter le nombre d’occurrences d’une valeur de champ.

• Définir un agrégat personnalisé que vous pouvez utiliser pour définir votre propre mode d’agrégation.

La propriété AggDescriptor sert à définir les colonnes selon lesquelles s’effectue le regroupement, la colonne à agréger et l’opération d’agrégation à effectuer. L’aggDescriptor est traité en détail dans les sections suivantes. L’opération d’agrégation est une instance de l’une des classes suivantes :

• CountAggOperator• SumAggOperator• MaxAggOperator

Page 210: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

• MinAggOperator• Une classe d’agrégation personnalisée que vous définissez vous-même

Il est plus facile de créer une colonne agrégée calculée que de créer une colonne calculée, car il n’y a pas besoin d’une méthode d’événement (sauf pour créer un composant d’agrégation personnalisé). La fonction statistique peut être calculée pour l’ensemble de données entier ou vous pouvez grouper sur une ou plusieurs colonnes de l’ensemble de données et calculer une valeur statistique pour chaque groupe. La colonne statistique calculée est définie dans l’ensemble de données en cours de récapitulation, ainsi chaque ligne du groupe aura la même valeur dans la colonne calculée (la valeur statistique du groupe en question). La colonne est cachée par défaut. Vous pouvez afficher la colonne ou afficher ses valeurs dans un autre contrôle, comme c’est le cas dans la section suivante.

Exemple : Agrégation de données avec des champs calculésDans l’exemple suivant, vous allez interroger la table SALES et créer un composant JdbTextField afin d’afficher la somme du champ TOTAL_VALUE pour le champ CUST_NO en cours. Pour ce faire, il faut d’abord créer une nouvelle colonne nommée GROUP_TOTAL. La valeur aggregated est affectée à la propriété calcType de la colonne et une expression est créée pour résumer la valeur du champ TOTAL_VALUE de la table SALES par numéro de client et placer la valeur résultante dans la colonne GROUP_TOTAL. Le projet complet est disponible dans le sous-répertoire /samples/DataExpress/Aggregating de l’installation JBuilder.

1 Créez une nouvelle application en suivant la procédure décrite dans “Accès aux données des exemples”, page 11-2.

Cette étape vous permet de vous connecter à une base de données, de lire les données d’une table, de voir et de modifier ces données dans un composant orienté données.

2 Cliquez sur queryDataSet1 dans l’arborescence des composants.

Ce composant constitue la requête utilisée pour remplir l’ensemble de données avec les valeurs à agréger.

3 Ouvrez la propriété query de queryDataSet1 et modifiez l’instruction SQL pour qu’elle devienne :

SELECT CUST_NO, PO_NUMBER, SHIP_DATE, TOTAL_VALUE from SALES

4 Cliquez sur le bouton Tester la requête pour tester la requête et vérifier sa validité ; lorsque la requête est réussie, cliquez sur OK.

5 Cliquez sur l’icône d’extension à côté du composant queryDataSet1 dans l’arborescence des composants afin d’afficher toutes les colonnes,

Page 211: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-13

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

sélectionnez <nouvelle colonne> et définissez dans l’inspecteur les propriétés suivantes pour la nouvelle colonne :

Une nouvelle colonne est instanciée et le code suivant est ajouté à la méthode jbInit(). Sélectionnez l’onglet Source pour voir le code. Sélectionnez l’onglet 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 d’interface utilisateur ; définissez sa propriété dataSet par queryDataSet1 et sa propriété columnName par GROUP_TOTAL.

Ce contrôle affiche les données agrégées. Vous pouvez aussi ajouter un contrôle JdbTextArea pour décrire ce qu’affiche le champ texte.

Aucune donnée n’est affichée dans le JdbTextField dans le concepteur. Les calculs ne sont effectués qu’au moment de l’exécution de l’application. Le type de donnée BIGDECIMAL est utilisé ici car c’est le type de données de la colonne TOTAL_VALUE qui est utilisée dans l’expression de calcul. Les colonnes agrégées sont toujours en lecture seule.

7 Sélectionnez chacune des colonnes suivantes et définissez par oui la propriété visible de chacune.

• PO_NUMBER

• CUST_NO

• SHIP_DATE

Cette étape rend persistantes les colonnes affichées dans la table. Les colonnes persistantes sont placées entre crochets dans le volet contenu.

8 Sélectionnez la colonne GROUP_TOTAL dans le volet contenu et; pour définir l’agrégat de cette colonne, double-cliquez sur la propriété agg afin d’afficher l’éditeur de la propriété agg.

Nom de la propriété Valeur

caption GROUP_TOTAL

columnName GROUP_TOTAL

currency True

dataType BIGDECIMAL

calcType aggregated

visible Oui

Page 212: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

Dans l’éditeur de la propriété agg,

a Sélectionnez CUST_NO dans la liste Colonnes disponibles. Cliquez sur Ajouter au groupe pour désigner ce champ comme le champ qui sera utilisé pour définir le groupe.

b Sélectionnez TOTAL_VALUE dans la liste Colonne statistique afin de la spécifier comme colonne contenant les données à agréger.

c Sélectionnez SumAggOperator dans la liste Opération statistique afin de spécifier que cette opération doit être effectuée.

En fonction de ces sélections, vous obtiendrez le total des ventes pour un client donné.

9 Cliquez sur OK lorsque l’éditeur de la propriété agg ressemble à ceci :

Cette étape génère le code source suivant dans la méthode jbInit() :

column1.setAgg(new com.borland.dx.dataset.AggDescriptor(new String[] {"CUST_NO"}, "TOTAL_VALUE", new com.borland.dx. dataset.SumAggOperator()));

10 Exécutez l’application en choisissant Exécuter|Exécuter le projet pour visualiser le résultat de l’agrégation.

Le résultat final ressemble à ceci :

Page 213: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-15

U t i l i s a t i o n d e c o l o n n e s c a l c u l é e s

Quand l’application est exécutée, les valeurs du champ agrégé sont automatiquement modifiées pour refléter les modifications du champ TOTAL_VALUE. De même, la valeur affichée dans le JdbTextField affiche l’agrégat pour le CUST_NO de la ligne sélectionnée.

Définition des propriétés de AggDescriptor

L’éditeur de la propriété agg propose une interface simple pour créer et modifier les objets AggDescriptor. Le constructeur d’un objet AggDescriptor nécessite les informations suivantes :

• Groupement des colonnes — Un tableau de chaînes (sans ordre) indiquant le nom des colonnes utilisées pour définir le sous-ensemble des lignes du DataSet sur lequel doit porter l’agrégation.

• Colonne statistique — Une chaîne représentant le nom de la colonne dont les valeurs seront agrégées.

• Opération statistique — Le nom d’un objet de type AggOperator qui réalise effectivement l’agrégation.

L’éditeur de la propriété agg extrait les noms de toutes les colonnes utilisables comme colonnes de regroupement et les propose dans la liste Colonnes disponibles. Seul les noms des colonnes non calculées et non agrégées sont proposés dans cette liste.

Si le DataSet contenant la colonne dont la propriété agg est définie a un descripteur MasterLink (autrement dit, si le DataSet est un ensemble de données détail), les noms des colonnes de liaison sont ajoutés par défaut à la liste des colonnes de regroupement lors de la définition d’un nouveau AggDescriptor.

Les boutons placés en dessous de la liste des colonnes de regroupement et de la liste des colonnes disponibles permettent de déplacer d’une liste à l’autre le nom de colonne mis en évidence. De même, en double-cliquant sur un nom de colonne, vous le faites passer dans l’autre liste. Les entrées des deux listes sont en lecture seule. Comme l’ordre des colonnes n’a pas d’importance dans un groupe, chaque nom de colonne est ajouté à la fin des listes. Il est possible de laisser un groupe vide (nul).

Le contrôle Colonne statistique contient les noms de toutes les colonnes non agrégées du DataSet en cours. Bien que les composants AggOperator fournis avec le paquet DataExpress ne supportent pas l’agrégation des colonnes de type non numérique, nous ne limitons pas cette liste aux types numériques : il est en effet possible de créer un AggOperator personnalisé qui gère les types chaîne ou date.

Le contrôle Opération statistique affiche la liste des objets AggOperator intégrés au paquet DataExpress ainsi que les composants AggOperator définis par l’utilisateur dans le même contexte de classe que la colonne (Column) du AggDescriptor.

Page 214: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

Les utilisateurs désireux d’effectuer des calculs sur des valeurs agrégées (par exemple, la somme des éléments d’une commande multipliée par une constante) doivent cocher la case Calcul sur fonction statistique. Cela désactive les contrôles Colonne statistique et Opération statistique et substitue “null” à leur valeur dans le constructeur du AggDescriptor, ce qui indique un agrégat de type calculé. Quand la case Calcul sur fonction statistique n’est pas cochée, les contrôles Colonne statistique et Opération statistique sont activés.

Création d’un gestionnaire d’événement d’agrégation personnalisé

Pour utiliser une méthode d’agrégation autre que celles fournies par JBuilder, vous pouvez créer un gestionnaire d’événement d’agrégation personnalisé. Un des moyens consiste à coder les événements calcAggAdd et calcAggDelete via le concepteur d’interface utilisateur. calcAggAdd et calcAggDelete sont des événements de StorageDataSet appelés lorsque le AggOperator est informé d’une opération d’actualisation.

Une utilisation habituelle de ces événements est de faire la somme des colonnes dans une table d’éléments ligne (comme SALES). Le montant en Francs peut être calculé en utilisant un SumAggOperator prédéfini. D’autres colonnes agrégées peuvent être ajoutées en définissant par null la propriété aggOperator du AggDescriptor. Ces colonnes supplémentaires peuvent servir à appliquer un taux de TVA ou de remise au sous-total, pour calculer les frais d’expédition, et ensuite pour calculer le total général.

Vous pouvez aussi créer une classe d’agrégation personnalisée en implémentant un composant opérateur statistique personnalisé étendant AggOperator et implémentant les méthodes abstraites. L’intérêt de l’implémentation d’un composant est sa réutilisabilité dans d’autres composants DataSet. Vous pouvez créer des classes d’agrégation pour calculer une moyenne, un écart-type ou une variance.

Ajout de modèles d’affichage ou de modification pour formater les données

Toutes les données stockées de manière interne, comme les nombres et les dates, sont saisies et affichées sous la forme de chaînes de caractères. Le formatage est le processus de conversion de la représentation interne en un équivalent chaîne. L’analyse est le processus de conversion de la représentation chaîne en représentation interne. Ces deux conversions sont définies par des règles spécifiées par des modèles exprimés sous forme de chaînes.

Page 215: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-17

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

Le formatage et l’analyse des données du paquet DataSet sont contrôlés par la classe VariantFormatter, définie de manière unique pour chaque objet Column d’un ensemble de données. Afin de simplifier l’utilisation de cette classe, il existe des propriétés chaîne correspondantes qui, lorsqu’elles sont définies, construisent un VariantFormatter pour l’objet Column en utilisant la syntaxe des modèles définie dans les classes java.text.Format du JDK.

Il y a quatre types différents de modèles correspondant aux différents types de données de l’élément à contrôler :

1 les modèles de nombre ;2 les modèles de date et d’heure ;3 les modèles de chaîne ;4 les modèles de booléen.

Pour davantage d’informations sur les modèles, voir “Modèles basés sur des chaînes (masques)” dans la Référence de la bibliothèque de composants DataExpress.

Les propriétés de l’objet Column qui utilisent les modèles exprimés sous forme de chaîne sont :

• La propriété displayMask, qui définit le modèle utilisé pour la saisie et l’affichage de base.

• La propriété editMask, qui définit le modèle utilisé pour analyser la saisie de données touche par touche (également appelé fragmentation).

• La propriété exportDisplayMask, qui définit le modèle utilisé pour importer et exporter les données dans un fichier texte.

Les implémentations par défaut de VariantFormatter pour chaque objet Column sont simples afin d’être rapide. Les colonnes mettant en jeu des caractères de ponctuation, comme les dates, utilisent un modèle par défaut dérivé des paramètres de locale de la colonne. Pour remplacer le formatage par défaut, par exemple pour utiliser le point comme séparateur des milliers au lieu de l’espace, définissez explicitement le modèle sous forme d’une chaîne pour la propriété que vous voulez changer (displayMask, editMask ou exportDisplayMask).

L’affectation d’une chaîne vide ou null à displayMask, editMask et exportDisplayMask a une signification particulière : cela choisit le modèle correspondant à la valeur de la propriété Locale. C’est le comportement par défaut dans JBuilder pour les colonnes de type Date, Time, Timestamp, Float, Double et BigDecimal. Ce faisant, JBuilder garantit qu’une application qui utilise les valeurs par défaut va automatiquement employer le bon format d’affichage quand elle est exécutée dans un autre pays.

Remarque Si vous réalisez des applications internationales utilisant des valeurs de locale autres que en_US (English (United States)), vous devez utiliser dans

Page 216: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-18 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

vos modèles le style de séparateur américain (par exemple, la virgule comme séparateur des milliers et le point comme séparateur décimal). En procédant ainsi, l’application peut utiliser les mêmes modèles quel que soit le pays où elle est installée. Quand vous utilisez une locale autre que en_US, ces caractères sont convertis par le JDK dans leur équivalent local et affichés de manière appropriée. Pour un exemple d’utilisation des modèles dans une application internationale, voir le fichier projet IntlDemo.jpx, situé dans le sous-répertoire /samples/dbSwing/MultiLingual de votre installation JBuilder.

Pour remplacer les formats par défaut des valeurs numériques et dates stockées dans les fichiers locaux, affectez les propriétés displayMask, editMask ou exportDisplayMask du composant Column de l’ensemble de données.

Les possibilités de formatage proposées par les chaînes de modèle du paquet DataExpress suffisent généralement pour la plupart des cas. Si vous avez besoin de modèles plus spécifiques, le mécanisme de formatage dispose d’interfaces et de classes que vous pouvez étendre pour créer des classes de formatage personnalisées.

Masques d’affichage

Les masques d’affichage sont des modèles sous forme de chaîne utilisés pour formater les données affichées par les colonnes, par exemple dans un JdbTable. Les modèles d’affichage peuvent ajouter des espaces ou des caractères spéciaux à l’élément de données.

Les masques d’affichage sont également utilisés pour analyser les saisies de l’utilisateur en convertissant la chaîne saisie dans le type adapté à la colonne (Column). Si vous entrez des données qui ne peuvent être analysées en utilisant le masque d’affichage spécifié, vous n’avez pas le droit de sortir du champ tant que les données ne sont pas saisies de la manière appropriée.

Astuce Les saisies utilisateur qui ne peuvent être analysées par le modèle spécifié génèrent des messages de validation. Ces messages apparaissent dans le contrôle JdbStatusLabel quand JdbStatusLabel et le composant d’interface utilisateur affichant les données à modifier (par exemple, un JdbTable) sont liés au même ensemble de données.

Masques de saisie

Avant le début de la saisie, le masque d’affichage contrôle entièrement le formatage et la fragmentation. Les masques de saisie sont des modèles optionnels sous forme de chaîne utilisés pour contrôler la saisie dans une colonne et pour replacer les données de la chaîne saisie dans la colonne en traitant les frappes de touche une à une.

Page 217: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-19

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

Quand le masque de saisie d’une colonne est spécifié, les caractères littéraux placés dans le modèle peuvent être éventuellement enregistrés avec les données. Les emplacements du modèle indiquant des caractères à saisir s’affichent par défaut comme un caractère de soulignement (_). Au fil de la saisie dans une colonne utilisant un masque de saisie, la saisie est validée en confrontant chaque touche enfoncée aux caractères autorisés par le modèle à la position en cours dans le masque.

Les caractères qui ne sont pas autorisés à un emplacement donné du modèle ne sont pas pris en compte et le curseur ne passe au caractère suivant que si le critère défini à cet emplacement du modèle est respecté.

Utilisation de masques pour l’importation et l’exportation de données

Quand des données sont importées dans un composant DataExpress, JBuilder recherche un fichier SCHEMA (.schema) portant le même nom que le fichier de données. S’il le trouve, les valeurs du fichier SCHEMA sont prioritaires. S’il ne le trouve pas, il examine la propriété exportDisplayMask de la colonne. Utilisez la propriété exportDisplayMask pour formater les données importées.

Les fichiers importés contiennent fréquemment des caractères de formatage monétaire qui ne peuvent être placés directement dans une colonne numérique. Le modèle exportDisplayMask permet de lire les valeurs en omettant le formatage monétaire. Une fois les données importées dans JBuilder, définissez les masques d’affichage et/ou de saisie pour mettre en place les formatages, monétaires ou autres, de votre choix.

Quand des données sont exportées, JBuilder utilise exportDisplayMask pour formater les données à exporter. Il crée également un fichier SCHEMA avec ces paramètres afin que les données puissent être réimportées facilement dans un composant DataExpress.

Modèles dépendant du type de données

Les sections suivantes décrivent et donnent des exemples de modèles utilisables pour les différents types de données.

Modèles pour les données numériquesLes modèles pour les données de type numérique sont composés de deux parties : la première partie spécifie le modèle à utiliser pour les nombres positifs (nombres supérieurs à 0) et la seconde, le modèle pour les nombres négatifs. Ces deux parties sont séparées par un point-virgule (;). Les symboles utilisables pour les données numériques sont décrits dans la Référence de la bibliothèque de composants DataExpress.

Page 218: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-20 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

Les composants Column numérique ont toujours des masques d’affichage et de saisie. Si vous ne définissez pas explicitement ces propriétés, des modèles par défaut sont définis en recherchant de la manière suivante :

1 Dans la locale du composant Column ;

2 Si la locale du composant Column n’est pas définie, dans la locale de l’objet DataSet ;

3 Si la locale de l’objet DataSet n’est pas définie, dans la locale par défaut du système. Les données numériques s’affichent par défaut avec trois chiffres après la virgule.

Il est possible de saisir un nombre quelconque de chiffres à gauche de la virgule dans une colonne numérique. Par contre, les masques limitent la saisie au nombre de chiffres spécifiés à gauche du séparateur décimal dans le masque. Pour être sûr que toutes les valeurs autorisées puissent être saisies dans une colonne, spécifiez un nombre suffisant de chiffres à gauche du séparateur décimal dans la spécification du modèle.

De plus, chaque masque numérique contient un caractère supplémentaire à gauche des données pour contenir le signe du nombre.

Le code utilisé pour définir le masque d’affichage du premier modèle du tableau suivant est :

column1.setDisplayMask(new String("###%"));

Le tableau suivant présente les spécifications de modèles pour les données numériques :

Spécification de modèle ValeurValeur formatée Signification

###% 85 85% Tous les chiffres sont optionnels, les zéros de début ne sont pas affichés, la valeur est divisée par 100 et s’affiche comme un pourcentage.

# ##0,0#^ F;-# ##0,0#^ F 500.0-500.5004453.3211-00453.3245

500,0 cc-500,5 cc4 453,32 cc-453,32 cc

Le “0” indique un chiffre obligatoire, les zéros ne sont pas supprimés. Les nombres négatifs sont précédés d’un signe moins (-). La valeur littérale “cc” est affichée à droite de la valeur. Le curseur est positionné au point indiqué par le caret (^), les chiffres se déplaçant vers la gauche au fil de la saisie.

$#,###.##;($#,###.##) 4321.1-123.456

$4,321.1($123.46)

Tous les chiffres sont optionnels, affiche le séparateur des milliers et le séparateur décimal ainsi que le symbole monétaire. Les valeurs négatives sont entre parenthèses. Si le signe moins (-) ou la parenthèse ouvrante (() sont saisis, JBuilder encadre la valeur de parenthèses.

Page 219: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-21

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

Modèles des données date et heureLes colonnes contenant des données date, heure ou date/heure ont toujours des masques d’affichage et de saisie. Si vous ne définissez pas explicitement ces propriétés, des modèles par défaut sont définis en recherchant de la manière suivante :

1 Dans la locale du composant Column ;2 Si la locale du composant Column n’est pas définie, dans la locale de

l’objet DataSet ;3 Si la locale de l’objet DataSet n’est pas définie, dans la locale par défaut

du système.

Les symboles de modèle utilisables pour les données date, heure et date/heure sont décrits dans la section “Modèles date, heure et date/heure” de la Référence de la bibliothèque de composants DataExpress.

Le code définissant le masque de saisie du premier modèle du tableau suivant est :

column1.setDisplayMask(new String("jj MMM aaaaG"));

Le tableau suivant présente les spécifications de modèles pour les données date et heure :

Modèles de données chaîneLes modèles de formatage et de modification des données sont spécifiques aux classes DataExpress. Ils sont composés de quatre parties séparées par des points-virgules dont seule la première est obligatoire. Ces différentes parties sont :

1 Le modèle de la chaîne.

2 Indique si les littéraux doivent être stockés avec les données. La valeur 1 (comportement par défaut) spécifie le stockage des littéraux avec les données. Pour retirer les littéraux des données stockées, utilisez 0.

3 Le caractère à utiliser comme indicateur “blanc”. Ce caractère indique les emplacements à saisir dans les données. Si cette partie est omise, le caractère de soulignement (_) est utilisé par défaut.

Spécification de modèle Valeur Valeur formatée Signification

jj MMM aaaaG 14.01.00 2 février 1492

14 Jan 1900AD 02 Fév 1492AD

Renvoie deux chiffres pour le jour, l’abréviation du mois, un espace (littéral) et 4 chiffres pour l’année.

j/MM/aa H:m 4 juillet 1776 3:302 mars 1997 23:59

07/4/76 3:30 03/2/92 23:59

Renvoie un ou deux chiffres pour le jour, le numéro du mois, deux chiffres pour l’année et l’heure en utilisant une horloge de 24 heures.

Page 220: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-22 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A j o u t d e m o d è l e s d ’ a f f i c h a g e o u d e m o d i f i c a t i o n p o u r f o r m a t e r l e s d o n n é e s

4 Les caractères à utiliser pour remplacer les zones vides à l’affichage. Si cette partie est omise, les positions vides sont supprimées.

Les symboles de modèle utilisables pour les données texte sont décrits dans la section “Modèles de texte” de la Référence de la bibliothèque de composants DataExpress.

Par exemple, le code définissant le masque d’affichage et de saisie du premier modèle spécifié dans le tableau suivant est :

column1.setDisplayMask(new String("00000{-9999}"));column1.setEditMask(new String("00000{-9999}"));

Le tableau suivant présente quelques spécifications de modèles :

Modèles des données booléennesLe composant BooleanFormat utilise un modèle sous forme de chaîne qui permet de travailler avec des données pouvant prendre deux valeurs stockées comme true ou false. Les données de ces deux catégories sont formatées en utilisant les valeurs chaînes spécifiées. Ce formateur peut également formater les valeurs null ou non affectées.

Spécification de modèle Valeur Valeur formatée Signification

00000{-9999} 950677394 00043 1540001

95067-7394 00043 00154-0001

Affichage des zéros pour les cinq positions de gauche (obligatoires), les caractères restants sont optionnels, ce sont un tiret littéral et quatre chiffres. Utilisez ce modèle pour les codes postaux américains.

L0L 0L0 H2A2R9 M1M3W4

H2A 2R9 M1M 3W4

Le L correspond à une saisie obligatoire de lettre A-Z. Le 0 (zéro) correspond à une saisie obligatoire de chiffre 0-9, les signes plus (+) et moins (-) n’étant pas autorisés. Utilisez ce modèle pour les codes postaux canadiens.

{(999)} 000-0000^!;0 4084311000 (408) 431-1000 Ce modèle correspond aux numéros de téléphone américains avec un indicatif optionnel entre parenthèses. Le signe caret (^) positionne le curseur à la droite du champ, les données se décalant vers la gauche au fil de la saisie. Pour que les données soient stockées correctement de droite à gauche, utilisez le symbole !. Ce comportement est automatique pour les valeurs numériques. Le code zéro (0) indique que les littéraux ne sont pas stockés avec les données.

Page 221: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-23

P r é s e n t a t i o n d e p l u s i e u r s v u e s d e s d o n n é e s

Vous pouvez, par exemple, stocker une information indiquant le sexe des individus dans une colonne de type boolean tout en faisant formater le champ par JBuilder afin d’afficher et d’accepter des saisies de la forme “Homme” et “Femme”, comme l’illustre le code suivant :

column1.setEditMask("Homme;Femme;");column1.displayMask("Homme;Femme;");

Le tableau suivant donne des modèles booléens et le résultat de leur formatage :

Présentation de plusieurs vues des donnéesDans tout StorageDataSet, il est possible de trier et de filtrer les données. Il y a néanmoins des situations dans lesquelles vous avez besoin de présenter simultanément les données d’un StorageDataSet en utilisant différents tris ou filtres. Le composant DataSetView offre cette possibilité.

Le composant DataSetView permet également un niveau supplémentaire d’indirection qui donne une plus grande flexibilité dans la modification des liens des composants d’interface utilisateur. Si vous prévoyez de changer la liaison de plusieurs composants d’interface utilisateur, liez ces composants à un DataSetView au lieu de les lier directement au StorageDataSet. Quand il faut changer la liaison, il suffit de modifier le composant DataSetView pour le lier au composant StorageDataSet approprié, ainsi une seule modification affecte également tous les composants d’interface utilisateur connectés au DataSetView.

Pour créer un objet DataSetView et affecter à sa propriété storageDataSet l’objet StorageDataSet contenant les données à visualiser :

1 Créez une nouvelle application en suivant la procédure décrite dans “Accès aux données des exemples”, page 11-2.

Cette étape vous permet de vous connecter à une base de données, de lire les données d’une table, de voir et de modifier ces données dans un composant orienté données.

2 Depuis l’onglet DataExpress, ajoutez un composant DataSetView à l’arborescence des composants ou au concepteur d’interface utilisateur.

Spécification de modèle

Format des valeurs true

Format des valeurs false

Format des valeurs null

homme;femme homme femme (chaîne vide)

V,F,V V F V

Oui,Non,Ne sait pas Oui Non Ne sait pas

fumeur;; fumeur (chaîne vide) (chaîne vide)

fumeur;non fumeur; fumeur non fumeur (chaîne vide)

Page 222: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-24 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

P r é s e n t a t i o n d e p l u s i e u r s v u e s d e s d o n n é e s

3 Attribuez la valeur queryDataSet1 à la propriété storageDataSet du composant DataSetView.

Le composant DataSetView parcourt les données indépendamment de son StorageDataSet associé.

4 Ajoutez d’autres TableScrollPane et JdbTable au concepteur d’interface utilisateur et définissez la propriété dataSet du JdbTable par dataSetView1 pour synchroniser la navigation dans les contrôles.

5 Compilez et exécutez l’application.

Le composant DataSetView affiche les données du QueryDataSet mais sans dupliquer son contenu. Il présente les données d’origine du QueryDataSet non triées, non filtrées.

Vous pouvez définir des critères de tri ou de filtre dans le composant DataSetView qui diffèrent de ceux du StorageDataSet original. L’attachement du DataSetView à un StorageDataSet et la définition d’un nouveau critère de filtre et/ou de tri n’a aucun effet sur les critères de filtre ou de tri définis dans le StorageDataSet.

Pour définir un critère de filtre ou de tri d’un composant DataSetView,

1 Double-cliquez sur le fichier cadre dans le volet projet et sélectionnez l’onglet Conception.

2 Sélectionnez le composant DataSetView.

3 Dans la page Propriétés de l’inspecteur,

a Sélectionnez la propriété sort pour modifier l’ordre d’affichage des enregistrements dans le DataSetView.

Pour davantage d’informations sur le sortDescriptor, voir “Tri des données”, page 11-9.

b Sélectionnez la propriété masterLink pour définir un ensemble de données parent de cette vue.

Pour plus d’informations sur le masterLinkDescriptor, voir Chapitre 9, “Etablissement d’une relation maître-détail”.

4 Sur la page Evénements de l’inspecteur, sélectionnez la méthode filterRow pour masquer temporairement des lignes dans le DataSetView. Pour plus d’informations sur le filtrage, voir “Filtrage des données”, page 11-5.

Vous pouvez, par défaut, modifier, supprimer ou ajouter des données dans le DataSetView. Quand vous modifiez, supprimez ou ajoutez des données dans le DataSetView, vous le faites également dans le StorageDataSet auquel est lié le composant DataSetView.

• Attribuez la valeur false à la propriété enableDelete pour empêcher l’utilisateur de supprimer des données du StorageDataSet.

Page 223: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-25

G a r a n t i e d e l a p e r s i s t a n c e d e s d o n n é e s

• Attribuez la valeur false à la propriété enableInsert pour empêcher l’utilisateur d’ajouter des données au StorageDataSet.

• Attribuez la valeur false à la propriété enableUpdate pour empêcher l’utilisateur de modifier les données du StorageDataSet.

Garantie de la persistance des donnéesEntre le moment où vous développez une application et celui où l’utilisateur l’exécute, il peut y avoir de nombreuses modifications dans les données de la source. Généralement les données de la source sont actualisées. Mais, plus important, il peut y avoir des modifications de structure qui sont une cause plus importante d’échec de l’application. Quand de telles situations se produisent, vous pouvez :

• Laisser l’application échouer quand un tel événement se produit. Par exemple, quand une colonne d’une table de référence a été renommée sur le serveur de la base de données et que cela n’est pas découvert avant que l’application ne tente de modifier la colonne de référence.

• Arrêtez l’exécution de l’application et affichez un message d’erreur. Selon l’endroit où se trouvent les données indisponibles, cette approche limite le risque d’actualisation partielle des données.

Par défaut, les colonnes affichées dans un composant orienté données sont déterminées à l’exécution en fonction des colonnes existant dans l’ensemble de données. Si la structure de données de la source de données a été modifiée et s’avère incompatible avec votre application, une erreur d’exécution est générée quand cette situation se produit.

JBuilder propose la persistance de données comme gestion alternative de telles situations. Utilisez cette caractéristique si le fonctionnement de votre application dépend de la disponibilité de certaines colonnes de données. Cela garantit que la colonne existe et que les données sont affichées dans l’ordre spécifié. Si la colonne source d’un objet Column persistant est modifiée ou supprimée, une Exception est générée au lieu d’une erreur d’exécution quand l’accès aux données de la colonne échoue.

Rendre des colonnes persistantes

Une colonne peut être rendue persistante en initialisant une des propriétés au niveau de la colonne (par exemple un masque de saisie). Quand une colonne devient persistante, des crochets ([ ]) sont placés autour du nom de la colonne.

Page 224: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-26 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

G a r a n t i e d e l a p e r s i s t a n c e d e s d o n n é e s

Pour initialiser une propriété de niveau Column,

1 Ouvrez un projet contenant un objet DataSet, par exemple sélectionnez l’un des fichiers projets (.jpx) du sous-répertoire /samples/DataExpress/ de votre installation JBuilder.

2 Double-cliquez sur le fichier Cadre (par exemple, BasicAppFrame.java) pour l’ouvrir dans le volet contenu, puis cliquez sur l’onglet Conception.

3 Double-cliquez sur l’objet DataSet. Cela affiche le concepteur de colonne pour l’ensemble de données. Le concepteur de colonne ressemble à l’image suivante pour la table exemple employee :

Figure 12.3 Concepteur de colonne

4 Sélectionnez la colonne dont vous voulez définir les propriétés. L’inspecteur reflète les propriétés (et les événements) de la colonne sélectionnée.

5 Définissez une propriété en saisissant une valeur dans la zone de saisie de l’inspecteur. Si vous ne voulez pas modifier de propriété de la colonne, vous pouvez définir une valeur, puis la réinitialiser à sa valeur par défaut.

A titre d’exemple, définissez la valeur minimum d’une colonne contenant une donnée numérique en saisissant une valeur dans la propriété min. JBuilder place automatiquement des crochets ([ ]) autour du nom de colonne.

Dans le concepteur de colonne, les colonnes de l’ensemble de données sont affichées dans une table à l’intérieur du concepteur d’interface utilisateur. Une barre d’outils permet d’ajouter, de supprimer, de parcourir et de restructurer l’ensemble de données.

• Le bouton Insérer une colonne dans le dataset insère une nouvelle colonne à l’indice préféré de la colonne mise en évidence dans la table.

• Le bouton Supprimer supprime la colonne de l’ensemble de données.

Page 225: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A j o u t d e f o n c t i o n n a l i t é s a u x a p p l i c a t i o n s d e b a s e s d e d o n n é e s 12-27

G a r a n t i e d e l a p e r s i s t a n c e d e s d o n n é e s

• Les boutons Déplacer vers le haut et Déplacer vers le bas changent la position par défaut des colonnes et leur ordre d’affichage dans les composants orientés données comme le contrôle table.

• Le bouton Choisir les propriétés à afficher vous permet de choisir les propriétés affichées dans le concepteur.

• Le bouton Restructurer est disponible uniquement si la propriété store désigne un DataStore. Pour plus d’informations sur les objets DataStore, voir “JDataStore et JBuilder”, page 2-13, ou le Guide du développeur JDataStore.

Le bouton Restructurer compile le composant this et démarre une machine virtuelle pour effectuer la restructuration de l’objet DataStore associé à l’ensemble de données. Pendant la restructuration, une boîte de dialogue est affichée pour indiquer l’état de la restructuration et permettre de l’annuler.

• Le bouton Continuer toutes les métadonnées rend persistantes toutes les métadonnées nécessaires pour l’ouverture d’un QueryDataSet à l’exécution. Voir “Utilisation du concepteur de colonne pour rendre persistantes des métadonnées”, page 7-4.

• Le bouton Rendre toutes les métadonnées dynamiques vous permet de mettre à jour une requête après la modification éventuelle de la table sur le serveur. Vous devez d’abord rendre les métadonnées dynamiques, puis persistantes, afin d’utiliser les nouveaux index créés sur la table de la base de données. La sélection du bouton Rendre toutes les métadonnées dynamiques SUPPRIME LE CODE du fichier source. Voir “Utilisation du concepteur de colonne pour rendre dynamiques des métadonnées”, page 7-5.

• La sélection du bouton de génération de classe de RowIterator ouvre une boîte de dialogue qui offre des fonctionnalités d’itération allégées (faible consommation de mémoire et liaison rapide) garantissant un accès statique aux colonnes avec sécurité des types. Voir “Bouton Créer une classe RowIterator”, page 7-3, pour plus d’informations.

Pour fermer le concepteur de colonnes, double-cliquez sur n’importe quel composant de l’interface utilisateur, comme contentPane, dans le volet contenu, ou cliquez sur un autre composant, et sélectionnez Activer le concepteur. En d’autres termes, la seule façon de fermer un concepteur est d’en ouvrir un autre.

Page 226: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

12-28 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d e t y p e s d e d o n n é e s v a r i a n t

Utilisation de types de données variantLes colonnes peuvent contenir de nombreux types de données. Cette rubrique décrit comment stocker des objets Java dans un objet Column. Les colonnes sont traitées de façon plus complète au Chapitre 7, “Manipulation des colonnes”.

Stockage d’objets Java

Les composants DataSet et DataStore peuvent stocker des objets Java dans les colonnes d’un ensemble de données. Les champs d’une table SQL, indiqués par le JDBC comme étant de type java.sql.Types.OTHER, sont mappés dans les colonnes dont le type de données est Variant.OBJECT, mais vous pouvez également définir le type de données d’une colonne à Object et lire/écrire des valeurs à travers l’API normale des ensembles de données.

Si un DataStore est employé, les objets doivent pouvoir se sérialiser. Si ce n’est pas le cas, une exception est déclenchée dès que le DataStore tente d’enregistrer l’objet. De plus, la classe doit exister dans le CLASSPATH au moment de lire un objet. Si ce n’est pas le cas, la tentative de lecture échoue.

Veuillez noter ce qui suit concernant le formatage et l’édition d’une colonne contenant un objet Java.

• Formatage et édition par défaut

Dans le concepteur d’interface utilisateur, un formateur est attribué par défaut aux colonnes de type Object. Quand l’objet est édité, il est considéré comme un objet de type java.lang.String indépendamment de son type d’origine.

• Personnalisation du formatage et de l’édition

Vous pouvez (et vous voudrez probablement le faire) définir la propriété formatter d’une colonne pour redéfinir les fonctionnalités par défaut, ou au moins rendre la colonne non modifiable. Un formateur personnalisé permet de définir le formatage et la fragmentation adaptés aux objets contenus dans la colonne.

Le même formateur de colonne est utilisé pour tous les enregistrements de l’ensemble de données. Cela signifie qu’il n’est pas possible de mélanger des objets de types différents dans une même colonne. Cette restriction ne s’applique qu’à l’édition personnalisée.

Page 227: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d ’ a u t r e s c o n t r ô l e s e t é v é n e m e n t s 13-1

C h a p i t r e

13Chapitre13Utilisation d’autres contrôles

et événementsLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Cette rubrique donne davantage d’informations sur l’utilisation des contrôles et des événements. “Accès aux données des exemples”, page 11-2, définit une requête qui peut être utilisée comme point de départ pour les questions traitées dans ce chapitre.

Ce chapitre aborde les sujets suivants :

• “Synchronisation des composants visuels”, page 13-1

• “Accès aux données et aux informations de modèle depuis un composant d’interface utilisateur”, page 13-2

• “Affichage d’informations d’état”, page 13-3

• “Gestion des erreurs et des exceptions”, page 13-5

Synchronisation des composants visuelsDifférents composants orientés données peuvent être associés au même DataSet. Dans ce cas, les composants parcourent les données de concert. Quand vous changez de ligne dans un composant, la ligne affichée change dans tous les composants partageant un même curseur. Cette synchronisation des composants associés à un même ensemble de données simplifie considérablement le développement de l’interface utilisateur d’une application.

L’ensemble de données gère un “pseudo” enregistrement, une zone de la mémoire dans laquelle est stockée une ligne nouvellement ajoutée ou les modifications apportées à une ligne. Les composants qui partagent le même ensemble de données comme source de données partagent également

Page 228: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

13-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A c c è s a u x d o n n é e s e t a u x i n f o r m a t i o n s d e m o d è l e d e p u i s u n c o m p o s a n t d ’ i n t e r f a c e

le même “pseudo” enregistrement. Cela permet aux modifications d’êtres visibles dès que la saisie au niveau du champ est achevée, par exemple dès que vous sortez du champ.

Plusieurs composants visuels sont synchronisés par l’affectation du même ensemble de données à leur propriété dataSet. Quand des composants sont liés au même ensemble de données, ils “parcourent” les données de concert et restent automatiquement synchronisés sur la même ligne de données. C’est ce que l’on appelle des curseurs partagés.

Si, par exemple, un programme utilise un JdbNavToolBar et un JdbTable connectés tous les deux au même 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 liés à différents composants ensemble de données, ils ne se repositionnent pas automatiquement sur la même ligne de données. Plusieurs composants dbSwing, dont JdbNavToolBar et JdbStatusLabel, s’attachent automatiquement à tout ensemble de données (DataSet) ayant la focalisation.

La méthode goToRow(com.borland.dx.dataset.ReadRow) permet de synchroniser deux composants ensemble de données sur la même ligne (celle sur laquelle est positionné dataSet) même si différents critères de tri ou de filtre sont actifs.

Accès aux données et aux informations de modèle depuis un composant d’interface utilisateur

Si vous avez initialisé la propriété dataSet d’un composant, il faut éviter d’accéder par programme aux données ou aux informations de modèle de l’ensemble de données via le composant tant que le responsable du composant n’a pas été créé.

Les opérations qui échouent ou renvoient des résultats incorrects ou incohérents quand elles sont exécutées avant l’affichage du composant dans l’interface utilisateur sont celles qui accèdent au modèle du composant. Entre autres,

• Opérations <composant>.get() ou <composant>.set()• <composant>.insertRow()• etc.

Pour garantir la bonne exécution de telles opérations, vérifiez la notification d’événement open() générée par l’ensemble de données. Une fois que la notification d’événement a eu lieu, vous êtes certain que le composant et son modèle sont correctement initialisés.

Page 229: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d ’ a u t r e s c o n t r ô l e s e t é v é n e m e n t s 13-3

A f f i c h a g e d ’ i n f o r m a t i o n s d ’ é t a t

Affichage d’informations d’étatGénéralement, les applications de bases de données ne se contentent pas d’afficher les données, elles affichent également des informations sur les données. Fréquemment, une zone particulière de la fenêtre propose des informations sur la ligne en cours, des messages d’erreur et des informations similaires. dbSwing dispose du composant JdbStatusLabel qui propose un mécanisme d’affichage de ces informations d’état. Il dispose d’une propriété text qui permet de définir une chaîne de texte devant être affichée dans le composant JdbStatusLabel. Cette chaîne remplace le contenu déjà affiché par le composant JdbStatusLabel et sera remplacée par la chaîne suivante écrite dans le composant JdbStatusLabel.

Le composant JdbStatusLabel se connecte automatiquement à tout ensemble de données ayant la focalisation. Le composant JdbStatusLabel n’affiche pas les données de l’ensemble de données mais les informations d’état suivantes générées par l’ensemble de données :

• La position de ligne en cours ;• le nombre de lignes ;• les erreurs de validation ;• les notifications de mise à jour des données ;• les messages de recherche.

Ajout d’un composant JdbStatusLabel à une application

Cette section décrit l’utilisation des outils de conception de JBuilder pour ajouter un composant dbSwing JdbStatusLabel à une application.

Pour ajouter le JdbStatusLabel à l’interface utilisateur d’une application existante,

1 Ouvrez les fichiers projet de l’application à laquelle vous voulez ajouter un JdbStatusLabel.

Cette application doit inclure un composant JdbTable, un composant Database et un composant QueryDataSet. Si vous n’avez pas cette application, utilisez les fichiers créés pour “Accès aux données des exemples”, page 11-2. Vérifiez que la disposition du contentPane du projet est bien définie par null.

2 Double-cliquez sur le fichier cadre dans le volet projet de l’AppBrowser pour l’ouvrir dans le volet du contenu, puis cliquez sur l’onglet Conception, en bas de l’AppBrowser.

3 Cliquez sur la page dbSwing de la palette des composants et cliquez sur le composant JdbStatusLabel.

Page 230: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

13-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

A f f i c h a g e d ’ i n f o r m a t i o n s d ’ é t a t

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 d’interface utilisateur, généralement un composant JdbTable qui affiche les données de l’ensemble de données. Ainsi, les deux composants suivent le même DataSet, c’est ce qu’on désigne 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 d’enregistrements dans l’ensemble de données).

5 Double-cliquez sur le QueryDataSet.

Cela affiche le concepteur de colonne.

6 Sélectionnez les colonnes Last_Name et First_Name et, dans l’inspecteur, affectez la valeur true à la propriété required de ces deux colonnes.

7 Affectez la valeur 25000 à la propriété min de la colonne SALARY.

8 Exécutez l’application.

Exécution de l’application JdbStatusLabel

Lors de l’exécution de cette application, quand vous parcourez l’ensemble de données, l’indicateur de ligne reflète la position de la ligne en cours. De même, si vous ajoutez ou supprimez des lignes, le compteur de ligne est actualisé.

Pour tester l’affichage des informations de validation,

1 Insérez une nouvelle ligne de données. Essayez d’enregistrer la ligne sans saisir de valeur dans les colonnes FIRST_NAME ou LAST_NAME. Un message est affiché dans le JdbStatusLabel indiquant qu’il n’est pas possible d’enregistrer 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) inférieur au minimum autorisé (25000). Quand vous essayez de changer de ligne, le JdbStatusLabel affiche le même message d’erreur signalant que la ligne ne peut être validée à cause de valeurs de champs manquantes ou incorrectes.

En définissant, à des endroits appropriés 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é par le texte suivant que vous définissez ou par le texte du prochain

Page 231: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

U t i l i s a t i o n d ’ a u t r e s c o n t r ô l e s e t é v é n e m e n t s 13-5

G e s t i o n d e s e r r e u r s e t d e s e x c e p t i o n s

message généré par l’ensemble de données. Un message d’état est généré par les déplacements dans les données de la table, les erreurs de validation, etc.

Gestion des erreurs et des exceptionsEn utilisant dans les programmes les classes DataExpress, l’essentiel de la gestion des erreurs est réalisée via les extensions DataExpress de la classe java.lang.Exception. Toutes les classes d’exception de dataset sont de type DataSetException ou de l’une de ses sous-classes.

La classe DataSetException peut être chaînée à d’autres types d’exceptions, par exemple les exceptions java.io.IOException et java.sql.SQLException. Dans ce cas, la classe DataSetException utilise un message approprié décrivant l’erreur dans la perspective d’une API de haut niveau. La méthode getExceptionChain() de la classe DataSetException peut être utilisée pour obtenir les exceptions chaînées. Les exceptions chaînées (une liste liée simple) sont des exceptions non DataSetException rencontrées dans une API de niveau plus bas.

Le paquet dataset propose une gestion prédéfinie des exceptions DataSetException pour les composants orientés données dbSwing. Les contrôles ne savent pas par eux-mêmes gérer les exceptions, DataSetException. Ils s’attendent simplement à ce que toutes leurs opérations de mise à jour et d’accès aux données réussissent, laissant la gestion des erreurs à la classe prédéfinie DataSetException.

Pour les composants orientés données dbSwing, la gestion des erreurs par défaut de DataSetException fonctionne de la manière suivante :

• Si un contrôle effectue une opération provoquant une exception DataSetException, une boîte de dialogue Exception est affichée avec le message associé à l’erreur. Cette boîte de dialogue Exception dispose d’un bouton Détails qui affiche le suivi de la pile.

• Si DataSetException comporte des exceptions chaînées, il est possible de les visualiser en utilisant les boutons Précédent et Suivant de la boîte de dialogue Exception.

• Si l’exception déclenchée est de type ValidationException (une sous-classe de DataSetException), la boîte de dialogue Exception n’est affichée que s’il n’y a pas d’auditeur StatusEvent dans l’ensemble de données, par exemple le contrôle JdbStatusLabel. Une exception ValidationException est générée par la violation d’une contrainte, par exemple une valeur hors de l’intervalle autorisé, une saisie de données ne respectant pas la spécification d’un masque de saisie, la tentative de modification d’une colonne en lecture seule, etc. Si un contrôle JdbStatusLabel est lié à un DataSet, il devient automatiquement un auditeur StatusEvent. Ainsi, les utilisateurs peuvent voir dans le libellé d’état les messages produits par les violations.

Page 232: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

13-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

G e s t i o n d e s e r r e u r s e t d e s e x c e p t i o n s

Remplacement de la gestion par défaut des exceptions DataSetException dans les contrôles

Il est possible de redéfinir des portions de la gestion par défaut des erreurs en recensant un auditeur StatusEvent dans l’ensemble de données. Cela empêche l’affichage des messages ValidationException dans la boîte de dialogue Exceptions.

Il est possible de neutraliser davantage la gestion par défaut des DataSetException pour les contrôles au niveau de l’ensemble de données en attribuant la valeur false à sa propriété displayErrors. Comme c’est une propriété d’ensemble de données, définissez-la pour chaque ensemble de données de l’application pour neutraliser la gestion des erreurs par défaut de tous les objets DataSet de l’application.

Pour contrôler complètement la gestion DataSetException de tous les contrôles dbSwing et des objets ensemble de données, vous devez créer votre propre classe gestionnaire et la connecter à l’auditeur ExceptionEvent de la classe DataSetException.

La plupart des événements du paquet dataset déclenchent des exceptions DataSetException. Cela s’avère très pratique quand vos gestionnaires d’erreurs utilisent l’API dataSet (qui déclenche généralement DataSetException). Cela vous évite de coder la logique try/catch pour chaque gestionnaire d’événements que vous écrivez. Pour le moment, les outils de conception JBuilder n’insèrent pas la clause “throws DataSetException” dans le code source java qu’ils génèrent mais vous pouvez ajouter cette clause.

Page 233: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e à l ’ a i d e d e D a t a S e t D a t a 14-1

C h a p i t r e

14Chapitre14Création d’une application

de base de données distribuéeà l’aide de DataSetData

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Le projet exemple DataSetData.jpx se trouvant dans le répertoire /samples/DataExpress/StreamableDataSets de votre installation JBuilder contient une application de base de données distribuée complète qui utilise l’appel de méthode distant (RMI) et DataSetData. Il contient une application serveur utilisant les données de la table exemple employee JDataStore qui envoie les données, via le RMI, sous la forme de DataSetData. Un DataSetData est utilisé pour passer des données en tant qu’argument à une méthode RMI ou en tant que flux d’entrée à un servlet.

Une application client communique avec le serveur via un Provider et un Resolver personnalisés. L’application client affiche les données dans une table. Les modifications effectuées sur le client peuvent être enregistrées en utilisant le bouton Enregistrer d’une barre d’outils JdbNavToolBar.

Pour plus d’informations sur l’écriture de fournisseurs personnalisés, voir “Ecriture d’un fournisseur de données personnalisé”, page 6-9. Pour plus d’informations sur l’écriture ou la personnalisation d’un résolveur, voir “Personnalisation de la logique de résolution par défaut”, page 8-17.

Voir le fichier DataSetData.html dans le répertoire /samples/DataExpress/StreamableDataSets/ pour des informations actualisées sur cette application exemple.

Chapter 14Explicationde l’exempled’application

de base dedonnées

distribuée

Page 234: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

14-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p l i c a t i o n d e l ’ e x e m p l e d ’ a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e

Explication de l’exemple d’application de base de données distribuée (utilisant Java RMI et DataSetData)

Le projet exemple, situé dans /samples/DataExpress/StreamableDataSets/DataSetData.jpx, illustre l’utilisation de la classe DataExpress DataSetData pour construire une application de base de données distribuée. Outre l’utilisation d’objets DataSetData pour la transmission de données de base de données entre un serveur et un client RMI, cet exemple illustre l’utilisation d’un fournisseur et d’un résolveuret d’ensemble de données personnalisé. L’application exemple contient les fichiers suivants :

• Fichiers interface

EmployeeApi.java est une interface qui définit les méthodes que vous voulez distantes.

• Fichiers serveur

DataServerApp.java est un serveur RMI. Il étend UnicastRemoteObject.

• Fichiers fournisseur

ClientProvider.java est l’implémentation d’un Provider. La méthode provideData est l’implémentation d’une méthode de com.borland.dx.dataset.Provider. Nous faisons référence au service “DataServerApp” sur l’hôte spécifié par la propriété hostName, puis effectuons l’appel à la méthode distante et chargeons notre DataSet avec le contenu.

• Fichiers résolveur

ClientResolver.java est l’implémentation d’un Resolver. La méthode resolveData est l’implémentation d’une méthode de com.borland.dx.dataset.Resolver. Nous faisons référence au service “DataServerApp” sur l’hôte spécifié par la propriété hostName. Puis, nous récupérons les modifications dans une instance de DataSetData. Ensuite, nous effectuons l’appel à la méthode distante, gérons les éventuelles erreurs de résolution et changeons les bits d’état de toutes les lignes modifiées à résoudre.

• Fichiers client

ClientApp.java est une application client RMI. Voir ClientFrame.java pour plus de détails.

• Autres fichiers

Res.java est un fichier ressource pour l’internationalisation de l’application.

ClientFrame.java est le cadre de ClientApp. Remarquez que le DataSet affiché dans la table est un TableDataSet avec un fournisseur

Chapter 14Explicationde l’exempled’application

de base dedonnées

distribuée

Page 235: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e à l ’ a i d e d e D a t a S e t D a t a 14-3

E x p l i c a t i o n d e l ’ e x e m p l e d ’ a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e

personnalisé et un résolveur personnalisé. Voir ClientProvider.java et ClientResolver.java pour plus de détails.

DataServerFrame.java est le frame affiché par DataServerApp.

Installation de l’application exemple

Pour exécuter l’application exemple :

1 Ouvrez cette application dans JBuilder en choisissant Fichier|Ouvrir et en naviguant jusqu’à /samples/DataExpress/StreamableDataSets/DataSetData.jpx.

2 Choisissez Projet|Propriétés du projet pour afficher les propriétés de ce projet. Définissez les options suivantes :

• Choisissez l’onglet Exécution.

• Vérifiez que la propriété “java.rmi.server.codebase” transmise à la VM du serveur RMI via un argument de ligne de commande pointe vers l’emplacement correct des classes du serveur RMI ("file:/usr/local/<jbuilder>/samples/DataExpress/StreamableDataSets/classes/" par défaut).

• Vérifiez que la propriété “java.security.policy” pointe vers le fichier SampleRMI.policy inclus avec ce projet ("file:/usr/local/<jbuilder>/samples/DataExpress/StreamableDataSets/SampleRMI.policy" par défaut).

• Fermez la boîte de dialogue Propriétés du projet.

3 Démarrez le registre RMI en choisissant Outils|Registre RMI dans JBuilder. Le registre est activé et désactivé à partir du menu Outils.

4 Sélectionnez le fichier DataServerApp dans le volet projet. Cliquez avec le bouton droit sur le fichier, puis choisissez Exécuter pour démarrer le serveur RMI.

5 Sélectionnez le fichier ClientApp dans le volet projet. Cliquez avec le bouton droit sur le fichier, puis choisissez Exécuter pour démarrer le client RMI.

6 Modifiez les données dans la table de ClientApp, puis cliquez sur le bouton Enregistrer les modifications de la barre d’outils (pour enregistrer les modifications sur le serveur) ou sur le bouton Rafraîchir de la barre d’outils (pour recharger les données depuis le serveur). Chaque fois que les données sont enregistrées ou rafraîchies, le compteur de requêtes intermédiaires est incrémenté.

Page 236: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

14-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p l i c a t i o n d e l ’ e x e m p l e d ’ a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e

Que se passe-t-il ?Ces étapes permettent à DataServerApp de se recenser lui-même en tant que serveur RMI. DataServerApp répondra à deux requêtes client RMI : provideEmployeeData et resolveEmployeeChanges, définies dans l’interface distante RMI EmployeeApi.java.

Le fichier ClientApp est un frame ayant un JdbTable et un JdbNavToolBar pour l’affichage des données dans un DataSet DataExpress. Les données sont fournies au DataSet via un fournisseur personnalisé, ClientProvider.java, et les données sont enregistrées dans la source via un résolveur personnalisé, ClientResolver.java. ClientProvider.java remplit ses données de table en invoquant la méthode distante provideEmployeeData() de DataServerApp via RMI. DataServerApp demande ensuite des données, à partir d’une table située sur un serveur de bases de données JDBC, qui sont regroupées dans un DataSet. Il extrait ensuite les données du DataSet et les place dans un objet DataSetData puis les renvoie au ClientProvider via RMI. ClientProvider charge ensuite les données situées dans l’objet DataSetData dans le DataSet de ClientApp, puis les données s’affichent dans la table.

Au moment de résoudre les modifications de la table dans la base de données, le résolveur personnalisé du DataSet de ClientApp, ClientResolver.java, extrait (uniquement) les modifications qui doivent être envoyées au serveur de bases de données dans un objet DataSetData. ClientResolver invoque ensuite la méthode distante resolveEmployeeChanges() de DataServerApp via RMI, en lui transmettant comme paramètre l’objet DataSetData contenant les mises à jour nécessaires.

DataServerApp utilise ensuite DataExpress pour résoudre les modifications dans le serveur de bases de données. En cas d’erreur (en raison d’une règle de métier ou d’une violation de contrainte de données, par exemple), DataServerApp empaquette les lignes qui n’ont pas pu être enregistrées dans la base de données dans un objet DataSetData qu’il renvoie au ClientResolver. ClientResolver extrait ensuite les lignes non résolues se trouvant dans l’objet DataSetData et les place dans la table de ClientApp afin qu’elles puissent de nouveau être corrigées et résolues dans le serveur.

Notez que DataServerApp est le niveau intermédiaire de l’application. Il peut imposer ses propres règles et contraintes de métier entre le serveur de bases de données et le client. De plus, il peut, bien sûr, offrir un nombre quelconque de méthodes supplémentaires accessibles à distance pour l’implémentation de tâches de métiers ou applicatives.

Page 237: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e à l ’ a i d e d e D a t a S e t D a t a 14-5

E x p l i c a t i o n d e l ’ e x e m p l e d ’ a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e

Transmission des métadonnées par DataSetDataLes métadonnées passées dans un objet DataSetData sont très limitées. Seules les propriétés Column suivantes sont transmises :

• columnName• dataType• precision• scale• hidden• rowId

Les autres propriétés de colonnes qu’un serveur doit passer à un client doivent être transmises en tant que tableau de Columns via RMI. L’objet Column lui-même est sérialisable, de sorte qu’une application client peut être conçue pour obtenir ces propriétés de colonnes avant qu’elle ait besoin des données. Les colonnes doivent être ajoutées en tant que colonnes persistantes avant le chargement de DataSetData.

Déploiement de l’application sur plusieurs niveauxPour déployer l’application sur plusieurs niveaux,

1 Sélectionnez DataServerApp.java dans le volet projet. Changez l’URL de la connexion à la base de données dans le constructeur afin qu’elle pointe sur une base de données distante à laquelle vous pouvez accéder. La base de données constitue l’extrémité dorsale, ou troisième niveau.

2 Choisissez Projet|Construire le projet pour recompiler et mettre à jour DataServerApp.class.

3 Déployez DataServerApp.class sur une machine distante à laquelle vous êtes connecté. DataServerApp s’exécute au deuxième niveau (ou niveau intermédiaire).

4 Démarrez le registre RMI sur l’ordinateur du niveau intermédiaire.

5 Démarrez DataServerApp au niveau intermédiaire.

Remarque A partir de JDK 1.2, il est nécessaire d’accorder à un serveur RMI des droits de sécurité particuliers afin qu’il puisse écouter et accepter les requêtes de clients RMI via un réseau. Généralement, ces droits sont spécifiés dans un fichier de stratégie de sécurité Java défini par une propriété particulière, java.security.policy, transmise par un argument de la ligne de commande à la VM du serveur. C’est l’équivalent de la propriété java.rmi.server.codebase qui doit aussi être transmise à la VM du serveur. Un fichier exemple de stratégie de sécurité RMI permettant à un client RMI de se connecter au serveur est inclus dans ce projet dans le fichier SampleRMI.policy.

Page 238: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

14-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p l i c a t i o n d e l ’ e x e m p l e d ’ a p p l i c a t i o n d e b a s e d e d o n n é e s d i s t r i b u é e

Lors du démarrage de DataServerApp au niveau intermédiaire, assurez-vous que les deux propriétés java.security.policy et java.rmi.server.codebase sont initialisées aux emplacements corrects sur la machine de niveau intermédiaire.

6 Double-cliquez sur ClientFrame.java dans le volet projet de JBuilder pour l’afficher dans le volet contenu. Sélectionnez l’onglet Conception pour invoquer le concepteur. Sélectionnez clientProvider1 dans l’arborescence des composants et changez la propriété hostName par le nom de l’hôte de la machine de niveau intermédiaire.

7 Sélectionnez clientResolver1 et changez la propriété hostName par le nom de l’hôte de la machine de niveau intermédiaire.

8 Choisissez Projet|Construire le projet pour reconstruire ClientApp.

Démarrez ClientApp sur le client, ou premier niveau, en cliquant avec le bouton droit sur le fichier ClientApp.java dans le volet projet puis en choisissant Exécuter.

Pour plus d’informations

• Lisez la documentation RMI du site web de Sun, à l’adresse http://java.sun.com/j2se/1.4/docs/guide/rmi/.

• Pour en savoir davantage sur l’écriture de fournisseurs et de résolveurs personnalisés, consultez l’application exemple d’ensemble de données /samples/DataExpress/CustomProviderResolver/CustomProviderResolver.jpx.

Page 239: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-1

C h a p i t r e

15Chapitre15Administration

d’une base de donnéesLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Ce chapitre donne des informations sur les tâches courantes d’administration de base de données. Les sujets suivants sont abordés :

• “Exploration des tables et métadonnées des bases de données en utilisant le pilote de base de données”, page 15-1

• “Utilisation du pilote de base de données pour l’administration de bases de données”, page 15-7

• “Surveillance des connexions aux bases de données”, page 15-11

Exploration des tables et métadonnées des bases de données en utilisant le pilote de base de données

Le pilote de base de données est un navigateur de bases de données hiérarchique, possédant des capacités d’édition. Il présente les méta-informations basées sur JDBC dans une fenêtre à deux volets. Le volet gauche contient une arborescence qui affiche de façon hiérarchique un ensemble de bases de données et ses tables, vues, procédures stockées et métadonnées associées. Le volet droit affiche sur plusieurs pages des informations qui décrivent chaque nœud de l’arborescence. Dans certains cas, il vous est également possible de modifier les données du volet droit.

Pour afficher le pilote de base de données, sélectionnez Outils|Pilote de base de données dans le menu JBuilder.

Chapter 15Explorationdes tables et

métadonnéesdes bases dedonnées enutilisant le

pilote

Page 240: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p l o r a t i o n d e s t a b l e s e t m é t a d o n n é e s d e s b a s e s d e d o n n é e s e n u t i l i s a n t l e p i l o t e

Figure 15.1 Pilote de base de données

Via une connexion persistante à une base de données, le pilote de base de données vous permet de :

• Parcourir et modifier les objets de schéma d’une base de données, y compris les tables, données des tables, colonnes (champs), index, clés primaires, clés étrangères, définitions de procédures stockées et paramètres des procédures stockées.

• Voir, créer et modifier des URL de bases de données.

• Entrer des instructions SQL pour interroger une base de données.

• Créer, voir et modifier des données dans des tables existantes.

Parcourir les objets de schéma d’une base de données

La fenêtre du pilote de base de données possède un menu, une barre d’outils, un libellé d’état et deux volets d’informations sur les bases de données.

• Le volet gauche affiche l’arborescence hiérarchique des objets suivants : URL des bases de données, tables (et leurs colonnes, index, clé primaire et clés étrangères), vues, tables système et procédures stockées (et leurs paramètres).

Une icône d’extension à côté d’un objet du volet gauche indique que cet objet contient d’autres objets. Pour les voir, cliquez sur l’icône d’extension. Quand un objet est développé, c’est-à-dire qu’il montre ses objets enfant, l’icône d’extension est remplacée par une icône de réduction. Pour cacher les objets enfant, cliquez sur l’icône de réduction.

Page 241: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-3

E x p l o r a t i o n d e s t a b l e s e t m é t a d o n n é e s d e s b a s e s d e d o n n é e s e n u t i l i s a n t l e p i l o t e

• 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 l’objet mis en évidence dans le volet gauche. Par exemple, s’il s’agit d’un alias de base de données, le volet droit affiche une page Définition contenant les paramètres Type, PATH et DRIVER NAME de la base de données, ou propriétés. Les noms de paramètres en gras signalent les paramètres qui ne peuvent pas être modifiés. Tous les autres paramètres qui apparaissent dans le volet droit peuvent être modifiés ici. Les pages à onglet suivantes peuvent apparaître dans le volet droit :

• Définition• Saisie SQL• Résumé• Données

Pour davantage d’informations sur le pilote de base de données, démarrez le pilote de base de données en choisissant Outils|Pilote de base de données dans le menu puis reportez-vous à son aide en ligne, Pilote de base de données.

Configuration des pilotes pour accéder à des bases de données distantes ou locales

Le Pilote de base de données parcourt les bases de données énumérées dans la section Connection URL History List du fichier <home>/.jdatastore/databasepilot.properties. Cette liste reçoit un nouvel élément quand vous vous connectez à une base de données en utilisant l’éditeur de la propriété connection d’un composant Database.

Vous pouvez utiliser le pilote de bases de données pour visualiser, créer et modifier des URL de base de données. La liste de tâches suivante suppose que l’URL est fermée et décrit brièvement les étapes nécessaires pour les accomplir :

• Visualiser une URL

a Dans le volet gauche, choisissez l’URL à visualiser. La page Définition apparaît dans le volet de droite.

b Cliquez sur l’icône d’extension à côté de l’URL de la base de données (ou double-cliquez dessus) dans le volet de gauche afin de visualiser son contenu.

• Créer une URL

a Sélectionnez une URL ou une base de données dans le volet de gauche.

b Cliquez avec le bouton droit de la souris pour afficher le menu contextuel.

Page 242: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p l o r a t i o n d e s t a b l e s e t m é t a d o n n é e s d e s b a s e s d e d o n n é e s e n u t i l i s a n t l e p i l o t e

c Choisissez Nouveau (ou sélectionnez Fichier|Nouveau dans le menu).

d Sélectionnez un pilote dans la liste déroulante, ou entrez ses informations. Pour pouvoir être utilisés, les pilotes doivent être installés, et les fichiers du pilote doivent apparaître dans l’instruction CLASSPATH du script de configuration de JBuilder.

e Naviguez vers l’URL désirée ou tapez-la.

f Dans la page Définition du volet droit, spécifiez le nom d’utilisateur et les autres propriétés nécessaires.

g Choisissez le bouton Appliquer dans la barre d’outils afin d’appliquer les paramètres de connexion.

• Modifier une URL

a Sélectionnez dans le volet gauche l’URL à modifier. La page Définition apparaît dans le volet droit.

b Modifiez selon vos besoins les paramètres de la page Définition.

c Choisissez le bouton Appliquer dans la barre d’outils afin d’actualiser les paramètres de connexion.

• Supprimer une URL

a Sélectionnez dans le volet gauche l’URL à supprimer.

b Sélectionnez Fichier|Supprimer dans le menu afin de supprimer l’URL.

Remarque Si vous créez une nouvelle URL ODBC alors que vous travaillez sous Windows NT, vous devez définir sa source de données ODBC via le panneau de configuration Windows avant de pouvoir vous connecter à la base de données.

Exécution d’instructions SQL

La page Saisie SQL affiche une fenêtre dans laquelle vous pouvez saisir des instructions SQL ou spécifier et exécuter un fichier .SQL existant. La partie principale de l’écran est une boîte de saisie dans laquelle vous pouvez saisir des instructions SQL. A droite de la boîte de saisie se trouvent les trois boutons : Exécuter, Suivant et Précédent. Quand une instruction SQL SELECT est exécutée, le résultat de la requête est affiché dans une table modifiable qui se trouve sous la boîte de saisie. Il est possible de redimensionner cet écran afin d’en visualiser tous les éléments.

Page 243: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-5

E x p l o r a t i o n d e s t a b l e s e t m é t a d o n n é e s d e s b a s e s d e d o n n é e s e n u t i l i s a n t l e p i l o t e

La page se présente ainsi :

Figure 15.2 Page Saisie SQL du pilote de base de données

Pour interroger une base de données en utilisant SQL,

1 Ouvrez une base de données en sélectionnant son URL dans le volet gauche puis entrez, si c’est nécessaire, un nom d’utilisateur et un mot de passe.

2 Dans le volet gauche, sélectionnez la base de données ou l’un de ses nœuds enfant.

3 Cliquez sur l’onglet Saisie SQL dans le volet de droite afin d’afficher la boîte de saisie dans laquelle vous allez pouvoir entrer ou sélectionner une instruction SQL.

4 Saisissez (ou collez) une instruction SQL dans la boîte de saisie, ou cliquez sur le bouton Charger SQL et saisissez un nom de fichier SQL. Si vous entrez des instructions n’employant pas SELECT, l’instruction est exécutée mais il n’y a pas de résultats renvoyés.

5 Cliquez sur le bouton Exécuter pour exécuter la requête.

Vous pouvez copier des instructions SQL depuis des fichiers texte, un fichier d’aide Windows ou d’autres applications puis les coller dans la boîte de saisie. Certains serveurs SQL exigent que le nom de table soit placé entre guillemets et d’autres pas.

Remarque Si la syntaxe SQL saisie est incorrecte, un message d’erreur est généré. Vous pouvez ensuite corriger à votre guise les erreurs de syntaxe dans la zone Saisie SQL.

Page 244: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E x p l o r a t i o n d e s t a b l e s e t m é t a d o n n é e s d e s b a s e s d e d o n n é e s e n u t i l i s a n t l e p i l o t e

Utilisation de l’explorateur pour visualiser ou modifier les données des tables

Sélectionnez la page Données pour afficher les données de la table, de la vue ou du synonyme sélectionné. Vous pouvez créer ou modifier des enregistrements d’une table dans la page Données si la table autorise un accès en écriture et si la case à cocher Demander les requêtes dynamiques du menu Voir|Options est cochée. La page Données affiche une table remplie avec les données de la table sélectionnée. Un contrôle barre d’outils est affiché au-dessus de la table afin de permettre le parcours et la modification des données. La page Données a l’aspect suivant :

Vous pouvez utiliser le pilote de base de données pour visualiser, modifier, ajouter ou supprimer les données des tables. La liste de tâches suivante décrit brièvement comment accomplir chacune de ces opérations.

• Visualiser les données d’une table :

a Dans le volet gauche, sélectionnez la table à visualiser.

b Cliquez sur l’onglet de la page Données du volet droit afin de visualiser une table déroulante affichant toutes les données de la table.

c Utilisez les boutons de la barre d’outils au-dessus de la table pour parcourir les enregistrements.

• Modifier un enregistrement :

a Vérifiez que l’option de menu Voir|Demander les requêtes dynamiques est cochée.

b Modifiez les champs de l’enregistrement dans la table.

c Pour envoyer les modifications à l’ensemble de données local, sélectionnez un enregistrement différent dans la table ou choisissez le bouton Valider de la barre d’outils.

Page 245: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-7

U t i l i s a t i o n d u p i l o t e d e b a s e d e d o n n é e s p o u r l ’ a d m i n i s t r a t i o n d e b a s e s d e d o n n é e s

d Pour annuler des modifications avant de changer d’enregistrement, choisissez le bouton Annuler de la barre d’outils ou appuyez sur Echap.

e Pour enregistrer vos modifications dans la base de données, cliquez sur le bouton Enregistrer les modifications.

• Insérer un enregistrement

a Placez le curseur sur la ligne précédant l’endroit où insérer.

b Choisissez le bouton Insérer de la barre d’outils. Une ligne vide apparaît.

c Entrez des données pour chaque colonne. Changez de colonne en utilisant la souris ou en tabulant de champ en champ.

d Pour valider l’ajout dans l’ensemble de données local, changez d’enregistrement dans la table ou choisissez le bouton Valider dans la barre d’outils.

e Pour annuler une insertion avant de changer d’enregistrement, choisissez le bouton Annuler de la barre d’outils ou appuyez sur Echap.

f Pour enregistrer une insertion dans la base de données, cliquez sur le bouton Enregistrer les modifications.

• Supprimer un enregistrement :

a Placez le curseur sur la ligne à supprimer.

b Cliquez sur le bouton Supprimer de la barre d’outils.

Les modifications n’interviennent qu’une fois appliquées. Pour appliquer les modifications et rendre les changements permanents,

1 Choisissez le bouton Valider dans la barre d’outils. Cela valide les modifications dans l’ensemble de données local uniquement (pas dans la base de données).

2 Cliquez sur le bouton Enregistrer les modifications pour les valider dans la base de données.

Utilisation du pilote de base de données pour l’administration de bases de données

Cette section propose une introduction à la création, au remplissage et à la suppression de tables en utilisant SQL. Ces tâches sont généralement réservées à un administrateur de bases de données, mais peuvent s’effectuer simplement en utilisant JBuilder.

Page 246: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d u p i l o t e d e b a s e d e d o n n é e s p o u r l ’ a d m i n i s t r a t i o n d e b a s e s d e d o n n é e s

Création de la source de données SQL

JBuilder est un environnement de développement d’application dans lequel vous créez des applications accédant aux données de bases de données, mais il ne propose pas d’option de menu permettant la création de tables de serveur SQL. C’est généralement une opération réservée à l’administrateur de bases de données. Il est néanmoins facile de créer des tables en utilisant SQL et le pilote de base de données.

Cette section ne prétend pas être un tutoriel du langage SQL mais indique simplement la manière d’utiliser des instructions SQL dans JBuilder. Pour davantage d’informations sur la syntaxe SQL, reportez-vous à l’un des nombreux livres traitant de ce sujet. En particulier A Guide to the SQL Standard de C.J. Date.

Remarque Sur de nombreux systèmes, l’administrateur de bases de données restreint les droits de création de tables aux utilisateurs autorisés. Si vous rencontrez des problèmes dans la création de tables, contactez-le pour vérifier si vos droits d’accès sont suffisants pour effectuer cette opération.

Pour créer une table simple, vous devez tout d’abord établir une connexion avec une URL de base de données. Si vous n’êtes pas familier avec cette opération, procédez comme suit :

1 Sélectionnez Outils|Pilote de base de données.

2 Dans le pilote de base de données, choisissez Fichier|Nouveau ou cliquez avec le bouton droit de la souris sur une URL existante et choisissez Nouveau dans le menu contextuel. La boîte de dialogue Nouvelle URL apparaît.

3 Sélectionnez un pilote dans la liste déroulante, ou entrez ses informations. Pour une présentation des différents types de pilotes, voir Pilotes de bases de données JDBC dans l’aide en ligne du pilote de base de données.

4 Naviguez vers l’URL désirée ou tapez-la. Le bouton Parcourir est activé lorsqu’un pilote de base de données reconnu par JBuilder est sélectionné dans le champ Pilote.

5 Cliquez sur OK pour fermer la boîte de dialogue.

6 Spécifiez le nom d’utilisateur et les autres propriétés souhaitées dans la page Définition du volet de droite.

7 Choisissez le bouton Appliquer dans la barre d’outils afin d’appliquer les paramètres de connexion.

Une fois une connexion établie, vous pouvez spécifier une instruction SQL à exécuter sur la base de données. Il y a deux moyens de le faire. Le premier passe par le dialogue Création d’une table.

Page 247: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-9

U t i l i s a t i o n d u p i l o t e d e b a s e d e d o n n é e s p o u r l ’ a d m i n i s t r a t i o n d e b a s e s d e d o n n é e s

Pour créer une table nommée mytable en utilisant le dialogue Création d’une table,

1 Sélectionnez Fichier|Créer une table, dans le pilote de base de données.

2 Tapez mytable dans le champ Nom de table.

3 Cliquez sur le bouton Insérer.

4 Tapez lastName dans la colonne Nom de colonne.

5 Sélectionnez VARCHAR comme valeur de la colonne Type de données.

6 Tapez 20 dans la colonne Précision.

7 Cliquez sur le bouton Ligne suivante. Une nouvelle ligne est créée.

8 Tapez firstName dans la colonne Nom de colonne.

9 Sélectionnez VARCHAR comme valeur de la colonne Type de données.

10 Tapez 20 dans la colonne Précision.

11 Cliquez sur le bouton Ligne suivante. Une nouvelle ligne est créée.

12 Tapez salary dans la colonne Nom de colonne.

13 Select NUMERIC comme valeur de la colonne Type de données.

14 Tapez 10 dans la colonne Précision.

15 Tapez 2 dans la colonne Echelle.

16 Cliquez sur le bouton Exécuter.

17 Remarquez qu’une instruction SQL a été créée pour vous dans la zone de texte SQL.

18 Cliquez sur OK. La table est créée dans la source de données actuellement ouverte.

Le deuxième moyen de créer une table est de spécifier une instruction SQL CREATE TABLE dans l’onglet Saisie SQL. Par exemple, pour créer une table nommée mytable2 dans la source de données à laquelle vous êtes connecté :

1 Cliquez sur l’onglet Saisie SQL dans le pilote de base de données.

2 Entrez ce qui suit dans la zone de saisie :

create table mytable2 (lastName char(20), firstName char(20), salary numeric(10,2) )

3 Cliquez sur le bouton Exécuter.

Page 248: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

U t i l i s a t i o n d u p i l o t e d e b a s e d e d o n n é e s p o u r l ’ a d m i n i s t r a t i o n d e b a s e s d e d o n n é e s

Ces étapes créent une table vide qui peut être utilisée dans une requête. Utilisez le pilote de base de données pour vérifier que la table a bien été créée. Vous devez voir :

• Une liste des tables de la source de données, y compris la nouvelle table (MYTABLE) que vous venez de créer.

• La liste des colonnes de la table sélectionnée. Sélectionnez MYTABLE, la liste des colonnes affiche FIRSTNAME, LASTNAME et SALARY.

Remplissage d’une table SQL en utilisant JBuilder

Une fois la table vide créée, il est facile de la remplir avec des données en utilisant le pilote de base de données ou en créant une application à l’aide des outils de conception visuelle de JBuilder. Sélectionnez la page Données pour afficher les données de la table, de la vue ou du synonyme sélectionné. Vous pouvez ajouter ou modifier des enregistrements de la table dans la page Données du pilote de base de données si la table autorise un accès en écriture et si la case Demander les requêtes dynamiques de la boîte de dialogue Voir|Options est cochée. La page Données affiche une table remplie avec les données de la table sélectionnée.

1 Suivez les étapes de la section “Création de la source de données SQL”, page 15-8.

2 Sélectionnez dans le volet gauche la table que vous venez de créer, puis sélectionnez la page Données dans le volet de droite. Une table remplie avec les données de la table sélectionnée apparaît dans le volet droit. Un contrôle barre d’outils est affiché au-dessus de la table afin de permettre le parcours et la modification des données.

3 Vous pouvez maintenant utiliser le pilote de base de données pour visualiser, ajouter, modifier ou supprimer les données des tables. Pour plus d’informations sur ces tâches, voir “Utilisation de l’explorateur pour visualiser ou modifier les données des tables”, page 15-6.

Suppression de tables dans JBuilder

Comme vous avez créé une ou plusieurs tables de test, il est nécessaire de savoir comment faire place nette et supprimer toutes ces tables de test. Suivez les étapes de la rubrique “Création de la source de données SQL”, page 15-8, en remplaçant l’instruction SQL par le texte suivant :

drop table mytable

Vous pouvez vérifier le bon fonctionnement de cette opération en constatant la disparition de la table dans le volet gauche du pilote de base de données.

Page 249: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-11

S u r v e i l l a n c e d e s c o n n e x i o n s a u x b a s e s d e d o n n é e s

Surveillance des connexions aux bases de donnéesJBuilder fournit une classe de surveillance JDBC qui peut suivre le trafic JDBC. JBuilder fournit une interface utilisateur, appelée par Outils|Moniteur JDBC, pour fonctionner avec cette classe à la conception. Pour plus d’informations sur l’utilisation de cette classe en mode exécution, voir “Utilisation du Moniteur JDBC dans une application en exécution”, page 15-12.

Le moniteur JDBC Monitor suivra tous les pilotes JDBC (c’est-à-dire toute sous-classe de java.sql.Driver ) utilisés par JBuilder. Le moniteur JDBC suit toutes les sorties directement depuis le pilote JDBC.

A propos du Moniteur JDBC

Pour démarrer le Moniteur JDBC, sélectionnez Outils|Moniteur JDBC. Le Moniteur JDBC apparaît :

Figure 15.3 Moniteur JDBC

Vous pouvez accomplir les actions suivantes dans le Moniteur JDBC :

• Choisissez le bouton Fermer dans la fenêtre du Moniteur JDBC pour fermer le Moniteur JDBC.

• Sélectionnez le texte dans la zone historique en le mettant en évidence avec la souris ou le clavier.

• Choisissez le bouton Enregistrer dans un fichier pour enregistrer dans un fichier le texte sélectionné (ou la totalité du texte si rien n’est sélectionné).

• Choisissez le bouton Effacer l’historique pour effacer le texte sélectionné (ou la totalité du texte si rien n’est sélectionné).

• Choisissez le bouton Activer la sortie historique pour activer/désactiver l’historique.

Page 250: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

S u r v e i l l a n c e d e s c o n n e x i o n s a u x b a s e s d e d o n n é e s

• Cliquez sur le bouton Taille de l’historique pour définir la quantité maximum d’informations à conserver dans l’historique (8 Ko par défaut).

• Ayant positionné le curseur dans la zone de texte, appuyez sur F1 ou sur le bouton Aide pour afficher l’aide du Moniteur JDBC. L’aide est disponible uniquement en mode conception.

Utilisation du Moniteur JDBC dans une application en exécution

Pour surveiller les connexions aux bases de données au cours de l’exécution, un MonitorButton ou un MonitorPanel doit être inclus dans l’application. MonitorButton est un bean Java qui vous permet d’exécuter le Moniteur JDBC sur une application en exécution. Pour cela, l’instance du Moniteur JDBC en utilisation doit être amenée par l’application. Une instance du Moniteur JDBC lancée depuis l’EDI ne pourra surveiller que les activités de la base pendant la conception. Cliquer sur le bouton Moniteur affiche une boîte de dialogue contenant le Moniteur JDBC.

Le MonitorPanel peut être utilisé pour placer le moniteur directement sur une fiche. Il a les mêmes propriétés que le MonitorButton.

Ajout du MonitorButton à la paletteVous pouvez placer le MonitorButton sur la palette des composants, en procédant comme suit :

1 Sélectionnez Outils|Configurer la palette.

2 Sélectionnez Data Express dans le champ Pages de l’onglet Pages.

3 Sélectionnez l’onglet Ajout de composants.

4 Sélectionnez JBCL dans le champ de sélection de la bibliothèque.

5 Sélectionnez la page de la palette sur laquelle vous voulez placer le MonitorPanel.

6 Choisissez Pas de filtrage.

7 Cliquez sur Ajouter depuis la bibliothèque sélectionnée.

8 Recherchez com.borland.jbcl.sql.monitor.MonitorButton.

9 Cliquez sur OK pour fermer le dialogue Recherche de classe.

10 Cliquez sur OK pour fermer le dialogue Propriétés de la palette.

Page 251: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

A d m i n i s t r a t i o n d ’ u n e b a s e d e d o n n é e s 15-13

S u r v e i l l a n c e d e s c o n n e x i o n s a u x b a s e s d e d o n n é e s

Utilisation de la classe MonitorButton dans le codeUne fois que le MonitorButton est sur la palette, il peut être placé dans votre application. Vous pourriez aussi ajouter une instance de MonitorButton dans le code, comme ceci :

MonitorButton monitorButton1 = new com.borland.jbcl.sql.monitor.MonitorButton();this.add(monitorButton1);

Propriétés de MonitorButtonLes propriétés suivantes sont disponibles pour le MonitorButton afin de contrôler l’état par défaut du moniteur :

Propriété Effet

outputEnabled Active ou désactive la surveillance du pilote.

maxLogSize Taille maximum de l’historique de suivi. La valeur par défaut est de 8 Ko.

Page 252: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

15-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 253: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-1

C h a p i t r e

16Chapitre16Tutoriel : Importation

et exportation des donnéesd’un fichier texte

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Ce tutoriel décrit la manière de fournir des données à une application en utilisant un composant TableDataSet et un fichier de données texte. Pour ce tutoriel, nous créerons manuellement le fichier texte, mais ce type de fichier peut être exporté depuis la majorité des bases de données bureautiques. Dans ce tutoriel, nous allons exécuter les tâches suivantes :

• Créer un projet JBuilder

• Créer un fichier de données texte simple

• Générer une application

• Ajouter des composants DataExpress pour accéder et stocker les données d’un fichier texte

• Ajouter des composants dbSwing pour créer l’interface utilisateur

• Ajouter un composant Swing JButton pour exporter les données

• Compiler et exécuter votre programme

• Utiliser des modèles pour exporter des champs numériques, date/heure et texte

Page 254: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 1 : C r é a t i o n d u p r o j e t

Une fois ce tutoriel achevé, l’application doit avoir l’aspect suivant :

Figure 16.1 Application d’importation/exportation

Vous pouvez consulter l’application complète en ouvrant le fichier projet exemple, TextFileImportExport.jpx qui se trouve dans <jbuilder>/samples/DataExpress/TextFileImportExport/. Les utilisateurs pour qui l’accès aux exemples de JBuilder est limité à la lecture doivent copier le répertoire samples dans un répertoire dont ils possèdent les droits de lecture et d’écriture.

La section Options d’accessibilité des Astuces JBuilder contient des conseils permettant de simplifier l’accès aux fonctionnalités de JBuilder, destinés en particulier aux personnes ayant des difficultés.

Pour plus d’informations sur les conventions de la documentation de ce tutoriel et des autres documents JBuilder, voir “Conventions de la documentation”, page 1-9.

Etape 1 : Création du projetPour développer votre application de base de données dans JBuilder, vous devez d’abord créer un nouveau projet. Pour ce faire,

1 Choisissez Fichier|Nouveau projet pour afficher l’expert projet.

2 Tapez TextFileImportExport dans le champ Nom.

3 Assurez-vous que l’option Créer le fichier de remarques du projet est cochée.

4 Cliquez sur le bouton Terminer pour fermer l’expert et créer le projet. Vous n’avez pas à modifier les valeurs par défaut des étapes 2 et 3 de l’expert.

Le fichier projet TextFileImportExport.jpx et le fichier HTML du projet sont affichés dans le volet projet.

Page 255: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-3

E t a p e 2 : C r é a t i o n d u f i c h i e r t e x t e

Etape 2 : Création du fichier texteNous allons créer un fichier de données texte simple pour importer les données qu’il contient dans votre application. Créez le fichier texte en suivant les étapes ci-dessous :

1 Créez un nouveau fichier texte, nommé ImportTest.txt, dans le répertoire contenant le fichier projet créé à l’étape précédente, TextFileImportExport.jpx.

Choisissez Fichier|Nouveau fichier pour ouvrir la boîte de dialogue de création d’un fichier. Dans le champ Nom, entrez ImportTest. Sélectionnez txt dans la liste déroulante Type. Vérifiez que le champ Répertoire est défini par le répertoire où se trouve TextFileImportExport.jpx.

2 Saisissez les trois lignes et deux colonnes (une colonne de valeurs entières et une colonne de valeurs chaîne) de données suivantes dans le nouveau fichier texte.

Appuyez sur Entrée à la fin de chaque ligne. Vous devez saisir les données 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 boîte de dialogue Ajout de fichiers ou paquets au projet, naviguez jusqu’au répertoire contenant le fichier, sélectionnez-le et cliquez sur OK pour l’ajouter à votre projet.

Etape 3 : Génération d’une applicationL’expert application crée les fichiers source Java qui seront ajoutés au projet que vous venez de créer.

Pour générer les fichiers source de votre application en utilisant l’expert application, procédez comme suit :

1 Choisissez Fichier|Nouveau pour ouvrir la galerie d’objets.

2 Sélectionnez l’onglet Général et double-cliquez sur l’icône Application pour ouvrir l’expert application.

3 Acceptez les valeurs par défaut de l’étape 1 de l’expert application et cliquez sur Terminer.

Page 256: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 4 : A j o u t d e c o m p o s a n t s D a t a E x p r e s s à v o t r e a p p l i c a t i o n

Les nouveaux fichiers source Java sont ajoutés à votre projet et affichés en tant que nœuds 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.

Etape 4 : Ajout de composants DataExpress à votre applicationLe concepteur d’interface utilisateur est utilisé pour ajouter les composants DataExpress à Cadre1.java.

1 Sélectionnez l’onglet Conception pour le fichier Cadre1.java dans le volet contenu.

2 Sélectionnez un composant TextDataFile de la page Data Express de la palette des composants, cliquez dans l’arborescence des composants ou dans le concepteur d’interface utilisateur pour ajouter le composant à votre application.

Le nouveau composant TextDataFile, textDataFile1, apparaît dans le volet structure sous la forme d’un nœud de l’arborescence des composants.

3 Sélectionnez les propriétés suivantes dans l’inspecteur et définissez leurs valeurs comme indiqué :

Pour définir la propriété fileName, sélectionnez le champ à droite du nom de la propriété, et cliquez sur bouton points de suspension (...) pour ouvrir la boîte de dialogue FileName. Cliquez sur le bouton points de suspension (...) dans la boîte de dialogue FileName, naviguez jusqu’au fichier ImportTest.txt, sélectionnez-le et cliquez sur Ouvrir. Cliquez sur OK pour fermer la boîte de dialogue FileName.

Pour un fichier texte, le délimiteur est le caractère servant à définir le début et la fin d’un champ chaîne. Par défaut, le guillemet est utilisé comme délimiteur des types de données chaîne. Pour ce tutoriel, il n’est pas nécessaire d’effectuer de modification.

Pour un fichier texte, le séparateur (separator) est le caractère servant à séparer les différentes valeurs des colonnes. Par défaut, la tabulation (/t) est utilisée comme séparateur. Pour cet exemple, le séparateur est

Nom de la propriété Valeur

delimiter “ (guillemet)

separator , (virgule)

fileName <chemin_fichier_données_texte> (le chemin d’accès à ImportTest.txt, y compris le nom du fichier)

Page 257: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-5

E t a p e 4 : A j o u t d e c o m p o s a n t s D a t a E x p r e s s à v o t r e a p p l i c a t i o n

une virgule (,). Selon le fichier que vous importez, modifiez ces propriétés en conséquence.

Spécifiez le nom de fichier et le chemin d’accès complet pour le champ fileName.

4 Sélectionnez un composant TableDataSet de la page Data Express de la palette des composants, cliquez dans l’arborescence des composants ou dans le concepteur d’interface utilisateur pour ajouter le composant à votre application.

5 Sélectionnez le composant et initialisez sa propriété dataFile en lui affectant la valeur textDataFile1.

6 Ajoutez des colonnes au composant TableDataSet.

Ce tutoriel décrit la manière d’ajouter des colonnes à l’ensemble de données en utilisant le concepteur d’interface utilisateur. Pour ajouter des colonnes en utilisant l’éditeur, voir “Ajout de colonnes à un TableDataSet en utilisant l’éditeur”, page 3-2. Si vous avez achevé le tutoriel précédent, JBuilder a créé un fichier SCHEMA (.schema) donnant une définition des colonnes lors de l’ouverture du fichier et il n’est donc pas nécessaire d’ajouter manuellement les colonnes.

a Cliquez sur l’icône d’extension à gauche du composant TableDataSet afin d’afficher les colonnes existantes.

En ce cas, il n’existe pas de colonne.

b Sélectionnez <nouvelle colonne> et définissez dans l’inspecteur les propriétés suivantes pour la nouvelle colonne :

c Sélectionnez à nouveau <nouvelle colonne> et définissez dans l’inspecteur les propriétés suivantes pour la seconde colonne :

7 Choisissez Fichier|Tout enregistrer pour enregistrer les fichiers source et le fichier projet.

Nom de la propriété Valeur

dataType SHORT

caption my_number

columnName my_number

Nom de la propriété Valeur

dataType STRING

caption my_string

columnName my_string

Page 258: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 5 : A j o u t d e c o m p o s a n t s d b S w i n g p o u r c r é e r l ’ i n t e r f a c e u t i l i s a t e u r

Les composants fondamentaux permettant d’extraire et de stocker les données de votre fichier texte sont en place. Nous allons maintenant créer l’interface utilisateur pour afficher et modifier ces données.

Etape 5 : Ajout de composants dbSwing pour créer l’interface utilisateur

Vous êtes maintenant prêt à créer une interface utilisateur pour votre application de base de données. Le moyen le plus rapide de le faire est d’utiliser les composants dbSwing dans le concepteur d’interface utilisateur.

Remarque Lors de la définition d’une interface utilisateur, la première étape consiste normalement à choisir une disposition appropriée à l’application (comment seront visuellement arrangés les composants et quel gestionnaire de disposition Java vous utiliserez pour contrôler ces positions.) Mais, apprendre à utiliser les gestionnaires de disposition Java est en soit une tâche ardue. Donc, pour laisser ce tutoriel axé sur la création d’une application de base de données, nous utiliserons la disposition par défaut (BorderLayout) et contrôlerons la position des composants en définissant leur propriété constraints.

Pour plus d’informations sur l’utilisation des dispositions, voir les rubriques “Utilisation du concepteur” et “Utilisation des gestionnaires de disposition” dans Conception d’applications avec JBuilder.

Les étapes ci-après ajoutent à l’application les composants d’interface utilisateur suivants à partir de l’onglet dbSwing de la palette de composants :

• JdbTable (et conteneur), utilisé pour afficher des données bi-dimensionnelles dans un format de type feuille de calcul.

• JdbNavToolBar, un ensemble de boutons pour vous aider à naviguer dans les données affichées JdbTable. Il vous permet de naviguer rapidement dans l’ensemble de données lorsque l’application est exécutée.

• JdbStatusLabel, qui affiche des informations sur l’enregistrement ou l’opération en cours et les messages d’erreur.

Vous ajouterez ces composants à contentPane (BorderLayout), qui est un JPanel, et le conteneur principal de l’interface utilisateur, dans lequel vous allez disposer les composants visuels.

1 Sélectionnez la page dbSwing de la palette de composants dans le concepteur d’interface utilisateur.

Page 259: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-7

E t a p e 5 : A j o u t d e c o m p o s a n t s d b S w i n g p o u r c r é e r l ’ i n t e r f a c e u t i l i s a t e u r

2 Sélectionnez le composant JdbNavToolBar et cliquez sur la zone centrale proche du bord supérieur du panneau dans le concepteur d’interface utilisateur.

Une instance de JdbNavToolBar, appelée jdbNavToolBar1, est ajoutée au panneau et apparaît dans l’arborescence des composants. Par défaut, le composant JdbNavToolBar détecte automatiquement les autres composants orientés données du même conteneur racine (tels que JFrame), et se déplace dans l’ensemble de données du composant ayant actuellement la focalisation. Vous n’avez donc pas besoin de définir la propriété constraints de jdbNavToolBar1 dans l’inspecteur.

jdbNavToolBar1 est désormais le composant sélectionné, et s’étend le long du bord supérieur du panneau. Ne vous inquiétez pas s’il est placé dans un endroit différent que celui attendu. Le gestionnaire de disposition détermine l’emplacement en fonction de l’endroit où vous cliquez. Si vous êtes trop près de la gauche, de la droite ou du centre du panneau, il peut croire que vous voulez placer le composant ailleurs. Vous le corrigerez à l’étape suivante.

3 Regardez la propriété constraints de jdbNavToolBar1 dans l’inspecteur.

Sa valeur doit être NORTH. Si ce n’est pas le cas, cliquez une fois sur cette valeur pour afficher une liste déroulante, et sélectionnez North dans la liste.

4 Sélectionnez le composant JdbNavToolBar et cliquez sur la zone centrale proche du bord supérieur du panneau dans le concepteur d’interface utilisateur.

Une instance de JdbStatusLabel, appelée jdbStatusLabel1, est ajoutée au panneau et apparaît dans l’arborescence des composants. La propriété constraints de jdbStatusLabel1 doit avoir la valeur SOUTH. Si ce n’est pas le cas, changez-la dans l’inspecteur. jdbStatusLabel1 s’attache automatiquement au DataSet qui détient la focalisation.

5 Sélectionnez un composant TableScrollPane dans la page dbSwing de la palette de composants, puis cliquez au centre du panneau dans le concepteur d’interface utilisateur pour ajouter le composant à votre application.

Le composant TableScrollPane, tableScrollPane1, apparaît dans le volet structure sous la forme d’un nœud de l’arborescence des composants.

6 Sélectionnez un composant JdbTable de la page dbSwing de la palette des composants, cliquez dans l’arborescence des composants ou dans le concepteur d’interface utilisateur pour ajouter le composant à votre application.

Le composant JdbTable, jdbTable1, apparaît dans le volet structure sous la forme d’un nœud de l’arborescence des composants, sous tableScrollPane1.

Page 260: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 6 : A j o u t d ’ u n c o m p o s a n t S w i n g J B u t t o n

7 Donnez la valeur tableDataSet1 à la propriété dataSet du jdbTable1.

Lorsque vous définissez la propriété dataSet du jdbTable1 par tableDataSet1, les données du fichier texte apparaissent dans le concepteur d’interface utilisateur :

Une boîte de dialogue d’erreur est affichée si vous n’avez pas spécifié le fichier de données correct ou si les colonnes n’ont pas bien été définies. Si vous n’instanciez pas de composant visuel pour afficher les données, il faut ouvrir explicitement le fichier dans le code source pour accéder aux données.

8 Choisissez Exécuter|Exécuter le projet pour compiler et exécuter l’application.

L’application en train de s’exécuter ressemble à ceci :

Figure 16.2 Importer/Exporter une application à l’exécution

9 Fermez l’application exécutée.

Quand cette application est exécutée, les données du fichier texte sont chargées dans le TableDataSet et affichées dans le composant table visuel qui lui est associé. Vous pouvez alors visualiser les données, les modifier, ajouter ou supprimer des données de l’ensemble de données. Un composant TableDataSet peut être utilisé comme table maître ou comme table détail dans une relation maître-détail. Pour enregistrer les modifications dans le fichier texte, vous devez y exporter les données. Pour plus d’informations sur l’exportation, voir “Exportation des données”, page 3-3.

Etape 6 : Ajout d’un composant Swing JButtonLe composant Swing JButton servira à exporter les données lors de l’exécution de l’application. L’exportation de données, ou l’enregistrement de données dans un fichier texte, enregistre toutes les données de la vue en cours dans un fichier texte, en remplaçant les données existantes. Dans

Page 261: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-9

E t a p e 6 : A j o u t d ’ u n c o m p o s a n t S w i n g J B u t t o n

ce tutoriel, nous effectuerons la résolution des données depuis un TableDataSet dans le fichier texte utilisé au départ pour importer les données. Quand des données sont exportées dans un fichier texte, toutes les données de la vue en cours sont écrites dans un fichier texte et les informations d’état des lignes ne sont pas modifiées.

1 Sélectionnez l’onglet Conception du volet contenu.

2 Sélectionnez contentPane (BorderLayout) dans le volet contenu. Modifiez sa propriété layout en null dans l’inspecteur.

3 Sélectionnez tableScrollPane1 dans l’arborescence des composants. Sélectionnez la poignée supérieure du composant dans le concepteur d’interface utilisateur, et redimensionnez-le pour laisser la place d’ajouter un bouton.

Voir la capture d’écran de l’application exécutée plus loin dans ce tutoriel pour connaître le placement général des composants.

4 Ajoutez un composant JButton depuis l’onglet Swing dans le concepteur d’interface utilisateur. Sur la page Propriétés de l’inspecteur, définissez la propriété text de ce composant JButton par Enregistrer les modifications.

5 Cliquez l’onglet Evénements de l’inspecteur et sélectionnez la méthode actionPerformed() puis double-cliquez dessus.

Cela fait passer la focalisation dans l’AppBrowser de l’onglet Conception à l’onglet Source et affiche dans le code source le squelette de la méthode actionPerformed().

Ajoutez le code suivant à la méthode actionPerformed() :

try { tableDataSet1.getDataFile().save(tableDataSet1); System.out.println("Modifications enregistrées");}catch (Exception ex) { System.out.println("Modifications NON enregistrées"); System.err.println("Exception: " + ex);}

Page 262: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 7 : C o m p i l a t i o n e t e x é c u t i o n d e v o t r e a p p l i c a t i o n

Figure 16.3 Application d’importation/exportation avec un JButton

6 Choisissez Fichier|Tout enregistrer pour enregistrer les fichiers source et le fichier projet.

Etape 7 : Compilation et exécution de votre applicationLorsque vous compilez et exécutez votre application, elle affiche un bouton Enregistrer les modifications servant à exporter les données. Quand vous exportez les données d’un TableDataSet dans un fichier texte, JBuilder crée un fichier SCHEMA (.schema) qui définit les colonnes par nom et par type de donnée. La prochaine fois que vous importerez les données dans JBuilder, il ne sera pas nécessaire de définir les colonnes, puisque ces informations seront déjà spécifiées dans le fichier SCHEMA.

1 Exécutez l’application en choisissant Exécuter|Exécuter le projet.

Quand vous exécutez l’application, l’application apparaît dans sa propre fenêtre. Les données sont affichées dans une table avec un bouton Enregistrer les modifications.

Page 263: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-11

E t a p e 7 : C o m p i l a t i o n e t e x é c u t i o n d e v o t r e a p p l i c a t i o n

Figure 16.4 Exportation de données vers un fichier texte lors de l’exécution de l’application

2 L’application s’exécutant, sélectionnez le champ chaîne du premier enregistrement de la fenêtre Cadre 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 qu’il contient désormais les données suivantes :

1,"Apple"2,"B"3,"C"

5 Fermez le fichier texte.

JBuilder crée automatiquement un fichier SCHEMA afin de définir le contenu du fichier texte.

6 Visualisez le fichier SCHEMA dans un éditeur de texte. Remarquez que ce fichier contient des informations sur les noms des champs exportés et le type des données exportées dans ce champ. Il ressemble à ceci :

[]FILETYPE = VARYINGFILEFORMAT = EncodedENCODING = Cp1252DELIMITER = "SEPARATOR = ,FIELD0 = my_number,Variant.SHORT,-1,-1,FIELD1 = my_string,Variant.STRING,-1,-1,

7 Fermez le fichier SCHEMA.

Vous pouvez continuer à modifier, insérer, supprimer et enregistrer des données jusqu’à la fermeture de l’application, mais vous devez cliquer sur le bouton Enregistrer les modifications pour réécrire les modifications dans le fichier texte. Lorsque vous enregistrez les modifications, le fichier existant est remplacé par les données de la vue en cours.

Page 264: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 8 : U t i l i s a t i o n d e m o d è l e p o u r l ’ e x p o r t a t i o n d e c h a m p s n u m é r i q u e s , d a t e / h e u r e

Etape 8 : Utilisation de modèle pour l’exportation de champs numériques, date/heure et texte

Par défaut, JBuilder attend la saisie de données et exporte les données des champs date, heure et monétaire en fonction de la propriété locale de la colonne. Vous pouvez utiliser la propriété exportDisplayMask pour lire ou enregistrer les champs date, heure ou numériques en utilisant un modèle différent. Les étapes suivantes illustrent la création d’un objet exportDisplayMask pour une nouvelle colonne de type DATE.

1 Sélectionnez Cadre1.java dans le volet contenu, puis sélectionnez l’onglet Conception. Développez tableDataSet1 dans l’arborescence des composants en cliquant sur l’icône d’extension à sa gauche. Sélectionnez <nouvelle colonne>, puis modifiez les propriétés de la colonne dans l’inspecteur de la manière suivante :

• dataType en DATE

• caption et columnName en my_date

2 Exécutez l’application. Dans la fenêtre de l’application en cours d’exécution, entrez une date dans la colonne my_date de la première ligne. Par défaut, 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 données suivantes :

1,"Apple",1995-11-162,"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 = VARYINGFILEFORMAT = EncodedENCODING = Cp1252DELIMITER = "SEPARATOR = ,FIELD0 = my_number,Variant.SHORT,-1,-1,FIELD1 = my_string,Variant.STRING,-1,-1,FIELD2 = my_date,Variant.DATE,-1,-1,

6 Fermez le fichier SCHEMA.

Page 265: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : I m p o r t a t i o n e t e x p o r t a t i o n d e s d o n n é e s d ’ u n f i c h i e r t e x t e 16-13

E t a p e 8 : U t i l i s a t i o n d e m o d è l e p o u r l ’ e x p o r t a t i o n d e c h a m p s n u m é r i q u e s , d a t e / h e u r e

Les étapes suivantes montrent ce qui se passe lorsque vous modifiez le modèle date, éditez les données et enregistrez à nouveau les modifications.

1 Fermez l’application exécutée et le fichier texte et revenez au concepteur d’interface utilisateur de JBuilder. Sélectionnez la colonne my_date et entrez le modèle suivant pour la propriété exportDisplayMask dans l’inspecteur : MM-jj-aaaa. La syntaxe des modèles est définie dans “Modèles à base de chaîne (masques)” dans la Référence de la bibliothèque de composants DataExpress. Ce type de modèle va écrire le champ date sous la forme suivante : 11-16-1995.

2 L’application produit maintenant une erreur si vous tentez de l’exécuter car le format de données dans le fichier texte ne correspond pas à celui que l’application tente d’utiliser. Modifiez manuellement le fichier texte et supprimez la valeur ",11/16/95" de la première ligne.

Au lieu d’utiliser l’étape ci-dessus, vous pouvez entrer manuellement du code établissant un exportDisplayMask pour l’importation de données et un autre exportDisplayMask pour l’exportation de données.

3 Exécutez l’application, entrez une date, comme 16/11/1995, dans la colonne my_date de la première 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 données suivantes :

1,"Apple",11-16-19952,"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 définition du champ. Lorsque le format par défaut est utilisé, cette valeur est vide puisqu’il se trouve dans la définition FIELD0. Il ressemble à ceci :

[]FILETYPE = VARYINGFILEFORMAT = EncodedENCODING = Cp1252DELIMITER = "SEPARATOR = ,FIELD0 = my_number,Variant.SHORT,-1,-1,FIELD1 = my_string,Variant.STRING,-1,-1,FIELD2 = my_date,Variant.DATE,-1,-1,MM-dd-yyyy

7 Fermez le fichier SCHEMA.

Page 266: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

16-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 8 : U t i l i s a t i o n d e m o d è l e p o u r l ’ e x p o r t a t i o n d e c h a m p s n u m é r i q u e s , d a t e / h e u r e

A la prochaine importation du fichier de données texte, les données sont importées en utilisant les informations du fichier SCHEMA. Pour visualiser les données dans une table en utilisant un modèle différent, utilisez la propriété displayMask. Pour éditer les données en utilisant un autre modèle, définissez la propriété editMask. Ces propriétés affectent uniquement la visualisation et la modification des données et pas la manière dont elles sont enregistrées. Par exemple, pour saisir des données dans un champ monétaire sans avoir à saisir le symbole monétaire à chaque fois, utilisez un displayMask qui utilise le symbole monétaire et un editMask ne contenant pas de symbole monétaire. En initialisant la propriété exportDisplayMask, vous pouvez choisir d’enregistrer les données dans le fichier texte en utilisant ou pas le symbole monétaire.

Page 267: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-1

C h a p i t r e

17Chapitre17Tutoriel : Création

d’une application de basede données élémentaire

Le développementd’applications de bases

de données est unefonctionnalité de JBuilder

Entreprise.

Ce tutoriel explique comment développer une application de base de données en utilisant les composants DataExpress et les outils de conception JBuilder. Quand c’est nécessaire, le code généré par les outils de conception sera modifié pour proposer des comportements personnalisés.

Cette application illustre les fonctionnalités suivantes :

• La connexion à la base de données exemple JDataStore, employee.jds, en utilisant des composants Database et QueryDataSet. (Voir le Chapitre 4, “Connexion à une base de données”, et “Interrogation d’une base de données”, page 5-2.)

• Elle contient un contrôle JdbTable qui affiche les données et illustre les caractéristiques suivantes :

• Les colonnes persistantes. Ce sont des colonnes dont les informations de structure (normalement obtenues du serveur) sont spécifiées dans les propriétés de la colonne. Cette façon de procéder permet d’améliorer les performances et assure la persistance des propriétés de colonne. Pour davantage d’informations, voir “Colonnes persistantes”, page 7-8. Dans le concepteur, double-cliquez sur l’ensemble de données pour ouvrir le concepteur de colonne et voir davantage d’informations sur chaque colonne.

• Le formatage des données affichées dans JdbTable à l’aide de masques d’affichage (la colonne HIRE_DATE). (Voir “Ajout de

Page 268: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e

modèles d’affichage ou de modification pour formater les données”, page 12-16.)

• La modification de données contrôlée par des masques de saisie (la colonne HIRE_DATE). (Voir “Ajout de modèles d’affichage ou de modification pour formater les données”, page 12-16.)

• Les champs calculés et récapitulatifs qui obtiennent leur valeur du résultat de l’évaluation d’une expression (les colonnes NEW_SALARY, ORG_TOTAL, NEW_TOTAL, DIFF_SALARY et DIFF_TOTAL). (Voir “Utilisation de colonnes calculées”, page 12-8.)

• Elle inclut un contrôle JdbStatusLabel qui affiche des informations de navigation, des messages de validation des données, etc. Les messages sont écrits dans le contrôle JdbStatusLabel lorsque cela est approprié ou lorsque une instruction du programme le commande. (Voir “Affichage d’informations d’état”, page 13-3.)

• Un contrôle JdbNavToolBar est affiché pour parcourir aisément les données affichées dans la table.

• Elle permet de trouver des données de manière interactive en utilisant un contrôle JdbNavField incorporé dans JdbNavToolBar. Pour plus d’informations sur la localisation des données, voir “Recherche de données”, page 11-14.

• Elle utilise un DBDisposeMonitor pour fermer automatiquement la connexion à la base de données lorsque le cadre est fermé.

• L’application résout les modifications apportées aux données du QueryDataSet en utilisant le comportement par défaut de résolution. (Voir “Explication de la résolution par défaut”, page 8-18.) Le bouton Enregistrer de JdbNavToolBar effectue l’enregistrement. Les messages relatifs au processus de résolution sont affichés dans le contrôle JdbStatusLabel.

Dans ce tutoriel, nous allons exécuter les tâches suivantes :

• Créer un projet JBuilder

• Générer une application

• Ajouter des composants DataExpress pour accéder aux données d’une base

• Concevoir les colonnes de l’application

• Ajouter des composants dbSwing pour créer l’interface utilisateur

• Agréger des données avec des champs calculés

Page 269: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-3

E t a p e 1 : C r é a t i o n d u p r o j e t

Une fois ce tutoriel achevé, l’application doit avoir l’aspect suivant :

Figure 17.1 Application de base de données élémentaire

Vous pouvez consulter l’application complète en ouvrant le fichier projet exemple, BasicApp.jpx, qui se trouve dans <jbuilder>/samples/DataExpress/BasicApp/. Il existe des différences mineures entre l’application créée dans ce tutoriel et l’application exemple fournie. Les utilisateurs pour qui l’accès aux exemples de JBuilder est limité à la lecture doivent copier le répertoire samples dans un répertoire dont ils possèdent les droits de lecture et d’écriture.

La section Options d’accessibilité des Astuces JBuilder contient des conseils permettant de simplifier l’accès aux fonctionnalités de JBuilder, destinés en particulier aux personnes ayant des difficultés.

Pour plus d’informations sur les conventions de la documentation de ce tutoriel et des autres documents JBuilder, voir “Conventions de la documentation”, page 1-9.

Etape 1 : Création du projetPour développer votre application de base de données dans JBuilder, vous devez d’abord créer un nouveau projet. Pour ce faire,

1 Sélectionnez Fichier|Nouveau projet pour afficher l’expert projet.

2 Tapez BasicApp dans le champ Nom.

Page 270: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 2 : G é n é r a t i o n d ’ u n e a p p l i c a t i o n

3 Cliquez sur le bouton Terminer pour fermer l’expert et créer le projet. Vous n’avez pas à modifier les valeurs par défaut des étapes 2 et 3 de l’expert.

Le fichier projet BasicApp.jpx est ouvert dans le volet projet.

Etape 2 : Génération d’une applicationL’expert application crée les fichiers source .java qui seront ajoutés au projet que vous venez de créer.

Pour générer les fichiers source de votre application en utilisant l’expert application, procédez comme suit :

1 Choisissez Fichier|Nouveau pour ouvrir la galerie d’objets.

2 Sélectionnez l’onglet Général et double-cliquez sur l’icône Application pour ouvrir l’expert application.

3 A l’étape 1 de l’expert application, acceptez le nom de paquet par défaut, basicapp, tapez BasicApp dans le champ Nom de classe et cliquez sur Suivant.

Remarque Le nom du paquet utilisé dans ce tutoriel, basicapp, n’est pas le même que celui qui est utilisé par l’application exemple, com.borland.samples.dx.basicapp mais, hormis cela, les applications sont les mêmes.

4 A l’étape 2 de l’expert application, tapez BasicAppFrame dans le champ Classe, tapez Exemple d’application de base de données élémentaire dans le champ Titre et cliquez sur Terminer.

Les nouveaux fichiers source Java sont ajoutés à votre projet et affichés en tant que nœuds 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.

Etape 3 : Ajout de composants DataExpress à votre applicationLe concepteur d’interface utilisateur est utilisé pour ajouter les composants DataExpress à BasicAppFrame.java. Vous ajouterez les composants DataExpress suivants à votre application :

• Base de données• QueryDataSet• DBDisposeMonitor

Page 271: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-5

E t a p e 3 : A j o u t d e c o m p o s a n t s D a t a E x p r e s s à v o t r e a p p l i c a t i o n

Ces composants apportent la structure base de données sous-jacente à votre application.

1 Sélectionnez l’onglet Conception pour BasicAppFrame.java dans le volet Contenu afin d’activer le concepteur d’interface utilisateur.

La palette de composants apparaît en haut du concepteur d’interface utilisateur.

2 Cliquez sur le composant Database de l’onglet DataExpress de la palette des composants, puis cliquez dans l’arborescence des composants ou le concepteur d’interface utilisateur pour ajouter le composant à l’application.

Le nouveau composant Database, database1, s’affiche sous le nœud Accès aux données dans le volet structure, et la ligne de code suivante est ajoutée à la classe Frame :

Database database1 = new Database();

3 Sélectionnez le composant database1 dans le volet structure, sélectionnez la propriété connection dans l’inspecteur et cliquez sur le bouton Points de suspension (...) pour ouvrir la boîte de dialogue Connection.

4 Définissez les propriétés de connexion pour la table employee du JDataStore exemple, en utilisant la valeur des champs du tableau suivant.

L’URL de connexion pointe sur le fichier employee.jds dans un sous-répertoire dépendant du répertoire où est installé JBuilder, <jbuilder>.

La boîte de dialogue Connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vérifier que les propriétés de connexion sont correctement définies. Le résultat de la tentative de connexion est affiché dans la zone d’état. Quand la connexion réussit, cliquez sur OK. Si la connexion échoue, vérifiez que vous avez bien suivi toutes les étapes du Chapitre 4, “Connexion à une base de données”.

5 Ajoutez un composant QueryDataSet au concepteur en cliquant sur le composant QueryDataSet de l’onglet DataExpress puis en cliquant dans l’arborescence des composants ou dans l’interface utilisateur.

Nom de la propriété Valeur

Driver com.borland.datastore.jdbc.DataStoreDriver

URL Naviguez jusqu’à votre copie locale de <jbuilder>/samples/JDataStore/datastores/employee.jds

Username Entrez votre nom

Password non obligatoire

Page 272: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 3 : A j o u t d e c o m p o s a n t s D a t a E x p r e s s à v o t r e a p p l i c a t i o n

Dans l’inspecteur, sélectionnez la propriété query du composant QueryDataSet, cliquez sur les points de suspension pour ouvrir la boîte de dialogue Query et définissez les propriétés de la manière suivante :

L’Instruction SQL sera automatiquement exécutée sur la base de données spécifiée dès l’ouverture du QueryDataSet.

6 Cliquez sur Tester la requête pour vérifier qu’elle peut être exécutée.

La boîte de dialogue Query doit ressembler à ce qui suit pour que la requête soit réussie.

Figure 17.2 Boîte de dialogue Query

Si la boîte de dialogue Query indique Echec, recherchez des erreurs de frappe ou des oublis dans les informations saisies pour la requête.

7 Cliquez sur OK pour fermer la boîte de dialogue Query.

8 Ajoutez un composant DBDisposeMonitor de la page dbSwing supplémentaires.

Le DBDisposeMonitor fermera le JDataStore lorsque la fenêtre sera fermée.

9 Définissez la propriété dataAwareComponentContainer du DBDisposeMonitor par this.

10 Développez le nœud queryDataSet1 dans le volet structure.

Nom de la propriété Valeur

Database database1

Instruction SQL SELECT EMP_NO, FULL_NAME, HIRE_DATE, DEPT_NO, JOB_COUNTRY, SALARY FROM EMPLOYEE

Page 273: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-7

E t a p e 4 : C o n c e p t i o n d e s c o l o n n e s d e l ’ a p p l i c a t i o n

Figure 17.3 Nœud queryDataSet1 développé

Les colonnes sélectionnées dans la base de données JDataStore des employés, employee.jds, sont affichées dans le nœud queryDataSet1.

Les composants fondamentaux permettant d’extraire et de stocker les données issues de la base de données Employee sont en place. Nous allons maintenant créer l’interface utilisateur pour afficher et modifier ces données.

Etape 4 : Conception des colonnes de l’applicationAvant d’ajouter une interface utilisateur à l’application, nous allons :

• Ajouter de nouvelles colonnes et modifier les colonnes existantes

• Spécifier les calculs des colonnes calculées

Ajout de colonnes et modification des propriétés des colonnes

1 Développez le nœud queryDataSet1 dans le volet structure et double-cliquez sur <nouvelle colonne> pour ajouter une nouvelle colonne.

Cela ouvre le concepteur de colonne dans le volet contenu et charge les propriétés de la nouvelle colonne dans l’inspecteur.

2 Dans l’inspecteur, changez la valeur de la propriété columnName de NouvelleColonne1 en NEW_SALARY.

Page 274: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 4 : C o n c e p t i o n d e s c o l o n n e s d e l ’ a p p l i c a t i o n

3 Cliquez sur le bouton Insérer une colonne pour ajouter quatre colonnes supplémentaires dont les valeurs de la propriété columnName sont les suivantes :

• DIFF_SALARY• ORIG_TOTAL• NEW_TOTAL• DIFF_TOTAL

4 Définissez les propriétés de ces colonnes comme indiqué dans le tableau suivant :

La modification des propriétés d’une colonne rend celle-ci persistante. Quand une colonne devient persistante, des crochets ([ ]) sont placés autour du nom de la colonne dans le volet structure.

Colonne Nom de la propriété Valeur

HIRE_DATE caption Date d’embauche

HIRE_DATE displayMask MM-jj-aa

HIRE_DATE editMask MM-jj-aaaa

NEW_SALARY caption NEW_SALARY

NEW_SALARY calcType calculated

NEW_SALARY dataType BIGDECIMAL

NEW_SALARY visible FALSE

EMP_NO caption No employé

FULL_NAME caption Nom

FULL_NAME width 16

DEPT_NO caption Dépt.

JOB_COUNTRY caption Pays

JOB_COUNTRY width 15

SALARY caption Salaire

ORIG_TOTAL calcType aggregated

ORIG_TOTAL caption ORIG_TOTAL

ORIG_TOTAL dataType BIGDECIMAL

NEW_TOTAL calcType aggregated

NEW_TOTAL caption Nouveau total

NEW_TOTAL dataType BIGDECIMAL

DIFF_SALARY calcType calculated

DIFF_SALARY caption DIFF_SALARY

DIFF_SALARY dataType BIGDECIMAL

DIFF_TOTAL calcType aggregated

DIFF_TOTAL caption Total diff.

DIFF_TOTAL dataType BIGDECIMAL

Page 275: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-9

E t a p e 4 : C o n c e p t i o n d e s c o l o n n e s d e l ’ a p p l i c a t i o n

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

Spécification des calculs des colonnes calculées

Les colonnes NEW_SALARY et DIFF_SALARY sont des colonnes calculées. Dans ce tutoriel, chaque employé obtient une augmentation de 10 %. Le calcul ajoute les données SALARY existantes au produit des données SALARY existantes par 0,10. La valeur résultante est placée dans la colonne NEW_SALARY. DIFF_SALARY est calculée en soustrayant la valeur existante de SALARY de NEW_SALARY.

Pour ajouter le calcul,

1 Sélectionnez le nœud queryDataSet1 dans le volet structure, sélectionnez l’onglet Evénements de l’inspecteur et double-cliquez sur le gestionnaire d’événement calcFields.

Cela crée le stub de la méthode de l’événement dans BasicAppFrame.java et affiche son code source dans le volet contenu.

2 Ajoutez l’instruction suivante aux instructions import existantes dans BasicAppFrame.java pour importer la classe java.math.BigDecimal nécessaire au type de données BIGDECIMAL choisi pour les colonnes calculées.

import java.math.BigDecimal;

3 Modifiez la méthode d’événement afin de calculer les valeurs de NEW_SALARY et de DIFF_SALARY, de la manière 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));}

Page 276: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 5 : A j o u t d e c o m p o s a n t s d b S w i n g p o u r c r é e r l ’ i n t e r f a c e u t i l i s a t e u r

Cette méthode est appelée pour calcFields chaque fois qu’une valeur de champ est enregistrée et chaque fois qu’une ligne est validée. Cet événement reçoit une donnée représentant 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 booléen (isPosted) indiquant si la ligne est validée ou pas dans DataSet. Vous pouvez ne pas recalculer les champs pour les lignes qui n’ont pas encore été validées.

Certaines des colonnes ajoutées par cette étape sont des colonnes agrégées (ou statistiques). Nous nous occuperons de ces colonnes ultérieurement. Ajoutons plutôt une interface utilisateur de façon à voir à quoi ressemble l’application.

Etape 5 : Ajout de composants dbSwing pour créer l’interface utilisateur

Vous êtes maintenant prêt à créer une interface utilisateur pour votre application de base de données. Le moyen le plus rapide de le faire est d’utiliser les composants dbSwing dans le concepteur d’interface utilisateur.

Remarque Lors de la définition d’une interface utilisateur, la première étape consiste normalement à choisir une disposition appropriée à l’application (comment seront visuellement arrangés les composants et quel gestionnaire de disposition Java vous utiliserez pour contrôler ces positions.) Mais, apprendre à utiliser les gestionnaires de disposition Java est en soit une tâche ardue. Donc, pour laisser ce tutoriel axé sur la création d’une application de base de données, nous utiliserons la disposition par défaut (BorderLayout) et contrôlerons la position des composants en définissant leur propriété constraints.

Pour plus d’informations sur l’utilisation des dispositions, voir les rubriques “Présentation du concepteur” et “Utilisation des gestionnaires de disposition” dans Conception d’applications avec JBuilder.

Les étapes ci-après ajoutent à l’application les composants d’interface utilisateur suivants à partir de l’onglet dbSwing de la palette de composants :

• JdbTable (et conteneur), utilisé pour afficher des données bi-dimensionnelles dans un format de type feuille de calcul.

• JdbNavToolBar, un ensemble de boutons pour vous aider à naviguer dans les données affichées JdbTable. Il vous permet de naviguer rapidement dans l’ensemble de données lorsque l’application est exécutée.

• JdbStatusLabel, qui affiche des informations sur l’enregistrement ou l’opération en cours et les messages d’erreur.

Page 277: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-11

E t a p e 5 : A j o u t d e c o m p o s a n t s d b S w i n g p o u r c r é e r l ’ i n t e r f a c e u t i l i s a t e u r

Vous ajouterez ces composants à contentPane (BorderLayout), qui est un JPanel, et le conteneur principal de l’interface utilisateur, dans lequel vous allez disposer les composants visuels. Des composants JPanel supplémentaires seront utilisés pour séparer les composants servant à la navigation du JdbStatusLabel.

Pour ajouter un composant JdbTable,

1 Sélectionnez l’onglet Conception pour BasicAppFrame.java dans le volet Contenu afin d’activer le concepteur d’interface utilisateur.

2 Sélectionnez la page dbSwing de la palette de composants dans le concepteur d’interface utilisateur.

3 Sélectionnez un composant TableScrollPane de la page dbSwing de la palette de composants, cliquez sur contentPane dans l’arborescence des composants ou au centre de la surface du concepteur d’interface utilisateur pour ajouter le composant à votre application.

Le composant TableScrollPane, tableScrollPane1, apparaît dans le volet structure sous la forme d’un nœud de l’arborescence des composants.

4 Sélectionnez un composant JdbTable de la page dbSwing de la palette de composants, cliquez sur tableScrollPane1 dans l’arborescence des composants ou au centre de la surface du concepteur d’interface utilisateur pour ajouter le composant à votre application.

Le composant JdbTable, jdbTable1, apparaît dans le volet structure sous la forme d’un nœud de l’arborescence des composants, sous tableScrollPane1.

5 Donnez la valeur queryDataSet1 à la propriété dataSet du jdbTable1.

Lorsque vous définissez la propriété dataSet du jdbTable1 par queryDataSet1, les données de la base de données apparaissent dans le concepteur d’interface utilisateur :

Figure 17.5 Composants JdbTable dans le concepteur d’interface utilisateur

Page 278: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 5 : A j o u t d e c o m p o s a n t s d b S w i n g p o u r c r é e r l ’ i n t e r f a c e u t i l i s a t e u r

Ensuite, nous ajouterons des composants de navigation, y compris un JdbNavToolBar. Les composants JPanel permettent de séparer les différents éléments de l’interface utilisateur.

Pour ajouter des éléments de navigation,

1 Sélectionnez la page Conteneurs Swing de la palette de composants dans le concepteur d’interface utilisateur, sélectionnez le composant JPanel et cliquez sur le nœud contentPane dans le volet structure.

2 Définissez la propriété layout de jPanel1 par FlowLayout.

3 Sélectionnez la page dbSwing supplémentaires de la palette de composants, sélectionnez le composant JdbNavField et cliquez sur le nœud jPanel1 dans le volet structure.

Le composant JdbNavField offre une fonction de recherche incrémentale pour les colonnes de type String. Sa propriété columnName spécifie la colonne où s’effectue la recherche. Si cette propriété n’est pas définie, la recherche est effectuée sur la dernière colonne visitée dans JdbTable.

4 Définissez la propriété preferredSize de jdbNavField1 par 125, 21.

5 Sélectionnez la page Swing de la palette de composants, sélectionnez le composant JLabel et cliquez sur le nœud jPanel1 dans le volet structure.

6 Définissez la propriété text de jLabel1 par Chercher.

7 Sélectionnez la page dbSwing de la palette de composants, sélectionnez le composant JdbNavToolBar et cliquez sur le nœud jPanel1 dans le volet structure.

Une instance de JdbNavToolBar, appelée jdbNavToolBar1, est ajoutée au panneau et apparaît dans l’arborescence des composants. Par défaut, le composant JdbNavToolBar détecte automatiquement les autres composants orientés données du même conteneur racine, et se déplace dans l’ensemble de données du composant détenant alors la focalisation. Vous n’avez donc pas besoin de définir la propriété constraints de jdbNavToolBar1 dans l’inspecteur.

Remarque Vous aurez peut-être à redimensionner l’espace du concepteur pour voir tous les composants de l’interface utilisateur.

Vous voilà prêt à ajouter le composant JdbStatusLabel.

Pour ajouter un composant JdbStatusLabel,

1 Ajoutez un autre composant JPanel au nœud contentPane dans le volet structure.

2 Dans l’inspecteur, définissez la propriété contraints de jPanel2 par South.

Page 279: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-13

E t a p e 5 : A j o u t d e c o m p o s a n t s d b S w i n g p o u r c r é e r l ’ i n t e r f a c e u t i l i s a t e u r

3 Sélectionnez la page dbSwing de la palette de composants, sélectionnez le composant JdbStatusLabel et cliquez sur la zone centrale proche du bord supérieur du panneau dans le concepteur d’interface utilisateur.

Une instance de JdbStatusLabel, appelée jdbStatusLabel1, est ajoutée au panneau et apparaît dans l’arborescence des composants. jdbStatusLabel1 s’attache automatiquement au DataSet qui détient la focalisation.

4 Choisissez Exécuter|Exécuter le projet pour compiler et exécuter l’application.

L’application en train de s’exécuter ressemble à ceci :

Figure 17.6 Application de base de données élémentaire avec barre de navigation et libellé d’état

Utilisez la barre de navigation et le champ de navigation pour vous déplacer dans les enregistrements. Remarquez que la barre d’état s’actualise en conséquence.

5 Fermez l’application entrain de s’exécuter et enregistrez toutes les modifications (Fichier|Tout enregistrer).

Pour terminer l’application, ajoutons des composants JdbTextField pour afficher les données des colonnes statistiques (ou agrégées).

Page 280: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-14 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 6 : A g r é g a t i o n d e d o n n é e s a v e c d e s c h a m p s c a l c u l é s

Etape 6 : Agrégation de données avec des champs calculésNous allons maintenant ajouter des composants JdbTextField pour afficher les données des colonnes statistiques (ou agrégées) : ORIG_TOTAL, NEW_TOTAL et DIFF_TOTAL. Ces composants seront insérés dans un composant JPanel distinct, à l’intérieur du composant JPanel qui contient déjà le composant JdbStatusLabel.

Pour ajouter les composants JdbTextField destinés aux données des colonnes agrégées,

1 Sélectionnez la page Conteneurs Swing de la palette de composants dans le concepteur d’interface utilisateur, sélectionnez le composant JPanel et cliquez sur le nœud jPanel2 dans le volet structure.

Cela ajoute un nouveau composant JPanel, jPanel3, dans jPanel2.

2 Définissez la propriété layout de jPanel3 par GridLayout, et la propriété layout de jPanel2 par BorderLayout.

3 Sélectionnez la page dbSwing de la palette de composants, sélectionnez le composant JdbTextField et cliquez sur le nœud jPanel3 dans le volet structure.

4 Définissez la propriété dataSet de jdbTextField1 par queryDataSet1, et sa propriété columnName par ORIG_TOTAL.

5 Sélectionnez la page Swing de la palette de composants, sélectionnez le composant JLabel et cliquez sur le nœud jPanel3 dans le volet structure.

Si nécessaire, repositionnez le composant JLabel (jLabel2) dans le concepteur d’interface utilisateur pour qu’il soit à gauche du composant jdbTextField1.

6 Définissez la propriété horizontalAlignment de jLabel2 par LEADING et la propriété text par Total originel.

7 Ajoutez deux autres composants JdbTextField et JLabel, et définissez leurs propriétés comme indiqué dans le tableau suivant :

Composant Nom de la propriété Valeur

jdbTextField2 dataSet queryDataSet1

jdbTextField2 columnName NEW_TOTAL

jLabel3 horizontalAlignment CENTER

jLabel3 text Nouveau total

jdbTextField3 dataSet queryDataSet1

jdbTextField3 columnName DIFF_TOTAL

jLabel4 horizontalAlignment CENTER

jLabel4 text Différence

Page 281: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : C r é a t i o n d ’ u n e a p p l i c a t i o n d e b a s e d e d o n n é e s é l é m e n t a i r e 17-15

E t a p e 6 : A g r é g a t i o n d e d o n n é e s a v e c d e s c h a m p s c a l c u l é s

Si nécessaire, ajustez la position des composants dans le concepteur d’interface utilisateur.

8 Développez le nœud queryDataSet2 dans le volet structure et sélectionnez la colonne ORIG_TOTAL.

9 Dans l’inspecteur, sélectionnez la propriété agg, puis cliquez sur le bouton points de suspension (...) pour ouvrir l’éditeur de la propriété Agg.

Figure 17.7 Boîte de dialogue Agg

10 Choisissez SALARY dans la liste déroulante Colonne statistique, choisissez SumAggOperator dans la liste déroulante Opération statistique et cliquez sur OK.

11 Sélectionnez la colonne NEW_TOTAL dans le volet structure et ouvrez la boîte de dialogue Agg.

12 Choisissez NEW_SALARY dans la liste déroulante Colonne statistique, choisissez SumAggOperator dans la liste déroulante Opération statistique et cliquez sur OK.

13 Sélectionnez la colonne DIFF_TOTAL dans le volet structure et ouvrez la boîte de dialogue Agg.

14 Choisissez DIFF_SALARY dans la liste déroulante Colonne statistique, choisissez SumAggOperator dans la liste déroulante Opération statistique et cliquez sur OK.

15 Choisissez Exécuter|Exécuter le projet pour compiler et exécuter l’application.

L’application doit afficher les données agrégées dans les nouveaux composants JdbTextField.

Page 282: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

17-16 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Page 283: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : E x t r a c t i o n d e d o n n é e s à l ’ a i d e d e p r o c é d u r e s s t o c k é e s 18-1

C h a p i t r e

18Chapitre18Tutoriel : Extraction de données

à l’aide de procédures stockéesLe développement

d’applications de basesde données est une

fonctionnalité de JBuilderEntreprise.

Ce tutoriel décrit la manière d’alimenter en données une application en utilisant le concepteur d’interface utilisateur JBuilder et un composant ProcedureDataSet. Cet exemple illustre également la manière d’attacher l’ensemble de résultats ainsi obtenu à un JdbTable et à un JdbNavToolBar pour l’affichage et la modification des données.

Dans ce tutoriel, nous allons exécuter les tâches suivantes :

• Création des tables et des procédures du tutoriel

• Ajout des composants DataSet

• Ajout de composants visuels

Vous pouvez consulter l’application complète en ouvrant le fichier projet exemple, SimpleStoredProcedure.jpx qui se trouve dans <jbuilder>/samples/DataExpress/SimpleStoredProcedure/. D’autres applications exemple démontrant l’utilisation des procédures stockées sur divers serveurs sont disponibles dans le répertoire <jbuilder>/samples/DataExpress/ServerSpecificProcedures.

La section Options d’accessibilité des Astuces JBuilder contient des conseils permettant de simplifier l’accès aux fonctionnalités de JBuilder, destinés en particulier aux personnes ayant des difficultés.

Pour plus d’informations sur les conventions de la documentation de ce tutoriel et des autres documents JBuilder, voir “Conventions de la documentation”, page 1-9.

Page 284: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

18-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 1 : C r é a t i o n d e s t a b l e s e t d e s p r o c é d u r e s d u t u t o r i e l

Etape 1 : Création des tables et des procédures du tutorielLes étapes suivantes exécutent une procédure stockée qui crée une table et des procédures d’insertion d’actualisation et de suppression sur le serveur InterBase (cela suppose l’application préalable des instructions d’installation décrite dans “Configuration d’InterBase et InterClient”, page 4-7). Cette procédure est écrite dans le langage InterBase.

1 InterBase Server et InterServer doivent être exécutés sur la même machine.

2 Choisissez Fichier|Fermer les projets dans le menu pour fermer les projets existants.

3 Choisissez Fichier|Ouvrir et ouvrez le projet ProcedureSetUp.jpx, qui doit se situer dans le répertoire samples/DataExpress/SimpleStoredProcedure/ProcedureSetup de l’installation JBuilder.

Si ce projet n’est pas disponible ou si vous voulez examiner le fichier CreateProcedures.java, voir “Création manuelle des tables et procédures de ce tutoriel”, page 6-4.

4 Choisissez Projet|Propriétés.

5 Sélectionnez l’onglet Bibliothèques nécessaires et sélectionnez InterClient.

Cette option est disponible si vous avez suivi la procédure “Ajout d’un pilote JDBC à JBuilder”, page 4-10.

6 Double-cliquez sur CreateProcedures.java dans le volet projet et modifiez le chemin d’accès au fichier InterBase employee.gdb pour qu’il mène au fichier installé sur votre ordinateur. (Utilisez les barres obliques dans le chemin d’accès.)

7 Enregistrez le fichier, puis cliquez avec le bouton droit sur CreateProcedures.java dans le projet et choisissez Exécuter.

Cela crée les tables et les procédures sur le serveur.

8 Choisissez Outils|Pilote de base de données pour vérifier que les tables et les procédures sont créées.

9 Choisissez Fichier|Fermer le projet dans le menu.

Page 285: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : E x t r a c t i o n d e d o n n é e s à l ’ a i d e d e p r o c é d u r e s s t o c k é e s 18-3

E t a p e 2 : A j o u t d e s c o m p o s a n t s D a t a S e t

Etape 2 : Ajout des composants DataSetPour créer cette application et remplir un ensemble de données en utilisant la procédure stockée,

1 Choisissez Fichier|Nouveau et double-cliquez sur l’icône Application.

Acceptez toutes les valeurs par défaut, ou modifiez le chemin et le nom du projet pour les rendre plus explicites.

2 Ouvrez le dialogue Propriétés du projet (Projet|Propriétés du projet) et cliquez sur l’onglet Bibliothèques nécessaires.

3 Ajoutez InterClient.

Cette option est disponible si vous avez suivi la procédure décrite dans “Ajout d’un pilote JDBC à JBuilder”, page 4-10.

4 Fermez la boîte de dialogue.

5 Sélectionnez l’onglet Conception pour activer le concepteur d’interface utilisateur.

6 Sélectionnez un composant Database dans l’onglet DataExpress de la palette de composants et cliquez n’importe où dans l’arborescence des composants.

7 Ouvrez l’éditeur de la propriété connection du composant Database en sélectionnant le bouton points de suspension (...) de la propriété connection dans l’inspecteur.

8 Initialisez les propriétés connection des tables exemple InterBase comme indiqué dans le tableau ci-dessous.

La réalisation de ces étapes suppose que vous avez réalisé les actions décrites dans “Configuration d’InterBase et InterClient”, page 4-7.

La boîte de dialogue connection contient un bouton Tester la connexion. Cliquez sur ce bouton pour vérifier que les propriétés connection sont correctement initialisées. Les résultats de la tentative de connexion s’affichent à côté du bouton. Quand le texte indique Succès, cliquez sur OK pour fermer la boîte de dialogue.

Nom de la propriété Valeur

Driver interbase.interclient.Driver

URL jdbc:interbase://<adresse IP ou localhost>/<chemin du fichier .gdb>

Username SYSDBA

Password masterkey

Page 286: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

18-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 2 : A j o u t d e s c o m p o s a n t s D a t a S e t

Le code généré par le concepteur pour cette étape peut être affiché en sélectionnant l’onglet Source et en recherchant ConnectionDescriptor. Sélectionnez l’onglet Conception pour continuer.

9 Dans le volet contenu, placez un composant ProcedureDataSet de l’onglet DataExpress de la palette de composants et définissez sa propriété procedure comme suit :

Plusieurs procédures ont été créées lors de l’exécution de CreateProcedures.java. La procédure GET_COUNTRIES est celle renvoyant un ensemble de résultats. L’instruction SELECT spécifie l’appel d’une procédure dans le langage InterBase.

Astuce Vous pouvez utiliser le bouton Parcourir les procédures dans vos projets ultérieurs pour savoir quelles procédures stockées sont disponibles. Voir “Séquences d’échappement, instructions SQL et appels de procédure spécifiques au serveur”, page 6-3, pour plus d’informations.

Cliquez sur le bouton Tester la procédure pour vérifier que la procédure est exécutable. Lorsque la zone grise se trouvant sous le bouton indique Succès comme ci-dessous, cliquez sur OK pour fermer la boîte de dialogue.

Le code généré par cette étape peut être affiché en sélectionnant l’onglet Source et en recherchant setProcedure.

10 Cliquez sur l’onglet Conception pour continuer.

Nom de la propriété Valeur

Database database1

Instruction SQL ou Escape de procédure stockée

SELECT * FROM GET_COUNTRIES

Page 287: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

T u t o r i e l : E x t r a c t i o n d e d o n n é e s à l ’ a i d e d e p r o c é d u r e s s t o c k é e s 18-5

E t a p e 3 : A j o u t d e c o m p o s a n t s v i s u e l s

Etape 3 : Ajout de composants visuelsCette étape décrit comment créer l’interface utilisateur de l’application en utilisant des composants dbSwing.

1 Sélectionnez contentPane(BorderLayout) dans l’arborescence des composants.

2 Cliquez sur un composant JdbNavToolBar dans l’onglet dbSwing de la palette de composants. Déposez-le dans la zone juste au-dessus du panneau dans le concepteur d’interface utilisateur.

jdbNavToolBar1 s’attache automatiquement au DataSet qui détient la focalisation.

3 Définissez la propriété constraints de jdbNavToolBar1 par NORTH.

4 Déposez un JdbStatusLabel dans la partie inférieure du panneau, dans le concepteur d’interface utilisateur et définissez sa propriété constraints par SOUTH.

jdbStatusLabel1 s’attache automatiquement au DataSet qui détient la focalisation.

5 Déposez un composant TableScrollPane au centre du panneau dans le concepteur d’interface utilisateur.

Vérifiez que sa propriété constraints est définie par CENTER.

6 Sélectionnez tableScrollPane1 et déposez un composant JdbTable en son centre.

7 Définissez la propriété dataSet du jdbTable1 par procedureDataSet1.

8 Choisissez Exécuter|Exécuter le projet pour exécuter l’application et parcourir l’ensemble de données.

L’application en train de s’exécuter ressemble à ceci :

Figure 18.1 Extraction de données avec une application de procédures stockées à l’exécution

Page 288: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

18-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

E t a p e 3 : A j o u t d e c o m p o s a n t s v i s u e l s

Le bouton Enregistrer les modifications de la barre d’outils enregistre les modifications à l’aide du QueryResolver par défaut. Pour personnaliser les fonctions de résolution dans l’application afin de pouvoir modifier, insérer ou supprimer des données pendant l’exécution de l’application, voir Chapitre 8, “Enregistrement des modifications dans la source de données”.

Page 289: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n d e x I-1

Symboles? comme marqueur de paramètres JDBC 5-19

Aaccès aux données 4-1, 5-1

à partir de sources de données personnalisées 6-9

des composants de l’interface utilisateur 13-2du module de données 10-1sources de données JDBC 4-1

accès aux informations de modèle 13-2administrateur de bases de données 15-7

tâches 15-1administration des bases de données 15-1, 15-7affichage

caractères spéciaux 12-18données dans les composants orientés

données 7-2informations d’état 13-3

agrégation de données 12-1création de colonne agrégées 12-11, 12-15exemple 12-12, 17-1personnalisation des méthodes

d’agrégation 12-16ajout de colonnes

à des requêtes paramétrées 5-19dans les fichiers texte importés 3-2pour utilisation interne 7-10

ajout de composantsà des modules de données 10-3

ajout de paramètres à des requêtes 5-13améliorations pour l’extraction des données 5-10analyse

chaînes 12-18données 12-16

API JDBC 2-1, 4-1appels de procédure

spécifiques au serveur 6-3application bases de données 2-1

création 11-2génération 10-20introduction 1-1, 2-1

application exemple ResolverEvents 8-19, 8-21applications

base de données (2 niveaux) 10-9génération 10-20

applications 2 niveauxgénération 10-20

applications clientdéveloppement avec InterClient 4-7

applications distribuéesbase de données 14-1

applications multi-niveauxdéploiement 14-5

architectureDataExpress 2-1

auditeur StatusEvent 13-5

BBase de données, champ

dans QueryDescriptor 5-5bases de données 1-1, 4-3

accès 15-3affichage d’informations 15-2connexion aux 4-2, 4-3connexion via JDBC 8-3développement 1-1exploration 15-1index 15-1interrogation 5-4IU 11-1, 12-1propriété de connexion 4-4

bases de données distantesaccès 15-3connexion aux 4-2

bases de données localesaccès 15-3

bases de données relationnelles 9-1bases de données SQL

connexion aux 4-2bibliothèque de composants DataExpress

description 2-1bibliothèques

ajout au projet 10-6création 4-10obligatoire 10-6

Borlandcontacter 1-11e-mail 1-13groupes de discussion 1-12rapports de bogues 1-13ressources en ligne 1-11support aux développeurs 1-11support technique 1-11World Wide Web 1-12

bouton Appliquer 10-14bouton Coller la colonne 10-14bouton Coller le paramètre 10-14

Index

Page 290: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I-2 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

Ccalcul

coûts des marchandises 12-16remises 12-16taux de TVA 12-16totaux 12-16

CalculatedColumn, exemple 12-9caractères spéciaux 12-18chaînes

analyse 12-18champs

bases de donnéesexploration 15-1

liaison sur des champs communs 9-2obligatoire 12-25

champs communs 9-1champs de données

exportation 16-1champs heure

exportation 16-1champs numériques

exportation 16-1champs texte

exportation 16-1chargement de données 6-12clause Where 10-14codage des événements

des modules de données 10-5colonnes 7-1, 7-8

ajout aux StorageDataSet 7-10calculées 12-1contrôle de l’ordre des 7-11définition des propriétés 7-1, 7-2définition des propriétés persistantes 7-7exploration 15-1filtrage des données dans 11-1liaison sur des champs communs 9-2modification des propriétés 7-2recherche de données dans 11-1tri 11-1utilisation 7-1valeurs de référence Voir colonnes de référencevisualisation des informations 7-2, 7-5

colonnes calculées 12-1, 12-8, 12-11agrégation de données 12-11, 12-12, 12-15, 17-1création de listes de sélection avec 12-2création de références avec 12-2, 12-5exemple 12-9tutoriel 17-1types supportés 12-8

colonnes de référence 12-2création 12-2exemple 12-5

colonnes persistantes 12-25ajout 7-10contrôle de l’actualisation des métadonnées

avec 7-9présentation 7-8suppression 7-9

commande Exécuter la requête 10-17composant base de données 4-1, 4-3

exemple 4-3présentation 2-6, 4-1utilisation 4-3

composant colonnedéfinition des propriétés 12-25formatage lorsqu’il contient un objet Java 12-28manipulation 12-25modification lorsqu’il contient un objet

Java 12-28persistantes 12-25présentation 2-8, 7-1propriété du formateur 12-28propriété locale 16-1spécification comme persistant 7-8stockage d’objets Java dans 12-28visualisation 12-25

composant JdbNavField 11-15exemple 11-14

composant JdbTabletri dans 11-10

composantsorientés données JFC 13-1synchronisation 13-1

Composants DataExpressDataSetView 12-23

Composants DataExpress pour EJB 2-9Composants de bases de données XML 2-10composants JBCL

orientés données 13-1composants JFC 13-1composants orientés données 13-1

affichage de données par défaut 7-2affichage des colonnes dans 12-25

concepteur de colonne 7-2, 12-25activation 7-2Créer une classe RowIterator, bouton 7-3options pour les métadonnées 7-4, 7-5

concepteursconcepteur de colonne 7-2

Voir aussi concepteur de colonneconnexion à une base de données

tutoriel 17-1connexions 4-1, 4-2

mise en pool des connexions JDBC 4-17présentation 4-1problèmes et solutions 4-23tutoriel 17-1

Page 291: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n d e x I-3

connexions aux bases de donnéesmise en pool 4-17surveillance 15-11, 15-12

Constructeur SQL 5-4construction d’applications de bases de

données 1-1Continuer toutes les métadonnées, option 7-4contraintes

activation 11-12contraintes de données

activation 11-12contrôle de la saisie de l’utilisateur 12-18contrôles 13-1conventions de la documentation 1-9

conventions des plates-formes 1-10conversions de chaînes

avec des masques 12-18coûts des marchandises

calcul 12-16création de relations maître-détail 9-1, 9-10création de requêtes 5-2création de tables SQL 15-8curseurs

partagés 13-1curseurs partagés 13-1

DDataExpress

applications 2-1architecture 1-1, 2-1, 2-2composants 2-2, 2-5, 5-1

accès aux données avec 5-1DataModule, interface

personnalisation 10-3présentation 2-9, 10-1référencement 10-8

DataRow, composantordre des colonnes dans les recherches 11-20présentation 2-8recherche de données 11-17, 11-18

DataSet, composantavec RMI 8-15enregistrement des modifications 8-1fonctionnalité 2-2mise en flux 8-15présentation 2-6stockage d’objets Java 12-28tri des données dans 11-1

DataSet, paquet 2-5DataSetData, composant 8-15, 14-1

exemple 14-1exemple d’application, description 14-2extractDataSet, méthode 8-16extractDataSetChanges, méthode 8-16remplissage 8-16

transmission des métadonnées 14-5DataSetException, classe 13-5DataSetView, composant

présentation 2-7propriétés 12-23tri dans 11-9utilisation 12-1, 12-23

DataStore, composantprésentation 2-6

DataStoreDriver, composantprésentation 2-7

datesimportation 3-2

dbSwing, composantscréation d’une interface utilisateur de base de

données 2-10utilisation 13-1

deleteProcedure, propriété 8-8déploiement

applications multi-niveaux 14-5distant

serveurs 4-1données 5-1

accès 11-2autre vue 12-23chargement 6-12exploration 15-10exportation 3-3extraction 5-1, 6-9, 11-2filtrage 11-1fournisseurs 5-1fourniture des données 5-1, 6-12insertion 15-10localisation 11-14, 11-15, 11-17, 11-18

filtrage des données dans 11-1manipulation 11-1mise en cache 2-13modification 15-6, 15-10obligatoire 12-25persistance 2-13persistantes 12-25recherche 11-14relations

1-à-1 8-131-t 8-13

résolution 8-1, 8-3personnalisation 8-22

résolution des donnéescomportement par défaut 8-18

stockage 2-13tri 11-1visualisation 15-6

données chaînemodèles 12-21

Page 292: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I-4 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

données d’heuremodèles 12-21

données de datemodèles 12-21

données de tablemodification 15-10visualisation 15-10

données membrepermanentes 8-16privées 8-16

données numériques 3-2importation 3-2modèles 12-19

données obligatoires 12-25données persistantes 12-25données récapitulées 12-11, 12-12, 17-1

Eéditeur de la propriété Agg 12-15éditeur de la propriété Query

tutoriel 17-1éditeur de la propriété Sort 11-11édition des données

contrôle de la saisie de l’utilisateur 12-18maître-détail 9-10

enableDelete, propriété 12-23enableInsert, propriété 12-23enableUpdate, propriété 12-23enregistrement des données 8-1

exemple 8-8plusieurs tables 8-12ProcedureResolver 8-9

enregistrement des modifications 8-3, 8-6, 8-17dans QueryDataSet 8-4relations maître-détail 9-11

enregistrements détailslecture 9-7, 9-8

ensembles de donnéesamélioration des performances 5-10fermeture 5-12liaison 9-1liaison des valeurs de paramètres 5-21mise en flux 8-15ouverture 6-12ouverture explicite 5-12renvoi en lecture seule 5-12

ensembles de données en lecture seule 5-12erreurs

exceptions, gestion 13-5Voir aussi exceptions

événementsajout de la logique métier 10-5résolution 8-17

événements de résolution 8-17exceptions

gestion 13-5exemple FilterRows 11-6exemple MasterDetail 9-3exemple StreamableDataSets

exécution 14-3exemples

agrégations calculées 12-12ajout d’informations d’état 13-3bases de données 8-17, 12-23colonnes calculées 12-9création de listes de sélection 12-2création de références 12-5création des procédures stockées 6-4données agrégées avec des colonnes

calculées 12-12filtrage des données 11-6paramétrage des requêtes 5-13procédures stockées

codage 8-8relations maître-détail 9-3ResolverEvents 8-21

exemples d’applicationsDataSetData 14-2ResolverEvents 8-21

exemples de bases de données 8-17agrégations calculées 12-12autres vues 12-23colonnes calculées 12-9configuration de JDataStore 4-7création de listes de sélection 12-2création de références 12-5création des procédures stockées 6-4filtrage des données 11-6paramétrage des requêtes 5-13relations maître-détail 9-3résolution des modifications 8-3résolution des ProcedureDataSet 8-6ResolverEvents 8-21StreamableDataSets 14-3

expert Nouveau module de données 10-2Explorateur JDataStore 2-14exportation des données 3-3

à partir d’un QueryDataSet 3-4utilisation des modèles 16-1vers des fichiers texte 3-1

exportDisplayMask, propriété 12-19extractDataSet, méthode 8-16extractDataSetChanges, méthode 8-16extraction des données 4-1, 5-1, 6-9, 11-2

d’un module de données 10-1via des procédures stockées 6-1

Page 293: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n d e x I-5

Ffermeture

ensembles de données 5-12fetchAsNeeded, propriété 9-7fichier de ressources 5-5fichier plat, bases de données 3-1fichiers ASCII 3-1

Voir aussi fichiers textefichiers .config

création pour les pilotes 4-10fichiers de ressources 5-7fichiers SCHEMA 3-2

et exportDisplayMasks 12-19fichiers texte 3-1

dans les sources JDBC 3-5dans les tables SQL 3-5exportation 3-1, 3-3importation 2-15, 3-1

fichiers texte formatés 3-2importation 3-2

filtrage des données 11-1, 11-5exemple 11-6

filtres de données 11-5exemple 11-6

fontesConventions de la documentation JBuilder 1-9

formatage des données 12-16masques d’affichage pour 12-18

fournisseursde données 5-1personnalisées 14-1personnalisés, création 6-9

fournisseurs de données 5-1fournisseurs personnalisés 6-9fourniture des données

à partir des sources de données JDBC 6-1avec des requêtes paramétrées 5-13définition 6-1exemples de bases de données 11-2

Ggénération

application bases de données 10-20gestion

erreurs 13-5exceptions 13-5

gestionnaire de pilotes 4-1gestionnaires d’événements

agrégation personnalisée 12-16Group By, clause 10-13groupes de discussion

Borland 1-12public 1-12

groupes de discussion Usenet 1-12groupes de données 12-11

Iimportation de données 2-15

à partir de fichiers texte 3-1importation et exportation des données

tutoriel 16-1index

base de données 15-1uniques et nommés 11-12

index uniques 11-12informations d’état 13-3insertProcedure, propriété 8-8insertRow(), méthode 6-12installation

InterClient 4-7Serveur JDataStore 4-7

Instruction SQL, champdans QueryDescriptor 5-5

instructions SQLdéfinition 5-4encapsulation 6-1exécution 15-4explication 6-3

InterBaseconfiguration pour JBuilder 4-7conseils 4-9paramètres de retour des procédures

stockées 8-12procédures stockées, exemple 6-7

InterBase et InterClientutilisation avec JBuilder 4-8

InterClientconfiguration dans JBuilder 4-10configuration pour JBuilder 4-7erreurs de connexion 4-23installation 4-7utilisation des pilotes JDBC 4-13

INTERNALROW 8-15, 8-16InternetBeans Express 2-10InterServer, pilote 4-7Intranet

développement d’applications client-serveur 4-7

JJava

pilotes de bases de données 4-7RMI avec bases de données 14-1

Java, interfacesdéveloppement avec InterClient 4-7

JConnectionPooloptimisation des performances 4-20

Page 294: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I-6 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

JDataStorecréation 2-15installation du serveur local 4-7JDBC, pilotes 4-7opérations 2-15paquet 2-5quand utiliser 2-13utilisation 2-13vérification 2-15

JDBC 1-1, 8-3mise en pool des connexions 4-17

JDBC, 4-7JDBC, connexions 4-1

gestion 2-6manipulation du trafic 15-11présentation 4-1surveillance 15-11tutoriel 17-1

JDBC, pilotes 4-2ajout à JBuilder 4-10ajout au projet 4-11InterClient 4-13JDataStore, pilotes JDBC 4-7quand utiliser 2-13spécifiés dans la base de données 4-4

JdbNavToolBar, composantenregistrement des données 8-3

JdbStatusLabel, composant 13-3exemple 13-3

jointure des tables 9-1

Llecture des données 5-2

à partir des sources de données JDBC 3-3, 6-1enregistrements détails 5-22, 9-7, 9-8optimisation 5-10

liaison d’ensembles de données 9-1liaison des valeurs de paramètres 5-21Liaison entre requêtes, boîte de dialogue 10-17libellés d’état

ajout aux applications 13-3listes de référence 12-1listes de sélection 12-2

exemple 12-2suppression 12-4

localepropriété 16-1

locate, méthode 11-17LocateOptions, classe 11-18logique métier 10-1, 10-5

Mmanipulation du trafic JDBC 15-11marqueurs de paramètres 5-19masques 12-1

de saisie 12-18pour l’importation/exportation 12-19pour les formats de données 12-18

masques d’affichage 12-1, 12-18ajout 12-16

masques d’exportation 12-16, 12-19masques d’importation 12-16, 12-19masques de saisie 12-1

ajout 12-16editMask, propriété 12-18

masterDataSet, propriété 9-10masterLink, propriété 9-2MasterLinkDescriptor, classe

présentation de l’utilisation 9-2metaDataUpdate, propriété

avec plusieurs tables 8-14métadonnées 7-1

actualisation dans des colonnes persistantes 7-9découverte 7-1exploration 15-1obtention 6-10persistance 5-11, 7-4rendre dynamiques 7-5visualisation 7-5

mise à joursources de données 8-1tables SQL 8-3

mise en flux de données 8-15mise en flux des ensembles de données 8-15

utilisation 8-16modèles 12-1, 12-16

accès aux informations sur 13-2données booléennes 12-22données chaîne 12-21données d’heure 12-21données de date 12-21données numériques 12-19exemples 12-19pour l’exportation des données 16-1pour la saisie de données 12-18

modèles d’heure 12-16exemples 12-19

modèles de booléen 12-16modèles de chaîne 12-16

exemples 12-19modèles de données 12-16

exemples 12-19

Page 295: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n d e x I-7

modèles de données booléennes 12-22exemples 12-19

modèles de nombre 12-16exemples 12-19

Modeleur de donnéesapplications 2 niveaux 10-9applications client-serveur 10-9création de requêtes 15-2

modules de données 10-1ajout aux bibliothèques 10-6ajout de composants 10-3ajout de la logique métier 10-5compilation 10-5création 10-2, 10-9enregistrement 10-5experts 10-2, 10-8fichiers classe 10-5générés, utilisation 10-22référencement 10-5, 10-8utilisation 10-5, 10-8

modules de données Javaenregistrement des requêtes 10-19

Moniteur JDBC 15-11dans les applications 15-12démarrage 15-11utilisation 15-12

MonitorButtonajout à la palette 15-12propriétés 15-13utilisation 15-13

mot de passesollicitation 4-16

Nnavigation

plusieurs ensembles de données 13-1synchronisation des composants 13-1

nom d’utilisateursollicitation 4-16

nomméindex 11-12paramètres 5-19

Oobjets

contenant des ensembles de données 8-15Java 12-28stockage 12-28

objets AggDescriptor 12-15objets distribués

base de données 14-1onglet Requête 5-5optimisation de l’extraction des données 5-10

option de mises à jour en cascade (cascadeUpdates) 9-7

option de suppressions en cascade (cascadeDeletes) 9-7

options de chargement, champdans QueryDescriptor 5-5

options de sélection de la direction de l’ordre de tri 10-16

Order By, clauseajout 10-16

ordre de résolutionspécification 8-15

ordre de tri 11-12requêtes SQL 10-16unique 11-12

ordre de tri croissant 10-16ordre de tri décroissant 10-16ordre des colonnes

recherche de données 11-20ouverture

ensembles de données 5-12

Ppage Données

pilote de base de données 15-6page Group By

Modeleur de données 10-13page Order By 10-16page Saisie SQL

pilote de base de données 15-4page Where

Modeleur de données 10-14paquets

de bases de données 2-5paquets de bases de données 2-5ParameterRow 5-15ParameterRow, composant 5-19

présentation 2-8paramètres

retour 8-12spécification 5-6

paramètres de retour 8-12Paramètres, onglet

QueryDescriptor 5-6PARTIAL, option

recherches multicolonnes 11-20performances

amélioration de l’ensemble de données 5-10persistance

données 2-13pilote de base de données 7-5

configuration 15-3fenêtre 15-2page Données 15-6, 15-10page Saisie SQL 15-4

Page 296: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I-8 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

utilisation 15-1visualisation des informations des colonnes 7-5

pilotesajout de pilotes de bases de données au

projet 4-11ajout du pilote JDBC 4-10configuration pour les bases de données 15-3

pilotes de bases de donnéesajout à JBuilder 4-10ajout au projet 4-11configuration 15-3entièrement Java 4-7

Placer le texte SQL dans l’ensemble de ressourcesdans QueryDescriptor 5-7

Pro 8-1ProcedureDataSet, composant 2-1

about 6-1exemple 6-4exemple de résolution 8-6présentation 2-7résolution des données 8-6tri dans 11-9tutoriel 18-1

ProcedureResolverdeleteProcedure, propriété 8-8insertProcedure, propriété 8-8propriétés 8-8updateProcedure, propriété 8-8

ProcedureResolver, composantcodage 8-8utilisation 8-6

procéduresrésolution 8-6

procédures d’insertionpersonnalisées 8-9

procédures de mise à jour 8-9procédures de suppression

personnalisées 8-9procédures stockées

création 6-3exemple 6-4exemples 6-7, 6-9InterBase 8-12paramètres de retour 8-12présentation 6-1ProcedureResolver 8-9résolution 8-6tutoriel 18-1

Procédures stockées Oracle PL/SQLexemple 6-7

Procédures stockées Sybaseexemple 6-9

processus de résolutioncontrôle 8-19

projet par défautajout de pilotes de bases de données 4-11

projetsajout de pilotes de bases de données 4-11

propriété formatterutilisation 12-28

propriétés de colonneaffichage de données 7-2pour plusieurs requêtes de tables 8-14

propriétés de connexionbase de données 4-4

provideData, méthode 6-12ProviderHelp

initData, méthode 6-12

Qquery, propriété

éditeur 5-4paramètres 5-6présentation 5-5

QueryDataSet, composant 2-1, 2-7, 5-15définition de la propriété query 5-4enregistrement des modifications 8-4exemple 5-13, 8-3exportation dans un fichier 3-3, 3-4présentation 5-2, 5-10tri dans 11-9

QueryDescriptor, composantdéfinition visuelle des propriétés 5-4page Requête 5-5Paramètres, onglet 5-6

QueryProvider, composantpour plusieurs requêtes de tables 8-14

QueryResolver, composantajout 8-19avec des procédures stockées 8-6enregistrement des modifications avec 8-6événements

contrôle 8-19exemple 8-3interception des événements 8-19par défaut 8-18personnalisation 8-17, 8-19pour les ProcedureDataSet 8-6utilisation 8-3

Rrapprochement des données 8-1récapitulation des données 12-11, 12-12, 17-1recherche de données 11-14, 11-18

interactive 11-15options de recherche 11-18ordre des colonnes 11-20par programme 11-17

Page 297: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n d e x I-9

variants 11-20recherches multicolonnes

ordre des colonnes 11-20regroupement de ressources 5-7regroupement des données 12-11relations de données plusieurs-à-plusieurs 8-13relations de données plusieurs-à-un 8-13relations maître-détail 10-17

création 9-1, 9-10définition 9-2exemple 9-3requêtes 5-22résolution 9-11

personnalisées 8-24relations un-à-plusieurs 9-1remises

calcul 12-16remplissage des tables SQL 15-10requêtes 5-2

clause Where 10-14composants obligatoires 5-2construction 5-4contenant la clause WHERE 8-13création 15-2création avec le Modeleur de données 10-10création de requêtes paramétrées 5-13enregistrement dans des modules de données

Java 10-19enregistrement dans un module de

données 10-19exécution 15-4Group By, clause 10-13maître-détail 10-17modification directe 10-17multiples dans le Modeleur de données 10-17optimisation 7-7ordre de tri 10-16paramétrées 10-14, 10-17présentation 5-2propriétés de colonne de plusieurs tables 8-14s’assurer que les requêtes SQL sont

modifiables 5-12SQL

pilote de base de données 15-4sur plusieurs tables 8-13test 10-17visualisation des résultats 10-17

requêtes paramétrées 5-13, 10-14, 10-17ajout de colonnes 5-19exemple 5-13fourniture de nouvelles valeurs 5-22liaison des valeurs 5-21pour les enregistrements maître-détail 5-22

requêtes SQL 5-2ajout de paramètres 5-13

clause Where 10-14composants obligatoires 5-2enregistrement dans un module de

données 10-19Group By, clause 10-13maître-détail 10-17mise en ressource 5-7modification directe 10-17multiples dans le Modeleur de données 10-17optimisation 7-7ordre de tri 10-16présentation 5-2s’assurer que les requêtes SQL sont

modifiables 5-12test 10-17visualisation des résultats 10-17

résolutionexemple 8-8ProcedureResolver 8-9

résolution des données 8-1, 8-3, 8-17, 8-22gestion des erreurs 8-19par défaut 8-18personnalisation de la logique de

résolution 8-19personnalisation des événements 8-19plusieurs tables 8-12procédures stockées 8-6QueryDataSet 8-4relations maître-détail 9-11

résolution multi-table 8-12ordre de résolution 8-15

résolution personnalisée 8-19ResolutionManager, classe 8-17resolveOrder, propriété 8-12, 8-15ResolverResponse 8-19résolveurs

par défaut 8-18personnalisées 8-19, 8-22, 14-1

ressources spécifiques à la locale 5-7RMI

avec bases de données 14-1mise en flux de données 8-15

RowFilterListener, interfaceexemple 11-6

rowID, propriétéutilisation 8-15

RowIterator, classe 7-3

Ssaisie de données

modèles 12-1saisie de l’utilisateur

analyse 12-18contrôle 12-18

Page 298: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I-10 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s

saveChanges(), méthodeet propriété rowID 8-15

schemaName, propriété 8-12séquences d’échappement 6-3séquences d’échappement JDBC 6-3sérialisation des objets 8-15serveur de base de données

communication avec 2-1Serveur JDataStore

installation 4-7serveur local InterBase 4-9serveurs SQL

connexion aux 4-1connexion aux Voir SQL, connexions

setResolver 8-19SimpleStoredProcedure, exemple 6-4, 18-1sollicitation

nom d’utilisateur et mot de passe 4-16sources de données

accès 5-1connexion aux 4-2

sources de données JDBC 3-3, 5-1, 6-1à partir de fichiers texte 3-5accès 4-1enregistrement des données de fichier texte 3-5

spécification de l’ordre de résolution 8-15SQL, connexions 4-1SqlRes, classe 5-7SQLResolver

utilisation avec plusieurs tables 8-12SQLResolver, composant 8-17

personnalisation 8-18pour les ProcedureDataSet 8-6utilisation de ProcedureResolver 8-8

StorageDataSet, composantajout de colonnes vides 7-10contrôle de l’ordre des colonnes 7-11présentation 2-6présentation de l’utilisation 5-1

StorageDataSet, méthodesinsertRow() 6-12startLoading() 6-12

storageDataSet, propriété 12-23suppression

colonnes persistantes 7-9tables 15-10

surveillanceconnexions 15-11, 15-12JDBC, pilotes 15-11

synchronisation des composants 13-1synonymes

affichage des données dans 15-6

Ttableaux

enregistrement des modifications 8-3tableColumnName, propriété 8-12TableDataSet, composant

enregistrement des modifications 3-3présentation 2-7présentation de l’utilisation 3-1résolution 3-5tri dans 11-9

tableName, propriété 8-12tables

création 15-8édition des données 15-6exploration 15-1interrogation 11-2liées 8-13non modifiables 8-15remplissage 15-10suppression 15-10visualisation des données 15-6

tables de donnéesaffichage des colonnes de liaison du détail 9-10

tables détail 9-2modification 9-10

tables liéestypes 8-13

tables maître 9-2modification 9-10

tables SQLà partir de fichiers texte 3-5création 15-8enregistrement des données de fichier texte 3-5enregistrement des modifications 8-3mise à jour 8-1remplissage 15-10suppression 15-10

taux de TVAcalcul 12-16

testrequêtes 10-17

TestFrame.java, exemple 6-9TextDataFile, composant

présentation de l’utilisation 3-1récupération des données JDBC 3-3résolution 3-5

totauxcalcul 12-16

transactions 8-3traitement par défaut 8-1

tri des données 11-1, 11-9avec des outils de conception 11-11avec des relations maître-détail 9-2dans des tableaux 11-10

Page 299: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I n d e x I-11

ordre de tri 11-12par programme 11-14

tutorielsagrégations calculées 17-1application de base de données

élémentaire 17-1création des procédures stockées 18-1données agrégées avec des colonnes

calculées 17-1importation et exportation des données d’un

fichier texte 16-1JDBC, connexions 17-1visualisation des informations des colonnes 7-2

tutoriels sur les bases de donnéesagrégations calculées 17-1création des procédures stockées 18-1JDBC, connexions 17-1visualisation des informations des colonnes 7-2

types de donnéesvariant 12-28

types de données variant 12-28

UupdateProcedure, propriété 8-8URL

ajout dans le Modeleur de données 10-11ouverture dans le modeleur de données 10-11

Utilisation d’un module de données, expertprésentation 10-8

VValidationException 13-5Variant, classe

recherche de données 11-20VariantFormatter, classe 12-16vues

affichage des données dans 15-6de données 2-7

Page 300: Guide du développeur d applications bases de …dessigsi2004.free.fr/dess/CD%20ann%E9e%202002_2004/Cours...Consultez le fichier deploy.html situé dans le r épertoire redist de JBuilder

I-12 G u i d e d u d é v e l o p p e u r d ’ a p p l i c a t i o n s b a s e s d e d o n n é e s