Comment tester si une table existante dans une base Access ?

Résolu
cs_benedict Messages postés 187 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 7 mai 2009 - 6 août 2005 à 09:48
jhary69 Messages postés 81 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 22 juillet 2007 - 7 août 2005 à 11:06
Je voudrais écrire un code pour savoir si la table "toto" existe dans la base "MaBase".

Et si la réponse est non, je voudrais créer la table "toto" en spécifiant les champs et le type de données.

Pouvez-vous m'aider ?
Merci de tout coeur.

Benedict

11 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 août 2005 à 14:45
OK, donc essaie ça :

' Coche Microsoft ADO Ext .... dans les références du projet
Function ExistTable(strNomTable As String) As Boolean


Dim cat As New ADOX.Catalog
Dim tbl As ADOX.Table

' Ouverture du catalogue
cat.Activeconnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=TaBase.mdb;"

'parcours de la collection de tables
For Each tbl In cat.Tables
If tbl.Name = strNomTable Then
ExistTable = True
Exit Function
End If
Next

ExistTable = False

End Function

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
3
jhary69 Messages postés 81 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 22 juillet 2007
6 août 2005 à 10:02
salut,

Function IsTableExiste(ByVal strNomTable As String) As Boolean
Dim tblTemp As TableDef

On Error GoTo err_IsTableExiste


Set tblTemp = CurrentDb.TableDefs(strNomTable)
IsTableExiste = True

Exit Function
err_IsTableExiste:
If Err.Number = 3265 Then ' element non trouvé dans la collection
IsTableExiste = False
Else
' gerer l'erreur inconnue
End If
End Function

A+

Christophe.
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 août 2005 à 12:54
Salut,
Qu'utilise-tu pour interroger ta base ? DAO, ADO ?

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 août 2005 à 13:00
Je me permettrais tout de même de reprendre le code de jhary69 car je n'aime pas trop les on error quand ce n'est pas nécessaire :

Function IsTableExiste(ByVal strNomTable As String) As Boolean
Dim tblTemp As TableDef

For Each tblTemp In CurrentDb.TableDefs
If tblTemp.Name = strNomTable Then
IsTableExiste = True
Exit Function
End If
Next

IsTableExiste = False


End Function

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_benedict Messages postés 187 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 7 mai 2009 2
6 août 2005 à 13:21
Dresseur de puce,

J'utilise ADO

Benedict
0
cs_benedict Messages postés 187 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 7 mai 2009 2
6 août 2005 à 17:00
Merci CanisLupus.


Une autre puce à dompter.

Comment faire pour tester si un champ "titi" existe dans la table "toto" ?

Merci.

Benedict
0
jhary69 Messages postés 81 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 22 juillet 2007
6 août 2005 à 18:25
re,

pour le test de l'existance d'une table effectivement si tu as peu de tables, le for each est tout aussi rapide par contre dans une bdd avec beaucoup de tables (des centaines) ca commence a etre long le parcours

pour le test de l'existance d'un champ on adapte le code de CanisLupus (ou tu adaptes le mien ...)

je crois me souvenir qu'en adox c'est la collection columns qui represente les champs d'une table ... du coup ca donne :

Function ExistChamp(ByVal strNomTable As String, ByVal strNomChamp As String) As Boolean
Dim cat As New ADOX.Catalog
Dim tbl As ADOX.Table
Dim col As ADOX.Column

ExistChamp = False

' Ouverture du catalogue
cat.Activeconnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=TaBase.mdb;"

Set tbl = cat.Tables(strNomTable)

'parcours de la collection de colonnes
For Each col In tbl.Columns
If col.Name = strNomChamp Then
ExistChamp = True
Exit For
End If
Next

Set tbl = Nothing

End Function
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 août 2005 à 19:27
Jhary69 > d'abord, rien à dire sur ton exemple pour les champs sauf que c'est correct.
Par contre, une base access contenant "des centaines de tables", c'est peu vraisemblable. Sinon, c'est une base mal construite et/ou c'est une "usine à gaz".
J'ai eu à bosser sur des bases "portail" avec des tables ou requetes attachées dans tous les sens (c'est la galère) mais je n'ai jamais eu affaire à "des centaines de tables" sauf dans un cas ou j'ai été obligé de reconstruire tout.
Mais admettons. Dans ce cas, le for each n'est pas beaucoup plus lent que le on error qui, mal utilisé peut provoquer d'autres bugs, et c'est beaucoup plus propre.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
jhary69 Messages postés 81 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 22 juillet 2007
6 août 2005 à 22:06
re,

oki, faut dire que je suis habitué aux usines à gaz sur Access voir meme sur Excel !

A+

Christophe.
0
cs_benedict Messages postés 187 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 7 mai 2009 2
6 août 2005 à 22:40
Désolé de vous embéter, les amis, mais j'ai un problème.

J'ai bien déclaré la fonction ExistChamp et j'ai créé un bouton avec le code suivant :

Sub Command1_Click()
ExistChamp=(strNomTable: = "toto", strNomChamp:= "titi")
End Sub

Ca ne marche pas.
J'ai "erreur de syntaxe : attendu )"

Quel est le code correct pour tester si dans la table "toto" il y a bien un champ "titi"

Benedict
0
jhary69 Messages postés 81 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 22 juillet 2007
7 août 2005 à 11:06
re,

il y a une erreur sur ta ligne de code :

ExistChamp=(strNomTable: = "toto", strNomChamp:= "titi") ==>syntaxe incorrecte
bRet ExistChamp(strNomTable: "toto", strNomChamp:= "titi") ==> ca devrait mieux marcher comme ca ...

A+

Christophe.
0
Rejoignez-nous