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.NET Discussion :

VB 2008 probleme enregistrement BDD bizarre


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut VB 2008 probleme enregistrement BDD bizarre
    Bonsoir,

    Le titre est peut être peu explicite pour vous mais je ne savais pas quoi mettre ... alors je vous explique mon problème, je suis sous visual studio 8 et pour mon application pour des chasseurs, j'ai un soucis au nouveau pour faire des statistique, j'ai une base de données sous access,

    Mon soucis alors j'ai du faire un sum pour savoir le nombre de gibié tué
    en une année, je peux enregistrer le résultat donné donc j'ai rajouté à ma base une nouvelle table statistique qui comporte les champs idstatistique,score,gibier_stat,nom_stat, prenom_stat donc l'enregistrement s'effectue bien. Je veux faire apparaître le résultat dans une datagridview.

    Et à l'affichage de ma DGV au lieu de me mettre la valeur texte du prénom,nom & le nom du gibier il affiche la valeur numérique. Et aussi ( mon programme permet aux chasseurs d'enregistrer chaque journée) admettons que Monsieur a effectué 3 journées de chasse à intervalle différents mais à tué X gibiers ... donc le sum se comporte bien mais dans ma DGV il m'affiche 3 fois le même résultat, 3 fois la même lignes

    Mon code pour afficher la DGV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'REMPLIR DGV
            Dim afficherScore As String = "Select score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat from chasseur,tuer,type_gibier,Statistique WHERE chasseur.idchasseur = tuer.idchasseur AND tuer.idtype_gibier = type_gibier.idtype_gibier AND Statistique.idtype_gibier = type_gibier.idtype_gibier"
            Dim da As New OleDb.OleDbDataAdapter(afficherScore, cnx)
            Dim ds As New DataSet
    
            cnx.Open()
            da.Fill(ds, "Statistique")
            cnx.Close()
            DGV_Statistique.DataSource = ds.Tables("Statistique")
            DGV_Statistique.CurrentCell = Nothing 'enleve le fait que la dgv est la premiere de selectionné automatiquement
    Merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    je pense qu'il n'y a rien de bizarre et que ta requete fait ce qu'elle doit faire, même si ce n'est pas ce que tu veux

    ta requête fait des jointures entre des tables (dont on a pas la description complète ...)
    WHERE chasseur.idchasseur = tuer.idchasseur
    si le chasseur x est une fois dans la table chasseur mais 2 fois dans la table tuer, il est normal que la requête retourne 2 lignes
    et c'est pareil pour toutes les jointures

    il te manque au minimum un group by (et tant qu'à faire une écriture plus professionnelle et plus lisible avec des JOIN (inner, left ou autre) plutot que from t1,t2 where condition de jointure)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    C'est comme sa pour les INNER JOIN, ON parce que je ne les ai jamais utilisé donc j’espère pas mettre trompé ... Sa fait bizarre d'avoir idchasseur = idchasseur, non ? ?

    Je vous ai envoyé en PJ mes relations


    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
     
    'REMPLIR DGV
            Dim afficherScore As String = "
            SELECT score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat FROM chasseur
            INNER JOIN tuer
            ON  idchasseur = idchasseur 
            INNER JOIN type_gibier
            ON idtype_gibier = idtype_gibier
            INNER JOIN Statistique
            ON idtype_gibier =  idtype_gibier
     
            Dim da As New OleDb.OleDbDataAdapter(afficherScore, cnx)
            Dim ds As New DataSet
     
            cnx.Open()
            da.Fill(ds, "Statistique")
            cnx.Close()
            DGV_Statistique.DataSource = ds.Tables("Statistique")
            DGV_Statistique.CurrentCell = Nothing 'enleve le fait que la dgv est la premiere de selectionné automatiquement
    Images attachées Images attachées  

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    non il faut préciser les tables comme tu le faisais initialiement, access ne peut pas deviner tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat
        FROM chasseur
            INNER JOIN tuer           ON  chasseur.idchasseur = tuer.idchasseur 
            (...)
    et essaye un group by chasseur.idchasseur (, autres champs si nécessaire)
    les champs non group byés devront alors être agrégés (SUM, MIN, MAX, AVG ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    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
     'REMPLIR DGV
            Dim afficherScore As String = "Select score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat" & _
            " FROM chasseur" & _
            " INNER JOIN tuer ON chasseur.idchasseur = tuer.idchasseur " & _
            " INNER JOIN type_gibier ON tuer.idtype_gibier = type_gibier.idtype_gibier " & _
            " INNER JOIN Statistique ON Statistique.idtype_gibier = type_gibier.idtype_gibier "
     
            Dim da As New OleDb.OleDbDataAdapter(afficherScore, cnx)
            Dim ds As New DataSet
     
            cnx.Open()
            da.Fill(ds, "Statistique")
            cnx.Close()
            DGV_Statistique.DataSource = ds.Tables("Statistique")
            DGV_Statistique.CurrentCell = Nothing 'enleve le fait que la dgv est la premiere de selectionné automatiquement
    comme ceci c'est bien mieux, il y a une erreur de syntaxe

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    Citation Envoyé par gauth62 Voir le message
    comme ceci c'est bien mieux, il y a une erreur de syntaxe
    tu n'as pas jugé utile de préciser le message d'erreur ?

    enfin c'est surement access qui n'arrive pas à la lire norme sql qui date pourtant des années 90 ...
    je pense qu'il veut des parenthèses autour des jointures mais c'est pas clair l'imbrication
    donc soit tu remets tes where, soit tu passes sur une vraie base de données
    parce que la syntaxe des jointures d'access est aussi illisible que les where
    voici l'exemple fournit par microsoft :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FROM Employees 
      INNER JOIN 
        ( Orders 
            INNER JOIN [Order Details] ON [Order Details].OrderID = Orders.OrderID ) 
               ON Orders.EmployeeID = Employees.EmployeeID
    (et désolé pour la perte de temps éventuelle si tu reviens aux where)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Erreur de syntaxe (opérateur absent) dans l'expression « chasseur.idchasseur = tuer.idchasseur INNER JOIN type_gibier ON tuer.idtype_gibier = type_gibier.idtype_gibier INNER JOIN Statistique ON Statistique.idtype_gibier = type_gibier.idtype_gibie »
    c'est l'erreur

    J'ai mis des parenthésés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Select score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat" & _
            " FROM chasseur" & _
            " INNER JOIN (tuer ON chasseur.idchasseur = tuer.idchasseur) " & _
            " INNER JOIN (type_gibier ON tuer.idtype_gibier = type_gibier.idtype_gibier) " & _
            " INNER JOIN (Statistique ON Statistique.idtype_gibier = type_gibier.idtype_gibier) "
    voici la nouvelle erreur :
    Erreur de syntaxe dans l'opération JOIN.
    Et tu appelles quoi une vraie base de données ??

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    les parenthèses ne sont pas autour de chaque inner join, mais imbriquées, relis l'exemple que j'ai mis


    et une vraie base de données, c'est une base de données qui respecte la norme SQL, qui est robuste, pratique etc...
    access a du faire des progrès depuis le temps, mais il y a quelques années, une coupure de courant pouvait vautrer la base, il fallait sans cesse compacter la base etc...

    si tu n'as qu'un seul poste qui utilise la base de données, tu peux rester sur un base de données fichier (sql server compact edition, sqllite ...)
    si tu as plusieurs postes qui se connectent sur la base il faut une base de données réseau (sql server express)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Justement je ne comprends pas bien avec l'exemple ... je ne vois ou ce fait l'imbrication

    Oui je n'ai qu'un PC mais j'ai toujours fait sous Access jamais les autres

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM Chasseur
      INNER JOIN (tuer INNER JOIN (...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "Select score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat" & _
            " FROM chasseur" & _
            " INNER JOIN (tuer ON (chasseur.idchasseur = tuer.idchasseur)) " & _
            " INNER JOIN (type_gibier ON (tuer.idtype_gibier = type_gibier.idtype_gibier)) " & _
            " INNER JOIN (Statistique ON (Statistique.idtype_gibier = type_gibier.idtype_gibier)) "
    comme sa ? car cela me donne encore une erreur :Erreur de syntaxe dans l'opération JOIN.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    J'ai réussi à faire afficher avec l'aide d'access je dois dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "Select score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat" & _
            " FROM (type_gibier INNER JOIN Statistique ON type_gibier.[idtype_gibier] = Statistique.[idtype_gibier]) INNER JOIN (chasseur INNER JOIN tuer ON chasseur.[idchasseur] = tuer.[idchasseur]) ON type_gibier.[idtype_gibier] = tuer.[idtype_gibier]"
    Mais toujours probleme sur le fait qu'il enregistre 3 fois la même chose et qu'au lieu de mettre le nom des personnes il donne l'id

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    group by
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Ce que j'ai fait, en essayant plusieurs tables différents mais à chaque fois reviens cette erreur :
    Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée « score » comme une partie de la fonction d'agrégat.
    A vrai dire je n'y comprends pas grand chose à cette erreur

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat" & _
            " FROM (type_gibier INNER JOIN Statistique ON type_gibier.[idtype_gibier] = Statistique.[idtype_gibier]) INNER JOIN (chasseur INNER JOIN tuer ON chasseur.[idchasseur] = tuer.[idchasseur]) ON type_gibier.[idtype_gibier] = tuer.[idtype_gibier] GROUP BY score,Statistique.idtype_gibier,nom_stat,prenom_stat,annee_stat"
    Alors c'est bon je n'ai plus de problème au niveau de l'enregistrement plus qu'au niveau de l'affichage

    ??

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    Il faut que tu fasses ton group by sur l'id du chasseur de ta PREMIERE table, sinon tu auras obligatoirement des doublons (Cf le 1er post de Pol63)

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Oui Oui c'est bon le group By fonctionne impec, comme je n'ai qu'un enrengistrement possible qui s'affiche

    Il me reste juste le soucis qu'il l'id des champs et non leur valeur

  18. #18
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Points : 478
    Points
    478
    Par défaut
    Lorsque tu fais un select sur un champ il t'es renvoyé ce qu'il y a dedans, si tu reçois un integer c'est que tu as un integer dans le champ appelé. Dans ce cas là il faut que tu rajoutes dans tes jointures la table qui a les noms des chasseurs (jointure sur les idChasseur).

    EDIT: Au temps pour moi, je viens de relire ta requête et tu prends bien les noms. C'est dans ce champ nom que tu as un Integer?

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Oui je sais sa fonctionne sa en rajoutant la table chasseur et les 2 champs non prénom j'ai déjà essayé mais je voulais essayé comme sa voir si sa marché mais apparemment on ne peut pas

    Oui moi je veut reprendre les champs de la table statistique ... le nom et prénom s'introduisent dans la BDD à l'aide 2 combobox,

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 35
    Points : 2
    Points
    2
    Par défaut
    Autant pour moi je n'ai pas répondu à ta question

    Voila comment j'ai fais pour mes combobox

    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Dim afficherNom As String = "Select nom ,idchasseur from chasseur"
            Dim daN As New OleDb.OleDbDataAdapter(afficherNom, cnx)
            Dim dsN As New DataSet
     
            cnx.Open()
            daN.Fill(dsN, "chasseur")
            cnx.Close()
     
            cb_nom_stat.DataSource = dsN.Tables("chasseur")
            cb_nom_stat.DisplayMember = "nom"
            cb_nom_stat.ValueMember = "idchasseur"
    et pour le prénom c'est sensiblement pareil

    Donc sa enregistre et sa renvoi l'id de la table chasseur .

    Donc je dois rajouter a mon select le nom & prenom

    ?? peut pas faire comme je voulais ?

Discussions similaires

  1. probleme enregistrement fichier en C, bug Bizarre
    Par hl037 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2011, 02h55
  2. [MySQL] probleme enregistrement dans la bdd
    Par nusdo dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 23/01/2010, 16h23
  3. [access2003] Probleme ouverture BDD access 2000
    Par sandrine dans le forum Access
    Réponses: 1
    Dernier message: 18/11/2005, 20h24
  4. Problème BDD bizarre
    Par helter_skelter dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 25/07/2005, 18h04

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