WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Opttimisation de l'application

( Télécharger le fichier original )
par Guelor IBARA NGATSE
ISTP - Master 2009
  

Disponible en mode multipage

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

    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

     

    NuméroSer

     

    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 &gt; 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 &lt; 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 &gt; 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 &gt; 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 &gt; 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






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Et il n'est rien de plus beau que l'instant qui précède le voyage, l'instant ou l'horizon de demain vient nous rendre visite et nous dire ses promesses"   Milan Kundera