PREMIER PROGRAMME INTERBASE
Nous allons créer une petite application qui utilisera Interbase,
elle permettra de nous familiariser avec les composants de Delphi.
DataModule
Démarrez Interbase ensuite, démarrez Delphi, créez un nouveau projet ensuite ajoutez un datamodule
Au lieu de mettre nos composants de base de donnée sur chaque forme qu'on crée, il
est possible de les mettre tous sur un DataModule. On centralise nos composants, il est
ainsi beaucoup plus aisé de gérer le tout.
Je vous rappelle ici notre schéma de table
Nous déposerons donc tous nos composants liés à notre bd sur ce DataModule.
Déposons 5 DataSource, 1 ibDataBase,5 ibDataset et ibTransaction sur le DataModule.
Le DataModule devrait ressembler à ceci après avoir mis tous les composants nécessaires
dessus et leur avoir donnée leur nom. J'ai mis qu'une transaction pour IbdVille et
IbdProvince, puisque nous allons effectuer leur transaction sur la même fiche. Le nom du
DataModule est dmGestion et sera sauvegardé sous le nom datamodule.
Lorsque nous ajouterons des formulaires au projet, pour avoir accès au composant de
base de donnée, il faudra ajouter datamodule dans le unit du formulaire.
Information des composants
Composant |
Propriété |
Valeur |
idbdLocation |
DatabaseName |
E:\divers\exemple\Exemple1.gdb |
idbdLocation |
LoginPrompt |
False |
idbdLocation |
Params |
user_name=SYSDBA password=masterkey |
dsVille |
DataSet |
ibdVille |
dsProvince |
DataSet |
ibdProvince |
dsVehicule |
DataSet |
ibdVehicule |
dsClient |
DataSet |
ibdClient |
dsLocation |
DataSet |
ibdLocation |
Composant |
Propriété |
Valeur |
ibdVille |
Database |
idbdLocation |
ibdVille |
SelectSQL |
select * from VILLE |
ibdVille |
InsertSQL |
insert into VILLE
(NOMVILLE)
values
( :NOMVILLE) |
ibdVille |
DeleteSQL |
delete from VILLE
where
NOMVILLE = :OLD_NOMVILLE |
ibdVille |
Transaction |
ibtAutres |
Composant |
Propriété |
Valeur |
ibdProvince |
Database |
idbdLocation |
ibdProvince |
SelectSQL |
select * from Province |
ibdProvince |
InsertSQL |
insert into Province
(NOMProvince)
values
( :NOMProvince) |
ibdProvince |
DeleteSQL |
delete from Province
where
NOMProvince= :OLD_NOMProvince |
ibdProvince |
Transaction |
ibtAutres |
Composant |
Propriété |
Valeur |
ibdVEHICULE |
Database |
idbdLocation |
ibdVEHICULE |
SelectSQL |
select * from VEHICULE |
ibdVEHICULE |
InsertSQL |
insert into VEHICULE
(NOVEHICULE, MARQUE, ANNEE, KM)
values
(:NOVEHICULE, :MARQUE, :ANNEE, :KM) |
ibdVEHICULE |
DeleteSQL |
delete from VEHICULE
where
NOVEHICULE = :OLD_NOVEHICULE
|
ibdVEHICULE |
RefreshSQL |
Select
NOVEHICULE,
MARQUE,
ANNEE,
KM
from VEHICULE
where
NOVEHICULE = :NOVEHICULE |
ibdVEHICULE |
ModifySQL |
update VEHICULE
set
NOVEHICULE = :NOVEHICULE,
MARQUE = :MARQUE,
ANNEE = :ANNEE,
KM = :KM
where
NOVEHICULE = :OLD_NOVEHICULE and
|
Composant |
Propriété |
Valeur |
ibdClient |
Database |
ibdbLocation |
ibdClient |
SelectSQL |
select * from CLIENT |
ibdClient |
Transaction |
ibtClient |
ibdClient |
InsertSQL |
insert into CLIENT
(NOCLIENT, NOM, PRENOM, ADRESSE, NOVILLE, NOPROVINCE, TELEPHONE,
NOPERMIS,
DATEEXPERATION, CODEPOSTAL)
values
(:NOCLIENT, :NOM, :PRENOM, :ADRESSE, :NOVILLE, :NOPROVINCE,
:TELEPHONE,
:NOPERMIS, :DATEEXPERATION, :CODEPOSTAL)
|
ibdClient |
DeleteSQL |
delete from CLIENT
where
NOCLIENT = :OLD_NOCLIENT
|
ibdClient |
RefreshSQL |
Select
NOCLIENT,
NOM,
PRENOM,
ADRESSE,
NOVILLE,
NOPROVINCE,
TELEPHONE,
NOPERMIS,
DATEEXPERATION,
CODEPOSTAL
from CLIENT
where
NOCLIENT = :NOCLIENT
|
ibdClient |
ModifySQL |
update CLIENT
set
NOCLIENT = :NOCLIENT,
NOM = :NOM,
PRENOM = :PRENOM,
ADRESSE = :ADRESSE,
NOVILLE = :NOVILLE,
NOPROVINCE = :NOPROVINCE,
TELEPHONE = :TELEPHONE,
NOPERMIS = :NOPERMIS,
DATEEXPERATION = :DATEEXPERATION,
CODEPOSTAL = :CODEPOSTAL
where
NOCLIENT = :OLD_NOCLIENT
|
Composant |
Propriété |
Valeur |
ibdLocation |
Database |
ibdbLocation |
ibdLocation |
SelectSQL |
select * from Location |
ibdLocation |
Transaction |
ibtLocation |
ibdLocation |
InsertSQL |
insert into LOCATION
(NOLOCATION, NOCLIENT, NOVEHICULE, PRIX, DATE_EMPRUNT, DATE_RETOUR)
values
(:NOLOCATION, :NOCLIENT, :NOVEHICULE, :PRIX, :DATE_EMPRUNT, :DATE_RETOUR) |
ibdLocation |
DeleteSQL |
delete from LOCATION
where
NOLOCATION = :OLD_NOLOCATION and
|
ibdLocation |
RefreshSQL |
Select
NOLOCATION,
NOCLIENT,
NOVEHICULE,
PRIX,
DATE_EMPRUNT,
DATE_RETOUR
from LOCATION
where
NOLOCATION = :NOLOCATION
|
ibdLocation |
ModifySQL |
update LOCATION
set
NOLOCATION = :NOLOCATION,
NOCLIENT = :NOCLIENT,
NOVEHICULE = :NOVEHICULE,
PRIX = :PRIX,
DATE_EMPRUNT = :DATE_EMPRUNT,
DATE_RETOUR = :DATE_RETOUR
where
NOLOCATION = :OLD_NOLOCATION
|
Composant |
Propriété |
Valeur |
ibtAutres |
DefaultDatabase |
idbdLocation |
ibtVehicule |
DefaultDatabase |
idbdLocation |
ibtClient |
DefaultDatabase |
idbdLocation |
ibtLocation |
DefaultDatabase |
idbdLocation |
Ajoutez dans la propriété params de chaque transaction le code suivant
read_committed
rec_version
nowait
Ce code permettra de voir les valeurs validées par les autres transactions
Générateur
Comme je l'ai mentionné plutôt, chaque table a un champ unique et qu'il ne peut être nul.
Nous utilisons un générateur pour incrémenter cette valeurs. Puisque que nous connaissons pas
la valeur des champs uniques devant être inséré, nous devons mettre la propriété required
de ces champs à false. Dans l'évènement AfterOpen de chaque ibDataSet, faudra donc mettre
la propriété de son cham unique à false.
Exemple
- Sélectionner ibdVille
- Aller dans l'inspecteur d'objet
- Sélectionner l'onglet Évènement
- Cliquer sur AfterOpen
- Entrer le code suivant
DataSet.FieldByName('NOVILLE').Required := False;
L'opération prédente doit être effectué pour chaque ibDataset, il suffit
de remplacer le champ NOVILLE, par le champ unique du dataset.
Formulaire
Villes et provinces
Nous allons maintenant créer les formlaires nécessaires pour l'application. La première
forme sera celle qui permettra de naviguer entre les formes. Nous parlerons plus en détails
du TDBLookupListBox dans le prochain chapitre.
Composant |
Propriété |
Valeur |
DBLookupListBox1 |
Name |
dblcVille |
dblcVille |
ListSource |
dmGestion.dsVille |
dblcVille |
ListField |
NOMVILLE |
dblcVille |
KeyField |
NOVILLE |
DBLookupListBox2 |
Name |
dblcProvince |
dblcProvince |
ListSource |
dmGestion.dsProvince |
dblcProvince |
ListField |
NOMPROVINCE |
dblcProvince |
KeyField |
NOPROVINCE |
Edit1 |
Name |
edtVille |
Edit2 |
Name |
edtProvince |
Ajout et suppresion
Dans ce formulaire, nous n'avons pas utilisé de dbnavigator. De cette façon, on pourra
apprendre commet on fait pour ajouter et effacé manuellement.
Avant d'ajouter, on va regarder s'il existe une donnée ayant la même valeur que
l'on désire insérer. Cette opération sera effectuée grâce à la méthode locate du ibDataset.
Le code suivant doit être ajouté dans l'évènement onclick du bouton ajouter (ville).
if not(dmGestion.ibdVille.Locate('NomVille',edtVille.Text,[])) then
begin
dmGestion.ibdVille.Append;
dmGestion.ibdVille.FieldValues['NomVille'] := edtVille.Text;
dmGestion.ibdVille.Post;
edtVille.Text := '';
end;
Append, insère un enregistrement vide. Ensuite on met la valeur du edit box dans le
champ Ville. Finalement, post envoit les données à Interbase.
Il faudra aussi ajouté ce code pour les provinces.
Maintenant pour effacer, il sélectionnant un item, ce dernier devient actif. Il reste
plus qu'à faire appel à la méthode delete du ibDataset
if dblcVille.SelectedItem <> '' then
dmGestion.ibdVille.Delete;
Transcation
Les transactions ont déjà été abordées précédemment. La transaction est déjà active.
Lorsqu'on quitte la fiche, on tente de sauvegarder sinon on revient dans l'état initial.
Il est préférable d'utiliser le CommitRetaining et le RollbackRetaining pour des raisons
de performances puisque la transaction demeure ouverte. En employant commit et Rollback, la
transaction doit se fermer et ouvrir de niveau ce qui pas nécessaire pour une simple mise à
jour. Adapter ce code pour les autres transactions et ajouter le dans l'évènement OnClose de
chaque form.
try
dmGestion.ibtAutres.CommitRetaining;
except
dmGestion.ibtAutres.RollbackRetaining;
end;
Véhicule
Composant |
Propriété |
Valeur |
DBNavigator1 |
Name |
dbnVehicule |
dbnVehicule |
DataSource |
dmGestion.dsVehicule |
dbEdit1 |
Name |
dbeMarque |
dbeMarque |
DataSource |
dmGestion.dsVehicule |
dbeMarque |
DataField |
Marque |
dbEdit2 |
Name |
dbeKm |
dbeKm |
DataSource |
dmGestion.dsVehicule |
dbeKm |
DataField |
Km |
dbEdit3 |
Name |
dbeAnnee |
dbeAnnee |
DataSource |
dmGestion.dsVehicule |
dbeAnnee |
DataField |
Annee |
Client
Champ persistent
On doit entrer un numéro de téléphone ainsi qu'un code postal pour un client. Ces
données ont un certain format pour qu'il soit valide. C'est là que les champs persistent
entre en action. Il est possible de
- mettre des mises en forme particulière
- d'appliquer des contraintes de saisi
- d'effectuer des validations
En effectuant de telle opération au niveau client, on évite du traffic réseau et
on personnalise d'avantage notre application.
Pour ajouter des champs persistent, il faut faire un clique droit de la souris sur notre ibdClient
Une image comme celle-ci apparaitra
Ensuite on fait un clique droit de la souris et on choisis l'option "Ajouter tous les champs"
Tous les champs sont maintenant ajoutés
Nous allons maintenant changer la mise en forme du champ téléphone.
- Sélectionner le champ téléphone
- Cliquer dans sa propriété EditMask
La fenêtre suivant s'ouvrira
La section du masque permet de définir les critères de saisi possible. Aller
dans l'aide pour de plus ample renseignement sur les codes disponibles. Si vous ne voulez
pas sauvegardé les caractère unilatéraux (dans l'exemple de tel caractère sont ()-, décochez
la case "Enregistrer les caractères unilatéraux. Ensuite vous pouvez tester votre masque
dans la section définie à cet effet.
Faire de même pour le code postal.
Il est aussi possible d'effectuer des validations sur des champs, la propriété validate
remplit cette fonction.
Composant |
Propriété |
Valeur |
DBNavigator1 |
Name |
dbnClient |
dbnClient |
DataSource |
dmGestion.dsClient |
dbEdit1 |
Name |
dbeNom |
dbeNom |
DataSource |
dmGestion.dsClient |
dbeNom |
DataField |
NOM |
dbEdit2 |
Name |
dbePrenom |
dbePrenom |
DataSource |
dmGestion.dsClient |
dbePrenom |
DataField |
PRENOM |
dbEdit2 |
Name |
dbeAdresse |
dbeAdresse |
DataSource |
dmGestion.dsClient |
dbeAdresse |
DataField |
Adresse |
TDBLookupComboBox
Je prends un petit moment pour vous expliquer d'avantage ce composant. Vous
l'avez surement remarqué, dans la table client, il y a les champs noville et noprovince.
Ces champs font naturellement références aux tables. Il faut donc trouver un moyen
d'avoir le noville de la table Ville et d'envoyer cette valeur dans le noville de Client.
Il est possible de le faire avec les TDBLookupComboBox.
On remplira le TDBLookupComboBox comme d'habitude.
Composant |
Propriété |
Valeur |
DBLookupComboBox1 |
Name |
dblcVille |
dblcVille |
ListSource |
dmGestion.dsVille |
dblcVille |
ListField |
NOMVILLE |
dblcVille |
KeyField |
NOVILLE |
La propriété ListSource permet d'identifier la source de donnée qui seront affiché dans
le contrôle. Nous utilisons le ibDataSet de Ville qui fait référence à notre table Ville.
La propriété ListField identifie le champ qui sera affiché dans le DBLookupComboBox.
Nous affichons le nom de la ville. Sachez qu'il est aussi possible d'afficher plus valeur,
il suffit de les séparer par un ";".
La propriété KeyField identifie le champ auquel sa valeur sera envoyée au datafield.
Ce champ a la valeur NoVille car dans notre table Client nous y faisons référence grace à noville.
Composant |
Propriété |
Valeur |
dblcVille |
DataSource |
dmGestion.dsClient |
dblcVille |
DataField |
NoClient |
DataSource représente la table qui va reçevoir la valeur du champ noville (propriété KeyField).
dans notre cas c'est le dataset Client.
Finalement le champ DataField, représente le champ du dataset Client qui reçevra la valeur
de la propriété KeyFiel. Cette valeur est noclient
Location
Un programme montrant les acquis est disponible
ici.
Quelques éléments du programme sont manquants, vous pouvez les ajouter et compléter votre formation.