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

Requêtes et SQL. Discussion :

INSERT INTO avec LOOP et PARAMETERS [AC-2016]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut INSERT INTO avec LOOP et PARAMETERS
    Bonjour,

    Je développe actuellement une application pour la gestion de documentation. Chaque document peut être tagué avec 1 ou plusieurs mot-clés pour en faciliter la recherche.

    J'ai donc une table T_Documents et une table T_Keywords avec une relation n/n. J'ai créé un table T_Junction qui prend la clé primaire de T_Documents et la clé primaire de T_Keywords.

    Côté U/I, j'ai un formulaire qui permet à l'utilisateur d'ajouter un nouveau document à la base. Dans ce formulaire, l'utilisateur peut renseigner 1 ou plusieurs mot-clés (sous forme de liste déroulante) pour taguer le nouveau document.

    J'ai une requête AddDocument qui ajoute le nouveau document à la table T_Documents. Ensuite, j'aimerais créer une requête AddJunction qui ajoute autant d'enregistrements Document_ID/Keyword_ID à la table T_Junction qu'il y a de keywords renseignés dans le formulaire.

    J'ai commencé à écrire ça:
    SQL pour Q_AddJunction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PARAMETERS [DocumentID] int, [KeywordID] int,
    INSERT INTO T_Junction (Document_ID, Keyword_ID) 
    SELECT [DocumentID] AS Document_ID, [KeywordID] AS Keyword_ID;
    VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Function Add_Junction()
     
    Set qdf = CurrentDb.QueryDefs("Q_AddJunction")
          With qdf
             .Parameters("DocumentID") = 99
             .Parameters("KeywordID") = 99
             .Execute
          End With
     
    End Function
    Bon, de base, ça ne marche pas! Access me dit "Elément non trouvé dans cette collection" pour la ligne .Parameters("DocumentID") = 99. J'ai mis 99/99 comme dummy values pour retrouver mon enregistrement dans T_Junction si d'aventure ça marchait...
    1/Voyez-vous ce qui ne marche pas dans ma définition/appelle de requête Q_AddJunction avec paramètres?

    Les questions qui viendront après ça sont:
    2/ comment passer en paramètre le document_ID du document qui vient d'être créé?
    3/ comment réaliser une boucle sur la requête AddJunction pour autant de combo box renseignées (Me!Keyword#.Value <> "" Et Me!Keyword#.Visible = True)? (max 6)

    Merci d'avance pour votre aide précieuse!

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir Marco88,
    INSERT INTO sans une table en sélection n'est pas possible dans acccess , il faut utiliser VALUES pour insérer les valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' avec des valeurs fixes:
    strSQL = "INSERT INTO T_Junction (Document_ID, Keyword_ID) VALUES(99, 99);"
    Currentdb.Execute strSQL, dbfailonerror
    ' avec des valeurs variables:
    strSQL = "INSERT INTO T_Junction (Document_ID, Keyword_ID) VALUES(""" & MaVariable1 & """,""" & MaVariable2 & """);"
    Currentdb.Execute strSQL, dbfailonerror
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Merci tee_grandbois!

    J'ai réécris ma requête SQL Q_AddJunction comme ça pour m'affranchir des paramètres dans un premier temps:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO T_Junction (Document_ID, Keyword_ID) VALUES (99, 99);
    et côté VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Function Add_Junction()
     
    Set qdf = CurrentDb.QueryDefs("Q_AddJunction")
        qdf.Execute    
    End Function
    J'ai la même erreur 3265 sur la ligne qdf.Execute maintenant...

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Hop, je suis reparti de tout propre et ta solution ajoute bien un enregistrement à la table T_Junction. Merci!!!

    Je pense que mon problème venait du fait que j'avais créé une requête à part et que j'essayais d'appeler cette requête depuis mon fichier VBA. Lorsque tout le code est dans le fichier VBA, ça roule!

    Me reste plus qu'à remplacer MaVariable1 par le dernier Document_ID de la table T_Documents et à faire une LOOP sur MaVariable2 pour toutes les combo box non vides et visibles.

    Thanks a lot!

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    une piste pour avancer dans la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Ctrl As Control
    For Each Ctrl In Me.Controls
        'traiter uniquement les listes déroulantes
        If (TypeOf Ctrl Is ComboBox) Then
        ' .... traitement
        End If
    Next
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Salut!

    Merci tee_grandbois pour ta réponse. Le problème c'est que j'ai d'autres combo box sur le formulaire qui ne doivent pas faire partie de la boucle...

    Du coup, j'ai utilisé une méthode bourin en hardcodant une liste des combo box à traiter (qu'elles soient renseignées ou pas, la boucle se chargera de les traiter ou non). Et ça marche! Le code ci-dessous si ça peut en aider d'autres.

    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
     
    Private Function Add_Junction()
     
        Dim DocumentID As Integer
        Dim KeywordID As Integer
        Dim i As Integer
        Dim myKeywords
     
        myKeywords = Array(Me!Keyword, Me!Keyword2, Me!Keyword3, Me!Keyword4, Me!Keyword5, Me!Keyword6)
        DocumentID = DMax("ID_Document", "T_Documents")
     
        For i = 0 To UBound(myKeywords)
            If myKeywords(i) <> "" Then
                KeywordID = myKeywords(i)
                strSQL = "INSERT INTO T_Junction (Document_ID, Keyword_ID) VALUES(""" & DocumentID & """,""" & KeywordID & """);"
                CurrentDb.Execute strSQL, dbFailOnError
            End If
        Next i
     
     
    End Function
    Merci encore!

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    alors filtre sur le nom et la valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (TypeOf Ctrl Is ComboBox) And Left(Ctrl.Name,6) = "Keyword" And Ctrl.Value <> "" And Ctrl.Visible Then
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. insert into avec une date
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/11/2006, 22h08
  2. [Débutant] INSERT INTO avec VALUES + SELECT
    Par Feezdev dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2006, 10h10
  3. INSERT INTO avec date (asp/access)
    Par ddeee dans le forum ASP
    Réponses: 2
    Dernier message: 30/03/2006, 13h07
  4. [MySQL] Php et INSERT INTO, avec variables
    Par Djwaves dans le forum PHP & Base de données
    Réponses: 24
    Dernier message: 20/02/2006, 13h53
  5. INSERT INTO avec une valeur numéroauto
    Par priest69 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 08/11/2005, 15h39

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