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 :

Parametres listbox requete SQL & "updateable query" erreur


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Parametres listbox requete SQL & "updateable query" erreur
    Bonjour à tous,

    J'essaie de faire un petit quelque chose sous access mais ça ne marche pas.

    J'ai 2 tables, [phone directory] et [updated phone directory], qui contiennent une ID (la PK), le nom de la personne (NAME), le département du bonhomme (DEPT), le code du pays (CODE), la racine du téléphone (ROOT) et l'extension du bonhomme (Extension).

    La 1ere table est le répertoire actuel, et la 2nd est le répertoire mis à jour mensuellement.

    J'ai fait quelques requêtes qui permettent de savoir qui a disparu, qui est nouveau, et qui a changé d'extension ou de département.

    Toutes ces requêtes aterrissent dans un formulaire par le biais de listbox.

    Pour l'instant j'essaie de me pencher sur le cas de qqn qui change d'extension. J'ai donc ma listbox qui contient les gens qui ont une nouvelle extension (genre 8844 au lieu de 9534), elle s'appelle : PhoneExtensiondiscrepancy.

    Ce que je veux faire, c'est en sélectionnant qqn dans cette liste, appuyer sur un bouton dessous, qui mettrait à jour le répertoire actuel en fonction de la valeur du répertoire mis à jour, pour la personne sélectionnée.

    Les valeurs de la listbox sont (par ordre de colonne) : ID, Name, Dept, Root, Extension.

    voila le code que j'ai associé au bouton :

    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
    Private Sub Command6_Click()
     
        Dim ctlList As Control, varItem As Variant, listvalue As Long, SQL As String
        Dim str As String
     
     
        ' Return Control object variable pointing to list box.
        Set ctlList = Me.PhoneExtensiondiscrepancy
        ' Enumerate through selected items.
        For Each varItem In ctlList.ItemsSelected
            ' stock value of bound column in listvalue.
            'listvalue = ctlList.ItemData(varItem)
            str = str & Me.PhoneExtensiondiscrepancy.ItemData(varElt)
        Next varItem
    MsgBox str
     
     SQL = "UPDATE [Phone Directory] " & _
              "SET [Phone Directory].extension = (SELECT [updated phone directory].extension FROM [updated phone directory] where [updated phone directory].ID =" & str & ")" & _
              "WHERE [Phone Directory].Name = [updated Phone Directory].Name"
     
    DoCmd.RunSQL SQL
     
     
    End Sub
    Lors de l'exécution, il me demande le nom de la personne (car je ne sais pas exactement comment le récupérer), je tape ce nom pour tester (vu que je l'ai sous les yeux), et je me retrouve avec la runtime error

    3073 : Operation must be an updateable query.
    Vu que l'aide d'access sur cette erreur est super efficace, je ne sais pas exactement ce que je dois faire :s

    Il y a peut être un moyen plus efficace et plus rapide de faire ce que je veux faire, mais je n'y connais rien en VBA :s et je dois faire une base qui sera maintenue par des gens qui y connaissent encore moins que moi

    Merci d'avance !

  2. #2
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 273
    Points : 258
    Points
    258
    Par défaut
    Dans la listbox avec la liste des extensions changees pourquoi n'affiches tu pas le nom avec (avec une jointure par exemple)? Comme ca tu le recuperes directement avec Me.Nom au lieu de le taper

    Sinon je ne sais pas trop a quoi correspond l'erreur mais je trouve quelque chose bizarre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "WHERE [Phone Directory].Name = [updated Phone Directory].Name"
    Comment peut-il savoir ou trouver le [updated Phone Directory].Name? A quel enregistrement regarder? Je pense qu'il faut ajouter comme precedemment un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE [Phone Directory].Name = (SELECT [updated phone directory].extension FROM [updated phone directory] where [updated phone directory].ID =" & str & ")
    (mets le nom entre dans une variable et utilise la meme dans les 2 SELECT comme ca tu seras sur qu'il prendra le meme enregistrement et ca evitera de faire taper 2 fois le nom)

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Salut,

    J'ai bien le nom dans la listbox, car elle est peuplée grâce à une requête SQL qui récupère l'ID, le nom, le dept (genre finance, marketing), et le code, root, extension, de chaque personne qui a qqch de changé. Le seul problème c'est que je ne sais pas comment le réucpérer.

    Pour appeler la list box je fais Me.PhoneExtensiondiscrepancy mais après je sais juste qu'il faut récupérer la valeur de la colonne du nom (soit la n°1 dans le standard access) qui correspond à la ligne sélectionnée.
    Ensuite je stocke ça dans une variable que je passe en paramêtre du Where.

    Mais le problème est que, même en entrant un nom valide à la main, je me tape la runtime error.

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai fait le code du bouton pour ajouter un membre provenant de la nouvelle liste dans l'ancienne liste, ça donne ça :

    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
     
    Private Sub AddEmployee_Click()
     
        Dim ctlList As Control, varItem As Variant, listvalue As Long, SQL As String
        Dim str As String
     
     
        ' Return Control object variable pointing to list box.
        Set ctlList = Me.NewEmployees
        ' Enumerate through selected items.
        For Each varItem In ctlList.ItemsSelected
            ' stock value of bound column in listvalue.
            'listvalue = ctlList.ItemData(varItem)
            str = str & Me.NewEmployees.ItemData(varElt)
        Next varItem
     
     SQLADD = "INSERT INTO [Phone Directory] " & _
              "SELECT * FROM [updated phone directory]" & _
              "WHERE ([updated Phone Directory].ID =" & str & ");"
     
     DoCmd.RunSQL SQLADD
     Me.Requery
     Me.Refresh
    End Sub
    ça marche dans l'idée, le seul problème c'est qu'il me rajoute les gars dans l'ordre de la liste, et pas selon qui j'ai sélectionné.

  5. #5
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    bonjour,

    j'ai une 1ère question:
    tes 2 tables ont quelle relation, c'est à dire sont elle en liaison 1-1 sur le champs ID ou sont elles reliées sur le champs Name.

    car j'ai bien peur que si elles sont reliées sur le champs "name" il y ait des problèmes car comment faire lorsque 2 personnes ont le même nom

    d'autre part ton code tu devrais le changer de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       str=""
        For Each varItem In ctlList.ItemsSelected
            ' stock value of bound column in listvalue.
            'listvalue = ctlList.ItemData(varItem)
            str = str & Me.NewEmployees.ItemData(varElt) & ", " 
        Next varItem
        str = mid(str,1, len(str)-2)
     
     SQLADD = "INSERT INTO [Phone Directory] " & _
              "SELECT * FROM [updated phone directory]" & _
              "WHERE ([updated Phone Directory].ID in (" & str & "));"
    il faut naturellement renseigner la liste des personnes séparées avec une , et utiliser la clause "in"
    bonne chance

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Les listes sont reliées en 1:1 par "Name" car chaque nom est unique, il ne peut pas y avoir 2 personnes avec le même nom.

    Pour ce qui est des listes, elles sont obtenues en uploadant des fichiers excel, donc je ne peux pas séparer les noms avec une virgule.

  7. #7
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    ton code pour l'udate doit être du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       str=""
       For Each varItem In ctlList.ItemsSelected
            ' sélection de la colonne 1 c'est a dire le nom
            str = str & ctlList.Column(1, varItem) & ", "
        Next varItem
        str = mid(str,1,len(str)-2))
    MsgBox str
     
     SQL = "UPDATE Phone Directory INNER JOIN updated phone directory ON Phone Directory.Name = updated phone directory.Name SET Phone Directory.ID = [updated phone directory.ID]
    WHERE (((Table1.Name) in " & str & "));
    DoCmd.RunSQL SQL
    voici ton code pour mettre à jour l'ID avec la jointure sur le nom. Si tu veux mettre à jour sur un autre champs tu changes ID par l'autre champs

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ok j'ai essayé comme ça

    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
     
    Private Sub Command6_Click()
     
        Dim ctlList As Control, varItem As Variant, listvalue As Long, SQL As String
        Dim str As String
     
     
     
       str = ""
        Set ctlList = Me.PhoneExtensiondiscrepancy
        For Each varItem In ctlList.ItemsSelected
            ' sélection de la colonne 1 c'est a dire le nom
            str = str & ctlList.Column(1, varItem) & ", "
        Next varItem
        str = Mid(str, 1, Len(str) - 2)
    MsgBox str
     
     SQL = "UPDATE [Phone Directory] INNER JOIN [updated phone directory] ON [Phone Directory].Name = [updated phone directory].Name" & _
        " SET [Phone Directory].Extension = [updated phone directory].Extension" & _
        " WHERE ((([updated phone directory].Name) in (" & str & ")));"
    MsgBox SQL
     
    DoCmd.RunSQL SQL
     
    End Sub
    J'arrive bien à récupérer le code mais, j'ai un missing operator dans la requête Et je ne le vois pas, je fatigue -_-

  9. #9
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    change le sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SQL = "UPDATE [Phone Directory] INNER JOIN [updated phone directory] ON [Phone Directory].Name = [updated phone directory].Name" & _
        " SET [Phone Directory].Extension = [updated phone directory].Extension" & _
        " WHERE ((([Phone Directory].Name) in (" & str & ")));"
    il faut changer la clause Where

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oki ça marche maintenant, c'était un problème de "" je l'ai refait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SQL = "UPDATE [Phone Directory] INNER JOIN [updated phone directory] ON [Phone Directory].Name = [updated phone directory].Name" & _
        " SET [Phone Directory].Extension = [updated phone directory].Extension" & _
        " WHERE ((([Phone Directory].Name) = """ & str & """));"

  11. #11
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    Attention je n'avais pas pensé au nom (perso je travaille toujours avec des chiffres)

    si tu sélectionne plusieurs nom tu auras certainement un problème donc il faut faire de la mainère suivante

    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
     
    Private Sub Command6_Click()
     
        Dim ctlList As Control, varItem As Variant, listvalue As Long, SQL As String
        Dim str As String
     
     
     
       str = ""
        Set ctlList = Me.PhoneExtensiondiscrepancy
        For Each varItem In ctlList.ItemsSelected
            ' sélection de la colonne 1 c'est a dire le nom
            str = str &  "'" & ctlList.Column(1, varItem) & "', "
        Next varItem
        str = Mid(str, 1, Len(str) - 2)
    MsgBox str
     
     SQL = "UPDATE [Phone Directory] INNER JOIN [updated phone directory] ON [Phone Directory].Name = [updated phone directory].Name" & _
        " SET [Phone Directory].Extension = [updated phone directory].Extension" & _
        " WHERE ((([Phone Directory].Name) in (" & str & ")));"
    MsgBox SQL
     
    DoCmd.RunSQL SQL
     
    End Sub

Discussions similaires

  1. [SQL-VBA] Variable en parametre de requete SQL
    Par Zawawi dans le forum VBA Access
    Réponses: 9
    Dernier message: 07/11/2007, 20h57
  2. Requete sql vers ORACLE qui renvoi une erreur
    Par lilou77 dans le forum Oracle
    Réponses: 7
    Dernier message: 29/01/2007, 09h52
  3. Parametrer une requete SQL
    Par Kurdran dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 28/12/2006, 18h53
  4. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51

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