Lodomez Olivier Résumé JBuilder 05/11/2002 Dans le JDK 1.02 l’accès à une base distante était impossible à réaliser depuis une applet. Dans le JDK 1.1 le but à été de normaliser une couche d’accès aux données. Celle-ci est connue sous le nom de JDBC (Java DataBase Connectivity) Ensuite, la norme JDBC 2.0 est apparue, elle apporte un support partiel de SQL3 L’API d’accès aux données de Java : JDBC JavaSoft a créé cet ensemble de classes et de méthodes (API) en reprenant les spécifications de Microsoft ODBC. ODBC est une interface de programmation définie par Microsoft qui permet à des applications d’accéder à des données à l’aide d’un ensemble de fonctions spécifiques. Il est ainsi possible de se connecter à des bases de données distante, d’exécuter des requêtes SQL... des procédures stockées, d’accéder aux métadonnées, … et ce, quel que soit le format du SGBD. Les bases Oracle, Informix, InterBase … peuvent ainsi être utilisées par le biais de cette technique. Il faut pour cela « passer » par ce qu’il est convenu d’appeler un driver. C’est lui qui va transmettre les ordres et commandes provenant de l’application ou l’applet Java, au serveur concerné. Si besoin est, une opération de conversion est effectuée afin de traduire les commandes dans un format compréhensible pat le server. Puisqu’un driver ODBC doit être stocké sur le poste d’exécution, une applet exécutée depuis un serveur ne peut jamais utiliser de drivers de type I (passerelle JDBC-ODBC). Rappelons qu’une applet ne peut pas, pour des raisons de sécurité, accéder au système de fichiers du poste d’exécution si elle a été chargée à partir d’un serveur distant. Les composants de la palette DataExpress La réalisation de votre application base de données va probablement passer par l’utilisation des composants de la palette dénommée DataExpress. Ces composants prendront non seulement en charge la gestion du driver JDBC, mais mettrons aussi à votre disposition des classes de plus haut niveau chargées de vous faciliter la tâche. DataExpress : dénomination commune pour un ensemble de classes et de composants qui permettent l’accès aux diverses fonctionnalités base de données définies dans JDBC. Entièrement écrits en Java, ils sont portables d’un environnement à un autre ; Leur principal intérêt est de masquer la complexité du développement JDBC. Ils permettent le codage de l’accès aux données de manière visuelle, en générant pour vous le code requis par les drivers utilisé. Par ailleurs, définis à un niveau supérieur à JDBC, ils ne sont pas liés à un format de données. 1 Lodomez Olivier Résumé JBuilder 05/11/2002 - DataBase -> Connexion à l base de données via un driver - TableDataSet -> Composant générique ne comprenant pas de mécanisme d’accès aux données. C’est en fait une coquille vide sur laquelle s’appuient les autres composants d’accès aux données. (souvent utilisé en conjonction avec un TextDataFile) - TextDataFile -> Destiné à manipuler des fichiers texte, ce composant sert aux opérations d’importation et d’exportation de données. - QueryDataSet -> Composant destinés à la gestion et à l’exécution des requêtes SQL. Il est à remarquer que c’est le seul composant disponible pour accéder à une table - … Schéma d’ensemble de l’accès aux données 1. Se connecter à la base de données avec le composant DataBase 2. Exécuter une requête SQL pour accéder à la source de données (QueryDataSet) 3. Visualiser les données via les composants de la JBCL ou dbSwing Etape 1 : Se connecter à la Base de Données [Le composant DataBase] La connexion à la base est la première étape à mettre en œuvre pour développer une application ou une applet avec des bases de données La connexion est toujours réalisée par l’intermédiaire d’un composant DataBase. La première opération à réaliser est de placer un composant de ce type dabs la ficher qui va contenir els données. Comme tous les composants de la palette DataExpress Ce composant est de type non visuel : il n’apparaîtra pas dans la fiche. Il vous faudra le sélectionner dans l’arbre des composants du navigateur d’applications. Pour définir la connexion à la base de données, il faut positionner la propriété connexion de ce composant. accéder à la base de données besoin de renseigner des paramètres 2 Lodomez Olivier Résumé JBuilder 05/11/2002 Driver : toute connexion s’effectue par le biais d’un driver Connexion URL : la base à laquelle vous allez vous connecter est toujours identifiée par une URL Nom d’utilisateur : Lorsque vous demandez une connexion à un serveur de bases de données, il faut vous identifié afin de vérifier si vous avez le droit d’accéder aux données. Il détermine aussi les règles d’accès qui vous concernent : lecture, lecture et écriture, restrictions diverses … Ce champ contient le nom qui sera transmis au serveur à l’initialisation de la connexion afin de vous identifier. Mot de passe : En association avec el nom d’utilisateur, une connexion sur un serveur nécessite un mot de passe afin de déterminer vos droits d’accès à la base de données. Le tandem InterClient / InterServer Borland a implémenté l’accès direct à InterBase sous la forme d’un driver de type III Celui-ci se compose de deux modules InterClient : Situé sur le poste client, c’est un ensemble de classes écrites en Java destinées à prendre en charge le dialogue entre l’application (ou l’applet) et InterServer InterServer : Cet outil joue le rôle d’interface entre les appels JDBC de l’application qui lui sont transmis par InterClient et les appels natifs à la base de données. Cette base peut être indifféremment locale ou distante. InterClient : implémente la quasi-totalité de la norme JDBC ainsi qu’un ensemble de points spécifiques à InterBase : cela afin de garantir des performances optimales. L’accès à InterBase via InterClient permet à une applet d’accéder à une base de données sans pour cela se préoccuper du système d’exploitation ni de la configuration du poste d’exécution. 3 Lodomez Olivier Résumé JBuilder 05/11/2002 En effet une solution 100 % Java permet de garantir la portabilité d votre code et de faciliter la phase de déploiement. Dans ce cas, rien ne doit être préinstallé sur le poste client, ce qui permet d’affirmer la supériorité de cette solution par rapport à l’utilisation de drivers de type I ou II InterServer : Son rôle est de convertir tous les appels d’InterClient en commande directement compréhensible par InterBase. C’est en fait un processus qui s’exécute sur l’ordinateur qui contient la base de données. Dans le cas d’une applet, il s’agit très souvent du Serveur Web. Principe de fonctionnement 1. 2. 3. 4. 5. 6. 7. 8. 9. L’utilisateur requiert le chargement d’une page HTML Cette page lui est expédiée vers le protocole http Une applet référencée dans la page est transférée sur son poste le code de l’applet s’exécute sur le poste de l’utilisateur, et la référence au driver InterClient provoque son transfert à partir de ce même serveur Web. InterClient s’exécute à partir de l’applet et établit un dialogue avec InterServer, situé sur le serveur Web InterServer, à son tour va se connecter à la base de données InterBase et demander l’exécution d’une requête SQL l’ensemble de données résultant est transmis au poste client par l’intermédiaire d’InterServer et d’InterClient. le programme s’exécute et l’utilisateur manipule les données présentées. Lors du déchargement de l’applet, le driver InterClient est supprimé du poste client. Etape 2 : Exécuter une requête de sélection pour obtenir une source de données [Le composant QueryDataSet] Moyen indispensable pour accéder à des informations, une requête est une commande , un ordre envoyé à un serveur afin d’obtenir des informations. Ces demandes sont exprimées dans un langage universel compréhensible quel que soit le serveur utilisé, c’est-à-dire en SQL. A partir de JBuilder, il existe deux techniques différentes pour exécuter une requête - utiliser directement les classes de JDBC Par le biais des composants du DataExpress utilisés sous la forme de ligne de codes Java ou visuellement depuis le concepteur graphique d’interface. Avec JBuilder il est impossible de visualiser une table sans passer par l’exécution d’une requête. Présentation du composant QueryDataSet Le composant QueryDataSet est l’un des constituants essentiels du Borland DataExpress. Il a pour but d’exécuter une requête sur un serveur ; 4 Lodomez Olivier Résumé JBuilder - 05/11/2002 transmission d’une requête SQL à un serveur de base de données récupération des données résultantes et mise à disposition de ces données pour les autres composants du DataExpress. La boîte de saisie de requêtes Cette boîte constitue le principal outil d’aide à la saisie de requêtes du DataExpress. Une fois la requête définie, il est préférable de la valider en essayant de l’exécuter. Etape 3 : Visualiser les données Les quatre bibliothèques de classes disponibles pour visualiser des données sont : AWT Swing dbSwing JBCL Les composants WAT Les composants de la palette WAT sont très intéressants dans le cadre du développement d’une applet Java, car ils offrent un avantage unique : basée sur le JDK 1.02, les applets sont toujours correctement exécutées par le navigateur, indépendamment de sa version . L’unique avantage de l’utilisation d’AWT dans le cadre d’un développement base de données est d’alléger la phase de déploiement. Effectivement, aucune bibliothèque particulière ne doit être déployée sur le poste d’exécution puisque tous les composants WAT sont intégrés à la machine virtuelle. 5 Lodomez Olivier Résumé JBuilder 05/11/2002 La bibliothèque Swing Cette bibliothèque présente l’avantage indéniable de se trouver directement dans la machine virtuelle destinée à exécuter vos programmes Java Les composants dbSwing Développés par Borland les composants de la palette dbSwing constituent une extension de la bibliothèque Swing. La plupart des composants originaux de Swing on été repris dans cette palette. Borland leur a ajouté une liaison automatique vers les données. Pour cela les propriétés dataSet et columnName sont intégrées dans chaque composant dbSwing : la liaison s’effectue par rapport aux composants du DataExpress La bibliothèque JBCL Dans la palette JBCL se trouve un ensemble de composants capables d’afficher directement des données en provenance d’une base de données. Questions-réponses Q Les composants TableDataSet et QueryDataSet me semblent destinées respectivement à visualiser une table et le résultat d’une requête est-ce vrai ? R Non. Si QueryDataSet permet effectivement d’exécuter une requête SQL, le composant TableDataSet a un autre rôle. Il s’agit d’un composant « libre » personnalisable à souhait. Il n’intègre pas en standard de mécanisme d’acquisition de données. Il permet uniquement l’affichable de données. C’est une sorte de coquille vide qui permet ensuite de définir de nouveaux composants personnalisés. On va préférer dbSwing à JBCL Composants dbSwing Utiliser la grille de saisie jdbTable Pour utiliser ce composant, uniquement positionner la propriété dataSet pour identifier la source de données à présenter dans la grille. Un certain nombre de comportements standards sont intégrés automatiquement dans une grille de saisie dbSwing 6 Lodomez Olivier Résumé JBuilder - 05/11/2002 Saisie directe dans la grille Redimensionnement horizontal et vertical des colonnes Réorganisation des colonnes et définition d’un ordre de positionnement dynamique Les contrôles standards : zones de texte, boutons radio, etc. Il s’agit de présenter des données en provenance d’une table dans des zones de texte (lecture seule, multiligne, formats …) de visualiser une valeur booléenne ou numérique dans une case à cocher ou un bouton radio ou encore de saisir une valeur numérique dans un contrôle de type glissière. jdbLabel : Destiné à l’affichage de champs en provenance d’une table, ce composant présente des informations mais ne permet pas leur modification (lecture seule) 7 Lodomez Olivier Résumé JBuilder 05/11/2002 jdbTextField : A l’inverse du jdbLabel, l’utilisateur pourra saisir la valeur du champ associé à ce composant. Il sert également pour la saisie de données numériques mais n’associe pas automatiquement un système de filtrage des caractères saisis. jdbTextArea : Zone de texte multiligne jdbTextPane : Ce composant fonctionne comme un jdbTextArea mais propose en plus la gestion de multiples couleurs et polices de caractères au sein d’une même zone de texte. Utiliser les zones de liste jdbList : ce composant propose la sélection d’une valeur dans une liste à sélection simple Les indispensables : navigateur et barre de status Deux composants sont prévus pour « habiller » vos applications. Ils permettent d’ajouter rapidement un navigateur et une barre de status dans votre programme, en liaison avec un ensemble de données. La liaison effective avec la source de données est réalisée automatiquement : les composants jdNavToolBar (barre de navigation) et jdbStatusLabel (barre de statuts) référencent d’eux-mêmes la source de données présente dans la fiche courante lorsque vous les placez dans une fiche. Localiser un enregistrement : jdbNavField Destiné à la recherche de valeurs sur un enregistrement, ce composant fonctionne de deux façons différentes : fixe la propriété columnName à un champ de l’ensemble des données, les recherches sont effectuées uniquement sur la colonne correspondante. 8 Lodomez Olivier Résumé JBuilder 05/11/2002 Si la propriété columnName n’est pas affectée, la colonne de l’ensemble de données sur laquelle porte la recherche est celle qui disposait du focus avant l’accès à ce composant. Définir les colonnes d’un ensemble de données Amélioration de la présentation standard des informations en définissant des fioritures : masques de saisies, format, longueur des zones … Pour définir ce genre d’attribut, il faut utiliser les objets spécifiques au DataExpress qui représenteront les différentes colonnes de données de votre table. Il s’agit des objets de la classe Column qu’il faut associer aux champs de la source de données. Ces objets colonnes décrivent le type de la donnée, des options ou préférences d’affichage, des contraintes, des valeurs par défaut … Un objet Column est associé, non pas à une vue d’une table, mais plutôt aux méthodes d’accès à l’information. Possibilité de définir les colonnes d’un ensemble de données : en laissant agir le DataExpress -> Lorsque la requête est exécutée, les colonnes sont créées automatiquement. A l’exécution d’une nouvelle requête (associée au même objet QueryDataSet) les objets précédents sont détruits puis recréés afin de refléter les changements éventuels de la table réponse. - En Créant des colonnes directement dans le code Java -> Ces objets sont ensuite figés et réutilisés lors des exécutions successives de la requête. Ces colonnes seront dites persistantes 9 Lodomez Olivier Résumé JBuilder 05/11/2002 Les métadonnées Les informations contenues dans les objets et colonnes sont appelées métadonnées : ce sont des données sur les données de la table. Les métadonnées sont obtenues dès l’ouverture de l’ensemble de données. JBuilder envoie une requête au serveur SQL afin d’obtenir des informations sur les données que va lui retourner la requête suivant (celle qu’on a définie dans le composant QueryDataSet lors du développement). Ce mécanisme est nécessaire à la bonne manipulation de données de la table. Les métadonnées sont toujours stockées dans des objets de la classe Column. Elle sont ensuite utilisées par tous les composants du DataExpress. Le principe d’acquisition de métadonnées Lorsque dans du code Java, on exécute une requête à travers un composant QueryDataSet JBuilder envoie deux requêtes au serveur. La première consiste à obtenir les métadonnées sur la table résultante. Dans certains cas, cette phase peut correspondre à l’exécution de plusieurs requêtes. La seconde correspond à la requête que vous avez spécifiée dans le QueryDataSet : elle va effectivement demander (et obtenir) les informations qui nous seront présentées. La classe Column La classe Column sert principalement à stocker des métadonnées sur une table réponse. Les colonnes persistantes Une colonne persistante est une colonne dont le paramétrage va persister (rester identique) entre plusieurs exécutions de la requête associée : ce qui permet de conserver sur certaines colonnes le paramétrage effectué lors du développement : couleur, titre, police... Une colonne 10 Lodomez Olivier Résumé JBuilder 05/11/2002 non persistante ne conserve pas son paramétrage entre deux exécutions. Lorsqu’une requête est exécutée sur un serveur, le DataExpress régénère tous les objets colonnes : ainsi, les valeurs précédentes sont perdues. Pour rendre une colonne persistante, positionnez sa propriété (setpersist(true)) avant l’exécution de la requête associée. Lorsqu’une requête est exécutée, l’objet QueryDataSet commence par détruire de la mémoire toutes les colonnes non persistantes pouvant exister. Les colonnes persistantes sont ainsi placées en tête de liste. La requête est exécutée et les colonnes non persistantes sont créées puis placées à la suite des précédentes. Définir un masque de saisie Lors de la saisie d’un champ, il est intéressant de contrôler précisément la valeur entrée par l’utilisateur. A cette fin, JBuilder propose d’associer un masque de saisie à un objet Column. Ce masque est en fait une chaîne de caractère qui définit le format de la donnée, format à respecter par l’utilisateur lors de la saisie. Si sa valeur ne correspond pas au masque, la donnée ne peut pas être validée dans la base. En, fat l’utilisateur ne peut pas sortir du champ de saisie. Pour affecter un masque à un champ d’une table, utilisez la propriété editmask de la classe Column. 11 Lodomez Olivier Résumé JBuilder 05/11/2002 Créer de nouveaux champs : les champs calculés Comment définir la valeur d’un champ d’après une combinaison de la valeur des autres champs d’un enregistrement ? Comment cumuler les valeurs d’une colonne ? Comment afficher le nombre de champs qui contiennent une valeur précise ? Etc. La réponse à toutes ces questions est la même : en définissant de nouvelles colonnes dans la table spécialisée dans le genre de problème. Ces colonnes virtuelles sont appelées champs calculés Un champ calculé est un champ qui n’a pas de correspondance physique dans la table réponse. Il s’agit d’une colonne dont la valeur est calculé par votre programme, juste avant d’afficher les informations de la table. JBuilder supporte deux types de champs calculés : Le champ résulte d’un calcul utilisateur (1) : Le programme est responsable du calcul de la valeur à afficher dans le champ. 12 Lodomez Olivier Résumé JBuilder 05/11/2002 Le champ est une agrégation (2) : La valeur est calculée, le plus souvent automatiquement, à partir d’un groupe d’enregistrement du même ensemble de données. Dans ces deux cas, le principe de mise en œuvre commence de la même façon : vous devez créer une nouvelle colonne dans l’ensemble de données et la rendre persistante. Définir un champ calculé (1) La valeur de ce champ résulte d’un calcul utilisateur qui doit être effectué dans votre code Java. 1. Positionnez la propriété calcType à calculated. 2. Interceptez l’évènement calcFields au niveau de la table à partir de l’onglet Evènement de l’inspecteur de propriétés La méthode associée est ensuite appelée pour chaque enregistrement de la table. Si un enregistrement est modifié ou inséré, cette méthode est aussi appelée afin de rafraîchir la valeur affichée. 3. Codez dans cette méthode la règle de calcul de ce champ. Les agrégations de champs (2) L’agrégation consiste à définir un champ dont la valeur est identique pour plusieurs enregistrements d’une table. Elle est calculée d’après l’ensemble des lignes de ce groupe d’enregistrements. Cet ensemble de lignes est groupé selon la valeur d’un champ particulier. En fait, un groupe est un ensemble d’enregistrements dont un champ possède une valeur identique. Ce champ est dit champ de groupage. Méthode de réalisation : 1. A partir d’un objet de type DataSet (SELECT * FROM ventes), définir un champ calculé en positionnant la propriété calcType à aggregated. 2. Lancez la boîte de paramétrage de ce champ en cliquant sur la propriété agg de la nouvelle colonne. 3. A partir de cette boîte, placez dans al liste de gauche intitulée groupement des colonnes, les champs dont les valeurs seront groupées. 4. Définissez le champ d’agrégation dans la liste déroulante intitulée Colonne agrégation. C’est le champ utilisé dans le calcul, c’est-à-dire QUANTITE (dans l’exemple du livre). 13 Lodomez Olivier Résumé JBuilder 05/11/2002 5. Choisissez le type de calcul à réaliser sur ce champ. CountAggOperator : Nombre d’éléments dans le groupe MaxAggOperator : Valeur maximale du champ dans le groupe MinAggOperator : Valeur minimale du champ dans le groupe SumAggOperator : Somme du champ pour tous les enregistrements du groupe 6. ensuite, lors de l’exécution de ce programme, la colonne sera visualisée de la même façon que les autres champs de la table. Cependant sa valeur sera identique pour tous les enregistrements du groupe. Aide à la saisie : les champs de références JBuilder propose de simplifier la saisie de certaines valeurs en définissant ce que l’on appelle des champs de références. Il s’agit de proposer à l’utilisateur une liste finie d’éléments dans laquelle il sélectionne une valeur. En fait l’aide à la saisie consiste à présenter à l’utilisateur la liste des différentes valeurs possibles pour le champ courant, dans le but de lui épargner la saisie répétitive d’informations identiques. La propriété pickList de la classe Column est destinée à gérer les références. La propriété pickList Vous pouvez positionner pour toute colonne d’un ensemble de données, la propriété pickList afin de définir la liste des valeurs possibles lors de la saisie de ce champ. A l’exécution, l’utilisateur disposera d’une liste déroulante contenant les différentes valeurs du champ. Les éléments présents dans la liste résultent de l’exécution d’une requête SQL. Exécution de code SQL à partir de JBuilder La méthode executeStatement() de la classe DataBase permet d’envoyer une requête SQL, quelconque à une base de données. Il peut s’agir d’ordres d’insertion ou de modification de données, de commandes de définition de données telles que la création de tables ou de vues, ou encore de la gestion de transactions et de droits d’accès. Utiliser les paramètres dans les requêtes SQL Il est ainsi possible de rechercher des données par rapport à un critère variable. La valeur de ce paramètre est le plus souvent positionné par programme juste avant l’exécution de la requête. Un paramètre d’une requête est préfixé par le symbole « : » Par exemple :NUMERO CLIENT. :NOM ou :CODE 345 sont des noms de paramètres correct 14 Lodomez Olivier Résumé JBuilder 05/11/2002 Il n’y a pas de nombre maximal de paramètres dans une requête Les paramètres sont obligatoirement placés dans la clause WHERE de la requête Les types définis pour les paramètres doivent correspondre aux types des champs de la requête Presque tous les types de champs peuvent être paramétrés. En fait, seuls les champs Blobs (images, sons, textes formatés de taille variable …) posent problème Le composant ParameterRow permet de définir les paramètres d’une requête. Tous les paramètres d’une même requête sont positionnés dans un seul objet de ce type 1. définir une requête contenant un ou plusieurs paramètres 2. Placez un composant ParameterRow dans la fiche depuis la palette du DataExpress 3. Ajoutez à ce composant tous les paramètres de la requête. La démarche est identique à celle qui est utilisée pour définir les champs persistants d’une requête 4. pour chaque paramètre, définissez obligatoirement son nom et son type. Ils doivent concorder avec ceux qui sont définis dans le texte de la requête 5. liez les paramètres à la requête 6. Spécifiez une valeur pour chaque paramètre à l’aide de votre programme Java 7. Exécutez la requête Acquisition / résolution de données Le DataExpress solution Borland pour l’accès aux bases de données est fondé sur les notions suivantes : Provider/Providing : acquisition de données depuis une base de données. Le transfert des données physiques vers un objet de la classe DataSet ou dérivé est appelé providing. L’objet contenant les données est le provider. Modification des données : par l’utilisateur d’une application ou d’une applet Resolver / Resolving : toutes les modifications effectuées dans une application sur l’ensemble de données sont envoyées au serveur. Cette phase est appelée resolving. L’outil ou le composant utilisé est dit resolver. Acquisition des données : les classes DataSet La classe DataSet est la classe de base de tous les composants d’accès aux données DataSet : Cette classe englobe toute la logique d’accès aux différents types d’ensembles de données. Etant abstraite cette classe ne peut jamais être instanciée. Il faut obligatoirement utiliser une classe dérivée. 15 Lodomez Olivier Résumé JBuilder 05/11/2002 StorageDataSet : implémente la gestion du stockage physique de données. La manipulation des colonnes de données ainsi que les procédures d’acquisition et de restitution QueryDataSet : Cette classe est liée à l’exécution d’une requête DataSetView : Cette classe permet de réaliser une vue logique à partir d’un objet StorageDataSet. Lorsqu’une application requiert la visualisation simultanée des mêmes données selon plusieurs critères, filtres ou tris, quelques objets DataSetView sont définis avec chacune des propriétés différentes liées à la présentation des données. TableDataSet : Cette classe correspond à un ensemble de données dont le type n’est pas prédéfini. Rien n’existe pour acquérir les données, les classes dérivées sont responsables de ce travail. ProcedureDataSet : Destiné à exécuter des procédures stockées, cette classe est l’une des méthodes d’acquisition de données liée à la norme JDBC. La classe QueryDataSet Destinée à exécuter des requêtes SQL de sélection Column : Contient les objets représentant les colonnes de la table DataFile : Fichier de donnée utilisé pour les opérations d’importation/exportation Query : Définition de la requête SQL 16 Lodomez Olivier Résumé JBuilder 05/11/2002 CallAggAdd : Calcul des colonnes de type agrégation CalcFields : Calcul des champs calculés de l’enregistrement courant DataChanged : indique qu’un enregistrement vient d’être changé DataLoaded : signale qu’un composant StorageDataSet vient d’être chargé Présenter plusieurs vues d’un même ensemble de données : DataSetView Mise en œuvre des vues logiques indépendantes des données physiques Visualiser plusieurs fois des données identiques avec des critères de tris ou de filtres différents -> DataSetView 1. Placer le composant d’accès aux données (QueryDataSet) dans la fiche et définissez la requête SQL 2. Définir un DataSetView pour chaque vue logique de ces données 3. Saisir l’ordre de tris, critères de filtres… à l’aide des propriétés des objets DataSetView. Il s’agit de positionner les propriétés de ce composant comme s’il s’agissait d’une vue de données classique. 17 Lodomez Olivier Résumé JBuilder 05/11/2002 Contrôler les modifications : la résolution des données La résolution des données est la technique qui consiste à reporter les modifications effectuées sur les données dans les tables de la base de données. Lorsqu’une requête est exécutée JBuilder détermine si elle peut être résolue avec les mécanismes standards. S’il ne peut pas utiliser une méthode de résolution prédéfinie, il va empêcher l’utilisateur de modifier les données en plaçant automatiquement la source des données en lecture seule. Pour qu’une table soit toujours modifiable quelles que soient les déductions faites par JBuilder, effectuez les opérations suivantes : Positionnez la propriété updateMetaData à la valeur aucun Définissez tous les champs clés qui doivent être définis dans la requête en tant que colonnes persistantes Indiquez qu’il s’agit de champs clés en modifiant la propriété rowID Le composant QueryResolver Ce composant a pour but de contrôler la résolution des données directement au niveau de l’envoi des commandes SQL. Il s’intercale entre le composant QueryDataSet et le driver d’accès à la base de données. Il contrôle les informations envoyées à la base : aucune modification ne peut être validée sans un accord préalable de ce composant. Les composants ProcedureResolver Permet de définir le code SQL réalisant la mise à jour effective des données. Un composant ProcedureResolver sert à plusieurs opérations Pour contrôler le code SQL exécuté lorsqu’une résolution de données intervient. Chaque traitement peut être défini sous la forme d’une procédure stockée et chaque appel à l’un de ces traitements doit être défini explicitement. Pour modifier certaines tables que JBuilder ne sait pas résoudre par lui-même. Par exemple, si l’une des tables de la requête est une vue. JBuilder ne peut pas utiliser les mécanismes de résolutions standards, car il ne fait pas la distinction entre une vue et une table. La vue ne pourra pas être modifiée, puisqu’elle résulte déjà de la composition de plusieurs tables. Le composant ProcedureResolver permet de personnaliser la méthode de résolution ainsi, l’utilisateur peut modifier les données. 18 Lodomez Olivier Résumé JBuilder 05/11/2002 19