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 :

Problème d'affichage - DatagridView - DataBase Access


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Administratif
    Inscrit en
    Février 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 6
    Par défaut Problème d'affichage - DatagridView - DataBase Access
    Bonjour,

    Après plusieurs recherches, je n'arrive pas à comprendre ni à trouver pourquoi l'une des colonnes de ma DataGridView provenant d'une DataBase Access s'affiche en chiffre..

    Pour faire simple : J'ai deux tables dans ma BDD access
    -Principal
    -Etat

    Dans ma table Principal, j'ai effectué une liaison sur l'une des colonnes avec la table Etat pour afficher "Nouveau", "En cours" ou "Terminé".

    Jusque là tout va bien,

    Je charge dans mon projet Visual Studio ma dataBase, les liaisons sont bien apparentes, je mets une datagridview dans mon form et je charge ma table "Principal",

    Les colonnes apparaissent, notamment ma colonne "Etat", sauf que les données insérées sont 1 - 2 - 3 et non "Nouveau", "En cours" ou "Terminé".

    Pouvez-vous me dire comment faire redescendre les données en alphabets svp ? Car je n'ai une fonction permettant de filtrer ma datagridview, mais le filtre ne fonctionne si je veux l'appliquer sur la colonne Etat..

    Je vous remercie de votre aide,

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Si ta DB est "bien conçue" (selon le mode relationnel), vraisemblablement que pour ce qui concerne Etat, la table Principal ne contient pas les libellés des états, mais bien les copies des identifiants des états DANS la table Etat. Ces copies d'identifiants sont les clés étrangères et ont pour but de trouver le libellé de l'état qui convient pour un enregistrement sans mémoriser ce libellé.
    L'intérêt est que si Principal contient 1000 enregistrements, chacun ayant une valeur d'état parmi 3 possibles, la DB ne contient que 3 fois chaque libellé, alors que si les libellés étaient mémorisés dans Principal, il y aurait là 1000 libellés, soit par exemple ±330 de chaque sorte. Quelle redondance !

    Pour que ton DataGrid présente le libellé de chaque enregistrement, il faut l'alimenter avec une requête JOINTURE sur les 2 tables. Cette requête devrait ressembler ± à ceci (attention, ceci n'est qu'une grossière approximation) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *, Principal.XID_Etat
    FROM Principal INNER JOIN Etat ON Principal.XID_Etat = Etat.ID_Etat;

    Si tu peux réaliser cette jointure sous Access, avec l'aide de l'assistant, tu trouveras la forme exacte de la jointure nécessaire.


  3. #3
    Membre du Club
    Homme Profil pro
    Administratif
    Inscrit en
    Février 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 6
    Par défaut
    Bonjour,

    Merci de cette réponse,

    Si je comprends bien, cela veut donc dire que la source de mon DataGridView doit être la requête elle-même ? Et non ma table "Principal" ?

    Je souhaite en fait effectuer cela car mon besoin primaire est de pouvoir faire un filtre sur la colonne Etat pour pouvoir trier les lignes contenants "En cours" etc...

    Pour les colonnes qui appartiennent directement à la table "Principal" le code ci-dessous fonctionne bien :

    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
    61
    62
    63
    64
    65
     Private Sub Button_filtre_Click(sender As Object, e As EventArgs) Handles Button_filtre.Click
            On Error GoTo SearchErr
            Dim cantFind As String = TextBox_filtre.Text
     
     
     
            If TextBox_filtre.Text = "" AndAlso ComboBox1.Text = "" Then
                MsgBox("Aucune données à rechercher.", MsgBoxStyle.Information, "Données manquantes")
                Exit Sub
            ElseIf TextBox_filtre.Text = "" Then
                MsgBox("Vous devez indiquer une valeur à trouver.", MsgBoxStyle.Information, "Données manquantes")
                Exit Sub
            ElseIf ComboBox1.Text = "" Then
                MsgBox("Vous devez indiquer une colone à filter.", MsgBoxStyle.Information, "Données manquantes")
                Exit Sub
     
            Else
     
     
     
                Me.DgvFill()
                If ComboBox1.Text = "N° Classe" Then
                    PrincipalBindingSource1.Filter = "(Identification LIKE '" & TextBox_filtre.Text & "') "
                ElseIf ComboBox1.Text = "Filiale" Then
                    PrincipalBindingSource1.Filter = "(Filiale LIKE '" & TextBox_filtre.Text & "') "
                ElseIf ComboBox1.Text = "Formation" Then
                    PrincipalBindingSource1.Filter = "(Formation LIKE '" & TextBox_filtre.Text & "') "
                ElseIf ComboBox1.Text = "Dates" Then
                    PrincipalBindingSource1.Filter = "(Dates_de_formation LIKE '" & TextBox_filtre.Text & "') "
                ElseIf ComboBox1.Text = "N° Factures" Then
                    PrincipalBindingSource1.Filter = "(Numéro_de_facture LIKE '" & TextBox_filtre.Text & "') "
                ElseIf ComboBox1.Text = "N° OPCO" Then
                    PrincipalBindingSource1.Filter = "(Numéro_OPCO LIKE '" & TextBox_filtre.Text & "') "
                End If
     
            End If
     
            If PrincipalBindingSource1.Count <> 0 Then
                With DataGridView1
                    .DataSource = PrincipalBindingSource1
                End With
     
            Else
                Me.Notfound()
     
                MsgBox("->" & " " & cantFind & vbNewLine &
                           "Donnée non trouvé", MsgBoxStyle.Information, "Recherche échouée")
     
                PrincipalBindingSource1.Filter = Nothing
                With DataGridView1
                    .ClearSelection()
                    .DataSource = PrincipalBindingSource1
                End With
     
            End If
     
    ErrExit:
            Exit Sub
     
    SearchErr:
            MsgBox("Erreur Number" & Err.Number & vbNewLine & "Error Description" & Err.Description, MsgBoxStyle.Critical, "Reset error")
            Resume ErrExit
     
     
        End Sub
    En revanche quand j'avais - dans la même logique - aussi indiqué le filtre sur la colonne état, cela me mettait un message d'erreur, (même en essayant de filtrer avec les numéros ID (1, 2 ,3)

    Peut-être avez-vous une solution de votre côté ?

  4. #4
    Membre du Club
    Homme Profil pro
    Administratif
    Inscrit en
    Février 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 6
    Par défaut
    J'ai trouvé ceci pour la requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Principal.Etat
    FROM Etat INNER JOIN Principal ON Etat.ID_ETAT = Principal.Etat


    Comment dois-je l'activer sur mon datagridview?

  5. #5
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Voici un projet de test (TestAccesDBSimpleConJOIN.zip) dans lequel une jointure est réalisée sur 2 tables et les informations montrées dans divers composants, dont un DataGridView.
    Le projet a été réalisé en espagnol mais comporte peu de libellés, par ailleurs pas trop difficiles à traduire. Pour ce qui est des quelques commentaires du code, Google Translator les traduira s’il le faut.

    La base de données est nommée Farmacia_Phil.accdb et contient 2 tables : la table des utilisateurs (Usarios) et la table des niveaux d’accès des utilisateurs (Usarios_Nivel).
    Dans Usarios, un champ Nivel_Seguro (Niveau de sécurité) contient la copie de l’identifiant du libellé de niveau d’accès de cet utilisateur. Dans Usarios_Nivel, il y a l’Id et le libellé de chaque niveau possible.

    L’illustration ci-dessous montre le contenu de chaque table dans Access et la requête jointure obtenue avec l’assistant requêtes d’Access, ainsi que le résultat de l’exécution de cette requête.

    La requête en question est transposée dans VB sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           Consulta = "SELECT ID_Usuario, Nombre_Usuario, Usuario, Nivel_Usuario " & _
                       "FROM Usuarios INNER JOIN Usuarios_Nivel ON Usuarios.Nivel_Seguro = Usuarios_Nivel.ID_Nivel"
    Elle est ensuite exécutée et son résultat est affecté aux divers composants, dont le DGV.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          Dim MiAdapter As New OleDbDataAdapter(Consulta, MiConexion)
            MiAdapter.Fill(UnaTabla)
            UnaTabla.TableName = "TMisUsarios"
            MiDatos.Tables.Add(UnaTabla)
            DGVTest.DataSource = UnaTabla
     
            MiAdapter.Dispose()
     
            'DGVTest es un DataGridView
     
            DGVTest.DataSource = UnaTabla  ' Para ejemplo, todos campos

    Comme le montre la vidéo https://www.dropbox.com/s/p6lnkb1wxj...nture.mp4?dl=0, il suffit de cliquer le bouton Cargar (Charger) pour voir toutes les données se mettre en place, avec les niveaux correctement affichés dans le DGV ainsi que dans le TextBox.

    Je te propose d’effectuer les tests nécessaires sur ce projet, là je pourrai éventuellement intervenir aussi.

    Pour ce qui est de la requête que tu postes, elle est plausible. Il te faut l'essayer sous Access pour être sûr de sa qualité. Pour ce qui est de son affectation au DGV, vois dans le projet que je t'envoie : DGVTest.DataSource = UnaTabla, la DataTable UnaTabla est crée par l'exécution de la requête.



    Nom : Jointure.jpg
Affichages : 361
Taille : 116,3 Ko

  6. #6
    Membre du Club
    Homme Profil pro
    Administratif
    Inscrit en
    Février 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 6
    Par défaut
    Un grand merci, je suis arrivé grâce à l'exemple à afficher dans mon DataGridView les données que je cherchais !

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Merci pour le feedback.
    Bonne journée,

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

Discussions similaires

  1. [ODBC] PDO_ODBC Access : problème d'affichage de champs
    Par koa dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/05/2007, 12h32
  2. petit problème d'affichage sur un datagridview
    Par boss_gama dans le forum C#
    Réponses: 5
    Dernier message: 01/05/2007, 21h42
  3. Problème d'affichage dans un formulaire Access
    Par JohnDoeVS dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/03/2007, 06h57
  4. Problème d'affichage de date sous access 2003
    Par FuNkY48 dans le forum Access
    Réponses: 7
    Dernier message: 11/12/2006, 14h04
  5. Réponses: 3
    Dernier message: 11/09/2006, 14h25

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