KioskeaKioskeaCommentCaMarcheInscrivez-vous, c'est gratuit !
Jeudi 22 mai 2008 - 00:54:13

VBA Access existance d'une table

Rechercher : dans
VBA Access existance d'une table
par darkspoilt
 Fil de Discussions
Statut : Non résolu
mercredi 23 mai 2007 à 16:21:04
Bonjour je pense que la question va etre bete pour beaucoup mais je voulais savoir quel est la méthode a utiliser en VBA pour Access pour vérifier l'existance d'une table
Merci d'avance
Configuration: Windows XP
Internet Explorer 6.0
Répondre à darkspoilt  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par sncf, le mercredi 23 mai 2007 à 17:01:01 Fil de Discussions
Bonjour
La solution que j'ai trouvé est d'ouvrir un recordset de cette table
Si elle n'existe pas, il y a une erreur qu'il est facile de traiter, sinon il suffit de fermer recordset

Sub x()
On Error GoTo err:
Dim rst As DAO.Recordset
Set rst = CurrentDb().OpenRecordset("T_Table")
Set rst = Nothing
Exit Sub
err:
Select Case err.Number
Case 3078
MsgBox "cette table n'existe pas"
Set rst = Nothing
End Select

End Sub
Pascal
Que c'est compliqué quand on cherche, que c'est simple quand on a trouvé
Répondre à sncf

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le mercredi 23 mai 2007 à 17:15:48 Fil de Discussions
En fait j'avais une solution de ce type car lors de l'import d'une table excel celle ci de s'écrase pas kand elle s'ajoute donc j'avais cette solution.

Jem e demande ou est l'erreur
Option Explicit

Private Sub Commande13_Click()
    On Error GoTo Err_Commande13_Click
   
    Dim m As String
    Dim a As String
    Dim nomTable As String
    Dim nomClasseur As String
    Dim SQL As String
    Dim d As String
    Dim cat As New ADOX.Catalog
       
    m = Me!mois
    a = Me!année
    d = a & m
    
    DoCmd.SetWarnings False

    nomClasseur = "D:\Test\Essai\" & a & m & ".xls"
    nomTable = "TableTest" & a & m

    If Not ExisteTable("nomTable") Then
    DoCmd.TransferSpreadsheet acImport, , nomTable, nomClasseur, -1
    End If
    'd = "2006_T3"
    'nomTable = "PJPF2006_T3"
    
    'Définir la requête
    SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, [année]) " & _
    "SELECT OPPO, MPE, MPF, MRE, MRF, M__, """ & d & """ AS [année] " & _
    "FROM " & nomTable & _
    " WHERE CBQD='total' AND MOIS='total' AND CMOP='total';"

    'Exécuter la requête
    CurrentDb.Execute SQL

Set cat = Nothing
Exit_Commande13_Click:
    Exit Sub
Err_Commande13_Click:
    MsgBox Err.Description
    Resume Exit_Commande13_Click
End Sub

Function ExisteTable(ByVal strTabl As String) As Boolean
    Dim str As String
    On Error GoTo err01
    str = CurrentDb.TableDefs(strTabl).name
    ExisteTable = True
    Exit Function
err01:
    Select Case Err.Number
        Case 3265
            ExisteTable = False
    End Select
End Function
 
Répondre à darkspoilt

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par sncf, le mercredi 23 mai 2007 à 17:52:03 Fil de Discussions
A mon avis le problème vient du fait que si la table existe déjà, tu ne fait pas d'importation Pascal
Que c'est compliqué quand on cherche, que c'est simple quand on a trouvé
Répondre à sncf

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le mercredi 23 mai 2007 à 17:55:04 Fil de Discussions
Bah la logik oui mais quand je click sur le bouton de mon formulaire la premiere fois j'ai exactement ce que je veux
et si je reclick une seconde fois j'ai des doublons donc c'est qu'il doit l'éxécuter.
Le but c'est que je n'ai plus ses doublons et je pense que c'est du a l'importation car quand la table existe il ne l'écrase pas mais colle a la suite d'apres les teste que j'ai fais.
Répondre à darkspoilt

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par sncf, le mercredi 23 mai 2007 à 18:19:51 Fil de Discussions
C'est donc que le seconde fois il considère aussi que la table n'existe pas, vérifie (en mettant un point d'arret) que la table créée la premi_re fois prote bien le meme nom que celui désiré Pascal
Que c'est compliqué quand on cherche, que c'est simple quand on a trouvé
Répondre à sncf

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 08:40:48 Fil de Discussions
Salut,

le plus simple est de balancer une requête de vidage de la table avant import :
Dim Req As QueryDef
Set Req = CurrentDb.CreateQueryDef("", "delete * from [ma_table")
Req.Execute dbFailOnError
Comme ça, plus de doublons possibles...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 09:38:09 Fil de Discussions
Dans ce cas autant je dois supprimer la table que je veux ajouter pour l'importer a chaque fois. Or c'est pas ce que je veux faire. Je me demandais il y aurait pas un buffer ou quelque chose comme ca a vidé??
Répondre à darkspoilt

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 10:15:37 Fil de Discussions
Si tu as des données en double, c'est que ta clé primaire n'est pas choisie correctement (numeroauto ?)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 10:20:09 Fil de Discussions
Dans la tableau excel que j'importe rien est en double si je refait ma fonction sans avoir effacé ma table j'ai tout en double une troisieme fois en truple etc... donc c pas mon tableau excel qui cloche c'est pour ca que je voulais vérifier l'existance de ma table afin de pas faire de nouveau import et de tout avoir en double triple etc...
Répondre à darkspoilt

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 10:34:02 Fil de Discussions
Excuse-moi d'insister, mais si tu récupères tes données 2 ou 3 fois, c'est que ta clé primaire n'est pas correctement configurée...

N'oublie pas que lorsque tu crées une table sans clé primaire, ACCESS en rajoute une qui est un numéro incrémenté automatiquement. Lors de l'insertion de données, ACCESS vérifie que la clé primaire n'existe pas déjà, et comme c'est un numéroauto, il n'y a aucune chance de le retrouver à la deuxième importation (ni même après).

Donne-moi la définition de ta table, je parie gros que c'est ça...

As-tu un critère discriminant dans ta feuille EXCEL ? Si oui, c'est lui qui doit être la clé primaire de ta table, tu n'auras aucun doublon ensuite (seulement des messages d'erreur de violation de clé lorsque tu voudras insérer quelque chose qui existe déjà)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 10:38:30 Fil de Discussions
c'est bon j'ai résolu le probleme merci en tout cas
Répondre à darkspoilt

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 10:43:56 Fil de Discussions
On peut savoir comment ? :-)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 10:56:11 Fil de Discussions
Déja tout mon code est dans le deuxieme post déclaration etc...
Mais je n'ai jamais entendu de la notion de clé primaire peux tu m'en dire plus ca m'interesse.

Sinon en fait la chose etait tout simple normalament j'initialise ma table avant d'ajouter une autre
bah dans mon code je n'effectuer pas ma requete initilisation c'est tout bete et jme suis pris le chou pour rien plus
Répondre à darkspoilt

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 11:10:36 Fil de Discussions
Sinon en fait la chose etait tout simple normalament j'initialise ma table avant d'ajouter une autre
bah dans mon code je n'effectuer pas ma requete initilisation c'est tout bete et jme suis pris le chou pour rien plus

C'est ce que j'ai proposé en <6>...

Mais je n'ai jamais entendu de la notion de clé primaire peux tu m'en dire plus ca m'interesse.

Une clé primaire est OBLIGATOIRE dans une table de base de données relationnelle, c'est elle qui sert de discriminant aux enregistrements (ça peut être un nom, mais attention aux homonymes, un code, genre numéro de sécu...).

Lorsqu'ACCESS cherche à insérer des données dans une table, il ne doit pas y avoir d'enregistrement qui existe avec la même clé primaire, sinon, il y a violation des règles...

Tu peux donner la structure de la table test ?
je suis sûr qu'il y a une clé primaire numéroauto, comme je l'ai déjà indiqué dans mes mesages précédents...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 11:58:44 Fil de Discussions
Ma table est contient les champs année OPPO, MPE, MPF, MRE, MRF, M__
voila
Répondre à darkspoilt

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 12:43:42 Fil de Discussions
Et quelles sont les propriétés de ces champs ? Où est la clé primaire ?
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 12:57:16 Fil de Discussions
Je vois pas ou tu vois ca moi quand je créer ma table j'exécute cette requete la apres je vois pas ou est la clé primaire?
SELECT t.année, t.OPPO, t.MPE, t.MPF, t.MRE, t.MRF, t.M__ INTO Test
FROM t;


et après je fais

INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, [année]) SELECT OPPO, MPE, MPF, MRE, MRF, M__, """ & d & """ AS [année] FROM " & nomTable WHERE CBQD='total' AND MOIS='total' AND CMOP='total';"


Répondre à darkspoilt

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 13:02:34 Fil de Discussions
Quand tu fais une requête SELECT INTO, il te crée une table dont les champs reprennent les propriétés de la table lue. Si tu as une clé primaire, il va la reprendre, si tu n'en as pas, il va t'en créer une.

Va voir ta table en mode création (via la fenêtre principale d'ACCESS), tu as sans aucun doute une clé primaire...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par darkspoilt, le jeudi 24 mai 2007 à 13:07:48 Fil de Discussions
non je lis nulle part clé primaire
Répondre à darkspoilt

20


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le jeudi 24 mai 2007 à 13:19:54 Fil de Discussions
Ca n'est pas marqué, il doit juste y avoir un champ avec une petite clé à gauche de son nom (d'ailleurs comment s'appelle-t'il ?)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

21


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par