ACCESS : Qui se souvient de Money ?

J’ai utilisé pendant des années Money, je le trouvais pratique et sur Windows il n’y avait pas beaucoup de choix. Les produits sympa mais gratuit ont souvent une durée de vie limitée. Microsoft a arrêté sa distribution en 95 ou 97. Beaucoup d’utilisateurs furent déçus par cette décision.

Argentek ou le retour d’un Money-Like

Quand un produit disparait on est tenté d’en choisir un autre… ou d’en concevoir un tel qu’on le souhaite. C’est ce que j’ai fait avec Argentek. J’ai pris ce bon vieil Access 2000 et j’ai créé un logiciel de comptes bancaires. Aujourd’hui nous sommes à la version 3.13.06 qui fonctionne avec Access 2016-2024. Au début le code était ouvert ce qui a permis aux utilisateurs de créer leur propre fork. Malheureusement, quelques utilisateurs ont tenté de s’approprier le produit à des fins mercantiles si bien qu’aujourd’hui le projet est livré compilé.

Les atouts d’Argentek

Il fonctionne avec Access 2016-2024, (version antérieure disponible sous condition) c’est un produit simple et robuste basé sur ACE et intégralement écrit en VBA. Cela fait de lui un produit autonome qui peut être utilisé avec une licence complète ou un runtime.
Ses fonctionnalités sont les suivantes :

  • Multicompte
  • Transfert de compte à compte
  • Opérations automatisées (Unique, Mensuelle, Trimestrielle, Annuelle, Personnalisée)
  • Gestion des tiers
  • Gestion des catégories
  • Solde par opération (indique pour chaque ligne d’opération le solde du compte)
  • Colonne Débit et Crédit
  • Pointage d’opérations
  • Sauvegarde automatisée (dernière sauvegarde effectuée)
  • Tri et Filtre sur les Opérations

Liste des paramètres possibles :

  • Activer/Désactiver la sauvegarde automatisée
  • Confirmation ou non de la sauvegarde
  • Suppression des opérations automatisées Unique
  • Protection contre la modification des opérations pointées
  • La dernière opération apparait en haut de la liste
  • Déclenchement de la sauvegarde à la fermeture
  • Chemin pour la sauvegarde
  • Fichier de sauvegarde zippé
  • Chemin du fichier de données
  • Compte affiché par défaut

Les retours d’utilisateurs

Les utilisateurs ont apprécié sa gratuité, sa simplicité de prise en main et sa fiabilité. J’ai reçu beaucoup de messages d’encouragement, de remerciement et de demandes d’évolution. Le plus étonnant message est celui d’un gradé de l’armée d’un pays africain qui affirmait gérer les comptes de l’armée… Pourquoi pas ?

Vous êtes intéressé par Argentek ?
Contactez moi !

VBA : Classe et gain de temps

Le concept de classe en VBA a quelques lacunes mais il ne doit pas être négligés pour autant.

En effet, grâce à elles on peut gagner un temps précieux. Voici un petit exemple fonctionnel d’une classe qui gère les évènements DblClick et NotInList d’une zone de liste déroulante. Le DblClick permet d’ouvrir un formulaire de saisie/édition avec l’item de la liste, tandis que NotInList permet de saisir l’item.

Créer le module de classe

Dans VBE faites Insertion/Module de classe. En bas à gauche dans la fenêtre des propriétés vous devez renseigner le nom de l’instance : cComboBox

Saisissir

Saisissez la première ligne de code suivante immédiatement après les lignes Option.

Private WithEvents LmCombo          As Access.ComboBox

WithEvents indique que cet objet pourra lever des évènements.

Access.ComboBox est le type Liste déroulante.

Ensuite nous aurons besoin de variables de type String pour stocker différents éléments nécessaires à l’ouverture du formulaire.

'nom du formulaire qui est appelé lors du notinlist
Private strFormNameLie     As String       
   'nom du champ id de la table recevant la nouvelle valeur
Private strIdFieldName     As String       
   'nom du champ recevant la valeur saisie dans la combo 
Private strControlName     As String       
   'nom de la table recevant la nouvelle valeur
Private strTableFormLie    As String

En suivant nous écrivons deux méthodes habituelles dans les classes.

La Class_Initialize est exécutée au démarrage de la classe. Elle ne contient rien dans cet exemple mais si vous devez initialiser une variable ou une propriété c’est ici que vous devrez le faire.

Private Sub Class_Initialize()
' Initialise

End Sub

Tandis que Class_Terminate est exécuté lorsqu’on libère la classe, qu’on la décharge. Celle-ci est importante car c’est là qu’on décharge également toutes nos variables.

Private Sub Class_Terminate()
' libère les variables
    On Error Resume Next
    Set LmCombo = Nothing
End Sub

Pour charger la combo depuis le formulaire il faut utiliser un « Setteur ». Le voici !

Public Property Set objComboBox(objCombo As Access.ComboBox)
    Set LmCombo = objCombo
    LmCombo.OnDblClick = "[Event Procedure]"
    LmCombo.OnNotInList = "[Event Procedure]"
End Property

On voit qu’on lui passe un objet combobox et qu’il est chargé dans la variable définie précédemment. Les 2 lignes suivantes permettent d’activer l’écoute des évènements dont nous avons besoin : DblClick et NotInList.

Les autres variables ou propriétés de la classe doivent également être valorisées toujours à l’aide de Setteurs.

Public Property Let frmNameLie(strNomFormulaireLie As String) 'le formulaire de saisie modif à ouvrir
    strFormNameLie = strNomFormulaireLie
End Property

Public Property Let idFieldName(strNomIdFieldFormulaireLie As String) 'le nom de la colonne id de la source du formulaire
    strIdFieldName = strNomIdFieldFormulaireLie
End Property

Public Property Let controlNameLie(strNomControleFormulaireLie As String) 'le nom du controle texte qui recevra la saisie
    strControlName = strNomControleFormulaireLie
End Property

Public Property Let tableNameLie(strNomTableFormulaireLie As String) 'le nom de la table du formulaire
    strTableFormLie = strNomTableFormulaireLie
End Property

Rien de bien particulier à part qu’on utilise un Let au lieu du Set qui est réservé aux objets.

Nos variables sont devenus des propriétés de la classe.

Méthode privée

Une méthode privée permettra d’attendre la fermeture du formulaire de saisie avant de poursuivre l’exécution du code. Nous obtiendrons un déroulement synchrone du processus.

Ce n’est pas la meilleure méthode mais pour cet exemple cela suffira.

Private Sub pAttendreFermeture(vlFrmRprt As Object)
'-----------------------------------------------------------
' Procedure   : pAttendreFermeture
' Author      : Fabrice CONSTANS
' Date        : 20/10/2011
' Description : Attend la fermeture de l'objet pour rendre la main
' Paramètres  : vlFr est l'objet à controler
'-----------------------------------------------------------
On Error GoTo pgAttenteFermeture_Error
   Do
      DoEvents
   Loop While vlFrmRprt.Visible

pgAttenteFermeture_Error:
        On Error GoTo 0
        Exit Sub
End Sub

Les évènements

Les évènements vont être gérés à l’aide de procédure qui deviendront de fait des méthodes de la classe. La différence c’est qu’à aucun moment nous ne devront les appeler pour qu’elles fonctionnent. Ceci grâce au WithEvents de la déclaration et à l’activation des écouteurs.

Le Notinlist

On remarque que la signature de la procédure est strictement identique à celle qui pourrait être générée dans un formulaire. Je vous conseille d’ailleurs d’utiliser des signature générée et de les copier dans la classe, vous gagnerez un temps précieux et vous n’aurez pas le risque que cela ne fonctionne pas.

Public Sub LmCombo_NotInList(NewData As String, Response As Integer) 'signature de la procédure
'--------------------------------------------------------------------
' Procedure : LmContact_NotInList
' Author    : Fabrice CONSTANS (MVP)
' Date      : 21/01/2016
' Purpose   : Nouveau contact, on appelle le formulaire de saisie.
'------------------------------------------------------------------
'
Dim strNouveauNumero As String

On Error GoTo Errsub

    If vbYes = MsgBox("Cette valeur n'existe pas. " & _
           "Souhaitez-vous la créer ?", vbInformation + vbYesNo, _
                                      "classe ccombo") Then
      'ouverture du formulaire en mode Ajout  
      DoCmd.OpenForm strFormNameLie, acNormal, , , acFormAdd
      'on gèle le contrôle reception de la valeur saisie
      Forms(strFormNameLie).Controls(strControlName).Enabled = False
      'on ajoute la valeur saisie dans la liste
      Forms(strFormNameLie).Controls(strControlName).Value = NewData
      'traitement synchrone
      pAttendreFermeture Forms(strFormNameLie)

'Vérification que le valeur existe (peut-être que l'utilisateur a
' changé d'avis et a annulé la création
   If dLookUp("nz(" & strIdFieldName & ",-1)", _
       strTableFormLie, strControlName & "=""" & NewData & """") > 0 Then
         'la valeur a été saisi
         Response = acDataErrAdded
      Else
        'la valeur n'a pas été saisi (annulation)  
        Response = acDataErrContinue
        LmCombo.Parent.Undo
     End If
   Else
     'il ne souhaite pas la création
     Response = acDataErrContinue
     LmCombo.Parent.Undo
   End If

Exitsub:
      On Error GoTo 0
      Exit Sub
Errsub:
       msgbox "cComboBox.LmCombo_NotInList", Err, Erl, Err.Description
End Sub

Vous pouvez constater que nous utilisons bien les constantes habituelles pour ce type d’évènement : NewDataacDataErrContinueacDataErrAdded

Le DblClick

Cet évènement est plus simple que le précédent puisqu’il ne fait qu’ouvrir le formulaire en mode consultation/modification.
A la sortie on pense à rafraichir le contenu de la combo au cas ou l’utilisateur a modifié une valeur.
Il va de soit que pour cette dernière le traitement doit également être synchrone.

Public Sub LmCombo_DblClick(Cancel As Integer)
'------------------------------------------------------------------
' Procedure : btnEditContact_Click
' Author    : Fabrice CONSTANS (MVP)
' Date      : 16/02/2016
' Purpose   : edit et raffraichit la liste au retour
'------------------------------------------------------------------
'
Dim Id As Long

On Error GoTo Errsub

    If IsNull(LmCombo.Column(0)) Then
        MsgBox "Pour créer un item vous devez entrer sa valeur.", _
               vbInformation + vbOKOnly, "classe ccombo"
        Exit Sub
    End If

    Id = LmCombo.Column(0)

    DoCmd.OpenForm strFormNameLie, acNormal, , _
                strIdFieldName & "=" & Id, acFormEdit

    pAttendreFermeture Forms(strFormNameLie)
    LmCombo.Undo
    LmCombo.Requery
    LmCombo.value = Id

 Exitsub:
   On Error GoTo 0
   Exit Sub 

Errsub:
    msgbox ("cComboBox.LmCombo_DblClick", Err, Erl, Err.Description)
End Sub

Voilà la Classe cCombo est prête à être utilisée. Voyons cela dans les faits.

Utiliser la classe dans un formulaire

En premier lieu il faut indiquer au formulaire que nous allons utiliser cette classe. Pour cela nous devons utiliser autant de variables qu’il y a de zone de liste à implémenter. Ces variables doivent être globale, donc déclarer immédiatement après les 2 lignes d’Options du module de classe du formulaire.

Dim cComboClient         As cComboBox

Dans l’événement Sur Ouverture du formulaire on poursuit la déclaration.

Set cComboClient = New cComboBox

cComboClient.controlNameLie = "RaisonSociale"
cComboClient.frmNameLie = "fClient"
cComboClient.idFieldName = "id_Client"
Set cComboClient.objComboBox = Me.Controls("lmClient")
cComboClient.tableNameLie = "tClient"

New permet de créer l’instance de la classe et ainsi pouvoir valoriser les propriétés.

Dans cet exemple la liste déroulante se nomme lmClient. Vous pouvez adapter ce code déclaratif à votre propre cas. Vous ne devez jamais modifier la classe pour y intégrer des noms propres à l’application. Une classe doit rester générique sous peine de ne plus être portable.

Il va de soit qu’à chaque nouvelle liste déroulante à instancier, un code similaire devra être ajouté. C’est tout l’intérêt d’une classe.

Une fois sauvegardé, vous pouvez utiliser le formulaire.

Les tests de comportement à faire :

  • Entrer une nouvelle valeur.
  • Double cliquer sur la zone de liste.

Classe en VBA, quels avantages ?

Le poids de l’application : On remplace des centaines de lignes par une partie déclarative.

L’uniformité du comportement : Comme on utilise le même code pour tous les contrôles nous sommes sûr que le comportement sera la même.

Maintenance et évolution : Si un bug est constaté ou que l’on souhaite faire évoluer le comportement, on intervient dans la classe. La duplication de code n’est plus nécessaire on évite des heures de test, d’erreurs potentielles et de tous les problèmes inhérent à cette pratique.

Rapidité de conception : Une simple déclaration permet d’exploiter la classe.

Classe en VBA, quels inconvénients ?

Gérer toutes les erreurs de l’application : En cas d’erreur non traitée avec les classes chargées se déchargent. Il faudra alors exécuter les déclarations une nouvelle fois.

Difficulté technique : Pour les non programmeurs, appréhender le concept de classe peut poser des problèmes.

Complexité : Les classes sont plus complexes à mettre en œuvre qu’un code procédural et évènementiel classique. Si vous traiter un formulaire il est conseillé de concevoir les traitements dans le formulaire puis de créer la classe à partir d’un code fonctionnel. Si c’est un classe standard créé le code dans un module standard, cela vous permettra de tester rapidement votre création, ensuite le transformer-la en classe.

Conclusion

J’espère que cette incursion dans les classes vous aura plu et qu’elle vous donnera des idées d’implémentations pour vos développements. N’hésitez pas à commenter ce billet.

ACCESS : Audit de parc informatique – RPNG Access 97

Dans les années 90, les produits d’audit de parc informatique étaient rares (3 identifiés à l’époque) et très onéreux (plusieurs milliers de dollars, hors assistance obligatoire). Quand on compte 3000 postes PC et une petite centaine de MAC répartis sur 3 sites sensibles, faire l’inventaire des logiciels installés est une véritable mission chronophage.

En quelques jours, avec Microsoft Access 97, j’ai créé un outil d’analyse des postes PC distants. Je me suis fixé les limites d’acceptabilités suivantes :

  • rapidité de collecte d’information du poste pour ne pas gêner l’utilisateur
  • possibilité de faire la collecte en dehors de certaines plages horaire
  • création de persistance pour faciliter l’analyse rapide des données
  • fonctionner en autonomie pour permettre à la petite équipe de se consacrer à l’analyse des données collectées
  • utiliser un RAD (Access est un RAD !) pour pouvoir faire évoluer l’outil suivant les demandes et limiter les coûts d’un produit jetable.

J’ai utilisé des commandes systèmes pour collecter les informations de chaque poste et persisté sur une base Jet (la base de données interne d’Access sur cette version) parfaitement dimensionnée pour le travail à réaliser.

Traitements

  • Les nouveaux logiciels identifiés ont fait l’objet d’un traitement d’identification manuel
  • Ceux déjà connus sont automatiquement identifiés
  • Plus la banque de données de référence (liste des logiciels) progresse moins les interventions manuelles sont nécessaires
  • Les postes inaccessibles (RH, Direction…) ont été traités manuellement, puis intégrés au processus automatisé
  • Les 200 premiers postes ont permis d’automatiser à 99 % le traitement des suivants
  • Une centaine de Mac nécessitent une intervention et une saisie manuelle, soit un rapport équivalent à 6,7 %, similaire à celui observé précédemment.

Grâce à l’enrichissement progressif de la base de référence et à l’apprentissage issu des premiers traitements manuels, le processus d’identification des logiciels a atteint un haut niveau d’automatisation, réduisant significativement les interventions humaines et permettant un traitement fiable et quasi intégral des postes restants.

Les résultats

Les résultats ont dépassé les attentes du client. En deux semaines, avec une équipe restreinte de deux personnes, nous avons réalisé un inventaire précis et fiable du parc.

Les résultats ont été consolidés dans un fichier Excel structuré, répertoriant les logiciels identifiés, leur taux de présence sur le parc, leur typologie fonctionnelle et leur localisation précise.

ACCESS : Plus qu’un RAD il est au cœur de l’intégration

Microsoft Access est souvent perçu comme un outil de base de données local. Pourtant, grâce à VBA et ses multiples bibliothèques, sa capacité à interagir avec les SGBDR du marché et son moteur ACE, il peut jouer un rôle central dans des architectures plus complexes. Il devient alors un véritable hub de connectivité entre différents systèmes.

Un exemple de connectivité Full Access :

  • Un CRM réalisé avec Access travaille avec MariaDb pour les données.
  • Il utilise ACE pour stocker certains paramètres locaux.
  • Une partie de données du CRM sont issus d’un logiciel métier sous PostgreSQL.
  • Un utilitaire autonome permet de faire une synchro client à heure fixe ou à la demande.

Un exemple d’utilisation sans ACE :

  • Un logiciel de création de modèle statistique réalisé avec Access.
  • Il utilise une base de données MariaDb hébergé.
  • Le logiciel récupère des données INSEE de plusieurs millions de lignes.
  • Les formats hétérogènes de ces données (CSV, DBase…) sont traités et envoyés vers MariaDb.
  • Le logiciel permet de créer des modèles statistiques réutilisables.
  • Le résultat est injecté dans des feuilles Excel pour créer des graphiques des tableaux de chiffre en vue de créer des présentations.

MS Access, un RAD central

MS Access a de multiples casquettes :

  • point de convergence pour des données hétérogènes (SQL, JSON, CSV…).
  • Client léger connecté à une base de données serveur.
  • Utilitaire autonome
  • Client lourd connecté à ACE en local ou intranet.

Grâce aux formulaires et états dotés de composants riches et paramétrables, l’utilisateur peut interagir avec les bases de données connectées via les formulaires et les états.

Important : ACE n’est pas compatible avec un cloud partagé (dropbox, onedrive…)

VBA un vrai langage

Le nuage VBA représente les interfaces de programmation qu’Access peut exploiter :

  • Windows API : pour interagir avec le système d’exploitation (fichiers, registres, processus…)
  • .NET COM : pour appeler des objets COM exposés par des bibliothèques .NET
  • API Web : pour envoyer des requêtes HTTP vers des services RESTful ou SOAP.
    Ces connexions permettent à Access de sortir de son périmètre local et d’interagir avec des services distants ou des composants système.
  • VBScript remplacé par PowerShell : véritable couteau suisse de Windows.

Access et les bases de données

Access peut aussi se connecter à des bases de données externes via ODBC ou des pilotes spécifiques :

  • MariaDb
  • SQL Server
  • PostgreSQL
  • Oracle
    Ces connexions permettent de centraliser les données dans Access tout en conservant la puissance des SGBD professionnels. Ces bases de données peuvent être locales, sur un serveur intranet ou totalement hébergées.

Le moteur ACE

Le moteur ACE (Access Connectivity Engine) est le moteur de base de données intégré à MS Access. Il permet :

  • L’accès aux fichiers de données accdb
  • L’utilisation d’Access comme source OLEDB dans d’autres applications
  • L’export/import de données vers Excel, CSV, etc.
  • ACE est aussi utilisé dans des contextes sans Access installé, comme dans des scripts PowerShell ou des applications .NET.

Conclusion

Access n’est pas juste un outil de bureau pour les petites bases de données. C’est un véritable orchestrateur, capable de dialoguer avec des APIs, des bases de données distantes, et des composants système. Grâce à VBA et ODBC il devient un pont entre le local et le cloud, entre l’utilisateur et les données.

ACCESS : Pourquoi Ms Access ?

Si vous entendez quelqu’un vous dire que MS Access est une base de données, c’est que votre interlocuteur ne le connaît pas ou ne s’est jamais aventuré au-delà de l’utilisation des tables et des requêtes. MS Access n’est pas une base de données (SGBDR). Il est plutôt à ranger dans la catégorie des RAD – acronyme de « Rapid Application Development » ou « Système de Développement Rapide d’Application » en Français.

C’est donc un produit qui intègre tous les composants nécessaires à la création « rapide » d’applications. Je mets le terme « rapide » entre guillemets, car bien qu’Access facilite la conception d’applications simples, concevoir une application complexe demande une certaine expertise.

Pourquoi choisir Access ?

Les utilisateurs qui choisissent Access le font généralement pour les bonnes – ou les mauvaises – raisons suivantes :

  • Disponible dans la version d’Office Professionnel ou en produit indépendant,
  • Dispose d’un Runtime
  • Facilité d’installation par rapport à d’autres produits de développement qui demande des compétences système et DBA.
  • Prise en main intuitive de l’interface graphique pour créer des tables, des relations et des requêtes,
  • Possibilité de lier des tables issues d’autres SGBDR,
  • Ensemble d’objets pour aller plus loin qu’une simple base de données,
  • Parfaitement intégré dans le monde Office et Windows.

Parmi les raisons contradictoires certaines sont factuelles, d’autres relèvent d’opinions, au pire des consensus fondés sur une méconnaissance du produit :

  • Édité par Microsoft (donc non libre),
  • Disponible uniquement sous Windows,
  • Base de données fichier (ACE), pas serveur,
  • ACE Limitée à 2 Go par fichier
  • Pas orienté Web
  • Méconnaissance de VBA (vu comme un langage de macros)
  • Confusion avec Excel (alors que ce sont 2 produits incomparables)
  • Mauvaise réputation en France (perçu comme un produit « bureautique »),

Vrai ou faux

Autant Ms Access n’est pas libre autant ce que vous produisez peut l’être, tout dépend de la licence que vous choisissez.

En effet, Access n’est disponible que sous Windows… mais fonctionne parfaitement sur une machine virtuelle.

ACE est une base de données fichier. Elle est très performante et a le mérite d’être parfaitement intégrée à Access. Cependant vous pouvez utiliser la base de données que vous souhaitez. Personnellement, tous mes projets d’envergure s’appuient sur Sql Server, MariaDb, PostgresSQL J’ai également travaillé sur de très grosses applications sur Oracle et Sql Server.

Oui ACE est limité à 2 Go. Mais vous êtes libre de choisir la base de données la plus adaptée.

Access n’est pas WEB. Si vous devez faire un site ou une application WEB ce n’est pas le bon produit. Il m’est arrivé de discuter avec des clients qui souhaitaient absolument une techno WEB… sans savoir pourquoi. En analysant le besoin je me suis rendu compte que ce besoin n’était pas justifié.

VBA est un langage accessible mais qui demande de la rigueur sur des projets professionnels. Ceux qui confondent VBA et macro ne connaissent pas le sujet.

Excel et Access n’ont rien à voir. L’un est un tableur qui manipule des données alors que l’autre est un RAD. Oui on peut parfaitement créer une IHM avec Excel, cependant il ne gérera jamais une base de données.

MS Access et sa mauvaise réputation en France

Cette mauvaise réputation est héritée d’une époque (fin des années 90 – début 2000) où les DSI voyaient Access comme une menace : des utilisateurs métiers créaient leurs propres outils, sans passer par les services informatiques. Ce que les DSI oubliaient c’est que ces utilisateurs :

  • maîtrisaient leur métier,
  • savaient ce dont ils avaient besoin
  • avaient un excellent taux de réactivité

Certes ils péchaient d’un manque d’expérience en développement. Cela donnait des applications parfois bancales… mais toujours utiles puisque 10 ans plus tard elles étaient toujours là.

Ms Access et ses objets

Les objets pour créer une application sont les suivants :

  • Tables (internes ou liées)
  • Requêtes SQL
  • Formulaires (saisie, consultation, suppression, navigation…)
  • Etats d’impression,
  • Macros (automatisation simpliste)
  • Modules pour le langage VBA. (automatisation avancée)

Access et les autres SGBDR

Bien que la plupart des applications utilisent un SGBDR pour la persistance, on peut créer des applications sans jamais avoir besoin d’une base de données. A contrario on peut avoir besoin d’une application standalone, sans aucune IHM et qui fonctionne de manière autonome.
Une application de synchronisation intelligente de données entre SGBDR hétérogènes en est le parfait exemple.
En règle générale Access permet de créer un front-end léger couplé à une base ACE, SQL Server, PostgresSQL, MariaDb.

Le pire côtoie le meilleur

Le pire c’est une appli conçue à la va-vite, sans modèle de données solide. Les adeptes du QDD (Quick & Dirty & Disposable, soit Vite, Sale et Jetable en français) en sont friand. Une fois le « jetable » installé, il est difficile de s’en passer, la réécriture étant couteuse et l’informatique le parent pauvre de l’industrie, on retrouve ces applications 15 ans plus tard pleinement fonctionnelles. Leur maintenance se fait souvent dans la douleur et les larmes et Access est déclaré comme un produit d’amateurs.

Le meilleur s’appuie sur les concepts qui régissent tous les logiciels. Elle s’appuie sur un choix de base de données pertinent, elle est maintenable, évolutive et répondant aux vrais besoins métier.

En résumé

Access est sous-estimé, mal compris, mais redoutablement efficace quand il est bien maîtrisé. Beaucoup ont tenté de migrer des applications Access vers des technos « à la mode » sans retrouver la puissance et l’ergonomie des composants d’Access. L’application est alors vu pas les utilisateurs comme ces livres inutiles qui ornent l’étagère la plus haute des bibliothèques.

ACCESS : Erreur 3010 avec DAO.CreateTableDef()

Ce problème est constaté le 16/01/2023

Le CreateTabledef() de DAO ne fonctionne plus comme avant !
Avec un :

Set td = db.CreateTableDef(tblname, dbAttachSavePWD, tblname, strConnexionOdbc)


On obtient une erreur 3010, la table existe déjà, mais non elle n’existe pas, ni dans la liste des objets, ni dans TableDefs et encore moins dans MsysObjects.

Quand on observe td on peut voir que Name et égal à SourceTableName
Le contournement est possible :

Set td = db.CreateTableDef()
td.Name = strTable
td.SourceTableName = tblname
td.Connect = strConnexionOdbc
td.Attributes = dbAttachSavePWD


       Ou encore :

DoCmd.TransferDatabase acLink, "ODBC Database", strConnexionOdbc, acTable, tblname, strTable, False, False

Ce problème a été constaté avec une application qui fonctionne avec ce code depuis 2016, et sur une fonctionnalité qui est utilisée quotidiennement.

Le pilote ODBC n’est pas en cause, des tests ont été fait dans ce sens.

MS ACCESS et CHATGPT

Puisque c’est la mode de ChatGpt et qu’on peut, au premier contact, lui faire dire ce que l’on veut, j’ai tenté une expérience sur le thème :

MS ACCESS est-il une base de données ?

Et voici l’échange avec ChatGpt :

User
Est-ce que Microsoft Access est une base de données ?
ChatGPT
Oui, Microsoft Access est une application de gestion de base de données relationnelle. Elle fait partie de la suite Microsoft Office et offre un environnement convivial permettant aux utilisateurs de créer, gérer et interroger des bases de données. Access utilise le modèle de base de données relationnelle, où les données sont organisées en tables, et les relations entre ces tables peuvent être définies pour permettre des liens logiques entre les différentes parties de la base de données. Bien que Microsoft Access soit utilisé pour des applications de base de données plus petites ou moins complexes, il peut être une solution pratique pour les utilisateurs qui ont des besoins de gestion de données sans nécessiter une infrastructure de base de données plus robuste.(ChatGpt 3.5 – le 26/01/2024)

La fin est absolument vrai. Ceux qui n’ont pas besoin d’une application robuste et n’ont pas de budget pour une infrastructure, Ms Access reste une bonne solution.

Mais vous pensez bien que cette réponse, plutôt réservée aux néophytes ou aux détracteurs de MS Access ne m’a pas convaincu. J’ai donc poussé plus loin l’expérience.

Ms Access n’est pas qu’une base de données

User
Non MS Access n’est pas une base de données.
ChatGPT
Je comprends que la terminologie peut parfois prêter à confusion. Pour clarifier, Microsoft Access est une application de gestion de base de données relationnelle. Cela signifie qu’Access fournit un environnement pour créer, gérer et interroger des bases de données relationnelles. Les bases de données créées avec Microsoft Access utilisent le modèle relationnel, où les données sont organisées en tables et les relations entre ces tables peuvent être définies.
Cependant, il est vrai que l’on peut parfois entendre des personnes dire que « Microsoft Access n’est pas une base de données » dans le sens où il ne s’agit pas d’un système de gestion de base de données (SGBD) autonome comme MySQL, PostgreSQL, ou Microsoft SQL Server. Access est plutôt une application qui inclut un moteur de base de données intégré.
Donc, selon le contexte, on peut se référer à Microsoft Access comme une application de gestion de base de données ou comme un système de gestion de base de données intégré.(ChatGpt 3.5 – le 26/01/2024)

ChatGPT vient de mettre le doigt sur 2 affirmations qui sont vrais :

  1. Le moteur ACE n’est pas autonome comme MySql, Oracle et autre.
  2. Ms Access inclus un moteur de base de données (ACE).

Rapid Application Development le RAD de Microsoft

Je décide donc d’aller plus loin dans la démonstration et de rentrer un peu plus dans le fond du problème.

User
Mais on peut utiliser MS Access sans se servir de ACE, donc ce n’est pas une base de données mais plutôt un RAD.
ChatGPT
Vous avez raison de souligner que Microsoft Access est souvent utilisé comme un outil de développement rapide d’applications (RAD – Rapid Application Development) plutôt que simplement comme un système de gestion de base de données (SGBD) autonome. Microsoft Access combine un moteur de base de données intégré (Microsoft Jet Database Engine ou ACE Database Engine) avec un environnement de développement qui permet aux utilisateurs de créer rapidement des applications liées à des bases de données.
Dans ce contexte, on peut considérer Microsoft Access comme un outil RAD qui offre une interface conviviale pour créer des applications associées à des bases de données, plutôt qu’un SGBD autonome. L’utilisation de l’ACE Database Engine permet à Access de gérer les données de manière relationnelle.
Il est important de noter que, bien que Microsoft Access puisse être utilisé pour le développement rapide d’applications, il a ses limites en termes de performances et d’évolutivité, ce qui le rend plus adapté à des applications de taille moyenne ou à des tâches spécifiques plutôt qu’à des solutions d’entreprise massives. Pour des applications plus complexes ou des volumes de données importants, des SGBD autonomes peuvent être préférables.(ChatGpt 3.5 – le 26/01/2024)


ChatGPT indique bien que MS Access, utilisé sans son composant ACE (le SGBDR tant décrié), est un RAD.

Ms Access et les applications Massives

Je décide de pousser ChatGPT un peu plus loin sur le thème des applications dites « massives ».

User
Ms Access peut utiliser des SGBD autonomes, il peut donc répondre à une demande d’application massive.
ChatGPT
Vous avez raison. Microsoft Access offre également la possibilité d’utiliser des sources de données externes, y compris des systèmes de gestion de base de données (SGBD) autonomes tels que Microsoft SQL Server, MySQL, ou Oracle. Cela permet d’accéder à des bases de données plus robustes et adaptées à des charges de travail plus importantes.
En utilisant Access comme interface frontale, vous pouvez développer des applications qui exploitent la puissance de SGBD autonomes pour gérer des volumes de données plus importants et offrir des performances optimisées. Cela peut rendre Access plus adapté à des applications plus massives, en tirant parti de la robustesse des SGBD sous-jacents tout en profitant de l’interface de développement rapide d’applications qu’Access offre.
Il est important de choisir la solution en fonction des besoins spécifiques du projet, de la complexité de l’application, des volumes de données anticipés et des exigences de performances. Utiliser Access comme interface frontale avec un SGBD autonome en backend est une approche courante pour tirer parti des avantages des deux mondes.(ChatGpt 3.5 – le 26/01/2024)

Voilà, nous sommes dans le coeur du sujet. Ms Access en frontal peut être utilisé pour répondre à des besoins d’applications massives. Pour moi ce n’est pas nouveau, cela fait plusieurs années que j’ai fait le choix technique d’utiliser Ms Access comme un RAD pour le Front-end et un SGBDR autonome (MySql, Sql Server, Oracle) pour le Back-end.

ChatGPT, Ms Access et le méchant humain

Mais comme je suis un peu obstiné, certains pourraient utiliser le vocable « chiant ». Je poursuis la discussion, car c’est bien d’une discussion qu’il s’agit.

User
En fait tu ne sais pas trop ce que raconte, tu dis tout et son contraire.
ChatGPT
Je m’excuse si mes réponses ont pu sembler contradictoires ou confuses. Permettez-moi de clarifier : Microsoft Access est un outil de gestion de base de données relationnelle qui combine un moteur de base de données intégré avec un environnement de développement. Vous pouvez utiliser Access de différentes manières, que ce soit en tant que système autonome avec son propre moteur de base de données (Jet Database Engine ou ACE Database Engine) ou en connectant Access à des SGBD autonomes externes tels que Microsoft SQL Server.
Cependant, il est important de noter que bien que Microsoft Access puisse être utilisé pour des applications de différentes tailles, il peut avoir des limitations en termes de performances et d’évolutivité par rapport à des SGBD autonomes plus puissants. Pour des applications massives et complexes, il peut être recommandé d’utiliser directement un SGBD autonome.
Encore une fois, je m’excuse pour toute confusion, et j’espère que cela clarifie la situation. Si vous avez des questions plus spécifiques ou des préoccupations, n’hésitez pas à les partager.(ChatGpt 3.5 – le 26/01/2024)

J’avoue que même si je m’adresse à une machine, le fond et la forme de mon affirmation ne sont pas du tout adaptés. J’en suis profondément désolé et m’en excuse. Mais cela permet cependant de voir les comportements intéressants suivants :

  1. ChatGPT a une capacité de synthèse.
  2. ChatGPT sait se remettre en question.
  3. ChatGPT sait s’excuser.
  4. ChatGPT ne semble pas apprendre des prompts.

Les trois premiers points sont vraiment peu courant chez les humains.

Frontend ou Backend là est la question

Je poursuis donc l’expérience pour tenter de lui en faire dire plus.

User
peut-on utiliser MS access en frontal avec un SGBD autonome pour des applications massives ?
ChatGPT
L’utilisation de Microsoft Access en tant qu’interface frontale avec un SGBD autonome en tant que backend est techniquement possible, et cela peut être une approche viable pour certaines applications, y compris celles qui peuvent être considérées comme massives. Cela permet de tirer parti de la convivialité de l’interface de développement rapide d’applications d’Access tout en utilisant un SGBD plus robuste pour stocker et gérer les données.
Voici quelques points à considérer :
Taille et complexité de l’application : Pour des applications massives avec des volumes de données importants et une complexité élevée, il peut être plus approprié d’envisager des SGBD autonomes tels que Microsoft SQL Server, Oracle, ou d’autres solutions.
Performances : Access peut avoir des limitations en termes de performances par rapport à des SGBD autonomes, surtout lorsque la taille des données ou le nombre d’utilisateurs simultanés augmente. Il est important d’évaluer les exigences de performances de votre application.
Sécurité : Lorsque vous utilisez Access avec un SGBD externe, assurez-vous de mettre en place des mécanismes appropriés de sécurité et d’accès aux données pour garantir l’intégrité et la confidentialité.
Évolutivité : Si vous prévoyez une croissance importante de votre application, il est essentiel d’évaluer la capacité d’évolutivité de votre solution. Certains SGBD autonomes offrent de meilleures capacités d’évolutivité que d’autres.
Maintenance : La maintenance d’une application dépend de la complexité de la solution. L’utilisation de SGBD autonomes peut parfois nécessiter des compétences techniques plus avancées pour la gestion et la maintenance.
En résumé, l’utilisation de Microsoft Access en tant qu’interface frontale avec un SGBD autonome en backend peut être une option, mais cela dépend des besoins spécifiques de votre application. Il est recommandé d’évaluer attentivement les caractéristiques et les exigences de votre projet avant de prendre une décision.(ChatGpt 3.5 – le 26/01/2024)


Conclusion

Pour moi ChatGPT s’avère être un bon outil… utilisé dans des mains compétentes. S’attacher à sa première réponse, et je l’ai déjà constaté sur des essais précédents, est loin d’être pertinent, il s’avère dans la majorité des cas comme contre-productif.
Donc n’hésitez pas à creuser, à le contredire et à aller dans les détails (chercher la petite bête). A moins que vous ne poursuiviez le but d’obtenir une réponse partiale, un consensus ou une réponse rapide sans autre forme de procès.

Pour finir voici la copie d’écran de la discussion.

VBA : La recherche et les accents en SQL et VBA.

Rechercher dans une base de données avec l’opérateur Like est assez trivial. Avec quelques jokers on arrive à retrouver ce que l’on souhaite. Cependant lorsque on a affaire à des contenus ayant des caractères accentués il est difficile de récupérer à la fois ceux qui en comporte et ceux qui n’en ont pas.

L’objet de ce billet est d’utiliser VBA pour contourner ce problème.

La première chose à faire est de créer une fonction qui va traiter le mot recherché.

Function ConvertAccForLike(strValue As String) As String
' Fabrice Constans (MVP ACCESS) mars 2016
If InStr(1, strValue, "a") > 0 Then
    strValue = Replace(strValue, "a", "[aàâä]")
End If
If InStr(1, strValue, "e") > 0 Then
    strValue = Replace(strValue, "e", "[eéèêë]")
End If
If InStr(1, strValue, "i") > 0 Then
    strValue = Replace(strValue, "i", "[iîï]")
End If
If InStr(1, strValue, "o") > 0 Then
    strValue = Replace(strValue, "o", "[oôö]")
End If
If InStr(1, strValue, "u") > 0 Then
    strValue = Replace(strValue, "u", "[uùûü]")
End If
ConvertAccForLike = strValue
End Function

Dans cette fonction, on recherche la présence des voyelles, une à une, en commençant par le a, ensuite le e, puis le i, etc. Chaque fois que la voyelle est détectée on la remplace par la syntaxe Contient de l’opérateur Like, soit […]

Pour le mot « eleve », la valeur renvoyée sera :

"[eéèêë]l[eéèêë]v[eéèêë]"

Les mots trouvés seront :

eleve, éleve, élève, élevé…

Vous pouvez l’utiliser directement dans objet requête, une source de formulaire, une clause Where d’un OpenForm ou OpenReport comme dans une requête en VBA.

Voici son utilisation :

SELECT * FROM matable WHERE champ1 LIKE convertAccForLike("eleve");

Évidemment vous pouvez compléter avec les autres jokers.

SELECT * FROM matable WHERE champ1 LIKE convertAccForLike("eleve?");

Dans ce cas la valeur renvoyée sera :

"[eéèêë]l[eéèêë]v[eéèêë]?"

Ce bout de code fonctionne avec des tables liées, cependant lorsque vous utilisez d’autres bases de données comme Sql Server, MariaDB, PostgreSql, il vaut mieux travailler directement sur ces dernières pour des raisons évidentes de performance.

N’hésitez pas à laisser un commentaire.