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 :

Modifier l'attribut d'indexation d'un champ


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut Modifier l'attribut d'indexation d'un champ
    Bonjour,

    Je cherche à modifier à partir de VBA l'attribut Index = Oui d'un champ de ma table...

    Je cherche et je cherche, mais je ne trouve rien...

    j'ai trouvé cela:

    La procédure pour la création des Index rejoint de près celle de la clé primaire et du coté des noms d'objets, il n'y a pas de différence entre ADO et DAO, il porte toujours le nom Index et appartient toujours à la collection Indexes.

    Remarquez que la syntaxe entre les deux méthodes est similaire :
    Création d'un index avec DAO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	''' Création de l'index sur le champ ProductName avec doublon
    	Set oIDX = .CreateIndex("IDXProductName")
    	With oIDX    
    	.Fields.Append .CreateField("ProductName")    
    	.Unique = False
    	End With
    	''' Ajout de l'index à la table
    	.Indexes.Append oIDX
    Création d'un index avec ADO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	''' Création de l'index sur le champ ProductName avec doublon
    	Set oIDX = New ADOX.Index
    	With oIDX    
    	.Name = "IDXProductName"    
    	.Columns.Append "ProductName"    
    	.Unique = FalseEnd With
    	''' Ajout de l'index à la table
    	.Indexes.Append oIDX
    Au même titre que vous affectez la clé primaire à un lot de champs, vous procédez de façon identique pour affecter les index à plusieurs champs...
    mais je ne comprend pas pourquoi il y a un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateField("ProductName")
    ???
    si je ne veux pas creer de champs moi??


    en fait, je ne vois pas ce que l'auteur appelle "IDXProductName" ou "ProductName" ??
    quelle et la difference entre les deux??
    lequel doit etre le nom de mon champ a moi pour lequel je veux un attribut index???

    MERCI

  2. #2
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour,

    Un index n'est pas une simple propriété d'un champ.

    Considère un index comme un objet comportant une collection de champs. Le CreateField ne créée pas un champ destiné à être ajouté à la table mais à l'index (rappel: un index peut être basé sur plusieurs champs).

    IDXProductName est donc le nom attribué à l'objet Index alors que ProductName est le champ sur lequel s'appuie cet index.

    Pour mieux comprendre, fais dans une base test des essais de clés primaires et/ ou d'index portant le cas échéant sur plusieurs champs et regarde dans la fenêtre des index au fur et à mesure.

    Bon dev

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut eeuuuh
    la fenêtre des indexes???

    là j'ai du sauté quelque chose!!!


    par contre, je retourne mon access 2000 sans trouver cettefenetre des indexes!!!

  4. #4
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Ben tu as mal cherché

    Y a un bouton dans la barre d'outil, avec un éclair jaune (je me souviens plus si c'était comme ca sous Access 2000 et je n'en ai pas sous la main pour le moment).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut re
    bah vraiment, je ne trouve pas!!!


    le bouton avec l'eclair s'appelle "nouvel objet" et permet de créer des formulaires, requete, macro, module.. instantanés...

    l'autre bouton avec un eclair s'appelle "filtrer par séléction" !!??

    sinon, j'ai essayé ce code:

    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
    Private Sub Commande48_Click()
     
     
    Dim oDB As DAO.Database
    Dim oTBL As DAO.TableDef
    Dim oFLD As DAO.Field
    Dim oIDX As DAO.Index
     
    DoCmd.SetWarnings False
     
    DoCmd.OpenQuery "rqt01_creation_table_locale"
    DoCmd.RunSQL "ALTER TABLE Clients_locale ADD [Prix_abonnement] SINGLE;"
    DoCmd.RunSQL "ALTER TABLE Clients_locale ADD [Date_Fin_Abonnement] DATE;"
    DoCmd.SetWarnings True
    Set oDB = CurrentDb
    ''' Création de l'index sur le champ ProductName avec doublon
        Set oIDX = .CreateIndex("IDXIndi_R")
        With oIDX
        .Fields.Append .CreateField("Indi_R")
        .Unique = False
        End With
        ''' Ajout de l'index à la table
        .Indexes.Append oIDX
    Set oIDX = Nothing
    Set oDB = Nothing
     
    End Sub
    à l'execution, j'ai une erreur sur le pourtant j'ai bien DAO déclaré dans mes références, et ce bout de code, qui devrait dire ce que c'est : alors pourquoi il ne reconnait pas?

    Merci

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut rere
    je cherche sur google l a"fenetre des indexs" pour access, et je trouve rien!!!
    j'y crois et tout, mais ma quete ressemble à celle du graal
    on en parle, on en parle, et on le toruve jamais

  7. #7
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Citation Envoyé par Frenchguy Voir le message
    le bouton avec l'eclair s'appelle "nouvel objet" et permet de créer des formulaires, requete, macro, module.. instantanés...

    l'autre bouton avec un eclair s'appelle "filtrer par séléction" !!??
    Heu, si tu passais en mode création, cela serait mieux non ?
    Ci joint une image du bouton



    Citation Envoyé par Frenchguy Voir le message
    à l'execution, j'ai une erreur sur le
    Hummm... tu as été un peu fort en allégeant ton code.... .CreateIndex signifie de faire appel à la métjode CreateIndex de l'objet en cours ... dans le With... que tu as oublié...
    Dit autrement, il faut que tu rajoutes un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With oDB
       .createIndex....
       .indexes.Append...
    end with
    Images attachées Images attachées  

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut oohh
    ma quete du graal prend fin...
    effectivement, je viens de trouver cette icone..
    en mode d'edition de ma table...
    (et pourtant j'etait allé voir!!??)


    ça me parait plus clair, maitnenant que je trouve l'envers du décor...

    reste à faire marcher le code DAO...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut suite
    Bon, j'ai pas trop eu le temps de m'y pencher, mais me revoila à la cahrge!!

    j'esaye ce code là:

    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
    Private Sub Commande55_Click()
    Dim MyDB As Database
    Dim MyTable As TableDef
    Dim MyIndex As Index
    Dim MyField As Field
     
    'Création de l'index dans la table
    Set MyDB = CurrentDb
    Set MyTable = MyDB.TableDefs("Clients_locale")
    Set MyIndex = MyTable.CreateIndex("Indi_R")
    'Le nom du champ créé dans la collection Indexes
    'est le nom du champ à indexer
    Set MyField = MyTable.Fields("Indi_R")
     
    'On rafraichit ensuite la collection Fields dans l'index
    MyIndex.Fields.Append MyField
    MyIndex.Fields.Refresh
    'On rafraichit les index dans la table
    MyTable.Indexes.Append MyIndex
    MyTable.Indexes.Refresh
     
    MyDB.Close
     
    Set MyDB = Nothing
    Set MyTable = Nothing
    Set MyIndex = Nothing
    Set MyField = Nothing
    End Sub
    et Access me retourne une incompatibilité de type...
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MyField = MyTable.Fields("Indi_R")
    j'imagine que mon code est pas bon...
    mais les seuls exemples qu ej trouve sur internet traitent de la créatino d'un champ, alors que mon champ a moi existe deja...
    j'ai donc essayé d'y faire référence de cette maniere...
    mais ça ne doit pas etre la bonne...

    qu'est-ce qui ne va pas??
    quel est la maniere de faire reference a un champ existant??? en dao??

    MERCI

  10. #10
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    attention les objets database et ses copains sont à la fois dans les bibliothèques ADO et DAO
    Cf http://access.developpez.com/faq/?pa...#IncompTypeRst

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut Ok
    Merci pour la prcision!!!


    maitnenant il s'arrete sur ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyIndex.Fields.Append MyField
    =>"jout impossible. Il existe deja un objet de ce nom dans la collection".

    pourtant j'ai récupéré le code d'un gars sur el net (ou alors, il a donné un code qui ne marchait pas!!?? j'avais pas pensé à ça tiens!! )

    si je traduit cette portion de code en ma langue, j'associe le champ index au champ "myfield" , non???

    quoi de mal là dedans?

  12. #12
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Revois la réponse de mout1234 qui est exacte.

    Et le tuto de tofalu (qui donne des réponses à presque toutes les question sur DAO) :
    http://warin.developpez.com/access/d...tie_4#L4.5.4.1

    Il faut bien utiliser CreateField sur l'index.
    Ce CreateField ne crée pas un champ dans la table mais un champ pour l'index.
    Puis utiliser Append, toujours sur l'index, pour ajouter le champ précédent à l'index (CreateField crée un objet Field, mais il faut bien l'ajouter à la collection Fields de l'index).
    Et bien sûr ajouter l'index à la table.

    Bref regarde le tuto de tofalu, y a pas mieux.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut re
    hmm...

    j'ai donc essayé ça, en appliquant le code du lien.

    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
    Dim oDb As DAO.Database
    Dim oTbl As DAO.TableDef
    Dim oFld As DAO.Field
    Dim oInd As DAO.Index
    'Instancie la base
    Set oDb = CurrentDb
    'Instancie la table
    Set oTbl = oDb.TableDefs("Clients_locale")
    'Crée l'index en le nommant Indi_R_index
    Set oInd = oTbl.CreateIndex("Indi_R_index")
    'Cree le champs dans l'index
    Set oFld = oInd.CreateField("Indi_R")
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'Ajoute l'index à la table
    oTbl.Indexes.Append oInd
    'Rafraichit la collection
    oTbl.Indexes.Refresh
     
    Set oDb = Nothing
    Set oTbl = Nothing
    Set oFld = Nothing
    Set oInd = Nothing
    il em retourne une erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oTbl.Indexes.Append oInd
    en me disant qu'un index ne peu pas contenir de valeur nulle !!??
    mon champ Indi_R peut en effet contenir une valeur nulle...
    mais de toute façon je veux faire un index avec doublon...
    est-ce que cette erreur viens du fait que par defaut ce code est adapté a la création d'un index sans doublons... ???



    je suis un boulet en DAO, je crois...

  14. #14
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Propriété Required de l'index

    Faudrait vraiment lire les tutos jusqu'au bout

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut re
    C'est a dire que dans les tutos, je peux pas lire la partie 4.5.4.1. "Créer un index" qui m'interesse sans lire l'intégralité de la partie 4.5.4 !!!???
    (qui devrait alors répondre à mon problème, en ajoutant un bout de code supplémentaire...)


  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 218
    Points : 77
    Points
    77
    Par défaut ok
    j'ai finalement mis ça:

    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
    'Instancie la base
    Set oDb = CurrentDb
    'Instancie la table
    Set oTbl = oDb.TableDefs("Clients_locale")
    'Crée l'index en le nommant PK_Client
    Set oInd = oTbl.CreateIndex("Indi_R_index")
    'Cree le champs dans l'index
    Set oFld = oInd.CreateField("Indi_R")
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'doublons ou pas
    oInd.Unique = False
    'valeur nulles acceptées
    oInd.Required = False
    'Ajoute l'index à la table
    oTbl.Indexes.Append oInd
    'Rafraichit la collection
    oTbl.Indexes.Refresh
     
    Set oDb = Nothing
    Set oTbl = Nothing
    Set oFld = Nothing
    Set oInd = Nothing
    (en ayant lu différentes parties du tuto en plus... )

    par contre, j'ai parfois vu des codezs, en fin de dao du genre

    est-ce que c'est nécessaire dans mon cas??
    (je n'ai pas de code openDb....)
    si je met juste
    ça suffit a contrer le:
    et à ne rien laisser d'ouvert par la dans mon dao???

    (je marque quand meme résolu, car le principal est là!!)

    MERCI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/12/2007, 14h50
  2. Undefined index sur un champs select
    Par kcizth dans le forum Langage
    Réponses: 1
    Dernier message: 06/04/2006, 09h47
  3. comment modifier les attributs d'un fichier?
    Par kamal101 dans le forum C++
    Réponses: 1
    Dernier message: 18/03/2005, 14h16
  4. n INDEXs sur chaque champ ou 1 seul INDEX sur n ch
    Par fourchette dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/04/2004, 10h55
  5. [VBA-E]modifier les attributs d'un commentaire dans une cellule
    Par Olivier vb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/03/2004, 10h26

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