Introduction
La technologie dit en «N-tiers» est une technique visant à isolé chacun des trois niveaux de traitement d'un système de gestion. Les avantages apporté sont la sécurité, performance et la possibilité d'exécuter les processus sur plusieurs serveurs distinct. Les trois paliers sont donc les suivants :
- Données (Nommé aussi «Data», «DB» ou «BD») (VB)
- Affaire (Nommé aussi «Bus» ou «Business») (VB)
- Interface (ASP)
Ainsi, on retrouve donc trois couches de code totalement distinguent mais ascendante. Les dépendances ont lieu systématiquement vers le niveau le plus bas, sens jamais que la partie du bas (BD) est conscience de la partie du haut (ASP). On retrouve de se fait les trois parties suivantes :
- La partie Données : Cette partie est essentiellement une zone de communication permettant d'envoyer des requêtes à la base de données et de transférer les informations aux couches supérieurs. Celle-ci est écrite en Visual Basic sous forme d'une bibliothèque DLL.
- La partie Affaire : Cette partie récupère les informations reçus par la couche «Données» et effectue les vérifications de validation avant d'envoyer une requête dans le cas d'une modification d'information dans la base de données ou après lorsqu'il s'agit d'une simple lecture d'information. Il n'y a absolument aucun lien entre la base de données et cette bibliothèque DLL, elle reçoit toujours les informations à partir de la couche inférieure, laquelle s'occupe de pouvoir fonctionner correctement avec la base de données.
- La partie Interface : Cette partie est essentiellement la partie du code Internet. Elle est située au niveau du code HTML, mais avec un traitement plus poussé grâce au code ASP. On retrouvera donc une syntaxe similaire à celui du HTML, mais avec des éléments (situé entre les "<%" et "%>") définissant du code ASP.
Prérequis
Les prérequis serveur, sont le support de l'ASP 3.0, et optionnellement XSL et XML. On devra donc avoir un serveur Windows NT 4, Windows 2000 Server ou Windows Server 2003.
Installation
Une fois créer votre DLL en VB, on doit passer directement par COM+ (Component Object Model). Généralement, celle-ci fera une liaison avec un «Microsoft Jet» en utilisant des requêtes SQL.
Création du projet dans le Service des Composants (COM+): Ce service est disponible dans les Outils d'administrateur (Activez-le dans les options du «Barre de tâche» et «Menu Démarrer» s'il n'est pas présent). On doit donc, en premier lieu, créer un projet du nom de votre choix "projet1" dans le répertoire «/Services de composantes/Ordinateurs/Poste de travail/Application COM+» (Note : Poste de travail peut-être aussi le nom d'un serveur distinct).
Pour se faire, on clique sur le deuxième bouton de la souris sur l'identifiant «Application COM+». On choisit dans ce menu «Nouveau > Application». Ensuite on suit les étapes suivantes:
- L'Assistant Installation d'application COM apparaît et cliquez sur le bouton «Suivant».
- Ensuite, sélectionnez «Créer une application vide».
- Écrivez le nom d'application de votre choix et sélectionnez l'«Application serveur».
Ajout des composants DLL: Il faut également ajouter dans le projet la liste des DLLs à exploiter pour le projet de votre choix. Pour se faire, on va sur le sous-répertoire «Composant» de répertoire de votre projet et on appuie sur le deuxième bouton de la souris afin de pouvoir sélectionner l'option «Nouveau > Composant».
Développement
Développement des bibliothèques sous Visual Basic : Lors du développement d'une bibliothèque à l'aide de l'outil de programmation Visual Basic, on ne peut malheureusement pas simplement écrire le code et l'exécuter comme on le ferait d'habitude pour un projet classique. On doit tenir compte de plusieurs éléments :
- On doit, en premier, définir l'objet de démarrage comme étant le Sub Main. Cette option est accessible par l'entremise du menu Projet, dans l'option Propriété de[...].
- En plus, dans les Propriétés du projet, on devra s'assurer que le code soit compilé en code natif et surtout pas en P-Code. On atteindra cette option dans l'onglet Compilation.
Création de la bibliothèque : La création de la bibliothèque sous forme d'une DLL se fera à l'aide du menu Fichier, avec l'option Crée [...]. En somme, on obtiendra à l'aide de cette option le résultat final de notre bibliothèque.
ATTENTION ! Si vous rencontrez un problème de «Permission refuser» lors de cette opération, il peut s'agir principalement des trois problèmes suivants :
- C'est qu'un autre projet est actuellement ouvert et qu'il utilise les mêmes informations ou fichier que l'autre. On a donc un conflit entre les deux applications.
- Les composantes COM+ doivent tout d'abord être arrêtées: Cette option est disponible dans les «Outils de l'administrateur» du menu «Démarrer». En utilisant le programme «Services de composantes». On se dirigera dans l'arbre dans «Services de composantes\ Ordinateurs \ Poste de travail\ Application COM+\ [...]» et demande d'«Arrêter» grâce au menu contextuel.
- Dans le cas ou les deux solutions précédentes n'ont pas lieu d'être, on devra se résigner a redémarrer le «Gestionnaire de Services Internet» (IIS en anglais ou ISS en français) situé dans les outils d'administrateur. On cliquera avec le menu contextuel sur notre poste de travail situé dans la fenêtre du programme et on sélectionnera «Redémarrage de l'IIS».
La bibliothèque de données: Dans ce DLL, on retrouve différentes classes construites de façon relativement primaire. On constatera donc, la présence de fonction comme Load, Insert, Update et Delete. Ceux-ci permettent d'effectuer les différentes mise-à-jour nécessaire ou simplement consulter de l'information. Aucune connaissance n'est retenu à se niveau. De se fait, après avoir appelé une fonction d'une de ces classes, il n'y a aucun souvenir de garder par l'ordinateur à se niveau.
On retrouvera en plus des noms comme «GetCandidat» ou «GetTypeEmployee» permettant de retourner différentes informations d'une autre table mais ayant une dépendance avec celle-ci.
ATTENTION : Dans les propriétés de démarrage, bien définir l'objet Sub Main.
La structure de programmation d'une fonction effectuant une requête SQL devrait avoir l'aspect suivant sous le Visual Basic :
Public Function fonction(paramètres) As ADODB.Recordset Dim sSql As String sSql = "requête" Set fonction = OpenRecordSet(sSql) End Function |
La bibliothèque Affaire : Dans se DLL, on retrouve tout le traitement de façon concret de la donnée. Dans cette couche, on retrouve les validations comme pour un code postal n'ayant pas les bons formats, un numéro de téléphone ressemblant à un numéro de 6/49 par exemple. En somme, toutes informations incohérentes est testé dans les classes dans une procédure portant le nom «Validate». On a donc, vous le comprendrez, des variables locales pour la classes, permettant de mémoriser le contenu d'un enregistrement d'un table. Pour, par exemple, éventuellement sauvegarder ses mêmes informations ou simplement effectué une mise-à-jour.
Note de bug Visual Basic : Il arrive parfois qu'il ne retrouve plus la classe de votre bibliothèque de données et dans ce cas, on va dans le menu «Projet» dans l'item «Référence» on décoche la classe. Et on le ferme comme ça, ensuite on repasse par le même chemin et on clique sur votre bibliothèque de données.
L'ASP: Dans cette zone, vous ne trouverez rien d'autre que des pages envoyées à des clients sur leurs navigateurs Internet (d'où le nom Client/Serveur) et ainsi, toutes les informations contenu entre les symboles «<%» et «%>» est interprétés par le serveur avant d'être envoyé au navigateur en ayant fait la demande. Tout le reste n'a aucune interprétation avant d'être envoyé au client.
Le code
Voici maintenant un exemple de ce à quoi ressemble les trois niveaux de codes. Tous d'abord la partie données :
- ' Cette classe permet de gérer une des données au niveau de la base de données.
-
- Option Explicit
-
- Public ConnectionString As String
- Public Cnx As ADODB.Connection
-
- ' ////////////////////////////////////////////////////////////////////
- ' OpenRecordSet
- ' Cette fonction retourne un «RecordSet» déconnecté
- ' ////////////////////////////////////////////////////////////////////
- Public Function OpenRecordSet(ByVal sSql As String) As ADODB.Recordset
- Dim oRs As New ADODB.Recordset
- oRs.CursorLocation = adUseClient
- oRs.Open sSql, IIf(Cnx Is Nothing, ConnectionString, Cnx), adOpenForwardOnly, adLockReadOnly
- Set oRs.ActiveConnection = Nothing
- Set OpenRecordSet = oRs
- Set oRs = Nothing
- End Function
-
- ' ********************************************************************
- ' ExecuteSQL
- ' Permet d'exécuter une requête SQL
- ' ********************************************************************
- Public Sub ExecuteSQL(ByVal sSql As String)
- If Cnx Is Nothing Then
- Set Cnx = New ADODB.Connection
- Cnx.Open ConnectionString
- Cnx.Execute sSql
- Cnx.Close
- Set Cnx = Nothing
- Else
- Cnx.Execute sSql
- End If
- End Sub
-
- ' ********************************************************************
- ' SqlString
- ' Cette fonction ajoute les apostrophes pour être compatible SQL.
- ' **********************************************************************
- Public Function SqlString(ByVal sString As String) As String
- If sString = Empty Then
- SqlString = "NULL"
- Else
- SqlString = "'" & Replace(sString, "'", "''") & "'"
- End If
- End Function
-
- ' ******************************************************************************
- ' Cette fonction retourne un identificateur unique d'enregistrement
- ' ******************************************************************************
- Public Function GenerateNewID(ByVal FieldName As String, ByVal TableName As String) As Long
- Dim oRs As ADODB.Recordset
- Dim sSql As String
- sSql = "SELECT MAX(" & FieldName & ") AS MaxNo FROM " & TableName
- Set oRs = OpenRecordSet(sSql)
- GenerateNewID = (oRs!MaxNo) + 1
- oRs.Close
- Set oRs = Nothing
- End Function
-
- ' ******************************************************************************
- ' getEntreprise
- ' Charge les entreprises dans un recordset
- ' ******************************************************************************
- Public Function getEntreprise() As ADODB.Recordset
- Dim sSql As String
- sSql = "SELECT * FROM vosentreprises ORDER BY NomEntreprise"
- Set getCompagnie = OpenRecordSet(sSql)
- End Function
-
- ' ******************************************************************************
- ' Load
- ' Charge l'entreprise dans un recordset
- ' ******************************************************************************
- Public Function Load(ByVal lID As Long) As ADODB.Recordset
- Dim sSql As String
- sSql = "SELECT * FROM vosentreprises " & _
- " ORDER BY NomTypeEntreprise" & _
- " FROM TypeEntreprise" & _
- " WHERE ID = " & lID
- Set Load = OpenRecordSet(sSql)
- End Function
-
- ' ******************************************************************************
- ' Insert
- ' Insertion d'un enregistrement dans la base de données
- ' ******************************************************************************
- Public Sub Insert(ByRef NoTypeEntreprise As Long, _
- ByVal NomTypeEntreprise As String)
- Dim sSql As String
- NoTypeEntreprise = GenerateNewID("NoEntreprise", "TypeEntreprise")
- sSql = "INSERT INTO TypeEntreprise" & _
- " (NoTypeEntreprise, NomTypeEntreprise" & _
- ") VALUES (" & _
- NoTypeEntreprise & _
- "," & SqlString(NomTypeEntreprise) & ")"
- ExecuteSQL sSql
- End Sub
-
- ' ******************************************************************************
- ' Update
- ' Mise à jour de l'enregistrement dans la base de données
- ' ******************************************************************************
- Public Sub Update(ByVal NoTypeEntreprise As Long, _
- ByVal NomTypeEntreprise As String)
- Dim sSql As String
- sSql = "UPDATE TypeEntreprise SET" & _
- " NomTypeEntreprise = " & SqlString(NomTypeEntreprise) & _
- " WHERE NoTypeEntreprise = " & NoTypeEntreprise
- ExecuteSQL sSql
- End Sub
-
- ' ******************************************************************************
- ' Delete
- ' Supprime l'entreprise de la base de données
- ' ******************************************************************************
- Public Sub Delete(ByVal Code As Long)
- Dim sSql As String
- sSql = "DELETE FROM TypeEntreprise" & _
- " WHERE NoTypeEntreprise = " & Code
- ExecuteSQL sSql
- End Sub
Voici le code de la bibliothèque d'affaire faisant appel à la classe de la bibliothèque de données :
- ' Cette classe permet d'offrir différent service à propos d'une entreprise.
-
- Option Explicit
-
- Public NoTypeEntreprise As Long
- Public NomEntreprise As String
-
- ' ******************************************************************************
- ' Load
- ' Charge la entreprise dans les variables de l'objet
- ' ******************************************************************************
- Public Sub Load(ByVal lID As Long)
- Dim oEntrepriseDB As New projet_DB.Entreprise
- Dim oRs As ADODB.Recordset
- Set oRs = oEntrepriseDB.Load(lID)
- If oRs.EOF Then
- NoTypeEntreprise = 0
- NomEntreprise = ""
- Else
- NoTypeEntreprise = oRs!NoTypeEntreprise
- NomEntreprise = oRs!NomTypeEntreprise
- End If
- oRs.Close
- Set oRs = Nothing
- Set oEntrepriseDB = Nothing
- End Sub
-
- ' ******************************************************************************
- ' Insert
- ' Insertion d'un enregistrement dans la base de données
- ' ******************************************************************************
- Public Sub Insert()
- Dim oEntrepriseDB As New projet_DB.Entreprise
- Validate
- oEntrepriseDB.Insert NoTypeEntreprise, _
- NomEntreprise
- Set oEntrepriseDB = Nothing
- End Sub
-
- ' ******************************************************************************
- ' Update
- ' Mise à jour de l'enregistrement dans la base de données
- ' ******************************************************************************
- Public Sub Update()
- Dim oEntrepriseDB As New projet_DB.Entreprise
- Validate
- oEntrepriseDB.Update NoTypeEntreprise, _
- NomEntreprise
- Set oEntrepriseDB = Nothing
- End Sub
-
- ' ******************************************************************************
- ' Delete
- ' Supprime l'entreprise de la base de données
- ' ******************************************************************************
- Public Sub Delete()
- Dim oEntrepriseDB As New projet_DB.Entreprise
- oEntrepriseDB.Delete NoTypeEntreprise
- Set oEntrepriseDB = Nothing
- End Sub
-
- ' ******************************************************************************
- ' Validate
- ' Effectue les validations d'affaires avant la mise à jour de l'enregistrement
- ' ******************************************************************************
- Private Sub Validate()
- If DescriptionF = Empty Then
- Err.Raise vbObjectError, "Type d'Entreprise", "ERR_DESC_TYPE_ENTREPRISE_F_REQUISE"
- End If
- End Sub
Voici finalement la partie interface écrite en ASP :
- <%
- Set oEntreprise = server.CreateObject("projet_Bus.Entreprise")
- oEntreprise.Load Request("ID")
- Response.Write oEntreprise.NomEntreprise
- %>