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 :

Problèmes sur lancement d'une requete creation de table depuis VBE [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2008
    Messages : 152
    Points : 110
    Points
    110
    Par défaut Problèmes sur lancement d'une requete creation de table depuis VBE
    Bonjour
    J'essais de lancer un requete creation de table afin de renseigner une table de recherche TRechercheTypeVariateur cette requete va "piocher" des données dans 3 tables de bases differentes. Cette requete fonctionne bien en la lancant manuellement elle met à jour la dite table, mais avec VBE et le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Set ReqFind = CurrentDb.QueryDefs("RRechercheVariateur")  ' lancement requete creation table de recherche
      ReqFind.Execute
      Set ReqFind = Nothing
    J'ai une erreur d'execution sur la ligne ReqFind.Execute " La table TRechercheTypeVariateur existe déja" Il est ou dit le problème ? Merci d'avance pour les tuyaux

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour
    Tu as utilisé une méthode qui interrompt la procédure si la requête existe.
    Pour retrouver ce que tu fais tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "RRechercheVariateur"
    Tu auras les messages habituels.
    Si tu veux les enlever:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.setWarnings False
    DoCmd.RunSQL "RRechercheVariateur"
    DoCmd.SetWarnings True
    Si tu veux garder le même type de procédure, il faut gérer les erreurs, par exemple comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Set ReqFind = CurrentDb.QueryDefs("RRechercheVariateur")  ' lancement requete creation table de recherche
     On Error Resume Next
     ReqFind.Execute
      Set ReqFind = Nothing
    Dans ce cas la procédure va se poursuivre malgré l'erreur. Ce n'est pas à utiliser dans tous les cas.

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2008
    Messages : 152
    Points : 110
    Points
    110
    Par défaut
    Ca ne marche pas, ta proposition avec fonctionne, il n'y a plus d'erreur d’exécution le programme passe bien sur la ligne sans claquer d'erreur, mais j'ai fait des tests la table n'est pas modifiée donc la requête n'est pas exécutée
    Tes autres solutions ne fonctionnent pas et génère des erreurs d'execution. Désolé

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    On Error Resume Next
    Dim oDb As Database
        Set oDb = CurrentDb
        oDb.Execute "RRechercheVariateur", dbFailOnError
        oDb.Close
        Set oDb = Nothing
    Quand il y message d'erreur quel est il?

    D'autre part grosse erreur de ma part: On ne doit pas utiliser RunSql comme je l'ai fait.
    Cela marchera mieux comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "RRechercheVariateur"
    DoCmd.SetWarnings True
    Dernière modification par Invité ; 20/12/2011 à 07h29.

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2008
    Messages : 152
    Points : 110
    Points
    110
    Par défaut
    Bonjour
    Je te remercie pour tes suggestions J'ai pris le problème dans l'autre sens. J'ai effacé la table TRechercheTypeVariateur
    Quand j'ouvre le formulaire menu de recherches j'effectue le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim ReqFind As DAO.QueryDef
        Dim stDocName As String
        Dim stLinkCriteria As String
        Set ReqFind = CurrentDb.QueryDefs("RRechercheVariateur")  ' lancement requete creation table de recherche
        ReqFind.Execute
        Set ReqFind = Nothing
        stDocName = "FRechercheAvanceesVariateurs"
        DoCmd.OpenForm stDocName, , , stLinkCriteria    ' Ouverture formulaire de recherches
    Et alléluia ça marche pas de défaut et création de la table en partant du principe mis en œuvre ci-dessus il faut effacer cette table après utilisation car à l’accès suivant j'aurais le message " la table ......existe déjà" . Cette opération se fait quand on quitte le menu recherche. Et là c'est de nouveau le casse tête pour effacer cette satanée table
    J'ai cherché et essaye 2 ou 3 solutions trouvés dans des FAQ et Forum pas une ne marche. Dans le meilleur des cas ça passe mais la table est toujours là dans le pire sa plante, je te mets la dernière version essayé qui ne marche pas non plus sa passe mais la table est toujours là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next
     DoCmd.RunSQL ("DROP TABLE TRechercheTypeVariateur")
     Err.Clear
    Ca gonfle un peu pour seulement effacer une table je fais quoi, je prends la corde ou le 12 ?

  6. #6
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    pour effacer une table, j'utilise cette technique (trouvée un jour je ne sais plus où ):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim res_bool As Boolean
    Dim objname As String
     
    'Supprime Table Si existe
    If ExisteTable(objname) Then
       res_bool = SupprimerTable(objname)
    End If
    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
    29
    30
    31
    32
    33
    34
    Function ExisteTable(NomTable As String) As Boolean
    'Pour fonctionner ce code nécessite la référence
    '   - Microsoft DAO X Object Library
    On Error GoTo err
        Dim oDb As DAO.Database
        Dim oQdf  As DAO.TableDef
     
        'Accède à la base de données courante
        Set oDb = CurrentDb
        Set oQdf = oDb.TableDefs(NomTable)
        'Retourne Vrai
        ExisteTable = True
     
    fin:
        'Libère les objets
        Set oDb = Nothing
        Set oQdf = Nothing
        Exit Function
    err:
        'Remonte toutes les erreurs différents de l'erreur 3265
        '(la requête n'existe pas)
     
        If err.Number <> 3265 Then
            err.Raise err.Number, err.Source, err.Description
        End If
        Resume fin
    End Function
     
    Function SupprimerTable(NomTable As String) As Boolean
    On Error GoTo err
    CurrentDb.TableDefs.Delete (NomTable)
    SupprimerTable = True
    err:
    End Function

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2008
    Messages : 152
    Points : 110
    Points
    110
    Par défaut
    Bonjour Godzestla

    Je doit avoir la cerise car ce que tu me propose qui est fort intéressant passe mais la table ne s’efface pas
    voici le code que j'ai mis dans un module pour que je puisse l'utiliser pour d'autres tables que j'ai a créer et a supprimer :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Public Sub LanceRequeteCreation(NameReq As String)   ' lance les requetes creation de table pour les recherches
      Dim ReqFind As DAO.QueryDef
         Set ReqFind = CurrentDb.QueryDefs(NameReq)  ' lancement requete creation table de recherche
         ReqFind.Execute                             ' execution requete
         Set ReqFind = Nothing                       ' fermeture
    End Sub
     
    Public Function ExisteTable(NomTable As String) As Boolean   ' Fonction de test existance table
    'Pour fonctionner ce code nécessite la référence
    '   - Microsoft DAO X Object Library
    On Error GoTo err
        Dim oDb As DAO.Database
        Dim oQdf  As DAO.TableDef
        'Accède à la base de données courante
        Set oDb = CurrentDb
        Set oQdf = oDb.TableDefs(NomTable)
        'Retourne Vrai
        ExisteTable = True
    fin:
        'Libère les objets
        Set oDb = Nothing
        Set oQdf = Nothing
        Exit Function
    err:
        'Remonte toutes les erreurs différents de l'erreur 3265
        '(la requête n'existe pas)
        If err.Number <> 3265 Then
            err.Raise err.Number, err.Source, err.Description
        End If
        Resume fin
    End Function
     
    Public Function SupprimerTable(NomTable As String) As Boolean    ' suppression des tables de recherches
    On Error GoTo err
      CurrentDb.TableDefs.Delete (NomTable)
      SupprimerTable = True
    err:
    End Function
     
    Public Function LibereTable(NameTable As String)
     Dim res_bool As Boolean
     Dim objname As String
     'Supprime Table Si existe
       If ExisteTable(NameTable) Then
         res_bool = SupprimerTable(NameTable)
    End If
    End Function
    La 1er sub est le lancement de la requete creation de table CA CA MARCHE
    Ensuite c'est le code que tu m'a fourni adapté à mon appli. Avec le debugeur en suivant ligne à ligne tout se passe bien SAUF dans la fonction suppression table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    On Error GoTo err
      CurrentDb.TableDefs.Delete (NomTable)
      SupprimerTable = True
    err:
    End Function
    Le debugeur passe sur la ligne CurrentDb.Tabl............... mais saute directement à end function au pas suivant ? L'appel du formulaire est fait à Function LibereTable(NameTable As String) pour info ensuite tout ce petit monde se débrouille.
    Comment tu explique cela ? Je te rappelle que je travaille avec Access 2003. Et à la sortie ma table n'est toujours pas supprimée

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonsoir
    Peut être un peu plus simple:
    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
    Public Sub Delete_Tbl(ByVal NomTbl As String)
    '---------------------------------------------------------------------------------------
    'Fonction de suppression d'une table
    '---------------------------------------------------------------------------------------
        Dim oDb As DAO.Database
        On Error GoTo Err
     
        Set oDb = CurrentDb
        oDb.TableDefs.Delete NomTbl
     
    Exit_Delete_Tbl:
        oDb.Close
        Set oDb = Nothing
        Exit Sub
    Err:
        If Err.Number <> 3265 Then
            MsgBox "Erreur " & Err.Number & "   "  &  Err.Description
            Resume Exit_Delete_Tbl
        End If
    End Sub
    On pourrait même se passer de la gestion d'erreur en mettant en tête de procédure
    Puisque à priori la seule erreur qui puisse se passer c'est que la table à supprimer n'existe pas et donc que le travail soit déjà fait.

    Il suffit d'appeler après la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Delete_Tbl ("NomDeLaTable")
    Dernière modification par Invité ; 21/12/2011 à 19h22.

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2008
    Messages : 152
    Points : 110
    Points
    110
    Par défaut
    Bonjour et merci à Godzestla et a GAYOT

    On dit souvent l'union fait la force (et l'oignon fait la soupe ) avec un mixe de vos propositions j'ai atteins le nirvana
    Concernant la dernière proposition de GAYOT cela marche mais il ne faut pas être dans le formulaire qui utilise la table sinon CRAC ! défaut.
    Donc j'ai tout regroupé dans la procédure événementielle sur click du bouton de recherche dans le menu précédent :

    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
    Private Sub BtMenuRecherche_Click()                  ' appel menu recherches Variateurs
    On Error GoTo Err_BtMenuRecherche_Click
        Dim stDocName As String
        Dim stLinkCriteria As String
        If ExisteTable("TRechercheTypeVariateur") Then   ' Si la table recherche existe
            Call Delete_Tbl("TRechercheTypeVariateur")   ' on la supprime
        End If
        LanceRequeteCreation ("RRechercheVariateur")     ' lancement requete creation de la nouvelle table de recherches
        stDocName = "FRechercheAvanceesVariateurs"
        DoCmd.OpenForm stDocName, , , stLinkCriteria     ' Ouverture du formulaire de recherche
     
    Exit_BtMenuRecherche_Click:
        Exit Sub
     
    Err_BtMenuRecherche_Click:
        MsgBox Err.Description
        Resume Exit_BtMenuRecherche_Click
    End Sub

    Et cela fonctionne ! alors merci à GAYOT pour Delete_Tbl() et merci à Godzestla pour la fonction existetable() le mixe des
    2 dans la subroutine ci-dessus fonctionne bien. 1000 fois merci à vous deux

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/05/2006, 13h25
  2. Clic sur élément d'une requete affiché
    Par leloup84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/02/2006, 00h38
  3. [QUERY ANALYSER]problème au lancement d'une stored procedure
    Par gregorian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2005, 16h39
  4. question sur syntaxe d'une requete
    Par sparis dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/09/2005, 11h58
  5. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21

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