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

VB 6 et antérieur Discussion :

requête sql vb


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut requête sql vb
    Bonjour, encore moi je crois que je vais prendre un abonnement si ça continue

    Non plus précisément, je n'arrive pas à trouver pourquoi la jointure de ma table n'est pas bonne du moins pourquoi elle ne retourne pas de résultat.

    Voilà, j'ai :
    -une table film (films_num, films_titre) => clef primaire films_num
    -une table emprunteur (emp_num, emp_nom, emp_prenom) => clef primaire emp_num
    -une table attribuer (att_emprunteur, att_titrefilm) => clef primaire att_emprunteur ET att_titrefilm

    Dans ma form sous vb, je voudrais rechercher les emprunteurs qui ont empruntés un ou plusieurs films (savoir si le film est déjà emprunté par qqu'un ou pas en gros). Par exemple, si martin a emprunté le film angel-a quand je fais rechercher dans ma listbox(qui contient tous les films de la bdd) le film angel-a et cliques dessus, elle doit me ressortir le nom martin.

    Pour cela, j'ai fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        sql = "SELECT FILMS_TITRE,EMP_NOM, EMP_PRENOM FROM FILMS, EMPRUNTEUR "
        sql = sql & " WHERE EMP_NUM = (SELECT ATT_EMPRUNTEUR FROM ATTRIBUER)"
        sql = sql & " AND FILMS_TITRE =(SELECT ATT_TITREFILM FROM ATTRIBUER)"
    Mais, y'a un hic. Lorsque je lance l'application, j'obtiens un message d'erreur disant ceci : Cette sous-requête peut retourner au plus un enregistrement

    j'ai essayé de changer les = par in mais rien

    J'ai donc modifié la requête en écrivant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT FILMS_TITRE, EMP_NOM, EMP_PRENOM FROM FILMS, EMPRUNTEUR INNER JOIN ATTRIBUER ON EMP_NUM = ATT_EMPRUNTEUR AND FILMS_TITRE = ATT_TITREFILM
    mais rien, le message dis que la jointure ne peut pas être supportées.

    Ensuite, j'ai fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "SELECT FILMS_TITRE, EMP_NOM FROM FILMS, EMPRUNTEUR union select ATT_EMPRUNTEUR, att_titrefilm from attribuer where att_emprunteur = emp_num and att_titrefilm = films_titre"
    mais à nouveau message erreur: Il me dis 2 paramètres attendu. Ici, je comprends car quand un film est sélectionné dans la lstbox il doit me renvoyer le nom et le prénom de l'emprunteur.

    J'ai cherché sur le site dans sql et lu les articles traitant sur les jointures mais là je sais plus laquelle utiliser. Je pensais que la première était la bonne car je l'avais utilisé sur un projet où figurait ce genre de jointure avec une table attribuer possédant également deux clefs primaires.
    Merci de prendre le tps de me répondre et de m'aider à nouveau

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    J'aurai une question sur ta table attribuer.

    attribuer.att_emprunteur donne un lien avec emprunteur.emp_num
    et
    attribuer.att_titrefilm donne un lien avec films.films_num (pas films.films_titre qui est une chaîne de caractère longue.)
    Dans ce cas le nom "attribuer.att_titrefilm" n'est pas judicieux.

    La clé primaire de ta table attribuer est constitué des clés primaires des 2 autres tables (films et emprunteur) ?
    C'est ça ?

    Ceci est important pour les performances.

    Si tes tables sont ainsi voila ce que j'aurai écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim vartitre  As String
     
      vartitre = "angel-a"
      sql = "SELECT FILMS_TITRE,EMP_NOM, EMP_PRENOM "
      sql = sql & " FROM FILMS, EMPRUNTEUR , attribuer " 'les tables concernées
      sql = sql & " WHERE films_num=att_titrefilm " ' lien entre films et attribuer
      sql = sql & " AND emp_num=att_emprunteur " ' lien entre attribuer et emprunteur
      sql = sql & " AND films_titre = '" & vartitre & "'" ' la selection de recherche
      MsgBox sql
    Doit normalement te donner le nom de "Martin" s'il l'a emprunté.

    Note : Je n'ai pas les tables pour tester.
    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    Doc.doc
    re, voilà comment est construite ma table attribuer

    Pour att_emprunteur le lien est :
    SELECT EMPRUNTEUR.Emp_Num, EMPRUNTEUR.Emp_Nom, EMPRUNTEUR.Emp_Prenom FROM EMPRUNTEUR;


    Pour att_titrefilm le lien est :

    SELECT FILMS.FILMS_TITRE FROM FILMS;

    Oui, ma table attribuer posséde les 2 clefs primaires des tables films et emprunteur.

    J'ai alors changé la construction de ma table attribuer pour att_titrefilm en mettant films.films_num à la place de films.films_titre.

    Ensuite j'ai copié, la requête dans vb et voici le message d'erreur que j'ai obtenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    incohérence de type dans une expression
    Lorsque je fais débogage je suis renvoyée sur la ligne rst_rechercheDVD.Open sql, cnx c'est-à-dire au moment au mon curseur s'ouvre pour parcourir la bdd




    Voici, le code complet de ma page :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Explicit
     
    Private Sub Cmd_annuler_click()
        'début
        Txt_NumFilm = ""
        Lst_AffichagePersonne.Clear
    End Sub
     
    Private Sub Cmd_Fermer_Click()
    Unload Me
    End Sub
     
    Private Sub Cmd_Imprimer_Click()
        'début
        Frm_RechercherDvd.PrintForm
    End Sub
     
    Private Sub Form_Load()
        'debut
        Connec
        'remplir la liste des films dans la lst_recherchefilms
        sql = "SELECT FILMS_TITRE FROM FILMS"
        rst_rechercheDVD.Open sql, cnx
        If Not rst_rechercheDVD.EOF Then
            Do
                Lst_recherchefilm.AddItem rst_rechercheDVD.Fields("FILMS_TITRE")
                rst_rechercheDVD.MoveNext
            Loop Until rst_rechercheDVD.EOF
        End If
        rst_rechercheDVD.Close
     
    End Sub
     
    Private Sub Lst_recherchefilm_Click()
     
    '    sql = "SELECT FILMS_TITRE,EMP_NOM, EMP_PRENOM FROM FILMS, EMPRUNTEUR "
    '    sql = sql & " WHERE EMP_NUM = (SELECT ATT_EMPRUNTEUR FROM ATTRIBUER)"
    '    sql = sql & " AND FILMS_TITRE =(SELECT ATT_TITREFILM FROM ATTRIBUER)"
     
    sql = "SELECT FILMS_TITRE,EMP_NOM, EMP_PRENOM "
      sql = sql & " FROM FILMS, EMPRUNTEUR , attribuer " 'les tables concernées
      sql = sql & " WHERE films_num = att_titrefilm " ' lien entre films et attribuer
      sql = sql & " AND emp_num = att_emprunteur " ' lien entre attribuer et emprunteu
     
    'Debug.Print sql ' affiche le résultat dans la fenêtre "Exécution" de l'EDI
     
        MsgBox sql ' boite de dialogue appli
     
        rst_rechercheDVD.Open sql, cnx
        If rst_rechercheDVD.Fields("FILMS_TITRE") = Lst_recherchefilm Then
        Do
            ligne = ligne + 1
            rst_rechercheDVD.MoveNext ' je passe à la ligne suivante
        Loop Until rst_rechercheDVD.EOF 'j'arrete kan il est vide
        rst_rechercheDVD.MoveFirst 'curseur doit revenir à la première ligne
        End If
        Lst_AffichagePersonne.AddItem (rst_rechercheDVD("EMP_NOM") & " " & rst_rechercheDVD("EMP_PRENOM"))
     
        rst_rechercheDVD.Close
    End Sub
    Pour la construction des tables voir fichier joint

    merci

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Je remarque l'absence du critère de recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    '...
    sql = "SELECT FILMS_TITRE,EMP_NOM, EMP_PRENOM "
      sql = sql & " FROM FILMS, EMPRUNTEUR , attribuer " 'les tables concernées
      sql = sql & " WHERE films_num = att_titrefilm " ' lien entre films et attribuer
      sql = sql & " AND emp_num = att_emprunteur " ' lien entre attribuer et emprunteu
    ' il faudrait aussi le critère de recherche
     sql = sql & " AND films_titre = '" & Lst_recherchefilm.text & "'" ' la selection de recherche
    '...
    Sous quelle base de données es-tu ?

    Mais le message laisse suggérer autre chose, sur la construction des tables.
    Afin d'être sur pour les tables
    Le nom de ta clé primaire de la table film est : (films_Num)
    Le nom de ta clé primaire de la table emprunteur est : (emp_num)
    Quel sont les noms constituant ta clé primaire de la table attribuer? (? , ?)

    Nous verrons après pour la construction de la requette.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    re, j'ai mis un dossier joint dans mon précédent qui montre le détail de mes tables.

    Pour la clef primaire de la table attribuer, il est question de la clef primaire att_emprunteur et de la clef primaire att_titrefilm

    Le critère de recherche "angel-a" emprunté par "martin" n'était qu'un exemple. C'était pour que me faire comprendre et éviter tout mal entendu.

    Ma base de donnée c'est ACCESS 07.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    J'ai pu ouvrir ton document (j'avais du faire une fausse manip avant)

    Ta table attribuer ne correspond pas à ce qui devrait être fait.

    "ATT_TITREFILM" de type "texte" ne peut pas te donner un lien avec "FILMS_NUM" qui est numérique.

    La table attribuer doit être ainsi (tu peux donner d'autres noms si tu veux)
    "ATT_CODE_EMPRUNTEUR" de type "numérique"
    "ATT_CODE_FILMS" de type "numérique"

    La clé primaire étant "ATT_CODE_EMPRUNTEUR","ATT_CODE_FILMS" .

    "ATT_CODE_EMPRUNTEUR" pouvant être lié avec "Emp_Num"
    "ATT_CODE_FILMS" pouvant être lié avec "FILMS_NUM"

    Ta requette devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sql = "SELECT FILMS_TITRE,EMP_NOM, EMP_PRENOM "
      sql = sql & " FROM FILMS, EMPRUNTEUR , attribuer " 'les tables concernées
      sql = sql & " WHERE films_num = att_code_film " ' lien entre films et attribuer
      sql = sql & " AND emp_num = att_code_emprunteur " ' lien entre attribuer et emprunteu
     sql = sql & " AND films_titre = '" & Lst_recherchefilm.text & "'" ' la selection de recherche
    A+, Hervé
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    bon j'ai refais ma table attribuer avec les bonnes valeurs.

    Mais maintenant, lorsque je lance l'appli il affiche ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOF ou EOF est égal à True ou l'enregistrement actuel a été supprimé. L'opération demandée nécessite un enregistrement actuel
    Lorsque je fais un déboggage il me renvoie sur cette ligne

    If rst_rechercheDVD.Fields("FILMS_TITRE") = Lst_recherchefilm.Text Then

    J'ai enregistré comme il a suggéré mais rien. La bdd a été enregistré et fermé.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    A mon avis, après la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        rst_rechercheDVD.Open sql, cnx
    Il faut tester si le jeu de données retourné est vide
    S'il ne l'est pas tu fait tes traitements.

    Mais il sagit d'une autre question tu devrais ouvrir un nouveau sujet (règle du forum )
    En mettant le code de ta procédure "Lst_recherchefilm_Click"
    et ta question.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    D'ailleur maintenant, la recherche d'un emprunteur d'un film est très simple.

    Grace à cette ligne de la requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    '...
    sql = sql & " AND films_titre = '" & Lst_recherchefilm.text & "'"
    Tu as le résultat directement.

    Algo:
    Si le résultat de la requette est vide
    . le film n'a pas été emprunté
    sinon
    . le résultat contient le nom de l'emprunteur

    bonne programmation.

    A+, Hervé
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  10. #10
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    Ok, merci beaucoup

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

Discussions similaires

  1. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  4. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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