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:
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.
:aie:
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).
:P 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 !