
ARRETE D'AGREMENT N° 0046/MFPRE/CAB
TEL. : (00242) 989 18 89 / 763 48 37 / 413 94
03
POUR L'OBTENTION DU DIPLÔME DE MASTEUR
SPECIALITE : INGENIERIE DES SYSTEMES
D'INFORMATIONS
Présenté et soutenu publiquement par : sous la
direction de :
Guelor IBARA NGATSE Docteur Aimé Onésime KASUYI
Etudiant Professeur
Année Académique : 2009-2010
d
DEDICACE
Je dédie ce mémoire à mes très chers
parents et tous ce qui m?ont soutenu tout le long de ces années
d?études. En particulier :
> A mon père et ma mère qui m'ont
présenté les sacrifices nécessaires durant toute ma vie
;
> A mes frères et soeurs, sans oublier mes amis qui
m'ont soutenu par leurs encouragements durant la rédaction de la
mémoire.
REMERCIEMENT
Nous remercions Dieu, l?être supreme qui nous a
donné la sagesse et l?intelligence d?élaborer ce travail.
Nous adressons aussi nos remerciements aux personnes qui ont
contribué à la réalisation de ce projet d?étude en
informatique. A savoir :
+ le Docteur Aimé Onésime KASUYI, Directeur
Général de l?Ecole de Génie Industriel et Directeur de mon
mémoire, pour m?avoir permis de travailler avec autonomie et conseiller
pour la réalisation de travail;
+ Monsieur Arsène TOUKOKANI, le promoteur Directeur
Général pour l?ouverture du cycle de master dans son Institut
;
+ Mes parents pour leur soutien à ma réussite ;
+ Enfin, à tous ceux qui de près ou de loin ont
contribué à la réussite de ce mémoire.
ACRONYMES
ADO : Activex Data Object
AGP : Application Generator Program (Le programme du
générateur
d?application)
API : Interface de programmation (Application Programming
Interface) BASIC : Beginner s All-purpose Symbolic Code
BD : Base de données (Database)
CLR : Common Language Runtime
CISC: Complexe Instruction Set Code
COM: Common Objet Oriented Model
DOS: Disk Opening System
DAO: Data Acces Object
PC : Personal Computer (Orditeur Personnel) L4G : Langages de
quatrième(4) Génération MCD : Modèle Conceptuel de
Données
MLD : Modèle Logique de Données
MPD : Modèle Physique de Données
NET : Normes Europeennes de Télécommunication ODBC:
Open Data Connectivity
OFA: Optimal Flexible Architecture
RIST: Ristructed Instriction Set Code
RAD: Rapid Application Development
SE: Système d?Exploitation (Operating System) SGBD:
Système de Gestion de Base de Données SGBDR: Système de
Gestion de Base de Données Relationnel
SQL: Structured Query Language
VB : Visual Basic
WEB: Wide Area Web WWW: Word Wild Web XP :
eXPerience
AVANT-PROPOS
Aujourd?huit, la programmation a eu des outils permettant aux
programmeurs de concevoir et de livrer des applications plus rapides, dans le
délai fixées avec les utilisateurs. Très souvent, le
produit fini ne repond pas aux critères d?acceptabilité, quand
bien même il produit les résultats attendus. Il faut aussi noter,
qu?une application est rarement maintenue par ceux qui l?on
dévéllopée.
Pour reléver ce défi, une solution est mise en
oeuvre. Il faut depasser le niveau de la conception, de la programmation. C?est
l?optimisation. Ce sera de cela que nous parlons tout au long de ce travail de
fin d?études.
SOMMAIRE
DEDICACE
REMERCIEMENT
ACRONYMES
AVANT-PROPOS
INTRODUCTION GENERALE
Présentation du sujet
Interêt du sujet
Problématique
Délimitation du sujet
Subdivision du sujet
Méthodologie
Présentation du sujet
Justification du choix du sujet
PREMIERE PARTIE : Généralités
Chapitre I : Matériel
Chapitre II : Système d?Exploitation
Chapitre III : Base de données
Chapitre IV : Langage de programmation
DEUXIEME PARTIE : Optimisation de la base de
données
Chapitre I : Modèlisation de données
ChapitreII : Principes de l?optimisation de la base de
données
ChapitreIII : Méthode de l?optimisation de la base de
données
Chapitre IV : Optimisartion du SGBDR :
TROISIEME PARTIE : Optimisation du code
Chapitre I: Optimisation des variables
Chapitre II : Optimisation sur les nombres
Chapitre III : Optimisation des tests
Chapitre IV : Optimisation sur les chaînes
Chapitre V : Optimisation des boucles
Chapitre VI : Compulation de l?application
QUATRIEME PARTIE : Etude de cas :
Chapitre I : Présentation de la base de données
oracle
Chapitre II : Présentation de l?application
CONCLUSION
ANNEXE
BIBLIOGRAPHIE
TABLE DES MATERIELS

8
INTRODUCTION GENERALE
Dèpuis que les logiciels sont devenus des
marachandisses (c'est-à-dire un produit logiciel) à vendre. Les
concepteurs doivent fournir les éfforts pour que les livrables repondent
aux normes. On constate en général que beaucoup des devellopeurs
n?ont pas conscience de cette nécessité. Plus grave, les
entreprises qui achètent les logiciels, manquent elles-mêmes aussi
les connaissances pour exiger le respect des normes. Pour resoudre ce
problème, les applications écrites doivent subir le test
d?optimisation. Nous nous efforcerons tout au long de ce travail d?apporter les
solutions permettent d?améliorer les qualités des
applications.
I-INTERET DU SUJET
L?intérêt de notre mémoire est de fournir
aux dévéloppeurs des applications, aux auditeurs des
systèmes informatiques et aux directeurs informatiques ou tout
simplement aux décideurs, les informations pouvant leurs permettre
d?améliorer les performances d?une application informatique.
II-PROBLEMATIQUE
Faire tourner une application tient plus aux qualités
et aux reflèxes du programmeur. En faire un produit commercial avec des
qualités compétitives sur le marché est une autre paire de
mauche. Comment une application qui est en compétition avec les autres
applications peut devenir meilleure tout en donnant les mêmes
résultats ?
III-DELIMITATION DU TRAVAIL
Notre travail, ce limitera à améliorer les
performances d?une application en agissant seulement au niveua de la base de
données et sur le code de celle-ci.
Nous savons qu?il est possible d?agir aussi bien sur le
matériel que sur le système d?exploitation, mais ces aspects ne
feront pas l?objet de notre mémoire.
IV- SUBDIVISION DU TRAVAIL
Ce mémoire est subdivisé en 6 parties qui sont : v'
Introduction

v' Généralité
v' Optimisation de la base de données v' Optimisation du
code
v' Etude de cas
v' Conclusion
V-METHODOLOGIE
Pour améliorer les performances d?une application, il
nous est nécessaire de décrire les spects pouvons conduire
à l?optimisation de cette application en partant de sa base de
données jusqu'à son code source.
C?est ainsi que, nous devons faire recours dans aux deux methode
à savoir : -méthodes de la recherche scientifique pour les
aspects rédactionnels ;
- méthodes informatiques (RAD) pour les aspects techniques
spécifiques ;
VI-PRESENTATION DU SUJET
L'optimisation au sens strict du terme est un très
vaste sujet. Il est cependant un ensemble de logique visant la performance
.Plusieurs aspects d'un programme informatique peuvent être
optimisés. Certes, On peut par exemple réduire l'empreinte
mémoire du matériel, augmenter la vitesse d'exécution du
système d?exploitation, Reduire le temps de réponse de la Base de
données en utilisant les routines du SGBD... Cependant, nous ne nous
m'intéresserons ici qu?à l'optimisation du code d?une application
et a celui une base de données qu?elle attaque.
VII-JUSTIFICATION DU CHOIX DU SUJET
Dans la plupart des applications informatiques, on trouve
toujours les données et les traitements qui permettent son
fonctionnement, quel que soit la plate forme matérielle ou logicielle
utilisée...
Il est possible de faire l?optimisation au niveau materiel, du
système d?exploitation ou alors sur toute une application. Nous avons
choisi de parler du dernier aspect qui fait lui-même appel à
l?optimisation de la base de données et du code.

Introduction
La première partie de ce mémoire, parle d?une
manière générale de l?optimisation. Cette
généralité, fait un tour d?horison du concept, partant du
materièl, du système d?exploitation, en suite de la base de
données et enfin du langage de programmation.
C?est une sorte d?état de lieu des connaissances actuelles
sur les éléments qui de près ou de loin intervenienent
dans ce travail. Nous conprenons dès lors que l?optimisation peut se
faire à plusieurs niveaux.

12
Chapitre I : Niveau Matériel
Notre travail s?inscrit dans le cadre de la
micro-informatique. Les Micro-ordinateurs communement applellé Personal
Computer se regroupent en deux familles. Il s?agit des : PC compatibles IBM et
les non Compatibles.
L?architecture des compatibles IBM est bâtie autour du
microprocesseur de la famille X86 de la société leader est INTEL.
les non compatibles sont bâtis autour de l?architecture motorola.
En termes de technologie, INTEL est base, sur la logique CISC
(Complexe Intruction Set Code), alors que motorola est basé sur la
logique RISC (Restricted Intruction Set Code). Par conséquent, les
équipements dits non compatibles sont à 75% hardwares et les
équipements dits compatibles sont à 35 % hardwares. Il en
découle que dans l?environnement RISC, les machines sont plus
performantes en terme de temps de reponse par ce qu?il y a beaucoup de circuits
spécifiques sur la carte mère. On a de ce fait, pas besoin de
beaucoup de mémoires ni beaucoup de logiciels. Par contre, dans
l?environnement CISC on a besoin de toujours, plus de la mémoire, plus
de puissance de processeur. Il en découle que la plupart du temps les
logiciels de bases deviennent très vites obsoletes.Cela vous oblige
regulièrement, à changer de système d?exploitation, des
barrettes mémoires et de disque dure pour remédier ou maintenir
les performances du matériel. Malhereusement, ce sont les machines de
cette famille qui sont le plus repandu à tel point que les langages de
programmations que nous utilisons sont conçus pour cet environnement.
Les débats autours de l?optimisation par rapport
à l?aspect matériel exigent donc des très bonnes
connaissances de l?architecture de microprocesseur, un débat qui risque
de sortir du cadre de notre étude.

Chapitre II : Niveau Système d?Exploitation
Le Système windows est un système d?exploitation
base disque, ce qui entraîne plusieurs opérations
d?entrées/sorties avec pour résultal les ralentissements
progressifs de tous les logiciels en général et du système
d?exploitation en particulier.
Pour ainsi dire, dans l?environnement windows (MS-DOS), plus
vous ajoutéz des programmes ou encore des fichiers, le temps de
réponse augmente. Pour remédier à cette situation, il est
conseillé de faire regulièrement des opérations de
maintenances préventives parmi lesquelles il y a des procédures
d?optimisations du système tel que le nettoyage du disque, le scanage de
la surface du disque, ainsi que la défragmentation. Ces
opérations relèvent plus de l?administration du système
d?exploitation ou encore de la maintenance préventive que de la
maintenance applicative.
De manière ramassée, nous dirons qu?il y a quatre
opérations essentielles à retenir :
-la gestion de la mémoire virtuel ; - Le nettoyage du
disque dur ;
- Le scannage du disque;
- La défragmentation.
1- La Gestion de la mémoire Virtuelle
Le système d?exploitation met à la disposition
des applications une mémoire dite virtuelle. Celle-ci acroite l?espace
mémoire reservé, permettant aussiaux applications de
donner les meilleures performances lors des traitements et des accès
à la base de données.
Dans le cas du système d?exploitation Unix ou Linux
par exemple, la mémoire virtuelle est representée par le fichier
SWAP. Pour le cas de windows, une partie du disque dur est allouée
à cette fin, que lui-même va gérer comme la mémoire
virtuelle de taille variable.
2- Le Nettoyage du disque dur
Le nettoyage du disque doit être fait après
chaque installation de programme ou après une période
donnée selon le volume de travail. En effet, lors des installations des
logiciels, les fichiers transitoirs appelés fichiers temporaires sont
crées et que l?administrateur du système doit

14
supprimer à la fin de l?installation. Il y a aussi des
fichiers de télécharchements des programmes web qu?il faut
nettoyer à la fin de la navigation sur internêt. En termes
simples, l?utilitaire de nettoyage du disque vous permet de faire les
opérations de suppression des fichiers superflus afin de rendre le
système d?exploitation plus performance.
3- Le Scannage du disque
C?est un utilitaire du système d?exploitation qui
permet de scaner le disque en supprimant les mauvais secteurs et les erreurs de
chaînage de lieu qui ralantissent ou bloque le système. C?est une
version améliorée du CHKDSK.
4- La Défragmentation du disque
L?utilitaire defram.con fourni par le système assure le
regroupement des blocs de données par fichier pour améliorer les
entrées/sorties.

Chapitre III : Niveau Base de données
Une base de données est une collection de
données inter reliées et stockées ensemble avec moins de
redondance possible pour servir une ou plusieur applications de
façon.
Elle est représentée par les modèles comme
MCD, MLD et MPD en l?implementant dans un SGBD.
Quel que soit le SGBD utilisé, la base de
données genère les informations, les relations entre elles, de
contrôle d?intégriter de données par rapport aux
règles de gestion...
Le SGBD influance grandement les performances d?une application
au niveau des opérations d?entrées et sorties.
Les Differentes éduteurs ont mis aux points les divers
mécanismes d?optimisation.Tels que :
- le Recordset (utilisé sur la plate-forme COM) et le
Dataset (utilisé sur la platforme NET) pour réduire le nombre de
lecture/ écriture ;
- les procédures;
- les vues ;
-les séquences;
-les index et les clés composées.
1-RecordSet
Le concept de Recordset utilisé dans les codes permettant
d?attaquer une base de données repose sur deux éléments
essentiels qui sont :
-l?enregistrement (Record) ; -l?ensemble (Set).
C?est ainsi, qu?un ensemble contient tous les enregistrements
d?un élément (fils) à un enregistrement de l?autre
(père) dans une rélation 1, N. L?enregitrement père est le
propriètaire de l?ensemble et l?enregistrement fils est membre de cet
ensemble.

16
L?objet RecordSet est utilisé dans environement COM
pour représenter les tables de la base de données. Il reduit le
nombre des opérations R/W de manière optimale.
2-DataSet
Nous avons également deux éléments dans
DataSet, comme les données (Data) et les ensembles (Set) de la base de
données.
Le processus de l?optimisation consiste à copier la
base de données à manupiler au sein de l?application, tout en
conservant les mêmes informantions fournies par la base réelle.
Cette technique permet au processeur de traiter rapidement les
informations de la mémoire, sans que celles-ci puissent aller les
soliciters dans le disque
dur.il est utilisé dans les
envirronement .NET.
3-Procedure Stockée
C?est l?implementation de la stratégie RPC du
modèle client serveur. Elle permet :
A -Partage de code
Les procédures garenties les partages des codes commun
quel que que soit le langage de programmation utilisé.Les codes seront
testés une seule fois.
A1-Objet gerent la securité
Les prévilèges EXECUTENTS sont donnés aux
utilisateurs de la base de données pour les procédures
stockées pour les tables utilisées par RPC. Ce qui signifie que
BDA n?est pas obligé de creante (athibut) des privilèges
specifiques aux utilisateurs.Les proprietaires de la RPC peuvent modifier les
privilèges sur la base et non pas sur les utilisateurs.
A2-Variable de passage de paramètre
L?un des points forts des procédures stockées et
ces lebrairées sont les capacités de passer ou de recevoir les
valeurs des autres applications.
A3-L?automotisation du suivi des dependances
Certains SGBDR genent automatiquements, les dépendances
pour chaque RPC de type SQL.C?est le cas oracle avec les RPC en Pl /SQL.On
entend par

objet de dépendance les tables, les vues, les
séquences... auquelles une procédure stockée peut faire
référence une fois que l?objet est modifié, oracle
recompile automatiquement la procédure stockée.
A4-La retrospective des règles de gestions
Les RPC (Remote proces contrôl) permettent de percuter les
règles de gestions sur les nouvelles applications qui sont
implementer.
A5-Adapter aux applications clients/serveur
Les RPC sont éfficaces dans un environnement
client/serveur. Elles sont exécutées par appels de
procédures qui peuvent à leur tour genèrer de centaines de
ligne de code PL/SQL ou SQL selon le cas en lieu et place de transmettre tout
le code auttravere un réseau.On a alors l?avantage d?avoir une seule
copie de code sur le serveur au lien que chaque client transmet une
série de codes pour faire la même chose.

Serveur
Code)
SGBDR
(Code)
(Code)
Client B
(Code)
Client C
Client A

18
B-Exploitation de la puissance de PL/SQL par les RPC
Pour que les RPC exploitent le maximun de puissance de PL/SQL. Il
faut :
B1-Augmenation de la taille du poole partagé
Tous les exécutables des procédures
stockées se résident sur la forme des binaires P_Code dont le
temps de partagés jusqu'à ce que sans exécutions
termines.
B2-le groupage
Il faut grouper toutes les RPC qui se ressemlent dans
même paquqge. Cela est particulièrement indiqué si les RPC
font appel aux unes et autres ou quant ils sont logés dans un même
support physique.
C -Avantage et incovénient des procedures stockées
C1-Avantage
Les avantages que l?on peut trouver dans les RPC sont : -facile
à être compuler par les compulateurs ;
-adpter aux applications réseaux ;
-reduire la duplication du code.
-inconvenient
Une RPC peut être supprimé par quelqu?un qui a
suffisamment des privilèges comme BDA.Malheuresement, il existe des RPC
qui permettent de le protéger contre ces genres d?incidents. Comme le
PL/SQL et le SQL sont des langages interpretés, vous n?avez pas des
moyennes de connaitre qu?il y a une suppresion jusqu'à ce qu?apparait
les erreurs confusées lors de l?exécution de l?application et
retracer la cause de ces erreurs risque de prendre beaucoups de temps pour le
retrouver.
4-Les Vues
Les vues sont utilisées dans les SGBD pour : -securiser
les données de la table ;
- assurer l?indépendance logique de la base de
données en permettant aux vues de représenter le schéma
d?une table à laquelle on ajoute des attributs ;

- visualiser les données par des requêtes SQL. Par
exemple, on veut calculer des données de synthèse avec fonction
d?agregat, on écrira :
Create vieuw V_Etudiant as
Select Nom, AVG(Numéro)
From Etudiant
Groupe by Nom ;
- faire les requêtes sur plusieurs tables.
Pour créer une vues, on utilise la syntaxe suivante :
Create View Nom_vues ;
5-Séquence
Les séquences sont les objets que manipulent les SGBD pour
permettre : -générer les clés uniques des tables ;
-gerer un compteur, qui va parcourir les enregistrements des
tables de la base de données.
A titre d?exemple:
Create sequence S_Etudiant
Minvalue 1
Maxvalue 999999
Start with
Increment by 1
Insert Into Etudiant (Numéro, Nom, Prenom)
Values ( S_Etudiant.nextvalue, ?IBARA??,??Guelor??)
;
6-Index et clés composées
Les index et les clés composées offres les
meilleurs moyen de navigation dans la base de données.
Pour les index, ils peuvent porter sur un ou plusieurs
attributs de la table.Par
exemple, la création des index de
numéro de la table Etudiant, veut dire

20
dispose en plus de la table une autre table index comme la
requête suivante illustre cette réalité :
Create index E_Etudiant on Etudiant (Numéro asc).
Dans le cas des clés composées, nous disons que
sa création ne donne pas lieu aux autres tables comme ceux des index,
mais permettent seulement la navigation dans la base de données. Cette
clés, on peut le créer sur deux ou trois attributs on les
cancatenants.

Chapitre IV: Niveau Langage de Programmation
En informatique, il existe plusieurs langages de pragrammations
(C, CoBol, Java...) permettent aux programmeurs de déveloper des
applications.
C'est-à-dire, les instructions commencent à la
première ligne du code et se déroulent suivant un chemin
défini dans l?application au fur et à mesure des besoins.Elles
peuvent être aussi événementielles, le code ne suit pas un
chemin prédeterminé, les differentes parties du code sont
exécutées par rapport aux événements qui se
produisent. Votre application doit être en mesure de traiter les
événements sans prévoir l?ordre.
Pour ce faire, les langages de programmations qui permettent de
concevoir les applications sont soites procedurales ou
événementielles.
Ainsi, optimiser un logiel devellopper dans ces langages c?est
agir sur le code de celui-ci, en se basant sur le respect de la syntaxe,
utilisation des types de données a manipulér, les instructions,
les modules, les procédures, les fichiers... pour l?estimation du temps
perdu à chaque niveau et proposer des solutions optimales.
Dans le contexte de ce travail nous prendrons pour exemple le
langage VB.
1-Type de données
Tous les langages de programmation, fournisent un certain
nombre de types de données que le programmeur doit utiliser pour la
conception de l?application.Parmi ceux-ci, on distingue :
-les types prédéfinis ;
-les types tableaux ;
-les types définis par le programmeur.
a-Types prédéfinis
Ces types sont déjà présents dans le langage
ou le logiciel que le Concepteur ne peut qu?utiliser pour son application. Nous
avons les types comme :
. Boolean : True - False
. Byte : de 0 à 255
? Integer : de -32 768 à 32 767
· Long : de -2 à +2 milliards
environ
· Single : virgule flottante simple
précision
· Double : virgule flottante double
précision
· Currency : entier en virgule fixe
· String : jusqu?à 65 000
caractères
b-Le type tableau
Les tableaux sont les types permettant de gérer un
ensemble de données de même type prédéfini pour un
traitement.
On trouve parfois des tableaux statiques et des tableaux dits
dynamiques :
-Les statiques le nombre d?élements maximum est
fixé déjà. Par exemple, la déclaration d?un tableau
de 1000 entiers. On écrit :
T(1000) as Integer ;
-les tableaux dynamiques ne fournissent pas de taille fixe. Ils
se déclarent comme suit :
T ( ) as Integer.
c-Les types définis par le programmeur
Ce type est déclaré par l?instruction Type et
contenant tous les autres cités précédament. A titre
d?exemple:
Type Etud
Numero as integer,
Nom as string, DateN as date, End type
2-Les instructions
Les langages de programmations fournissent un certain nombre
d?instructions appartenant à ces trois catégories suivantes :
-les déclarations ; -les affectations ; -les
exécutions.
Pour le concept de l?optimisation, chaque instruction doit
être bien définie pour l?amélioration du produit
logiciel.
a- Les déclarations
La déclaration permet à toutes les données
utilisées dans le programme d?être nommées et de
préciser son type.
Dans nos programmes, nous déclarons des variables, des
constants, les procédures..., tout en spécifiant leurs types par
les instructions définies du langage. Le langage VB, pris comme exemple
gere les instructions de déclaration suivante :

22
-Dim pour les variables : dim x as integer ;

-Const pour les constantes ;
-Private, public pour les procédures, les variables...
Lorsque la déclaration des données n?est pas
respectée, cela peut ralentir les programmes ou peut augmenter le temps
de réponse des instructions.
b-L?affectation
L?affectation consiste à attribuer une valeur à
une variable ou constant.
Si cette affectation n?a pas respecté le type de
données, ceci peut entrainer le dysfonctionnement de l?application. Bien
affecter les données, c?est agir sur le bon fonctionnement du
logiciel.
c-Les instructions exécutables
Le code d?une application est basé sur les structures
ou instructions d?exécutables. Pour optimiser une application, il faut
connaitre les instructions utilisées dans le code de celui-ci.
Ainsi, nous avons les structures ou instructions suivantes : -
les structures de choix ou conditionnelles ;
-les structures de boucles ou répétitives
c1-Les structures de choix
On distingue deux types de structures de choix, qui sont :
-Structure If (SI) *If Simple
Syntaxe
IF condition Then //Instructions
EndIF.
*IF avec ELSE
Syntaxe
IF condition Then // instructions
ELSE
//instructions
EndIF

24
*IF imbruqué
Syntaxe
IF condition 1 Then
//instructions
Elseif condition 2 Then
//instruction
Eleif condition 3 Then
// instructions ELSE
//instructions EndIF
-Structure Case ( selon cas)
Syntaxe
Select case Expression Case: // instruction Case: //
instruction
.
.
.
case Else
// instruction EndSelect
c2-Les structures de boucles
On distingue trois formes de cette structure.Ces trois formes
presentent les syntaxes suivantes :
-La structure For (Pour)
Syntaxe
For i=valeurDebut to valeurFin // instruction
Next

-La structure Do While (TantQue)
Syntaxe
Do While Condition // instructions
Loop
-la structure Do
Syntaxe
Do
// Instruction
Loop until Condition
3-Les modules
Un programme écrit en module, est un programme souple
dans la mesure où une instruction est appelée dans plus
d?interfaces pour exécuter la même tâche donnée. Ceci
étant, le programmeur évitera d?écrire des codes lourds
pouvons ralentir l?application. Les modules utilisent les instructions comme
:
-les procédures ; -les fonctions.
a-Les procédures
Les procédures sont un ensemble des instructions
délimitées par les instructions du début et à la
fin qui exécutent les actions, sans renvoyer les valeurs.
Pour appeler une procédure, on utilisée
l?instruction Call.
Une procédure est utilisée dans une application
à partir de trois niveaux, qui sont :
-niveau procédure :
Les instructions utiliséess à ce niveau ne sont
pas visibles à l?extremité de celle-ci.
-niveau module privé :
Les instructions ne sont disponibles qu?au niveau
procédure du module. On utilise les mots clés suivants :
Private.
-niveau module public :
Ici les instructions sont visibles dans tout le projet ou
l?application. Ce qui permet l?écriture moins du code, la maintenance,
la performance...dans l?application. Dans Vb par exemple, nous utiliserons le
mot clé Public pour la déclaration de celui-ci.

26
b-Les fonctions
Les fonctions sont identiques aux procédures, mais
peuvent renvoyer des valeurs. On retrouve une série d?instructions de
délimitée par les instructions Function et End Function dans le
cas VB.
4-les Fichiers
Pour accèder au fichier de la base de données, le
langage de programmation utilise les instructions.
Ces opérations que le langage utilise sont : -l?ouverture
du fichier ;
-la lecture du fichier ;
-l?écriture du fichier ;
-la fermeture du fichier.
a-L?ouverture
Les fichiers existent dans le disque dur et sont
séparés de l?application.Pour lire et écrire des
enregistrements dans les fichiers de la base de données, il faut
établir une connexion avec la base de données et le code de votre
application tout en solicitant le système d?exploitation. La fonction
Open permet l?ouverture du fichier depuis le code de
l?appliation.
Voici un exemple de l?ouverture du fichier Etudiant en visual
basic : Private Etude as intreger
Open ? Etudiant ? For input
As # Etude
b-Lecture
Pour lirer dans un fichier de la base; on utilise la function
input, dont il existe trois variantes que nous allons
représenter par les exemples suivants :
*private Etude as variant Etude= Input (100, Etudiant) *private
Nom, Prénom as string
Input # Etudiant, Nom, Prénom
*while not EOF(Etudiant)

Call lire (Etudiant) Wend.
c-Ecriture
L?écriture des données dans le fichier de la base
de données, nécessite l?ouverture de celui-ci par la fonction
output. Voici un exemple :
Private Nom, Prénom as string print # Etudiant, Nom,
Prénom.
d-Fermeture
Pour la fermeture d?un fichier, on uitlise la fonction
Close.Par exemple, on écrit :
Close # Etudiant.


29
Introduction
Dans la deuxième partie de notre travail nous
présentons, l?optimisation au niveau de la base de données. Nous
parlerons de l?optimisation au niveau conceptuel de la base de
données.
Ainsi, nous n?allons pas concevoir la base de données,
mais plutôt parler des procédures d?optimisation du modèle
logique de données (MLD), optimisé appliqué au
Système de gestion des bases de données relationnelles (SGBDR)
Pour illuster nos propos, nous nous servirons des exemples bases sur le SGBDR
oracle.

Chapitre I : Modèlisation de données
Ce chapitre ne nous apprend pas à modeliser la base de
données, mais plustôt nous montre à quel niveau de la
modelisation nous pouvons optimiser la base de données.
En fait, l?optimisation d?un modele intervient lors de la fin
de la conception du modèle logique de données (MLD) déduit
du modèle conceptuel de données (MCD).C?est pour quoi cette
étapes intermediaires du modèle logique de données et du
modèle physique de données est appelé modèle
logique de données optimisé.
Ce modèle logique de données optimisé porte
sur les concepts suivants : - les données calculées ;
- les clés secondaires ;
-la redandonse calculé ;
-le rapprochement physique.
Avant de parler de chaque concepts, nous disons que cette
étape consiste à optimiser l?organisation physique de
données afin de la reprendre au niveau traitements de l?application et
d?améliorer les performances des accès logiques en reduissant
leur nombres des R/W.
1-Les données calculées
Pendant la modelisation du MCD, les données
calculées ne sont pas prises en compte dans les entités,
c'est-à-dire ne représentent pas les proprietés des
objets. Car leurs valeurs respectives sont trouvées suités
à des calculés.
Il arrivé que ces valeurs soient calculées
plusieurs fois selon les besoins de l?application, il est mieux de les
mémorise dans la base de données. Cela fait l?optimisation de
MLD.
2-Les clés secondaires
La création des clés secondaires dans les
tables, nous offre une meilleure navigation dans tables de la base de
données. Car la navigation facile, permet la rapidité des
traitements dans l?application.
Pour illustrer ce propos, nous prenons trois tables : clients,
commande et
facture. Les tables client et la facture ne sont pas
liées, mais ells ne sont en
rélation qu?avec la table commande. Si on veut savoir
à quel client appartient la facture, on est obligé de passer par
la table commande, alors qu?on peut directement créer la clé
secondaire référençant le client dans la table facture.
Voici cet exemple :
*MCD
Client Commande

NuméroCli
Numérocom
Facture
NuméroFac 1,N
1,1
Associer

1,N 1,1
passer

Client
Commande
NuméroCli
Numérocom NuméroCli
Facture
NuméroFac Numérocom

31
*MLD
Agent
NuméroAg
Affecter
1,N 1,N
Service
NuméroSer


*MLD optimisé

Client
Commande
NuméroCli
Numérocom NuméroCli
Facture
NuméroFac Numérocom NuméroCli
3-Redondance calculée
Ici on se propose de mettre dans une table quelques attributs
d?une autre table afin de réduire le nombre d?accès.
Par exemple, les table agent et service relié par la
relation affectée,l? on aura le MCD suivant :
*MLD
Agent
Service
NuméroSer

NuméroAg

NuméroAg NuméroSer
Affecter
NuméroAg NuméroSer
*MLD optimisé
|
|
Agent
|
Service
|
|
Affecter

33
NuméroAg NuméroSer
4-Rapprochement physique
Le rapprochement physique s?effectue avec des liaisons
paralleles (1,1) dites aussi bijections, il faudra concevoir une table qui
prendra tous les attributs de l?autre table tout en éliminant celle qui
donne ces attributs.
Considérons les entités secteur et charger
d?affaire.L?on a le MCD suivant :
Secteur
NuméroSec NomSec
*MLD
Charger
d?affaire
NuméroCh
1,1 1,1

Couvrir

Secteur
NuméroSec NomSec NuméroCh
Charger
d?affaire
NuméroCh NuméroSec
*MLD optimisé

Charger
d?affaire
NuméroCh NuméroSec NomSec

35
Chapitre II : Principe de l?optimisation de la base de
données
Les principaux points d?optimisation de la base de
données sont les suivants :
-Organiser les données pour obtenir une base de
données fonctionnant avec de bonnes performances ;
-le modèle logique de données que l?on
déduit du modèle conceptuel de données ne coïncide
pas toujours avec une bonne organisation optimale des données dans le
disque. Il faut réaliser le modèle logique de données
optimisé pour reprendre avec le besoin du système
d?information.
Ainsi, nous disons que la réalisation d?une base de
données surtout quand elle doit contenir de très nombreuses
données, nécessite fréquemment une nette modification au
niveau modélisation optimale afin de garantir la fiabilité, voir
les qualités d?une application.
Cette modification résulte d?une optimisation de la
base de données avec les méthodes précises et des
possibilités qu?offre le système de gestion de base de
données rélationnelle comme dans le cas d?oracle.

Chapitre III : Méthode d?optimisation de la base de
données
Les méthodes que nous pouvons retenir partant des
principes pour d?optimisation d?une base données sont :
-l? évaluation générale des performances
d?une application ; -les paramètres d?enregistrement ;
-la démarche d?optimisation de la base de
données.
1-Evaluation générale des performances d?une
application
Il y a deux éléments essentiels pour
évaluer la performance d?une application. Ces éléments
sont :
-le temps de réponse qui se passe lors du lancement de
chaque traitement et l?obtention des résultats correspondant attendu.
-la fiabilité qui détermine la capacité
de la base de données à réagir de façon stable et a
ne pas provoquer de perte d?informations ou données en cas de
problème et aussi d?enpêcher des accès intempestifs
à son contenu.
En plus de ce qui vient d?être dit, la qualité
d?une application réside aussi de ces capacités à
évaluer à moindre coût. Car la maintenance d?une
application est facile que si elle a été conçue clairement
et qu?elle est bien documentée.
Certains choix technique élaboré peuvent en
particulier améliorer la performance d?une application en faisant migrer
la base de données de celui-ci vers un système de base de
données à une autre.
2-Les paramètres d?enregistrements
Le temps de réponse dans les applications informatiques
est souvent influencé par des paramètres agissants sur un
élément essentiel qui est le disque dur.
Le disque est constitué de surfaces planes en
rotation, sur lesquelles on enregistre les données dans les emplacements
bien définis appelés les secteurs.
Pour effectuer la lecture, ou l?écriture d?un secteur
disque, il faut que le bras de lecture/écriture se déplace puis
attendre que la rotation du disque amène le secteur à lire devant
la tête de lecture/écriture portée par le bras. Cette
action ralentie les traitements.
Ainsi, nous pouvons retenir deux paramètres
d?enregistrements des données dans le disque :

37
-l?accès séquentiel ; -l?accès direct.
a-L?accès séquentiel
Ce paramètre permet de parcourir ou de lire la table
de la base de données depuis sa première ligne d?enregistrement
jusqu'à trouver la donnée recherchée. Ceci afin
d?accéder à autant d?enregistrement sur le disque.
b-L?accès direct
Il nécessite les connaissances de l?adresse de
l?enregistrement se trouvant dans un secteur disque pour retrouver chaque
donnée trouvée, chaque donnée voulue. Cette astuce, est
impossible dans les applications de gestions courantes. Par contre le SGBD
fournit un accès accéléré grâce à des
index et des blocs de données créent par l?administrateur de la
base de données.
3-La démarche d?optimisation
Pour optimiser une base de données, il faut : - optimiser
le MLD selon les traitements ; -optimiser le MPD selon le SGBD.
Voici un tableau résumant ces propos :

Base de départ
|
Actions d?optimisations
possibles
|
Résultat
d?optimisation
|
|
Optimisation logique selon la logique des traitements :
|
|
|
-groupement des tables ;
|
|
MLD
|
|
|
|
-définition des index ;
|
|
|
|
MLD optimisé
|
|
-élimination des tables
volumineuses.
|
|
|
Optimisation physique selon des caractéristiques du
|
|
|
SGBD :
|
|
Tables logiquement
|
-définition des tailles de
|
|
optimisées
|
bloc ;
-répartition des tables par bloc ;
|
Tables physiquements
optimisées
|
|
-paramétrage des index.
|
|
|

39
Chapitre IV : Optimisation du SGBDR
Pour parler de l?optimisation SGBDR, nous avons choix le SGBDR
oracle, car il fournit un grand nombre d?éléments
nécessaires pour notre étude.
Ainsi, disons que oracle est un système de gestion de
base de données relationnel puissant et utilisé aussi dans les
grandes organisations ou entreprises, pour ces possibilités de
sécurité, de performances...
Il fournit quelques paramètres essentiels pour une
meilleure optimisation de la base de données, que nous citons comme suit
:
-les implantations des index ;
-enregistrement des données sur les mémoires de
masses et des accès concurrentiels ;
-les reprises après panne ;
-l?optimisation des requêtes ;
Les transactions dans les bases de données reparties.
1-Implementation des index
Un index est un objet informatique qui contient des
clés utilisées dans oracle, pour accéder rapidement
à une ou plusieurs lignes de la table et accélérer une
jointure ou une recherche d?informations dans la base.
Le principe clé des index est de limiter le nombre des
accès disque pour trouver une clé de la table.
On distingue trois types des index dans oracles. A savoir :
v' B-arbes qui sont les plus utilisés et pour
l?optimisation, la taille du noeud (le nombre minimum et maximum des
clés) doit être un multiple de la taille du secteur disque.
v' L?index bitmaps réservé aux données
qui peuvent être modifiées rarement. Ils sont performants sur les
combinaisons et /ou des critères ;
v' Index appelé table hachage, qui ne sont presque pas
moins utilisés dans les nouvelles versions d?oracle.

2-Enregistrement des données et accès
concurrents
Dans ce contexte, les données de la base sont
enregistrées dans les fichiers du système d?exploitation. Or le
SGDB enregistre les données des tables, des vues... dans le
système de fichiers. Il arrive parfois que le SGDB pour l?enregistrement
de données puisse s?en passer complètement du système de
fichier du système d?exploitation. Oracle utilise le fichier REDOLOG
pour les enregistrements système et le segment ROLLBACK or le
système, mais dans la base de données.
Pour les accès concurrentiels, oracle utilise des BUFFERS
en mémoire centrale pour les opérations de
lectures/écritures.
En ce qui concerne les performances, Oracle fournit Les
COMMIT pour éviter d?écrire dans la base de données
placé dans les BUFFERS et si ces BUFFERS sont pleins, les données
non validées peuvent être enregistrées dans la base de
données sans problème.
3-Reprise après panne
Nous constatons souvent les pannes dues aux : -les logiciels
installés ;
-les matériels utilisés ;
-l? implantation du réseau.
Ces pannes peuvent endommager ou non les fichiers.
> Si les fichiers sont corrects, la reprise après
panne du fonctionnement de SGBD permet de déterminer les transactions
validées qui ne sont pas finies et annulées ces transactions non
validées (ROLLBACK, on panne avant le COMMIT) ;
> Si les fichiers sont abîmés ou
endommagés, l?administrateur doit commencer par récharger la
dernière sauvegarde complète de la base de données et
ensuite, en redemarrant les actions enregistrées des images après
depuis la dernière sauvegarde. Sinon, il faut recommencer les commandes
perdues.
4-Optimisation de requêtes
L?optimisation des requêtes est basée sur :
-les considérations logiques en réduisant la
taille des données, c'est-à-dire faire des sélections ou
les projections avant les jointures ;

41
-l?implantation physique des données comme l?existence des
index et des clusters ;
-de faire des statistiques sur les données contenus dans
les tables (nombre de ligne, de valeur...).
5-Base de données reparties
Les processus du SGBD sont souvent repartis sur les machines
tandis que les données sont sur plusieurs sites. Il est
nécessaire d?utiliser les COMMITS distribués pour les
transactions distantes. Or, il arrive parfois aussi des pertes de performances
dues au réseau.
Pour résoudre ce problème, il est faut
gérer en temps réel des données locales en faisant
utiliser des copies des données distantes.

Introduction
Il existe plusieurs langages de programmations. Parmi ceux-ci,
nous avons préféré de parler de l?optimisation du langage
Visual Basic 6.0.
Visual Basic est une variante du BASIC (Beginners All purposes
Symbolic Interchange Code) conçu uniquement pour faciliter
l?apprentissage de la programmation. Ce langage est le plus populaire des
langages de programmations.
Visual basic est un langage le plus répondus parce qu?il
est installé avec ou intégré dans tous les systèmes
d?exploitations depuis les origines.
Avec l?arrivée de Windows, l?intégration des
interfaces graphiques de Windows dans Basic a donné naissance à
Visual basic. Héritant de la popularité de BASIC, Visual Basic
est devenu le premier langage de programmation pour PC (Personal Computer).
Il a atteint son plus haut niveau avec l?arrivée de
l?environnement de données et des API de connexion du genre ADO. C?est
pouquoi notre étude portera sur ceux-ci pour montrer les aspects
possibles pour l?optimisation.

44
Chapitre I: Optimisation des variables 1-Déclarations des
variables
La déclaration du type de variable est une
première optimisation extrêmement classique et indispensable. Afin
de n'oublier aucune déclaration, utiliser en tête de module ou de
Form etc... la fonction :
Option Explicit
Succinctement, à retenir pour choisir le type :
· Pour des nb entier utilisez de préférence
le type Long.
· Pour des nb décimaux utilisez
nécessairement le type Double.
· Pour des variables de chaînes utilisez le type
String.
Bien sur, les déclarations dépendent aussi des
besoins.
Mais d?une manière générale, l?emploi du
type Variant (autre que dans les appels de fonctions) n'est jamais
indispensable, et est à proscrire pour l?optimisation. Ce type
est surtout intéressant pour faciliter la programmation aux
débutants. Mais cette facilité se paye par une baisse importante
des performances.
Une de remarque syntaxique.
Certains pensent que : " Dim a, b, c As Long" déclare
les 3 variables en Long. Seul "c" est ici en Long, "a" et "b" sont
déclarées en Variant, par défaut. La syntaxe correcte est
: " Dim a As Long, b As Long, c As Long"
2-Utilisation des tableaux (Dim)
Quelques évidences. L?optimisation avec les tableaux,
consiste d?abord à déclarer son type. Puis, autant que possible,
il faut trouver une " structure " et/ou déterminer le nombre
d?éléments, quitte à définir un nombre en
excès, afin de ne jamais manipuler une nouvelle fois la
déclaration d?un tableau ; par exemple, évitez de
réutiliser Redim (Preserve).
L?utilisation d?une variable "tableau" est toujours moins
rapide qu?une variable "simple" de type équivalent. Cette
caractéristique est générale. La durée est au moins
doublée. Donc, n?utilisez pas une variable "tableau" dans des
instructions spécifiques, comme par exemple dans une boucle FOR avec FOR
M(0)=...etc.

Chapitre II: Optimisation sur les nombres 1-Longueur d'un nombre
entier positif ou nul.
Pour connaître le nombre de chiffre.
Forme optimisée :
Fix(Log(nb + 0.11) ! Log(10)) + 1
Ici 0.11 est utile dans le cas ou nb=0, ainsi la formule renvoi
1. Si nb ne peut pas être nul, retirer cette constante.
Forme équivalente : (+3.9*) Len(Str$(nb)) - 1
Forme équivalente : (+5*) Len(Trim$(Str$(nb)))
Programme de test :
temps = Timer
Dim nb As Long, lg As Long
For nb = 1 To 100000
lg = Fix(Log(nb + 0.11) ! Log(10)) + 1 ' par formule math 'lg =
Len(Str$(nb)) - 1 ' chaîne
'lg = Len(Trim$(Str$(nb))) 'par fonction de chaîne Next
nb
MsgBox Timer - temps
2-Pour un nombre entier négatif
A partir de la forme précédente, il faut adapter la
programmation et on rajoutera +1 pour tenir compte du signe négatif ou
+1 pour la virgule.
Forme optimisée :
Fix(Log(Abs(nb) + 0.11) ! Log(10)) + 2
Forme équivalente : Len(Str$(nb))
etc...

46
3-Parité d?un nombre
Pour tester si un nombre est pair :
Forme optimisée :
If (nb And 1) = 0 Then ...
Forme équivalente : (+1.2*) If nb Mod 2 = 0 Then
...
Forme équivalente : (+1.3*) If nb = 2 * (nb \ 2)
Then ...
Forme équivalente : (+2.1*) If nb = 2 * Int(nb / 2)
Then ...
Forme équivalente : (+2.7*) If nb / 2 = Int(nb / 2)
Then ...
Programme de test :
temps = Timer
Dim nb As Long, lg As Long
For nb = 0 To 10000000
If (nb And 1) = 0 Then lg = lg + 1 'If nb Mod 2 = 0 Then lg = lg
+ 1
'If nb = 2 * (nb \ 2) Then lg = lg + 1
'If nb = 2 * Int(nb / 2) Then lg = lg + 1 'If nb / 2 = Int(b / 2)
Then lg = lg + 1 Next nb
MsgBox Timer - temps
Pour tester si un nombre est impair :
Forme optimisée :
If (nb And 1) Then ...
Remarque : Entre les deux formes optimisées,
cette dernière est plus rapide car il n?y a pas de test
d?égalité (=0) prenant du temps dans le traitement. (pair :
+1.1*)
4-Calculs des puissances entières
Curieuse fonction que " ^ " qui s?effectue en un temps
quasi-constant quelle que soit la puissance, mais reste moins rapide que la
multiplication successive jusqu?à puissance 9 environ.
Forme optimisée : nb = lg * lg * ... * lg


48
Forme équivalente : nb = lg " 2 (+7.5*) nb = lg
" 3 (+5.0*) nb = lg " 4 (+4.6*) nb = lg " 5 (+3.9*)
Programme de test :
temps = Timer
Dim nb As Long, lg As Long, A As Long lg = 100
For A = 0 To 10000000
nb = lg * lg
'nb = 100 * 100
'nb = lg " 2
Next A
MsgBox Timer - temps
5-Calcul de la racine carré
Forme optimisée : lg = Sqr(nb)
Forme équivalente : (+3.5*) lg = nb " 0.5
Programme de test :
temps = Timer
Dim nb As Long, lg As Double For nb = 1 To 10000000
lg = Sqr(nb)
'lg = nb " 0.5
Next nb
MsgBox Timer - temps
Remarque : comme pour les puissances, on peut cumuler
les racines carrés optimisées jusqu?à 4. Ainsi lg =
Sqr(Sqr(Sqr(Sqr(nb)))) est la dernière expression plus rapide que lg =
nb " 0.0625.
6-Division entière
Dans le cas oil les nombres peuvent être
déclarés en type Long sans dépassement de
capacité.
Forme optimisée : nb = nb1 \ nb2
Forme équivalente : (+2.3*) Nb = Int(nb1 / nb2)
Programme de test :
temps = Timer
Dim nb As Long, lg As Long For nb = 1 To 10000000
lg = 1000000 \ nb
'lg = Int(1000000 / nb)
Next nb
MsgBox Timer - temps
7-La multiplication plus rapide que la division
Dans une expression mathématique, il est
légèrement plus rapide d'effectuer une multiplication par
l'inverse d'un nombre que de diviser par ce même nombre. Ainsi, par
exemple, pour diviser par 4, au lieu de faire (expression)/4, faire
0.25*(expression).
Forme optimisée :
nb = nb1 * [inverse nb2]
Forme équivalente : (+1.1*) Nb = nb1 / nb2
Programme de test :
temps = Timer
Dim nb As Double, lg As Double For nb = 1 To 10000000
lg = nb * 0.25
'lg = nb / 4
Next nb
MsgBox Timer - temps
8-Le Pré-calcul
Dans une boucle, il faut sortir tous les calculs d?expression
constante.
Forme optimisée :
Dim nb As Long, lg As Double, z As Double z = Sqr(2)
lg = nb * z
Forme équivalente : (+2.7*) lg = nb * sqr(2)
Programme de test :
temps = Timer
Dim nb As Long, lg As Double, z As Double z = Sqr(2)

For nb = 1 To 10000000 lg = nb * z
'lg = nb * Sqr(2)
Next nb
MsgBox Timer - temps
9-Maximum et Minimum de 2 nombres
Forme optimisée :
If a < b Then max = b Else max = a
Forme équivalente : (+1.5*) max = (a+b+abs(a-b))/2
min = (a+b-abs(a-b))/2
Forme équivalente : (+4.3*)
max = IIf(a < b, b, a) min = IIf(a < b, a, b)
Programme de test : temps = Timer
Dim a As Long, b As Long, max As Long, c As Long
a = 3: b = 5
For t = 1 To 1000000
If a < b Then max = b Else max = a
'max = (a + b + Abs(a - b)) / 2
'max = IIf(a < b, b, a)
c = a: b = a: a = c Next t
MsgBox Timer - temps
10-Attribution de 2 valeurs alternatives
On rencontre assez souvent en programmation des variables
utilisées comme indicateurs « flags » pouvant prendre que deux
valeurs. On peut évidemment utiliser le type Booléan dans ce cas,
avec TRUE et FALSE. Mais est-ce le meilleur ? La réponse est positive.
Or, ce n?est pas toujours ce choix qui est fait.
Forme optimisée :
a = True
b = False
Forme équivalente : (+1.2*)
a = -1
b = 0
Programme de test : temps = Timer

50
Dim t As Long, maxi As Long maxi = 10000000
ReDim b(maxi) As Boolean 'ReDim b(maxi) As Byte
For t = 0 To maxi
b(t) = False
'b(t) = 0
Next t
MsgBox Timer - temps
On observe également sur ce test qu?il est aussi
préférable d?utiliser le type Boolean au lieu de Byte même
si ces deux types sont codés sur 8 bits chacun.

Chapitre III : Optimisation des tests
1-Vérification d?une condition avec renvoi
Booléan
Forme optimisée :
a=(condition)
Ici condition pourrait être constituée par une
expression comme b=c, soit a=(b=c). L?interprétation est facile, si b=c
alors VB remplace en interne cette condition par la valeur vraie (True), puis
l?affecte à "a", soit a=True. Même chose dans le cas contraire,
avec False. Cette optimisation est valable que pour le renvoi d?une valeur
Booléan.
Forme équivalente : (+1.5*)
If condition Then a = True Else a = False
Programme de test :
temps = Timer
Dim nb As Long, a As Boolean
For nb = 1 To 10000000
a = (nb And 1)
'If (nb And 1) Then a = True Else a = False Next nb
MsgBox Timer - temps
2-Les fonctions conditionnelles
Au vu des très nombreuses formes qu'on peut imaginer
pour utiliser les fonctions conditionnelles, nous les présentons au fur
et à mesure, sans être exhaustif.
Dans une série de tests conditionnels et quel que soit
le nombre de condition et la complexité des conditions, " If... Then...
ElseIf... End If " est le plus performant. Mais il faut savoir aussi regarder
le côté pratique du codage, ce qui privilégie sans doute
Select Case. De plus, on s?efforcera de mettre la condition qui a le plus de
chance d?être vérifiée en premier pour sortir du test le
plus tôt possible.
Forme optimisée : If (condition1) Then
(instructions1)
ElseIf (condition2) Then
(instructions2) ElseIf ...
End If

52

Forme équivalente : (+1.1*)
If (condition1) Then (instructions1)
If (condition2) Then
(instructions2)
Forme équivalente : (+1.2*)
Select Case (variable)
Case (condition1) (instructions1)
Case (condition2) (instructions2)
...
End Select
Forme équivalente : (+1.25*)
If (condition1) Then (instructions1)
Else
If (condition2) Then (instructions2)
Else
...
End If
End If
Programme de test :
temps = Timer
Dim t As Long, j As Long, a As Long For j = 1 To 1000000
For t = 1 To 5
If t = 1 Then
a = a + 1
ElseIf t = 2 Then
a = a + 2
ElseIf t = 3 Then
a = a + 3
ElseIf t = 4 Then
a = a + 4
ElseIf t = 5 Then
a = a + 5 End If
Next t, j
MsgBox Timer - temps
Programme de test : temps = Timer
Dim t As Long, j As Long, a As Long For j = 1 To 1000000
For t = 1 To 5
If t = 1 Then a = a + 1 If t = 2 Then a = a + 2 If t = 3 Then
a = a + 3 If t = 4 Then a = a + 4 If t = 5 Then a = a + 5 Next t, j
MsgBox Timer - temps
Programme de test :
temps = Timer
Dim t As Long, j As Long, a As Long For j = 1 To 1000000
For t = 1 To 5
Select Case t
Case 1
a = a + 1 Case 2
a = a + 2 Case 3
a = a + 3 Case 4
a = a + 4 Case 5
a = a + 5 End Select
Next t, j
MsgBox Timer - temps
Programme de test :
temps = Timer
Dim t As Long, j As Long, a As Long For j = 1 To 1000000
For t = 1 To 5 If t = 1 Then a = a + 1
Else
If t = 2 Then a = a + 2
Else
If t = 3 Then a = a + 3
Else
If t = 4 Then a = a + 4
Else
If t = 5 Then a = a + 5
End If

54
End If End If End If End If Next t, j
MsgBox Timer - temps
On pourrait encore se poser la question dans le cas d?une
série de conditions rassemblées avec un opérateur logique,
par exemple avec OR. La structure " If... Then... ElseIf... End If " pourrait
toujours être utilisée et resterait la plus rapide, mais serait
très lourde à écrire, puisqu'il faudrait
répéter de très nombreuses fois les mêmes
instructions...
Forme optimisée : Voir ci-dessus.
Programme de test : (+1.25*)
temps = Timer
Dim t As Long, j As Long, a As Long
For j = 1 To 1000000
For t = 1 To 5 Select Case t Case 1, 2, 5 a = a + 1
Case 3, 4
a = a + 3
End Select
Next t
Next j
MsgBox Timer - temps
Programme de test : (+1.25*)
temps = Timer
Dim t As Long, j As Long, a As Long
For j = 1 To 1000000
For t = 1 To 5
If t = 1 Or t = 2 Or t = 5 Then
a = a + 1
ElseIf t = 3 Or t = 4 Then
a = a + 3
End If Next t Next j MsgBox Timer - temps

3-Les différentes écritures de If
En VB, les différentes formes d'écriture de
l'instruction "IF" ont une influence sur la vitesse d'exécution, mais la
différence n'existe pas après compilation.
Forme optimisée :
If (condition) Then (instructions1) Else (instructions2)
Forme équivalente : (+1.1*)
If (condition) Then (instructions1) Else: (instructions2)
Forme équivalente : (+1.3*)
If (condition) Then
(instructions1) Else
(instructions2) End If
Programme de test :
temps = Timer
Dim a As Long, b As Long, max As Long, c As Long a = 3: b = 5
For t = 1 To 10000000
If a < b Then max = b Else max = a
'If a < b Then max = b Else: max = a
'If a < b Then
' max = b
'Else
' max = a
'End If
c = a: b = a: a = c
Next t
MsgBox Timer - temps

56
Chapitre IV : Optimisation sur les chaînes 1-Les fonctions
de chaînes
Certaines fonctions sur les chaînes existent en deux
versions, correspondant soit à un type de données en Variant,
soit en String déclaré par le signe dollar ($). Cette
dernière version est la plus rapide. Par exemple, String deviendra
String$.
Les fonctions concernées sont :
Chr$, ChrB$, CurDir$, Date$, Dir$, Error$, Format$, Hex$,
Input$, InputB$, LCase$, Left$, LeftB$, LTrim$, Mid$, MidB$, Oct$, Right$,
RightB$, RTrim$, Space$, Str$, String$, Time$, Trim$, UCase$.
String$
L?appel à certaines de ces fonctions peut être
plus optimisé, en déclarant les paramètres de
l?instruction dans une variable adaptée. Utile seulement dans une
boucle.
Forme optimisée :
Dim z As String, lg As String z = "0"
lg = String$(1000, z)
Forme équivalente : (+1.1*) String(1000, z)
Forme équivalente : (+1.1*) String$(1000, 48)
Forme équivalente : (+1.3*) String$(1000, "0")
Programme de test : temps = Timer
Dim nb As Long, z As String, lg As String
z = "0"
For nb = 1 To 1000000 lg = String$(1000, z) 'lg = String(1000, z)
'lg = String$(1000, 48)
'lg = String$(1000, "0") 'lg = String(1000, "0") Next nb
MsgBox Timer - temps

2-Chaîne statistique ou dynamique
La déclaration de chaîne peut être fait de
deux manières, soit statistique (au maximum 63ko) en définissant
une longueur fixe grâce à String * (longueur), soit
dynamique (jusqu?à 2 milliards de caractère).
Curieusement la déclaration dynamique est nettement plus
rapide pour la concaténation de chaîne.
Forme optimisée : Dim a As String
Forme équivalente : (+3*) Dim a As String *
(nombre)
Programme de test :
temps = Timer
'Dim a As String * 7, b As String * 7, c As String * 14 Dim a As
String, b As String, c As String
Dim t As Long
a = "bonjour"
b = " à toi!"
For t = 1 To 10000000
c = a & b
Next t
MsgBox Timer - temps
3-La concaténation de chaîne
La concaténation est identique avec " & " ou " + ".
Préférer " & " pour éviter toute confusion.
Néanmoins, on peut faire une concaténation plus
rapide, utile dans une boucle. Cela consiste à déclarer la
variable de réception avec une taille valant (ou par excès), la
taille des chaînes à concaténer, puis d?utiliser Mid$.
Cette astuce semble également beaucoup plus performante sous les
dernières versions de VB (version 6 ou plus).
Forme optimisée :
c = Space$(14)
Mid$(c, 1, 7) = a: Mid$(c, 8, 7) = b
Forme optimisée : (+1,04*)
Dim l1 As Long, l2 As Long, l3 As Long, c As String l1 = Len(a):
l2 = Len(b): l3 = l1 + 1
c = Space$(la + lb)
Mid$(c, 1, l1) = a: Mid$(c, l3, l2) = b

58
Forme équivalente : (+1,5*) c = a & b
Forme équivalente : (+1,5*) c = a + b
Programme de test : temps = Timer
Dim a As String, b As String, c As String, t As Long
a = "bonjour"
b = " à toi!"
c = Space$(14)
'Dim l1 As Long, l2 As Long, l3 As Long
'l1 = Len(a): l2 = Len(b): l3 = l1 + 1
'c = Space$(l1 + l2) For t = 1 To 1000000
Mid$(c, 1, 7) = a: Mid$(c, 8, 7) = b
'Mid$(c, 1, l1) = a: Mid$(c, l3, l2) = b
'c = a & b
'c = a + b
Next t
MsgBox Timer - temps
4-La chaîne nulle
Pour attribuer une chaîne nulle à une variable
utilisez la constante vbNullString.
Forme optimisée : mot = vbNullString
Forme équivalente : (+4*) mot = ""
Forme équivalente : (+5.5*) mot = Chr$(0)
Programme de test :
temps = Timer
Dim nb As Long, mot As String For nb = 1 To 1000000
mot = vbNullString
'mot = ""
'mot = Chr$(0)
Next nb
MsgBox Timer - temps

Chapitre V : Optimisation des boucles
La variable d?une boucle doit être déclarée
pour être optimale. Option Explicit est donc très pratique
ici...
Parmi toutes les syntaxes et conditions d?utilisation on peut
faire un classement des boucles en fonction de leur rapidité
d?exécution, pour réaliser exactement le même nombre de
passages.
IL est à noter qu?on peut retenir uniquement deux
formes de boucles optimales : FOR TO NEXT, dans le cas oil l'on connaît
exactement les bornes, oil DO.. LOOP (UNTIL/WHILE) sinon.
For... To... (Step)... Next
La vitesse est la plus rapide pour le type Integer. A
défaut, si la borne > 32766 alors prendre le type Long (presque
équivalent).
Forme optimisée :
Dim Variable As Long, borne_fin As Long
borne_fin = (un nb ou une expression)
FOR Variable = (un nb ou une expression) TO borne_fin STEP (un nb
ou une expression)
NEXT
Programme de test :
temps = Timer
Dim nb As Integer, nb2 As Integer 'Dim nb As Long, nb2 As Long
'Dim nb As Double, nb2 As Double For nb = 1 To 1000
For nb2 = 1 To 32766
Next nb2
Next nb
MsgBox Timer - temps
Do.. Loop (While/Until)
Do (While/Until)... Loop
Do.. Exit Do... Loop
While... Wend
étiquette... Goto étiquette ... Goto
suite
Formes optimales et test : Dim A As Long
Do
A = A + 1
Loop Until A = 10000000

60
Forme équivalente et test : (+1.1*) Dim A As
Long
Do
A = A + 1
Loop While A < 10000000
Forme équivalente et test : (+1.3*) Dim A As
Long
Do Until A = 10000000
A = A + 1
Loop
Forme équivalente et test : (+1.4*) Dim A As
Long
boucle:
A = A + 1
If A < 10000000 Then GoTo boucle
Forme équivalente et test : (+1.4*) Dim A As
Long
Do While A < 10000000
A = A + 1
Loop
Forme équivalente et test : (1.5*) Dim A As Long
Do
A = A + 1
If A = 10000000 Then Exit Do Loop
Forme équivalente et test : (+1.5*) Dim A As
Long
While A < 10000000
A = A + 1
Wend
Forme équivalente et test : (+1.9*) Dim A As Long,
nb As Integer
For nb = 0 To 1
nb = 0
A = A + 1
If A = 10000000 Then Exit For Next
Forme équivalente et test : (+2.7*) ReDim A(0) As
Long
Do

A(0) = A(0) + 1
Loop Until A(0) = 10000000
Pour exécuter une instruction une fois sur x passages :
Forme optimisée :
Dim Saut As Long, A As Long, nb As Long
Saut = 90
For nb = 0 To 10000000
If nb = Saut Then Saut = Saut + 90: A = A + 1 'instructions Next
nb
Forme équivalente : (+1.9*)
Dim A As Long, nb As Long
For nb = 0 To 10000000
If nb mod 90 Then A = A + 1 'instructions Next nb
Programme de test : temps = Timer
Dim Saut As Long, A As Long, nb As Long
Saut = 90
For nb = 0 To 10000000
If nb = Saut Then Saut = Saut + 90: A = A + 1
'If nb Mod 90 Then A = A + 1 'instructions
Next nb
MsgBox Timer - temps

62
Chapitre VI : Compulation de l?application
Utiliser un programme en l'exécutant sous Vb, c'est bien,
mais en compilé en .Exe, c?est plus mieux.
En effet, Vb fournit lors de la compilation un certain nombre de
routines pour optimiser les performances de votre application, ces routines
sont :
-L?IDE ;
-Le compulateur ; -API ;
-Recursivités.
1-IDE
Lorsqu?on exécute un programme sous l'ide de vb,
celui-ci interprète ligne par ligne (bloc par bloc) le comportement de
l'application en faisant une analyse de la syntaxe. Chaque méthode,
chaque fonction, chaque instruction écrite appel dans msvbvm60.dll un
"api" qui exécutera l'instruction lorsque le pointeur d'exécution
(la "ligne jaune"...) sera dessus.
2-Le Compilateur
Pour executer le compilateur sous VB, vous devez aller dans le
Menu Fichier > créer Projet1.exe puis bouton "Options...", onglet
"Compilation" Vous avez alors accès aux différentes options de
compilations comme la fenêtre suivante l?indique :


a-Compilation P-Code
Les routines du programme sont transcrites en p-code. La
compilation en p-code oblige l'utilisation d'un interpreteur de p-code
puisqu'il ne s'agit pas d'asm compilé. Vous n'obtiendrez que peu de
performances en utilisant cette méthode de compilation. En revanche, le
p-code autorise des artefacts de programmation qui ne sont pas autorisés
via la compilation en code natif, ce qui explique qu'un programme
compilé en p-code est plus stable et peut être
décompilé facilement.
b-Compilation en code natif
Les routines du programme sont interpretées puis
compilées en binaire (asm compilé). Les performances des
algoritmes sont donc maximales, car il n'y a plus d?interprétation.
Ici, il s'agit des "performances maximales" pour des routines
compilées sous vb. Comme dit précédemment, les routines
sont interprétées puis compilées définitivement. Le
compilateur "code natif" permet d'agir sur la méthode
d?interprétation ainsi que sur la méthode de compilation :
-optimiser la rapidité du code
L?interpréteur du compilateur simplifiera les
structures vers un code commun "pré-optimisé" (par exemple, un
"for... next" ou un "do... loop until" sera équivalent). Il y aura
également une étude des algorithmes simple pour les
"résumer" (par exemple : "do: i=i+1:loop while i < 1000" sera
remplaçé par "i =1000"...).Le code final sera donc
potentiellement plus rapide car l'interprétation aura simplifié
le code. Notez donc qu'il est possible de "manuellement" d?optimiser la
rapidité du code, en programmant de la façon la plus simple qu'il
soit, les routines classique (A ce sujet, voir mon précédent.
-Optimiser la taille du code
L?interpréteur du compilateur réduira la taille
des structures pour obtenir un code binaire plus petit (mais pas
obligatoirement le plus adapté). Il en résulte un .exe plus petit
que s'il n'y a pas d'optimisation, mais parfois moins performant. La taille
finale de l'exe sera entre 5% et 15% plus petit que sans optimisation (en
arrondissant au multiple de 4096 octets, le gain est parfois de 0%). Il est
difficile de réduire la taille du .exe compilé en
réduisant manuellement la taille des algorithmes sous l'ide (sauf
peut-être en supprimant tout ce qui est inutile : subs () jamais
appelé, objets/classes inutile, etc...). Il existe un moyen plus
astucieux pour réduire la taille du code compilé que d?utiliser
cette option...

64
-Pas d?optimisation
L?interpréteur traduit "tout ce qu'il lit" en binaire
sans restructurations particulière. De toutes évidences ce mode
n'est pas interssant... sauf pour une comparaison avec les autres modes
su-cités comparaison avec les autres modes.
Viennent ensuite deux options en complément :
-Favoriser le Pentium Pro
La compilation utilisera préférentiellement les
instructions ASM fonctionnant rapidement dans les core Pentium Pro. On peut
s'attendre à quelques performances supérieurs sur les "vieux"
pentiums ou pentiums-2 et a des performances moindres sur les k6/cyrix/486...
Mais sur les processeurs tels que PIII, PIV, Celeron ou K7, il n'y aura pas de
différences.
-Générer des informations de débogager
symbolique
Equivalent de la compilation "debug" de vc++, cela permet le
débogage du programme compilé en utilisant des débogueurs
compatibles CodeView (le débogueur de VC++ par exemple...). Cela
interessera ceux qui ont l'habitude déboguer un programme compilé
(les codeurs c/c++ ...). Malheureusement, nous ne savons pas quels
débogages supplémentaires sont accessibles via cette
méthode, par rapport à ce qui est possible sous l?ide.
c-Optimisation avancéés
Vous avez accès à des options
supplémentaires. En cochant judicieusement sur les cases là oil
c'est nécessaire, vous pouvez gagner instantanément 30% de
vitesse d'exécution, en plus de l'option "Optimiser la rapidité
du code" ! Mais, vous pouvez aussi réduire les performances, voire
même provoquer des erreurs non gérées par « On Error
».
Pour les performances optimales, vous ne devrez cocher que les
cases nécessaires. En lisant la description ci-dessous, identifiez si
vos routines seront optimisées ou non via l?option choisie.
-Pas d?utilisation d?alias :
Optimise le stockage des variables en mémoire, lorsque
les références sont communes. Lorsque vous utilisez des arguments
ByRef pour appeler des subs (), la compilation binaire plaçera
astucieusement en cache les variables régulièrement
appelées, comme c'est le cas dans les boucles (do: call T(i): i=i+1:
loop until i > 1000 ; avec Sub T (i as long)). Cette optimisation est
interessante si votre code appelle souvent les mêmes variables
partagées dans beaucoup de sous-fonctions. Dans le cas contraire (le
plus probable), la "mise

en cache" forcé des variables seront des intructions
superflues et vous risquez de perdre des performances.
-Supprimer les contrôles de limites de tableaux Prenons un
exemple:
"dim Tb(1 to 1000) as long
for i = 1 to 1000: Tb(i) = i*2
Next".
Lorsque le code est compilé, avant l'instruction "Tb(i)
=" il y a un test pour savoir si "i > 1000" et si c'est le cas, le
programme appelle __vbaGenerateBoundsError, générant une erreur
pouvant être intercepté via "On Error...", pour éviter le
"seg fault" (tentative d'accès à une zone mémoire non
alloué/autorisé). Si on ne coche pas cette case, cela reviendrai
à faire un "If i > UBound(tabl()) Then Err.Raise" avant chaque
appel dans un tableau!! (Collection d'objets inclus). En enfin, si votre
programme utilise un tableau, et si vous ne risquez pas de "dépasser" ce
tableau, cochez cette case! Y gagnerez assurément en performances!
-Supprimer les contrôles de dépassement sur les
entiers
A chaque calcul aboutissant dans un entier, il y a une
étape pour vérifier si l'entier ne dépasse pas la valeur
maximale autorisée dans son type (+32767 dans le cas de l?Integer). S'il
y a dépassement, le programme génère une erreur pouvant
être interceptée par "On Error...". A l'instar de l'option
précédente, en cochant cette case vous gagnerez
immédiatement en performances puisque il y aura moins de tests. En
revanche, si votre programme risque de faire un dépassement,
attendez-vous à une inversion de signe dans les résultats!
Exemple :
Dim i as integer
i = 32767 + 1" l'ide génère une erreur, tandis que
le code compilé admettra i=-1.
-Supprimer les controles en virgule flottante
Equivalent de l'option précédente, mais sur les
type Single et Double. Si une opération arithmétique
dépasse la limite autorisée pour un type de données, le
compilateur appelle le générateur d'erreur __vbaErrorOverflow,
pouvant être intercepté par "On Error...". Cochez cette case si
vous êtes sûr de ne pas faire un tel dépassement pour
supprimer les quelques instructions de tests, et ainsi gagner en performances.
S'il y a une erreur de ce type durant l'exécution alors

66
que le programme a été compilé avec cette
option, le résultat du calcul sera faussé.
-Autoser les apérations en virgule flottante non
arrondies
Si vous manipuler des chiffres à virgules flottantes
dans les opérations arithmétique (type Single ou Double), par
défaut vb ajuste en permanence le type pour qu'il y ai correspondance
dans, par exemple, les comparaisons (dim s as single, d as double: : if
s = d then ; dans cet exemple, d aura été converti en type single
pour réaliser la comparaison). En cochant cette case, vous supprimez cet
ajustement automatique. Cette option est interessante si vous travaillez avec
la même précision tout au long de vos routines (uniquement Single
ou Double) : en effet la compilation binaire utilisera plus efficacement les
registres mémoires et n'insérera pas d'instruction d'ajustement
des "virgules".
-Supprimer les contrôles safe Pentium FDIV
Une génération de pentium (ceux compris entre
75MHz et 133Mhz) renvoyait un résultat légèrement faux
lors de la division de deux chiffres à virgule flottante (instruction
asm FDIV). Pour palier le problème, le compilateur intègre un
correcteur automatique après chaque division en virugle flottante dans
le code. Si votre programme réalise des divisions de ce type et que vous
n'avez pas l'intention de l'utiliser sur un "vieux" pentium, cochez cette case
pour supprimer ces tests et vous gagnerez quelques peux en performances.
Pour résumer ce qui vient d?être dit, nous
dissons que les applications lorsqu?elles sont compilées permettent de
juger de leurs vitesses d?exécutions, après que le concepteur ait
pensé aux optimisations avancés et a coché les options
comme code natif, rapidité du code, suppression des
contrôles.
3-Les APIs
Utiliser des APIs extérieurs à vb permet
à nos projets vb de voir leurs fonctionnalités très
étendues. Or vous avez déjà pu lire qu?utiliser des APIs
sous vb, c'est moins rapide que d'utiliser les fonctions
préprogrammées vb. Je pense notamment aux manipulations de
caractères. Par exemple : le petit "&" est l'équivalent de
l'API lstrcat ()... normalement la vitesse d'exécution devrait
être la même! Ais ce n?est pas le cas.
Parce que le '&' est intégré à vb".
C'est un des éléments de réponse. L'autre
élément à savoir est que vb n'appelle pas directement les
API "déclarés" tel que le ferait un programme compilé. VB
utilise une API qui appelle les API! Cette fonction que l'on appelle
implicitement via "Declare" s'appelle DllFunctionCall. Et lorsque vous compilez
votre programme vb en .exe , toutes les apis seront appelées via
DllFunctionCall avec le nom "string" de l'API, le nom "string" de la dll, et un
argument ParamArray.

Il faut comprendre qu?appeler une API sous vb sera
définitivement toujours un peu plus lent que dans un autre langage.Cela
ne signifie pas qu'il ne faut plus utiliser d'apis, mais qu'il faut les
utiliser astucieusement. Car un .exe vb compilé, le programme appelle
les fonctions le l'objet activex via __vbaObjSet (et quelques autres)..., si
l'activex utilise beaucoup d?API brute, il est plus intéressant de
passer via l'activex (un objet dans un fichier dont l'extension est soit .dll,
soit .ocx). En revanche, si l'activex a été créé
sous vb, ou que l'activex n'utilise pas plus d'API que l'on peut soi-même
appelé via "Declare", utilisez directement les API ! C'est plus rapide.
A noter que, pour justement palier à ce problème,
directx/direct3d8 intègre directement ses APIs dans le .exe Vb
compilé.
Utiliser un activex est toujours plus pratique pour la
lisibilité d'un code. Si votre objectif est de faire un "bon code de
démonstration", utilisez toujours ces activex! En revanche, si vous
souhaitez des performances, oubliez les règles standard de coding :
trichez, imbriquez, outrepassez et detournez les fonctions vb!
4-Recursivité
Chaque fois que vous appelez une de vos fonctions (par
l?instruction Call) utilisateur, ou qu'il y a un appel à un
"evênement", etc... Sachez que dans le .exe vb compilé, il y a
toujours une vérification de la "pile d'instruction" via __vbaChkStk (on
peut l'assimiler aux nombres de sous-sous-sous-subs () dans lequel le pointeur
"ligne jaune" se situe). Cela permet de générer l'erreur "Espace
de pile insuffisant". Comprenez donc que plus vous appelez de subs et de
sous-subs, plus l?exécution ne perdra des performances pour faire cette
vérification.

Introduction
Cette partie du mémoire présente la base de
données en oracle et l?application en Vb 6.0. La base de données
oracle nous présente les routines déjà invoquées
dans la deuxième partie du travail et l?application met en
évidence des propos du langage de programmation et de l?optimisation du
code de la troixième partie.

70
Chapitre I : La base de données oracle
La base de données présentée est
conçue en oracle, elle gère les employés et les clients.
Cette base de données oracle qui nous montre les routines
d?optimisations comme les vues, les clés secondaires...
1-Connexion à oracle

2-Les tables de la base
a-Table S_DEPT & Enregistrement s


b-Table S_EMP & les Enregistrements


72


c-Table S_DUAL & Enregistrement s

d-Table S_REGION & Enregistrement s

e-Table S_CUSTOMER & Enregistrement s
74

f-Table S_TITLE & Enregistrement s


76



Chapitre II : L?application VB
L?application que nous avons choixie d?optimiser est une
application développée en Visual basic version 6.0. Cette
application se connecte avec une base de données oracle pour
gérer les employés d?une société et ces clients.
Dans le cas de notre travail, cette application parait
intéressante, pour montrer au concepteur la modularité de son
code, les routines de performance que nous avons mise en évidence et en
plus les interfaces de celui-ci.
1-connexion a-Conception

b-module
Option Explicit
Public db As New ADODB.Connection Public uid As String
Public pwd As String
Public dBase As String
Public connected As Integer

78
Sub OracleConnect()
On Error GoTo logonError
connected = 0
Dim Conn As String
Dim drv As String
uid = Trim$(FRMConnexion.txtUserId.Text) pwd =
Trim$(FRMConnexion.txtPassword.Text)
dBase = Trim$(FRMConnexion.txtDatabase.Text) Set db = New
ADODB.Connection
With FRMConnexion
If .txtUserId.Text = "" Then
MsgBox "Entrez le nom d'Utilisateur", vbExclamation
.txtUserId.SetFocus
Exit Sub
ElseIf .txtPassword.Text = "" Then
MsgBox "Entrez le Mot de Passe", vbExclamation
.txtPassword.SetFocus
Exit Sub End If
If .txtDatabase.Text <> "" Then
Conn = "UID= " & uid & ";PWD=" & pwd &
";DRIVER={Microsoft ODBC
For Oracle};" _
& "SERVER=" & dBase & ";"

Else
Conn = "UID= " & uid & ";PWD=" & pwd &
";DRIVER={Microsoft ODBC
For Oracle};"
End If
End With
Screen.MousePointer = vbHourglass With db
.ConnectionString = Conn
.CursorLocation = adUseClient .Open
End With
connected = 1
Screen.MousePointer = vbDefault logonError:
If Err.Number <> 0 Then
Screen.MousePointer = vbDefault
MsgBox "Redémarrer le Programme si une erreur c'est
produite. Error
Description:" & Err.Description & "", vbCritical
connected = 0
With FRMConnexion
.txtUserId.Text = vbNullString
.txtPassword.Text = vbNullString .txtDatabase.Text =
vbNullString .txtUserId.SetFocus
End With
Else

80
Screen.MousePointer = vbDefault
Unload FRMConnexion
End If End Sub c-Code Option Explicit
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdOk_Click()
OracleConnect
End Sub
c-Execution



2-Menu
a-Mode conception

b-Code
Private Sub client_Click() If connected = 1 Then

82
FRMCustomer.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub
Private Sub connexion_Click() FRMConnexion.Show
End Sub
Private Sub conregion_Click()
If connected = 1 Then
FRMConsRégion.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub
Private Sub consclient_Click()
If connected = 1 Then FRMConsClient.Show Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub

Private Sub consdept_Click()
If connected = 1 Then
FRMConsDept.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub
Private Sub consemp_Click()
If connected = 1 Then
FRMConsEmp.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub
Private Sub dept_Click()
If connected = 1 Then
FRMDept.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub
Private Sub emp_Click() If connected = 1 Then

84
FRMEmp.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub
Private Sub Form_Load()
End Sub
Private Sub quitter_Click() End
End Sub
Private Sub Region_Click()
If connected = 1 Then
FRMRégion.Show
Else
MsgBox "Vous devez d'abord vous connectez" End If
End Sub

c-Exécution du Menu

3-Département a-mode conception

86
b-Module
Sub InsertDept()
Dim adoCommand As ADODB.Command
Dim adoRecordSet As ADODB.Recordset
On Error GoTo InsertDept
Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText .ActiveConnection = db
.CommandText = "SELECT ID,NAME,REGION_ID FROM S_DEPT"
End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
adoRecordSet.AddNew
adoRecordSet!ID = FRMDept.D(0).Text
adoRecordSet!Name = FRMDept.D(1).Text
adoRecordSet!region_id = FRMDept.rg
Call adoRecordSet.Update Set adoRecordSet = Nothing Set
adoCommand = Nothing Exit Sub
InsertDept:
MsgBox "Ajout Error Description:" & Err.Description & "",
vbCritical End Sub
Sub DeleteDept()

Dim adoCommand As ADODB.Command
Dim adoRecordSet As ADODB.Recordset
On Error GoTo DeleteDept
Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT ID,NAME,REGION_ID FROM S_DEPT" End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic,
adLockOptimistic
Call adoRecordSet.Find("id =" & FRMDept.D(0).Text)
While Not adoRecordSet.EOF() adoRecordSet.Delete
adoRecordSet.MoveNext
Call adoRecordSet.Find("id =" & FRMDept.D(0).Text)
Wend
If adoRecordSet.RecordCount > 0 Then
adoRecordSet.MoveFirst End If

88
Call adoRecordSet.Update
Set adoRecordSet = Nothing Set adoCommand = Nothing Exit
Sub
DeleteDept:
MsgBox "Supression Error Description:" & Err.Description
& "", vbCritical End Sub
Sub UpdateDept()
Dim adoCommand As ADODB.Command Dim adoRecordSet As
ADODB.Recordset On Error GoTo UpdateDept
Set adoCommand = New ADODB.Command With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT ID,NAME,REGION_ID FROM S_DEPT"
End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
Call adoRecordSet.Find("id =" & FRMDept.D(0).Text)
While Not adoRecordSet.EOF()
adoRecordSet!Name = FRMDept.D(1).Text adoRecordSet!region_id =
FRMDept.rg

adoRecordSet.MoveNext
Call adoRecordSet.Find("id =" & FRMDept.D(0).Text)
Wend
If adoRecordSet.RecordCount > 0 Then
adoRecordSet.MoveFirst End If
Call adoRecordSet.Update Set adoRecordSet = Nothing Set
adoCommand = Nothing Exit Sub
UpdateDept:
MsgBox "Modification Error Description:" & Err.Description
& "", vbCritical End Sub
c-code
Option Explicit
Dim rs2 As New ADODB.Recordset Dim sq2 As New ADODB.Recordset Dim
nb As New ADODB.Recordset Dim cmbrg As New ADODB.Recordset Dim cmbch As New
ADODB.Recordset Dim aj, up As Integer
Public rg As Integer
Private Sub Annuler_Click()
DRG.Clear
cmbnumreg.Clear

90
parcours.Enabled = True actions.Enabled = True validation.Enabled
= False premier.Enabled = True dernier.Enabled = True precedent.Enabled = True
suivant.Enabled = True nouveau.Enabled = True modifier.Enabled = True
supprimer.Enabled = True fermer.Enabled = True Valider.Enabled = False
Annuler.Enabled = False D(0).Enabled = False
D(1).Enabled = False
DRG.Enabled = False
rs2.MoveFirst
D(0).Text = rs2("id")
D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db,
adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name")
cmbrg.Close
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group
by dept_id", db, adOpenDynamic, adLockBatchOptimistic nb_emp =
""

nb_emp.Text = nb.Fields(0)
nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
aj = 0
up = 0
End Sub
Private Sub DRG_Click()
rg = cmbnumreg.List(DRG.ListIndex)
End Sub
Private Sub fermer_Click()
Me.Hide Unload Me
End Sub
Private Sub Form_Load()
Set cmbrg = New ADODB.Recordset
Set cmbch = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
Set nb = New ADODB.Recordset
rs2.Open "Select * from s_dept", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveFirst
D(0).Text = rs2("id")
D(1).Text = rs2("Name")
cmbrg.Open "Select name from s_region where id=" &
rs2("region_id"), db

92
DRG.Text = cmbrg("name") cmbrg.Close
parcours.Enabled = True actions.Enabled = True validation.Enabled
= False premier.Enabled = True dernier.Enabled = True precedent.Enabled = True
suivant.Enabled = True nouveau.Enabled = True modifier.Enabled = True
supprimer.Enabled = True fermer.Enabled = True Valider.Enabled = False
Annuler.Enabled = False aj = 0
up = 0
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group
by dept_id", db, adOpenDynamic, adLockBatchOptimistic nb_emp =
""
nb_emp.Text = nb.Fields(0)
nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If

End Sub
Private Sub Form_Unload(Cancel As Integer) rs2.Close
End Sub
Private Sub modifier_Click() parcours.Enabled = False
actions.Enabled = False validation.Enabled = True D(0).Enabled = False
D(1).Enabled = True
DRG.Enabled = True
aj = 0
up = 1
premier.Enabled = False dernier.Enabled = False precedent.Enabled
= False suivant.Enabled = False nouveau.Enabled = False modifier.Enabled =
False supprimer.Enabled = False fermer.Enabled = False Valider.Enabled = True
Annuler.Enabled = True

94

cmbch.Open "Select * from s_region", db, adOpenDynamic,
adLockBatchOptimistic
While Not cmbch.EOF()
DRG.AddItem (cmbch("name"))
cmbnumreg.AddItem (cmbch("id"))
cmbch.MoveNext
Wend cmbch.Close
End Sub
Private Sub nouveau_Click()
parcours.Enabled = False
actions.Enabled = False
validation.Enabled = True
D(0).Enabled = False
D(1).Enabled = True
DRG.Enabled = True
D(0).Text = "" D(1).Text = "" DRG.Text = "" aj = 1
up = 0
premier.Enabled = False
dernier.Enabled = False
precedent.Enabled = False
suivant.Enabled = False
nouveau.Enabled = False modifier.Enabled = False
supprimer.Enabled = False fermer.Enabled = False Valider.Enabled = True
Annuler.Enabled = True
D(0).Text = "Identifiant Automatique"
cmbch.Open "Select * from s_region", db, adOpenDynamic,
adLockBatchOptimistic
While Not cmbch.EOF()
DRG.AddItem (cmbch("name"))
cmbnumreg.AddItem (cmbch("id"))
cmbch.MoveNext
Wend cmbch.Close
End Sub
Private Sub precedent_Click() On Error Resume Next
D(0).Text = vbNullString D(1).Text = vbNullString DRG.Text =
vbNullString rs2.MovePrevious
D(0).Text = rs2("id")
D(1).Text = rs2("Name")

96
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db, adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name") cmbrg.Close
If D(0).Text = "" Then
rs2.MoveNext
D(0).Text = rs2("id")
D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db, adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name") cmbrg.Close
End If
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group by dept_id", db, adOpenDynamic, adLockBatchOptimistic
nb_emp = ""
nb_emp.Text = nb.Fields(0) nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
End Sub
Private Sub premier_Click() On Error Resume Next
D(0).Text = ""

D(1).Text = "" DRG.Text = "" rs2.MoveFirst D(0).Text =
rs2("id")
D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db,
adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name")
cmbrg.Close
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group
by dept_id", db, adOpenDynamic, adLockBatchOptimistic
nb_emp = ""
nb_emp.Text = nb.Fields(0)
nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
End Sub
Private Sub suivant_Click() On Error Resume Next
D(0).Text = vbNullString D(1).Text = vbNullString DRG.Text =
vbNullString rs2.MoveNext

98
D(0).Text = rs2("id") D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db, adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name") cmbrg.Close
If D(0).Text = "" Then
rs2.MovePrevious
D(0).Text = rs2("id")
D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db, adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name") cmbrg.Close
End If
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group by dept_id", db, adOpenDynamic, adLockBatchOptimistic
nb_emp = ""
nb_emp.Text = nb.Fields(0) nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
End Sub
Private Sub dernier_Click()

On Error Resume Next
rs2.MoveLast
D(0).Text = rs2("id")
D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db,
adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name")
cmbrg.Close
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group
by dept_id", db, adOpenDynamic, adLockBatchOptimistic
nb_emp = ""
nb_emp.Text = nb.Fields(0)
nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
End Sub
Private Sub supprimer_Click()
MAJDept.DeleteDept
rs2.Close
rs2.Open "Select * from s_dept", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveFirst
D(0).Text = rs2("id")
D(1).Text = rs2("Name")

100
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db, adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name") cmbrg.Close
On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group by dept_id", db, adOpenDynamic, adLockBatchOptimistic
nb_emp = ""
nb_emp.Text = nb.Fields(0)
nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
End Sub
Private Sub Valider_Click()
DRG.Clear
cmbnumreg.Clear
parcours.Enabled = True
actions.Enabled = True
validation.Enabled = False
If aj = 1 Then
Set sq2 = New ADODB.Recordset
sq2.Open "Select s_dept_id.nextval from dual", db, adOpenDynamic,
adLockBatchOptimistic
D(0).Text = sq2.Fields(0) sq2.Close

MAJDept.InsertDept rs2.Close
rs2.Open "Select * from s_dept", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveLast
D(0).Text = rs2("id") D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db,
adOpenDynamic, adLockBatchOptimistic
DRG.Text = cmbrg("name")
cmbrg.Close
End If
D(0).Enabled = False D(1).Enabled = False DRG.Enabled = False
If up = 1 Then
MAJDept.UpdateDept rs2.Close
rs2.Open "Select * from s_dept", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveFirst
D(0).Text = rs2("id") D(1).Text = rs2("Name")
cmbrg.Open "Select * from s_region where id=" &
rs2("region_id"), db,
adOpenDynamic, adLockBatchOptimistic DRG.Text = cmbrg("name")
cmbrg.Close
End If

102
aj = 0
up = 0
premier.Enabled = True dernier.Enabled = True precedent.Enabled =
True suivant.Enabled = True nouveau.Enabled = True modifier.Enabled = True
supprimer.Enabled = True fermer.Enabled = True Valider.Enabled = False
Annuler.Enabled = False On Error Resume Next
nb.Open "select count(*) from s_emp Where dept_id =" &
D(0).Text & "group
by dept_id", db, adOpenDynamic, adLockBatchOptimistic nb_emp =
""
nb_emp.Text = nb.Fields(0)
nb.Close
If nb_emp = "" Then
nb_emp.Text = 0
End If
End Sub

4-Employé
a-mode conception

b-Module
Sub InsertEmp()
Dim adoCommand As ADODB.Command
Dim adoRecordSet As ADODB.Recordset
On Error GoTo InsertEmp
Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT * FROM S_Emp"
End With

104
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
adoRecordSet.AddNew
adoRecordSet!ID = FRMEmp.E(0).Text
adoRecordSet!Last_Name = FRMEmp.E(1).Text adoRecordSet!First_Name
= FRMEmp.E(2).Text adoRecordSet!UserID = FRMEmp.E(3).Text
adoRecordSet!Start_Date = FRMEmp.E(4).Text adoRecordSet!Comments =
FRMEmp.E(5).Text adoRecordSet!Manager_ID = FRMEmp.E(6).Text adoRecordSet!title
= FRMEmp.title.Text adoRecordSet!DEPT_ID = FRMEmp.dpt
adoRecordSet!Salary = FRMEmp.E(9).Text
adoRecordSet!Commission_PCT = FRMEmp.compct.Text Call adoRecordSet.Update
Set adoRecordSet = Nothing
Set adoCommand = Nothing
Exit Sub
InsertEmp:
MsgBox "Ajout Error Description:" & Err.Description & "",
vbCritical End Sub
Sub DeleteEmp()
Dim adoCommand As ADODB.Command Dim adoRecordSet As
ADODB.Recordset
On Error GoTo DeleteEmp

Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT * FROM S_Emp"
End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
Call adoRecordSet.Find("id =" & FRMEmp.E(0).Text)
While Not adoRecordSet.EOF()
adoRecordSet.Delete
adoRecordSet.MoveNext
Call adoRecordSet.Find("id =" & FRMEmp.E(0).Text)
Wend
If adoRecordSet.RecordCount > 0 Then
adoRecordSet.MoveFirst
End If
Call adoRecordSet.Update
Set adoRecordSet = Nothing
Set adoCommand = Nothing
Exit Sub
DeleteEmp:
MsgBox "Supression Error Description:" & Err.Description
& "", vbCritical
End Sub

106
Sub UpdateEmp()
Dim adoCommand As ADODB.Command Dim adoRecordSet As
ADODB.Recordset On Error GoTo UpdateEmp
Set adoCommand = New ADODB.Command With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT
ID,LAST_NAME,FIRST_NAME,USERID,START_DATE,COMMENTS,MANAGER_ID
,TITLE,DEPT_ID,SALARY,COMMISSION_PCT FROM S_Emp" End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
Call adoRecordSet.Find("id =" & FRMEmp.E(0).Text) While Not
adoRecordSet.EOF()
adoRecordSet!Last_Name = FRMEmp.E(1).Text adoRecordSet!First_Name
= FRMEmp.E(2).Text adoRecordSet!UserID = FRMEmp.E(3).Text
adoRecordSet!Start_Date = FRMEmp.E(4).Text adoRecordSet!Comments =
FRMEmp.E(5).Text adoRecordSet!Manager_ID = FRMEmp.E(6).Text adoRecordSet!title
= FRMEmp.title.Text adoRecordSet!DEPT_ID = FRMEmp.dpt
adoRecordSet!Salary = FRMEmp.E(9).Text
adoRecordSet!Commission_PCT = FRMEmp.compct.Text

adoRecordSet.MoveNext
Call adoRecordSet.Find("id =" & FRMEmp.E(0).Text)
Wend
If adoRecordSet.RecordCount > 0 Then
adoRecordSet.MoveFirst
End If
Call adoRecordSet.Update
Set adoRecordSet = Nothing Set adoCommand = Nothing Exit
Sub
UpdateEmp:
MsgBox "Modification Error Description:" & Err.Description
& "", vbCritical
End Sub
c-code
Option Explicit
Dim rs2 As New ADODB.Recordset Dim sq2 As New ADODB.Recordset Dim
nb As New ADODB.Recordset Dim cmbrg As New ADODB.Recordset Dim cmbch As New
ADODB.Recordset Dim tit As New ADODB.Recordset
Dim aj, up As Integer
Public dpt As Integer

108
Private Sub cmbdept_Click()
dpt = cmbdeptnum.List(cmbdept.ListIndex) End Sub
Private Sub date1_Click() Calendar1.Visible = True End Sub
Private Sub fermer_Click()
Me.Hide
Unload Me
End Sub
Private Sub Form_Load()
On Error Resume Next
E(0).Text = "" E(1).Text = "" E(2).Text = "" E(3).Text = ""
E(4).Text = "" E(5).Text = "" E(6).Text = "" title.Text = "" cmbdept.Text =
""
E(9).Text = "" compct.Text = ""
Set cmbrg = New ADODB.Recordset

Set tit = New ADODB.Recordset
Set cmbch = New ADODB.Recordset
Set rs2 = New ADODB.Recordset Set nb = New ADODB.Recordset
rs2.Open "Select * from s_emp", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveFirst
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db
cmbdept.Text = cmbrg("name") cmbrg.Close
E(9).Text = rs2("salary")
compct.Text = rs2("commission_pct")
parcours.Enabled = True actions.Enabled = True
validation.Enabled = False premier.Enabled = True dernier.Enabled
= True precedent.Enabled = True suivant.Enabled = True

110
nouveau.Enabled = True modifier.Enabled = True supprimer.Enabled
= True fermer.Enabled = True Valider.Enabled = False Annuler.Enabled = False aj
= 0
up = 0
End Sub
Private Sub Form_Unload(Cancel As Integer) rs2.Close
End Sub
Private Sub precedent_Click()
On Error Resume Next
E(0).Text = vbNullString E(1).Text = vbNullString E(2).Text =
vbNullString E(3).Text = vbNullString E(4).Text = vbNullString E(5).Text =
vbNullString E(6).Text = vbNullString title.Text = vbNullString cmbdept.Text =
vbNullString E(9).Text = vbNullString


112
compct.Text = vbNullString
rs2.MovePrevious
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
E(9).Text = rs2("salary") cmbrg.Close
If rs2("commission_pct") <> "" Then
compct.Text = rs2("commission_pct")
Else
compct.Text = ""
End If
If E(0).Text = "" Then
rs2.MoveNext
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date")
E(5).Text = rs2("comments")
E(6).Text = rs2("manager_id")
title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
If rs2("commission_pct") <> "" Then
compct.Text = rs2("commission_pct")
Else
compct.Text = ""
End If End If End Sub
Private Sub premier_Click() On Error Resume Next
E(0).Text = vbNullString
E(1).Text =
vbNullString
E(2).Text = vbNullString
E(3).Text = vbNullString E(4).Text = vbNullString E(5).Text =
vbNullString E(6).Text = vbNullString title.Text = vbNullString

cmbdept.Text = vbNullString
E(9).Text = vbNullString compct.Text = vbNullString
rs2.MoveFirst
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
If rs2("commission_pct") <> "" Then
compct.Text = rs2("commission_pct")
Else
compct.Text = ""
End If
End Sub
Private Sub suivant_Click() On Error Resume Next
E(0).Text = vbNullString

114
E(1).Text = vbNullString
E(2).Text = vbNullString E(3).Text = vbNullString E(4).Text =
vbNullString E(5).Text = vbNullString E(6).Text = vbNullString title.Text =
vbNullString cmbdept.Text = vbNullString E(9).Text = vbNullString compct.Text =
vbNullString rs2.MoveNext
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
If rs2("commission_pct") <> "" Then
compct.Text = rs2("commission_pct")

Else
compct.Text = "" End If
If E(0).Text = "" Then
rs2.MovePrevious
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
If rs2("commission_pct") <> "" Then
compct.Text = rs2("commission_pct")
Else
compct.Text = ""
End If
End If
End Sub
Private Sub dernier_Click()

116
On Error Resume Next
E(0).Text = vbNullString E(1).Text = vbNullString E(2).Text =
vbNullString E(3).Text = vbNullString E(4).Text = vbNullString E(5).Text =
vbNullString E(6).Text = vbNullString title.Text = vbNullString cmbdept.Text =
vbNullString E(9).Text = vbNullString compct.Text = vbNullString
rs2.MoveLast
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")

If rs2("commission_pct") <> "" Then compct.Text =
rs2("commission_pct") Else
compct.Text = ""
End If
End Sub
Private Sub supprimer_Click()
MAJEmp.DeleteEmp
E(0).Text = "" E(1).Text = "" E(2).Text = "" E(3).Text = ""
E(4).Text = "" E(5).Text = "" E(6).Text = "" title.Text = "" cmbdept.Text =
""
E(9).Text = "" compct.Text = ""
On Error Resume Next
rs2.Close
rs2.Open "Select * from s_Emp", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveFirst
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name")

118
E(2).Text = rs2("first_name")
E(3).Text = rs2("userid")
E(4).Text = rs2("start_date")
E(5).Text = rs2("comments")
E(6).Text = rs2("manager_id")
title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
compct.Text = rs2("commission_pct")
End Sub
Private Sub nouveau_Click()
parcours.Enabled = False
actions.Enabled = False validation.Enabled = True
E(0).Enabled = False E(1).Enabled = True E(2).Enabled = True
E(3).Enabled = True E(4).Enabled = True E(5).Enabled = True E(6).Enabled = True
title.Enabled = True cmbdept.Enabled = True

E(9).Enabled = True compct.Enabled = True date1.Enabled = True
E(0).Text = ""
E(1).Text = "" E(2).Text = "" E(3).Text = "" E(4).Text = ""
E(5).Text = "" E(6).Text = "" title.Text = "" cmbdept.Text = "" E(9).Text = ""
compct.Text = "10"
aj = 1
up = 0
premier.Enabled = False dernier.Enabled = False precedent.Enabled
= False suivant.Enabled = False nouveau.Enabled = False modifier.Enabled =
False supprimer.Enabled = False fermer.Enabled = False Valider.Enabled = True
Annuler.Enabled = True

120
E(0).Text = "Identifiant Automatique"
cmbch.Open "Select * from s_dept", db, adOpenDynamic,
adLockBatchOptimistic
While Not cmbch.EOF()
cmbdept.AddItem (cmbch("name")) cmbdeptnum.AddItem
(cmbch("id")) cmbch.MoveNext
Wend
cmbch.Close
tit.Open "Select * from s_title", db, adOpenDynamic,
adLockBatchOptimistic While Not tit.EOF()
title.AddItem (tit("title"))
tit.MoveNext
Wend tit.Close End Sub
Private Sub modifier_Click()
parcours.Enabled = False
actions.Enabled = False validation.Enabled = True
E(0).Enabled = False E(1).Enabled = True E(2).Enabled = True
E(3).Enabled = True

E(4).Enabled = True E(5).Enabled = True E(6).Enabled = True
title.Enabled = True cmbdept.Enabled = True E(9).Enabled = True compct.Enabled
= True date1.Enabled = True
compct.Text = rs2("commission_pct")
aj = 0
up = 1
premier.Enabled = False dernier.Enabled = False
precedent.Enabled = False
suivant.Enabled = False nouveau.Enabled = False
modifier.Enabled = False
supprimer.Enabled = False
fermer.Enabled = False Valider.Enabled = True Annuler.Enabled
= True cmbch.Open "Select * from s_dept", db, adOpenDynamic,
adLockBatchOptimistic
While Not cmbch.EOF()
cmbdept.AddItem (cmbch("name")) cmbdeptnum.AddItem
(cmbch("id"))

122
cmbch.MoveNext Wend
cmbch.Close
tit.Open "Select * from s_title", db, adOpenDynamic,
adLockBatchOptimistic
While Not tit.EOF()
title.AddItem (tit("title"))
tit.MoveNext
Wend tit.Close End Sub
Private Sub Annuler_Click() cmbdept.Clear
cmbdeptnum.Clear
title.Clear
parcours.Enabled = True actions.Enabled = True validation.Enabled
= False premier.Enabled = True dernier.Enabled = True precedent.Enabled = True
suivant.Enabled = True

nouveau.Enabled = True modifier.Enabled = True supprimer.Enabled
= True fermer.Enabled = True Valider.Enabled = False Annuler.Enabled = False
E(0).Enabled = False E(1).Enabled = False E(2).Enabled = False E(3).Enabled =
False E(4).Enabled = False E(5).Enabled = False E(6).Enabled = False
title.Enabled = False cmbdept.Enabled = False E(9).Enabled = False
compct.Enabled = False date1.Enabled = False Calendar1.Visible = False
E(0).Text = ""
E(1).Text = ""
E(2).Text = ""
E(3).Text = ""
E(4).Text = ""
E(5).Text = ""
E(6).Text = ""

124
title.Text = ""
cmbdept.Text = ""
E(9).Text = ""
compct.Text = ""
On Error Resume Next
rs2.Close
rs2.Open "Select * from s_Emp", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveFirst
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name") E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text =
rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
compct.Text = rs2("commission_pct")
aj = 0
up = 0
End Sub

Private Sub Valider_Click()
cmbdept.Clear
cmbdeptnum.Clear
parcours.Enabled = True
actions.Enabled = True
validation.Enabled = False
If aj = 1 Then
Set sq2 = New ADODB.Recordset
sq2.Open "Select s_emp_id.nextval from dual", db,
adOpenDynamic,
adLockBatchOptimistic
E(0).Text = sq2.Fields(0)
sq2.Close
MAJEmp.InsertEmp
title.Clear
E(0).Text = "" E(1).Text = "" E(2).Text = "" E(3).Text = ""
E(4).Text = "" E(5).Text = "" E(6).Text = "" title.Text = "" cmbdept.Text =
""
E(9).Text = "" compct.Text = ""

126
On Error Resume Next rs2.Close
rs2.Open "Select * from s_Emp", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveLast
E(0).Text = rs2("id") E(1).Text = rs2("last_Name")
E(2).Text = rs2("first_name")
E(3).Text = rs2("userid") E(4).Text = rs2("start_date")
E(5).Text = rs2("comments")
E(6).Text = rs2("manager_id")
title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db
cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
compct.Text = rs2("commission_pct")
End If
E(0).Enabled = False E(1).Enabled = False E(2).Enabled = False
E(3).Enabled = False E(4).Enabled = False E(5).Enabled = False E(6).Enabled =
False title.Enabled = False

cmbdept.Enabled = False
E(9).Enabled = False
compct.Enabled = False
date1.Enabled = False
Calendar1.Visible = False
If up = 1 Then MAJEmp.UpdateEmp
title.Clear
E(0).Text = "" E(1).Text = "" E(2).Text = "" E(3).Text = ""
E(4).Text = "" E(5).Text = "" E(6).Text = "" title.Text = "" cmbdept.Text =
""
E(9).Text = "" compct.Text = ""
On Error Resume Next
rs2.Close
rs2.Open "Select * from s_Emp", db, adOpenDynamic,
adLockBatchOptimistic rs2.MoveLast
E(0).Text = rs2("id")
E(1).Text = rs2("last_Name")
E(2).Text = rs2("first_name")

128
E(3).Text = rs2("userid") E(4).Text = rs2("start_date") E(5).Text
= rs2("comments") E(6).Text = rs2("manager_id") title.Text = rs2("title")
cmbrg.Open "Select name from s_dept where id=" &
rs2("dept_id"), db cmbdept.Text = cmbrg("name")
cmbrg.Close
E(9).Text = rs2("salary")
compct.Text = rs2("commission_pct")
End If
aj = 0
up = 0
premier.Enabled = True dernier.Enabled = True precedent.Enabled =
True suivant.Enabled = True nouveau.Enabled = True modifier.Enabled = True
supprimer.Enabled = True fermer.Enabled = True Valider.Enabled = False
Annuler.Enabled = False End Sub
Private Sub Calendar1_Click() E(4).Text = Calendar1.Value

Calendar1.Visible = False End Sub
5-Client

6-Région
a-mode de conception


130
b-Module
Sub InsertRégion()
Dim adoCommand As ADODB.Command
Dim adoRecordSet As ADODB.Recordset
On Error GoTo InsertRégion
Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT ID,NAME FROM S_REGION" End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic,
adLockOptimistic
adoRecordSet.AddNew
adoRecordSet!ID = FRMRégion.R(0).Text
adoRecordSet!Name = FRMRégion.R(1).Text
Call adoRecordSet.Update Set adoRecordSet = Nothing Set
adoCommand = Nothing Exit Sub
InsertRégion:
MsgBox "Ajout Error Description:" & Err.Description & "",
vbCritical End Sub
Sub DeleteRégion()

Dim adoCommand As ADODB.Command
Dim adoRecordSet As ADODB.Recordset
On Error GoTo DeleteRégion
Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT ID,NAME FROM S_REGION" End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
Call adoRecordSet.Find("id =" & FRMRégion.R(0).Text)
While Not adoRecordSet.EOF() adoRecordSet.Delete
adoRecordSet.MoveNext
Call adoRecordSet.Find("id =" &
FRMRégion.R(0).Text)
Wend
If adoRecordSet.RecordCount > 0 Then
adoRecordSet.MoveFirst End If
Call adoRecordSet.Update Set adoRecordSet = Nothing Set
adoCommand = Nothing Exit Sub

132
DeleteRégion:
MsgBox "Supression Error Description:" & Err.Description
& "", vbCritical End Sub
Sub UpdateRégion()
Dim adoCommand As ADODB.Command
Dim adoRecordSet As ADODB.Recordset
On Error GoTo UpdateRégion
Set adoCommand = New ADODB.Command
With adoCommand
.CommandType = adCmdText
.ActiveConnection = db
.CommandText = "SELECT ID,NAME FROM S_REGION" End With
Set adoRecordSet = New ADODB.Recordset
adoRecordSet.Open adoCommand, , adOpenStatic, adLockOptimistic
Call adoRecordSet.Find("id =" & FRMRégion.R(0).Text)
While Not adoRecordSet.EOF()
adoRecordSet!Name = FRMRégion.R(1).Text
adoRecordSet.MoveNext
Call adoRecordSet.Find("id =" & FRMRégion.R(0).Text)
Wend

If adoRecordSet.RecordCount > 0 Then adoRecordSet.MoveFirst
End If
Call adoRecordSet.Update
Set adoRecordSet = Nothing Set adoCommand = Nothing Exit
Sub
UpdateRégion:
MsgBox "Modification Error Description:" & Err.Description
& "", vbCritical End Sub
c-Code
Option Explicit
Dim rs As New ADODB.Recordset Dim sq As New ADODB.Recordset
Dim aj, up As Integer
Private Sub Annuler_Click() parcours.Enabled = True
actions.Enabled = True validation.Enabled = False premier.Enabled = True
dernier.Enabled = True precedent.Enabled = True

134
suivant.Enabled = True nouveau.Enabled = True modifier.Enabled =
True supprimer.Enabled = True fermer.Enabled = True Valider.Enabled = False
Annuler.Enabled = False R(0).Enabled = False R(1).Enabled = False
rs.MoveFirst
R(0).Text = rs("id") R(1).Text = rs("Name") aj = 0
up = 0
End Sub
Private Sub fermer_Click() Me.Hide
Unload Me
End Sub
Private Sub Form_Load() Dim i As Integer
For i = 0 To 1
R(i) = 0
Next

Set rs = New ADODB.Recordset
rs.Open "Select * from s_region", db, adOpenDynamic,
adLockBatchOptimistic rs.MoveFirst
R(0).Text = rs("id")
R(1).Text = rs("Name")
parcours.Enabled = True
actions.Enabled = True
validation.Enabled = False
premier.Enabled = True dernier.Enabled = True precedent.Enabled =
True suivant.Enabled = True nouveau.Enabled = True modifier.Enabled = True
supprimer.Enabled = True fermer.Enabled = True Valider.Enabled = False
Annuler.Enabled = False aj = 0
up = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
rs.Close
End Sub

136
Private Sub modifier_Click() parcours.Enabled = False
actions.Enabled = False validation.Enabled = True R(0).Enabled = False
R(1).Enabled = True
aj = 0
up = 1
premier.Enabled = False dernier.Enabled = False precedent.Enabled
= False suivant.Enabled = False nouveau.Enabled = False modifier.Enabled =
False supprimer.Enabled = False fermer.Enabled = False Valider.Enabled = True
Annuler.Enabled = True End Sub
Private Sub nouveau_Click() parcours.Enabled = False
actions.Enabled = False validation.Enabled = True R(0).Enabled = False

R(1).Enabled = True
R(0).Text = ""
R(1).Text = ""
aj = 1
up = 0
premier.Enabled = False dernier.Enabled = False precedent.Enabled
= False suivant.Enabled = False nouveau.Enabled = False modifier.Enabled =
False supprimer.Enabled = False fermer.Enabled = False Valider.Enabled = True
Annuler.Enabled = True
R(0).Text = "Identifiant Automatique" End Sub
Private Sub precedent_Click()
On Error Resume Next
R(0).Text = "" R(1).Text = "" rs.MovePrevious
R(0).Text = rs("id")
R(1).Text = rs("Name")
If R(0).Text = "" Then

138
rs.MoveNext
R(0).Text = rs("id") R(1).Text = rs("Name") End If
End Sub
Private Sub premier_Click() On Error Resume Next rs.MoveFirst
R(0).Text = rs("id") R(1).Text = rs("Name") End Sub
Private Sub suivant_Click() On Error Resume Next R(0).Text =
""
R(1).Text = ""
rs.MoveNext
R(0).Text = rs("id") R(1).Text = rs("Name") If R(0).Text = ""
Then rs.MovePrevious
R(0).Text = rs("id") R(1).Text = rs("Name") End If
End Sub

Private Sub dernier_Click() On Error Resume Next
rs.MoveLast
R(0).Text = rs("id")
R(1).Text = rs("Name")
End Sub
Private Sub supprimer_Click()
MAJRégion.DeleteRégion
rs.Close
rs.Open "Select * from s_region", db, adOpenDynamic,
adLockBatchOptimistic rs.MoveFirst
R(0).Text = rs("id")
R(1).Text = rs("Name")
End Sub
Private Sub Valider_Click()
parcours.Enabled = True
actions.Enabled = True
validation.Enabled = False
If aj = 1 Then
Set sq = New ADODB.Recordset
sq.Open "Select s_region_id.nextval from dual", db,
adOpenDynamic,
adLockBatchOptimistic
R(0).Text =
sq.Fields(0)
sq.Close

140
MAJRégion.InsertRégion rs.Close
rs.Open "Select * from s_region", db, adOpenDynamic,
adLockBatchOptimistic rs.MoveLast
R(0).Text = rs("id")
R(1).Text = rs("Name") End If
R(0).Enabled = False R(1).Enabled = False If up = 1 Then
MAJRégion.UpdateRégion rs.Close
rs.Open "Select * from s_region", db, adOpenDynamic,
adLockBatchOptimistic rs.MoveFirst
R(0).Text = rs("id")
R(1).Text = rs("Name") End If
aj = 0
up = 0
premier.Enabled = True dernier.Enabled = True precedent.Enabled =
True suivant.Enabled = True nouveau.Enabled = True modifier.Enabled = True
supprimer.Enabled = True

fermer.Enabled = True Valider.Enabled = False Annuler.Enabled
= False End Sub

142
CONCLUSION
Au vu de tous ce qui prècede nous pouvons conclure que
l?optimisation est un concept applicable à tous les niveaux de
l?informatique. En ce qui concerne l?application, elle peut se faire au niveau
de la base de données en tenant compte des possibilités
qu?offrent le SGBDR ou encore au niveau du code source de celle-ci du point de
vue algorithmiques et langage de programmation. En effet, une application
optimisée sera plus performante et plus rapide qu?une application non
optimisée, car les élèments qui la composent ont
été réecrit de la meilleure façon.

ANNEXES
BIBLIOGRAPHIE

144
1-Comprendre MERISE, outits de conceptions et
organisationnels. Jean Patrick MATHERON
Edition EYROLLES.
2- INFORMATIQUE DE GESTION. Jacques SORNET
Edition Dunod, paris 2003. 3-Base de données
avancées Jean-Yves Antoine
Li-Université François Rabalais de Tours.
4-Oracle 10g(Administration) Olivier HEURTEL
Edition ENI.
5-Rudiments SQL pour Oracle
Cyril GNUAU, 23 septembre 2005. 6-Visual Basic Version
6.0
CPR Informatique, Mai 2002. 7-Implantation des SGBD
rellationnels
Université de Nice Sophia-Antipolis
Version 3.4-25/11/06
Richard GNIN.
TABLE DES MATIERES
DEDICACE 1
REMERCIEMENT 2
ACRONYMES 3
AVANT-PROPOS 5
INTRODUCTION GENERALE 8
Présentation du sujet 8
Interêt du sujet 8
Problematique 8
Délimitation du sujet 8
Subdivision du sujet 9
Méthodologie 9
Présentation du sujet 9
Justification du choix du sujet 9
PREMIERE PARTIE : Généralités 10
Chapitre I : Matériel 12
Chapitre II : Système d?Exploitation 13
1-Gestion de la mémoire Virtuelle 13
2-Nettoyage du disque dur 13

3-Scane disque 14

146
4-Défragmentation du disque 14
Chapitre III : Base de données 15
1-RecordSet 15
2-DataSet 16
3-Procedure Stockée 16
A -Partage de code 16
A1-Objet gérant la securité 16
A2-Variable de passage de paramettre 16
A3-L?automotisation du suivi des dependances 16
A4-La rétrospective des règles de gestions 17
A5-Adapter aux applications clients/serveur 17
B-Exploitation de la puissance de P/SQL par les RPC 18
B1-Augmenation de la taille du poole partagé 18
B2-le groupage 18
C -Avantage et incovenient des procédures stockées
18
C1-Avantage 18
-inconvenient 18
4-Les Vues 18
5-Séquence 19
6-Index et clés composées 19
Chapitre IV : Langage de programmation 21

1-Type de données 21
a-Types prédéfinis 21
b-Le type tableau 22
c-Les types définis par le programmeur 22
2-Les instructions 22
a-Les déclarations 22
b-L?affectation 23
c-Les instructions exécutables 23
c1-Les structures de choix 23
c2-Les structures de boucles 24
3-Les modules 25
a-Les procédures 25
b-Les fonctions 26
4-les Fichiers 26
a-L?ouverture 26
b-Lecture 26
c-Ecriture 27
d-Fermeture 27
DEUXIEME PARTIE : Optimisation de la base de données
28
Chapitre I : Modèlisation de données 30
1-Les données calculées 30
2-Les clés secondaires 30
3-Redondance calculée 32
4-Rapprochement physique 34
ChapitreII : Principe de
l?optimisation de la base de
données 35

148
Chapitre III : Méthode de l?optimisation de la
base de
données 36
1-Evaluation générale des performances d?une
application 36
2-Les paramètres d?enregistrements 36
a-L?accès séquentiel 37
b-L?accès direct 37
3-La démarche d?optimisation 37
Chapitre IV : Optimisartion du SGBDR : Oracle 39
1-Implémentation des index 39
2-Enregistrement des données et accès concurents
40
3-Reprise après panne 40
4-Optimisation de requêtes 40
5-Base de données réparties 41
DEUXIEME PARTIE : Optimisation du code 42
Chapitre I: Optimisation des variables 44
1-Déclarations des variables 44
2-Utilisation des tableaux (Dim) 44
Chapitre II : Optimisation sur les nombres 45
1-Longueur d'un nombre entier positif ou nul 45
2-Pour un nombre entier négatif 45
3-Parité d?un nombre 46
4-Calculs des puissances entières 46
5-Calcul de la racine carré 47

6-Division entière 47
7-La multiplication plus rapide que la division 48
8-Le Pré-calcul 48
9-Maximum et Minimum de 2 nombres 49
10-Attribution de 2 valeurs alternatives 49
Chapitre III : Optimisation des tests 51
1-Vérification d?une condition avec renvoi Booléan
51
2-Les fonctions conditionnelles 51
3-Les différentes écritures d?If 55
Chapitre IV : Optimisation sur les chaînes 56
1-Les fonctions de chaînes 56
2-Chaîne statistique ou dynamique 57
3-La concaténation de chaîne 57
4-La chaîne nulle 58
Chapitre V : Optimisation des boucles 59
Chapitre VI : Compulation de l?application 62
1-IDE 62
2-Le Compilateur 62
a-Compilation P-Code 63
b-Compilation en code natif 63
c-Optimisation avancéés 64
3-Les APIs 66

150
4-Recursivité 67
TROISIEME PARTIE : Etude de cas : 68
Chapitre I : La base de données oracle 70
1-Les objets de la base de données 70
2-Les tables de la base 70
a-Table Départemant & Enregistrement s 70
b-Table mployé & les Enregistrements 71
c-Table Job & Enregistrements 73
d-Table Localité & Enregistrements 73
e-Table S_CUSTOMER & Enregistrements 74
F-Table S_TITLE & Enregistremens 75
Chapitre II : L?application Vbfrance 77
1-connexion 77
a-Conception 77
b-module 77
c-Exécution 80
2-Menu 81
b-Code 81
c-Exécution du Menu 85
3-Département 85
a-mode conception 85
b-Module 86
c-code 89

4-Employé 103
a-mode conception 103
b-Module 103
c-code 107
5-Client 129
6-Région 129
a-mode de conception 129
b-Module 130
c-code 133
CONCLUSION 142
ANNEXE 143
BIBLIOGRAPHIE 144
TABLE DES MATERIELS 145