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 :

Création d'index unique sur vue MS-SQL


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Par défaut Création d'index unique sur vue MS-SQL
    Contexte : vue sous MS-SQL, dont chaque ligne est en pratique unique, l'identifiant étant ROWID.
    Nota : pas de possibilité de modifier la vue pour y créer un index, ce qui aurait résolu le problème FYI

    Objet : création de tables liées dans Access pour pouvoir les éditer (soit à partir de tables ms-sql, soit à partir de vues ms-sql).
    Ici, on créer une table liée Access dbo_XXBNC_PARAMS à partir de la vue dbo.XXBNC_PARAMS dans MS-SQL (dont la colonne ROWID est en pratique un identifiant unique de chaque ligne).

    Extrait du 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
    For i = 0 To N - 1
        Set tdf = New TableDef
        tdf.Name = arrTableName(i)
        tdf.SourceTableName = arrSourceName(i)
        tdf.Connect = strSourceConnect
        If tdf.Name = "dbo_XXBNC_PARAMS" Then
                With tdf
                    Set Idx = New Index
                    With Idx
                        .Name = "IdxR" & i
                        '.Primary = True
                        '.Required = True
                        '.Unique = True
                        ' .Fields.Append .CreateField("ROWID")
                    End With
                    .Indexes.Append Idx
                    '.Indexes.Refresh
                End With
        End If
        CurrentDb.TableDefs.Append tdf
    Ce qui se passe : tout semble aller bien, sauf que la dernière ligne "CurrentDb.TableDefs.Append tdf" retourne une erreur 1039 (impossible de créer d'index, il y en a trop).
    A noter :
    - la table access est détruite en préalable de l'exécution de ce code, qui doit recréer le lien
    - ce code marche très bien pour les autres tables/vues où on ne cherche pas à créer d'index
    - il est tout à fait possible de faire l'opération manuellement sur cette même table avec le wizard de création de table attachée. En fin de wizard, ce dernier nous demande alors de choisir la colonne ROWID et tout est parfait
    - si on compare les propriétés de la table créée à la main, et de celle créée avant l'ordre append qui plante, tout est identique, sauf la propriété CollectionIndex qui vaut 0 dans la nouvelle (sans doute parceque pas encore rajoutée à tabledefs), et une constante (29 chez moi) lorsqu'on regarde la table manuellement créée.
    - on peut créer autant de tables manuelles qu'on veut sur cette même vue (avec des noms différents bien sûr)

    Bref, merci de votre aide.
    Objectif = pouvoir automatiser la recréation (voir simple refresh en pouvnat changer de base de données) de cette table/vue, en vue de la rendre modifiable ds Access.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Bonjour,

    Citation Envoyé par pdelap Voir le message
    Objectif = pouvoir automatiser la recréation (voir simple refresh en pouvnat changer de base de données) de cette table/vue, en vue de la rendre modifiable ds Access.
    Un sujet similaire (créer un index local sur une table liée) est traité dans une discussion du forum:
    http://www.developpez.net/forums/sho...ighlight=index

    Dans cette discussion, je propose une solution basée sur une simple commande SQL de création d'un index clé primaire.

    Pour en revenir à ton cas, apparemment tu utilises la bibliothèque DAO.
    Et la création d'index ne se réalise pas comme ça avec DAO, comme toutes les créations d'objets dans DAO qui passent plutôt par des méthodes nommées Create*.

    Dans ton cas:
    * pour créer la table il faut invoquer la méthode CreateTableDef d'objet DAO.Database concerné,
    * pour instancier un nouvel objet DAO.Index il faut invoquer la méthode CreateIndex de l'objet TableDef concerné.

    En plus, par précaution je te conseille de créer l'index *après* la création de la table liée.

    Dans ton code ça donnerait ceci (pas testé):
    Code VBA : 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
        Set tdf = CurrentDb.CreateTableDef()
        tdf.Name = arrTableName(i)
        tdf.SourceTableName = arrSourceName(i)
        tdf.Connect = strSourceConnect
        CurrentDb.TableDefs.Append tdf
        If tdf.Name = "dbo_XXBNC_PARAMS" Then
                With tdf
                    Set Idx = tdf.CreateIndex()
                    With Idx
                        .Name = "IdxR" & i
                        .Primary = True
                        .Required = True
                        .Unique = True
                        .Fields.Append .CreateField("ROWID")
                    End With
                    .Indexes.Append Idx
                    .Indexes.Refresh
                End With
        End If

    Ce que tu dis ensuite me laisse perplexe:
    Citation Envoyé par pdelap Voir le message
    - ce code marche très bien pour les autres tables/vues où on ne cherche pas à créer d'index
    Et pourtant "officiellement" ça ne devrait pas fonctionner...
    comme quoi ... !?
    _

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Par défaut Explications / Conseils sur la mise en oeuvre
    Merci !

    La solution réside en effet dans la mise en place d'un PseudoIndex ... et le lien proposé permet d'y arriver.

    La doc (Aides & Co) disait qu'il faut le mettre en même temps que la création de la table liée pour les objets ODBC.
    En revanche, une telle opération sur la table liée est impossible, que ceci soit fait en même temps ou après (cf ci-dessus).
    Manuellement idem ... et on ne peut le faire après manuellement ...

    La solution proposée permet de mettre en place l'index non plus sur l'objet lié, mais directement en exécutant une commande au sein de la base de données (celle qui contient l'objet table_liée, et non celle qui contient la table ou vue cible, car ce n'est pas toujours possible sur la base source).

    Cette solution marche parfaitement, notamment sur des bases liées en MS-SQL (ce qui est mon cas) : il suffit de lui passer en paramètre la bonne chaîne ODBC.

    Conclusion : utiliser la procédure proposée dans le dernier bloc de la discussion n°4 de ce sujet.

    Dans mon cas, et sans doute le votre :
    1) récupérer la procédure (je l'ai amendée pour ma part pour passer une unique chaine de connection en paramètre)
    2) se faire une table où on met la liste des tables liées à "rafraichir" et éventuellement les index à créer (attention, ne mettre que les index des vues qui n'ont pas d'index natif, soit uniquement les index dont on veut forcer la création : les autres sont créés automatiquement).
    3) appeler la procédure avec les bons paramètres. Par exemple, en bases de données source et destination, vous mettrez ... la base actuelle, soit CurrentDb.

    Merci encore !

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

Discussions similaires

  1. Index unique sur 3 champs
    Par pol2095 dans le forum Administration
    Réponses: 1
    Dernier message: 25/07/2014, 08h26
  2. [phpMyAdmin] Index unique sur 3 colonnes
    Par pol2095 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 24/07/2014, 15h13
  3. Index unique sur champ nullable
    Par olibara dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/05/2013, 10h36
  4. Contrainte "unique" sur une table sql!
    Par nixmind dans le forum Administration
    Réponses: 9
    Dernier message: 30/05/2012, 08h39
  5. [Sql] index sur vue
    Par fxp17 dans le forum Oracle
    Réponses: 8
    Dernier message: 23/02/2006, 10h56

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