IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

[VBA-A][BDD] Rendre le code souple


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut [VBA-A][BDD] Rendre le code souple
    Bonjour,

    Je travaille sur une base ou les noms des tables /champs sont succeptibles de changer. Mais pour l'instant, je fais mes requetes avec les noms actuels en dur dans le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT monChamp FROM maTable"
    Si "monChamp" devient "monChamP", le code plante. Je souhaite donc creer des variables globales a initialiser au demarrage. Ma question est comment automatiser cette tache, car je ne veux pas creer 250 noms de champs a la main.

    La solution adoptee pour l'instant passe par un tableau de "structures" (d'ailleurs, existent t elles en VBA) qui au chargement, me renvoie les noms des tables/Champs. Un exemple d'utilisation (Voir le code complet a la fin du post)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT " & l_DBTableDefinition_AllDef(4).i_String_Field_Name(0) & " FROM " & l_DBTableDefinition_AllDef(4).i_String_Table_Name
    Mais cette solution ne me convient pas, car je travaille avec des indices : si j'ajoute une table a la base, il me faudra changer tous les indices dans tout le code...

    Avez-vous resolu cette difficulte ?

    Code de la structure et de la fonction d'initialisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    '"Structure" definisant une table
    'Contient son nom
    'le nom de ces champs
    'leur type
     
    Public Type DBTableDefinition
     
        i_String_Table_Name As String
        i_String_Field_Name() As String
        i_Long_Field_Type() As Long
     
    End Type
     
    'Fonction initialisant un tableau de "structure", chacune des cellules contenent les infos d'une table
     
    Public Function Create_DB_Fields_String()
     
     
    Dim l_Integer_NbFields As Integer
    Dim l_Integer_NbTable As Integer
    Dim l_Integer_TableLoop As Integer
    Dim l_Integer_FieldsLoop As Integer
    Dim l_Byte_NbSystemTable As Byte
     
    Dim l_Database_db As DAO.Database
    Dim l_Recordset_Bargain_File As DAO.Recordset
    Dim l_Database_TableDef As DAO.TableDef
    Dim l_Database_Fields As DAO.Field
     
    Dim l_DBTableDefinition_AllDef() As DBTableDefinition
     
    Set l_Database_db = CurrentDb
     
    l_Byte_NbSystemTable = 6 'Le nombres de tables system
     
    With l_Database_db
     
        l_Integer_NbTable = .TableDefs.Count - l_Byte_NbSystemTable 'recupere le nombre de tables creees
     
        ReDim l_DBTableDefinition_AllDef(l_Integer_NbTable)
     
        For l_Integer_TableLoop = 0 To l_Integer_NbTable - 1
     
    	'on donne le nom de la table
     
            l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_String_Table_Name = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Name
     
    	'compte le nombre de champ dans la table
     
            l_Integer_NbFields = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Fields.Count
     
            ReDim l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_String_Field_Name(l_Integer_NbFields - 1)
     
            ReDim l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_Long_Field_Type(l_Integer_NbFields - 1)
     
    	'donne le nom et le type de chaque champ
     
            For l_Integer_FieldsLoop = 0 To l_Integer_NbFields - 1
     
                l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_String_Field_Name(l_Integer_FieldsLoop) = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Fields(l_Integer_FieldsLoop).Name
     
                l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_Long_Field_Type(l_Integer_FieldsLoop) = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Fields(l_Integer_FieldsLoop).Type
     
            Next
     
        Next l_Integer_TableLoop
     
        MsgBox (l_Integer_NbTable)
     
    End With
     
    End Function

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Ma question, peut-être idiote, est:
    Pourquoi les noms des tables et des champs risquent-ils de changer :

    Il me semble que maintenir des requêtes sql fonctionnelles avec des tables dont la structure est modifiable relève de la gageure, mais je ne suis pas le pro des pros...

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    relève de la gageure
    et comment !!!
    il n'y a qu'à, une fois la base établie et renseignée, tenter (hors même toute programmation... manuellement donc...) d'en modifier les caractéristiques principales...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    j'espère que le nom de la table contenant les noms des champs, et celui de la base vont rester fixes
    on ne change pas les noms des champs ni celui des tables
    par contre on peut écrire du code modulaire en adressant les champs par
    leur index et en lui passant le nom de l'objet en paramètre
    si les tables aux noms changeants et aux intitulés multiples proviennent de sources extérieures c'est aux procédures d'import qu'il faudra réfléchir

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut
    Merci de vous etre interesse a mon probleme.

    Les noms de mes tables/Champs sont en fait ceux que je trouve dans un fichier log fourni par un organisme exterieur. La plupart du temps, ces noms ne varient pas, mais il arrive que pour etre plus logique avec le metier, il renomme/ajoute quelques champs.

    Je dois alors renommer le champ dans la base et dans toute l'appli avant de la redeployer.

    Je voulais que l'appli soit capable au lancement de creer autant de variables (contenant le nom des champs) qu'il n'y a de champs, de sorte a gagner le temps perdu en redeployement. Dans la suite du code, j'aurais toujours fait reference a ces variables.

    Le probleme semblant insoluble, je vais me resoudre a la redeployer de temps a autres. A moins que quelqu'un n'ait une idee. Encore merci.

  6. #6
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Une idée ? oui, mais elle n'est valable que pour les changements de noms, pas pour les rajouts de champs :
    utilisation d'un fichier de ressources (.res) et, dans le code, traduction, notamment dans les requêtes, par loadrestring.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut
    Je ne connais pas le "loadrestring" et n'ai jamais utilise les .res. Je fais une petite recherche pour voir si cela pourrait m'aider. Merci

Discussions similaires

  1. [VBA-A]suivi d'un code unique d'un formulaire a un autre
    Par acidstrike dans le forum VBA Access
    Réponses: 4
    Dernier message: 09/03/2006, 15h02
  2. [Excel + vba] Compacter BDD Access
    Par Emcy dans le forum Access
    Réponses: 6
    Dernier message: 01/12/2005, 15h18
  3. [Vba] Lire BDD avec Excel
    Par Emcy dans le forum Access
    Réponses: 12
    Dernier message: 09/11/2005, 11h09
  4. [VBA Excel Word]Adapter un code Excel a Word
    Par Baxter67 dans le forum VBA Word
    Réponses: 4
    Dernier message: 08/08/2005, 23h43
  5. [VBA Excel] Comment écrire un code dans le ThisWorkBook ?
    Par WebPac dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/05/2005, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo