John a écrit, le 15/09/2012 12:17 :
> Tout d'abord, je veux que tu saches que j'apprécie ton aide.
Tant mieux :)
>
> ( j'ai l'impression que <microsoft.public.fr.access> est désert )
C'est vrai qu'il y a des gens qui sont partis ...
>
> Pour commencer, je ne suis pas du tout 'database designer',
> mais à mon job on a besoin d'une base pour certains trucs
> ( je ne peux pas entrer trop dans les détails )
> et c'est à moi qu'a été confié l'étude et la réalisation.
> Au début j'ai utilisé au maximum les fonctionnalités internes d'Access
> ( relations entre tables liées, clés primaires, automatismes, etc )
> pour assurer la consistance, mais j'ai eu de mauvaises surprises.
> ( je ne prétends pas que le problème soit uniquement dû à Access,
> c'est aussi bien dû à l'incomplètude de mes connaissances )
J'ai mis trois ans à maîtriser Access en m'accrochant, et j'avais déjà
des notions au départ. Au bout de dix ans, je jette à peine un coup
d'oeil à l'aide de temps à autre.
Un point sur lequel on insiste trop rarement : c'est une grave erreur de
confier le développement d'une base Access à quelqu'un qui n'est pas
solide sur une méthode d'analyse, comme par exemple Merise. C'est comme
ça qu'on voit fleurir des bases avec un centre qui comporte dix
praticiens, et on crée un deuxième centre quand il y en a un onzième
praticien dans le même centre. C'est juste un exemple.
Sur Merise on trouve des docs pas trop mal fichues, il y a des gens qui
proposent des formations aussi. En deux semaines on peut avoir une
initiation valable.
>
> J'ai tout repris from crash, avec des formulaires dont les champs
> ne sont pas liés à des tables : je me charge de lire les champs saisis
> puis de les écrire dans les bons champs des bonnes tables.
> ( et de conserver l'intégrité des champs de tables contenant
> des entiers servant d'index pour pointer vers d'autres tables )
> Au final, pour te donner une idée de la facon dont c'est fait,
> TOUT est géré par du code Visual Basic : c'est pour moi la
> seule facon de maitriser tout ce qui se passe dans cette base.
> ( et quand quelque chose déconne je sais corriger le bug )
La création dynamique de champs est utile dans certaines situations.
Notamment, quand on a déployé une base de données, et que la base de
traitement prend en compte un nouveau champ : la base de traitement doit
alors créer le nouveau champ par code, sinon on est tranquille qu'un
jour ou l'autre on va se tromper de base de données et se retrouver avec
le message "champ inconnu".
En dehors de cela, l'interface utilisateur ne me paraît pas attirer de
reproche majeur, ça va quand même plus vite de créer un champ avec, que
d'écrire le code pour le faire, puis l'exécuter. Une réserve quand même,
c'est vrai que l'interface utilisateur évolue assez régulièrement, alors
que Dieu merci l'environnement de développement conserve plus de stabilité.
>
> J'imagine que cette facon de procéder te semble hérétique ...
> J'aurais largement préféré m'appuyer sur les fonctionnalités
> d'Access car cela m'aurait évité de tout faire 'à la main'
> et m'aurait fait gagner du temps, mais je bosse sur
> d'autres projets ( qui eux, sont mon métier ) et je n'ai
> pas le temps ( ni l'envie ) de devenir 'designer Access'.
Depuis environ cinq ans, les entreprises hésitent bien plus à faire
appel aux compétences, du coup les utilisateurs doivent se débrouiller
par leurs propres moyens. Quand on sera sortis de ça, ça augure des
missions de maintenance hautement joyeuses.
>
> Bref, j'ai quand même pu maintenant aboutir
> à une base qui tient trés correctement la route,
> même s'il me reste quelques trucs à optimiser.
C'est au moins une bonne chose :)
> C'est trés clair.
Bonne nouvelle. C'est généralement ce qu'on me dit, mais il ne faut
jamais le considérer comme définitivement acquis.
> De mon côté, je ne tiens pas à tout apprendre de MS-Access
> comme si je devais en faire mon métier ( j'ai déja un métier :o)
> Heureusement cela fait 25 ans que je pratique la programmation
> ( microprocesseurs, microcontroleurs, PC, etc )
> alors quand un système met à disposition un langage
> ( même un langage aussi merdique que Visual Basic ) au moins
> j'ai des outils pour m'en sortir et aboutir à une base correcte.
Il me semble que Visual Basic est conçu pour être lisible par des gens
qui ne l'ont pas appris. ça fait que l'utilisateur peut avoir une idée
de ce qu'il y a dedans. Si jamais on s'est mal compris, je ne dirais pas
que c'est le moyen de correction par excellence parce que ça prendrait
quand même pas mal de temps à l'utilisateur, mais au moins si il veut le
lire il peut.
Quand à dire que c'est un langage merdique ... moins compact que C,
c'est sûr. Probablement ne le choisit-on pas pour les mêmes raisons.
D'ailleurs à présent, Microsoft propose de faire de la programmation
pour le pack Office avec la plateforme .Net : C#, VB.Net, C++ ...
Je n'ai pas encore vu se dessiner une demande forte là-dessus, mais
c'est une piste à ne pas négliger. Cela étant, comme il faut quand même
plus de temps pour y entrer que pour ouvrir un module VBA, c'est
probablement davantage destiné à des gens dont c'est le métier de
programmer, et qui savent poser les bonnes question grâce à une méthode
d'analyse éprouvée. On en attend un code plus cher à produire au départ,
mais qui est supposé durer -tant que l'aspect fonctionnel n'évolue pas,
ou encore le système d'exploitation.
>
>
>> Ah ben oui mais ... c'est un point important. D'ailleurs je me
>> rappelle, quand on m'a demandé de migrer ma base arrière vers Oracle
>
> C'est marrant que tu parles d'Oracle, parce-que dans les années
> 1998/2002 j'ai bossé là-dessus pour une boite de bio-informatique,
> j'ai fait des interfaces réseau sous forme de programmes Windows
> qui s'interfacaient à Oracle en PL/SQL ... j'écrivais mes logiciels sous
> MS-Visual C++ en langage C ( ca au moins c'est un VRAI langage )
> Et tout cela marchait nickel. Faut dire qu'Oracle, c'est pas Access ...
Sinon, il n'y aurait pas de raison qu'il y ait deux noms :o)
> Disons que, tant que l'utilisateur est prévenu, c'est déja ca.
> On peut même lui dire QUI est en train de modifier l'enregistrement,
> ensuite c'est à lui de voir s'il veut contacter l'autre utilisateur ou pas.
>
> Mais je vois un problème potentiel dans les flags de blocage :
> si un utilisateur accède à un enregistrement pour le modifier,
> on positionne les flags ( indiquant 'pas touche, c'est verouillé' )
> mais imagine que l'utilisateur quitte Access 'sauvagement',
> ou qu'il y ait une rupture réseau, ou que son PC plante :
> dans la base les flags de verrouillage vont rester positionnés
> et plus personne ne pourra accèder à l'enregistrement, non ?
> ( et il faudra appeler l'admin (moi) pour débloquer la bête ... )
Exactement. C'est pour ça que c'est important de mettre à sa disposition
un champ qui lui dise qui a demandé le verrouillage et quand. Si ça
remonte à la veille, et que les utilisateurs sont bien "briefés" sur la
nécessité d'éteindre leur poste de travail le soir en partant, on sait
que c'est un plantage et qu'on peut fermer. Si c'est récent on contacte
l'utilisateur pour savoir où il en est ...
> Oui, un des problèmes potentiels qu'il me reste à résoudre est celui-ci :
> Si deux utilisateurs accèdent au même enregistrement en même temps,
> il faut que je mette en place un truc pour que seul celui qui accède
> en premier puisse modifier les données, mais en plus que l'autre
> utilisateur soit prévenu que l'enregistrement est en cours de modif
> par un autre utilisateur, histoire de lui éviter de saisir des données
> qui au final seront de toutes facons écrasées par les données de l'autre.
Absolument. Vraisemblablement, pendant que quelqu'un d'autre modifie, on
peut lire, mais c'est une mauvaise idée d'autoriser la modification.
En fonction des détails fonctionnels de l'application, il peut
apparaître qu'un découpage des données soit judicieux, pour qu'une
personne modifie une partie, pendant qu'une autre modifie une autre.
Dans ce cas je verrais bien définir deux tables, bien que j'aie entendu
ériger le contraire en principe, mais si on veut que deux utilisateurs
puissent modifier deux parties d'un enregistrement en même temps, il
faut que le système d'exploitation, le système de gestion de base de
données et le langage le permettent. Je n'en connais pas d'exemple.
> Dans ma base j'ai créé une table avec les noms des utilisateurs
> autorisés, les niveaux des droits utilisateurs, les adresses email, etc.
> Quand un utilisateur ouvre l'interface ( formulaire ) Access,
> je récupère le login Windows de l'utilisateur et le recherche
> dans la table pour y lire les informations le concernant.
> ( si l'utilisateur n'est pas dans la table, j'affiche un message
> genre ' Access denied ' puis je ferme la base et quitte Access )
> Sinon j'autorise ou bloque des fonctionnalités suivant les droits
> attribués.
> C'est déja une première barrière pour éviter les embrouilles.
Oui, effectivement. D'ailleurs, selon le cas, il peut arriver qu'il soit
utile de se demander si l'utilisateur peut lire le code.
Il est à noter qu'Access propose un système de gestion de sécurité, avec
des groupes de connexion stockés dans un fichier d'extension mdw, et qui
accorde des droits par objets (formulaires, tables ...). Ce n'est
peut-être pas une panacée, mais ça a au moins le mérite d'exister.
>
> J'ai aussi implémenté une table de log où j'enregistre les évènements
> ( login utilisateur, date/time, action réalisée, etc ) comme ca s'il y a
> une couille je pense pouvoir remonter l'historique pour débugger.
Effectivement. Bien réfléchir à ce qui se passe en cas de plantage, voir
si le système a le temps d'écrire dans la table de log. ça suppose un
gestionnaire d'erreur bien écrit.
> J'ai aussi écrit une fonction VBA pour envoyer automatiquement des emails
> aux utilisateurs en fonctions des actions impliquées par leur action sur
> la base.
Oui, c'est une idée, d'ailleurs SQL Server propose ça de façon
automatique en fonction de l'évolution d'un champ par exemple.
ça peut être une bonne idée d'en parler avec l'administrateur des mails
de la boîte. C'est lui qui a connaissance des abus qui peuvent se
présenter, des blocages qu'il peut être amené à mettre en place,
éventuellement de finesses à apporter au protocole.
> Aujourd'hui cette base se tient bien (je n'ai pas à en rougir) mais
> comme je te l'ai dit, il y a encore des trucs que je voudrais fignoler.
>
> Par exemple, je ne comprends pas trop ce qui se passe réélement
> lorsqu'un utilisateur, depuis sa machine 'X' , ouvre la base ACCDB
> qui est physiquement sur une autre machine 'Y' ( via le réseau )
> Est-ce que Access ouvre sur la machine locale 'X' de l'utilisateur
> une copie de la base, ou est-ce que Access se contente
> d'établir une connection avec la base qui est sur la machine 'Y' ?
> Une conséquence de cette question est que dans le code VBA,
> 1 - Soit toutes les variables ( integer, chaines, etc )
> sont uniquement locales sur la machine 'X'
> ( donc propres à chaque utilisateur connecté )
> 2 - Soit elles sont les mêmes pour tous les utilisateurs.
> Evidemment ca fait une sacrée différence.
>
> Je ne sais pas si mes questions sont bien claires ?
Oui, très clair, mais là, plutôt que de dire des bêtises, au sujet
d'informations qui seraient enregistrées en cache sur le disque et qui
poseraient un problème de confidentialité, je vais te laisser chercher
toi-même :)
Pour ce qui est de la portée des variables on doit pouvoir creuser.
Tu as une base de données, à l'arrière, qui contient les données, et une
base frontale sur la machine de chaque utilisateur. A priori, les
variables globales sont au niveau de la base, pour le frontal on a
chacun la sienne. C'est une bonne idée de faire quelques tests pour bien
avoir le coeur net quant à éviter toute ambiguïté.