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 :

commandBuilder avec jointure


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut commandBuilder avec jointure
    Bonjour
    Je suis en train de développer une application vb.net en VS2010, SGBD : SQL Server 2008.
    J'ai un plan qui se compose de plusieurs rayon et chaque rayon se compose de plusieurs articles.
    J'ai donc les tables suivantes :
    - plan (code,..)
    - rayon (id,code,#numPlan,...)
    - article (code,designation,prix,...)
    - article_rayon (id,#article,#rayon,quantite)

    j'ai chargé 3 datasets :
    - un pour la les plans
    - un pour les rayons du plan sélectionné
    - un pour les articles du rayon sélectionné

    C'est bon pour l'affichage.

    J'ai un bouton Enregistrer qui permet d'ajouter un nouveau plan avec ses rayons et les articles, modifier un plan et supprimer.

    Je peut faire ça avec la méthode classique (insert, update, delete) mais y a t-il une autre solution plus efficace par commandbuilder par exemple.

    voici le code:
    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
     
    Module MonModule
      Dim strConn As String = "Data Source=localhost; Integrated Security=SSPI; Initial Catalog=MaBase"
      Public cnx As New SqlConnection(strConn)
     
      'la fonction pour raffraichissement qui retourne un dataview
      Public Function rafraichier(ByVal requete As String) As DataView
        cnx.Open()
        Dim da = New SqlDataAdapter(requete, cnx)
        cnx.Close()
        Dim ds As New DataSet()
        ds.Clear()
        da.Fill(ds, "matable")
        Dim dv = ds.Tables("matable").DefaultView
        dv.AllowEdit = True
     
        Return dv
     
      End Function
     
    End Module
     
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'afficher la liste des plans dans un datagrid pour le test
        Dim dv As DataView = rafraichier("SELECT * FROM [plan]")
        dgvPlan.DataSource = dv
     
      End Sub
     
    'afficher la liste des rayons du plan donné dans un listbox et datagrid(pour le test)
      Private Sub txtPlan_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPlan.Validated
        lstRayon.Items.Clear()
        Dim dv As DataView = rafraichier("SELECT * FROM [Rayon] WHERE numplan='" & txtPlan.Text & "'")
        dgvRayon.DataSource = dv
        'listbox
        Dim pos As Integer
        ReDim lstRayon.Tag(dv.Count - 1)
        For cmp = 0 To dv.Count - 1
          pos = lstRayon.Items.Add(dv(cmp).Item("code") & Chr(9) & dv(cmp).Item("designation"))
          lstRayon.Tag(pos) = dv(cmp).Item("id")
        Next cmp
     
    'liste des artciles du rayon sélectionné dans la listbox
     Private Sub lstRayon_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstRayon.SelectedIndexChanged
        Dim rayon As Integer = lstRayon.Tag(lstRayon.SelectedIndex)
        Dim dv As DataView = rafraichier("SELECT Article_Rayon.ID,Article_Rayon.Repere,Article_Rayon.Rayon,Article_Rayon.Article,Article.Designation,Article.Dimension,Article.Prix,Article_Rayon.Quantite " & _
                                         "FROM [Article],[Article_Rayon] " & _
                                         "WHERE Article_Rayon.rayon=" & rayon & " AND Article_Rayon.Article=Article.Code")
        dgvArticle.DataSource = dv
      End Sub
    Merci.

  2. #2
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Salut,

    tu peux utiliser le databinding qui consiste à lier tes controles (datagrid, listbox, combobox, etc.) avec tes données. Ainsi les modifs faites seront effectives quand tu feras un MyTableAdapter.Update(MyDataSet), et rien d'autre.

    Exemple de form test avec une datagridview liée à une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class Form1
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            'TODO: cette ligne de code charge les données dans la table 'DataSet1.test'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
            Me.TestTableAdapter.Fill(Me.DataSet1.test)
     
        End Sub
     
        Private Sub ButtonSave_Click(sender As System.Object, e As System.EventArgs) Handles ButtonSave.Click
            Me.TestTableAdapter.Update(Me.DataSet1)
        End Sub
     
    End Class
    J’ai des questions à toutes vos réponses!

  3. #3
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Même principe avec une jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Me.TestTableAdapter.Fill(Me.DataSet1.test)
            Me.Test2TableAdapter.Fill(Me.DataSet1.test2)
        End Sub
     
        Private Sub ButtonSave_Click(sender As System.Object, e As System.EventArgs) Handles ButtonSave.Click
            Me.TestTableAdapter.Update(Me.DataSet1.test)
            Me.Test2TableAdapter.Update(Me.DataSet1.test2)
        End Sub
    J'ai mis en fichier joint une capture d'écran de mon formulaire (design) et du dataset utilisé.
    Images attachées Images attachées   
    J’ai des questions à toutes vos réponses!

  4. #4
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Tu t'en sors?
    Je pense que tu peux faire un maximum de chose sans passer par le code..
    Tu veux absolument passer par un CommandBuilder?
    J’ai des questions à toutes vos réponses!

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Bonjour
    Merci -N4w4k- pour ton idée
    J'ai crée un formulaire comme dans la figure ci joint.
    Mon but est de personnaliser l'affichage: afficher les rayons du plan sélectionné, les articles du rayon sélectionné, les désignations des articles dans le groupe "détails"
    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
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'ALMIADataSet.Article_Rayon' table. You can move, or remove it, as needed.
        Me.Article_RayonTableAdapter.Fill(Me.ALMIADataSet.Article_Rayon)
        'TODO: This line of code loads data into the 'ALMIADataSet.Rayon' table. You can move, or remove it, as needed.
        Me.RayonTableAdapter.Fill(Me.ALMIADataSet.Rayon)
        'TODO: This line of code loads data into the 'ALMIADataSet.Plan' table. You can move, or remove it, as needed.
        Me.PlanTableAdapter.Fill(Me.ALMIADataSet.Plan)
     
       End Sub
      Private Sub PlanBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlanBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.PlanBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.ALMIADataSet)
     
      End Sub
    Merci.
    Images attachées Images attachées  

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Rebonjour
    Bon j'ai modifié la procédure.
    J'ai chargé un dataset à partir de 3 dataadapters (pour les 3 tables : plan, rayon, article_rayon)
    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
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        cnx.ConnectionString = strConn
        cnx.Open() 'ouvrir la connexion
        'dataAdapters
        daPlan = New SqlDataAdapter("SELECT * FROM [plan]", cnx)
        daRayon = New SqlDataAdapter("SELECT * FROM [rayon]", cnx)
        daAR = New SqlDataAdapter("SELECT * FROM [Article_Rayon]", cnx)
        '''''''''
        cnx.Close() 'fermer la connexion
        'charger le dataset par les 3 dataadapters
        ds = New Data.DataSet()
        daPlan.Fill(ds, "plan")
        daRayon.Fill(ds, "rayon")
        daAR.Fill(ds, "ar")
     
        '''' pour les textboxs ''''
        bsPlan.DataSource = ds 'bsPlan: controle bindingsource
        bsPlan.DataMember = "plan"
        bnPlan.BindingSource = bsPlan 'bnPlan: controle bindingnavigator
     
        txtPlan.DataBindings.Add("Text", bsPlan, "code")
        txtClient.DataBindings.Add("Text", bsPlan, "client")
        txtLocal.DataBindings.Add("Text", bsPlan, "local")
        dtpDate.DataBindings.Add("Text", bsPlan, "DateModif")
        txtUser.DataBindings.Add("Text", bsPlan, "user")
        '''''''''''''''''''''''
        dgvRayon.DataSource = ds.Tables("rayon")
        dgvArticle.DataSource = ds.Tables("ar")
      End Sub
    c'est bon pour l'affichage, mais quand je clique sur le bouton enregistrer, les données dans les 2 tableaux s'enregistrent mais les textBox non:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Private Sub btEnreg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btEnregPlan.Click
        Dim cbPlan As New SqlCommandBuilder(daPlan)
        Dim cbRayon As New SqlCommandBuilder(daRayon)
        Dim cbAR As New SqlCommandBuilder(daAR)
        daPlan.Update(ds, "plan")
        daRayon.Update(ds, "rayon")
        daAR.Update(ds, "ar")
      End Sub
    Images attachées Images attachées  

  7. #7
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Salut,

    Tu peux le faire par le designer (cf. img en fichier joint) en assignant la bonne méthode de "mise à jour de la source de données".

    Tu dois pouvoir t'inspirer de cette démarche pour le faire par le code.

    EDIT: ça se voit pas beaucoup dans l'image mais c'est dans la propriété DataBindings qu'il faut regarder puis dans avancées.
    Images attachées Images attachées  
    J’ai des questions à toutes vos réponses!

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Bonjour,

    SVP mon but est d'avoir quelque chose comme cette figure impr ecran sachant que le tableau des détails doit comporter des autres informations comme Les désignations des articles, prix... sauvegardées dans la base de données.

    Mon problème n'est pas au niveau de l'affichage mais au niveau de la mise à jour (MAJ des plans, MAJ des rayons d'un plan donné et MAJ des articles d'un rayon donné) et quand je clique sur "Enregistrer" j'enregistre tout.
    MAJ: Ajout, suppression, modification.

    Selon vous quelle est la méthode la plus efficace ?

    Merci.

  9. #9
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Salut,

    tu veux apparemment que quand l'utilisateur change le texte dans les TextBox, ça modifie directement les valeurs du Datasource. Donc il faut que tu précise le mode de validation des DataBindings sinon les valeurs ne seront pas mises à jour.. Voici comment faire: Binding Constructor (msdn). C'est la démarche que je te proposais dans mon message précédent..
    J’ai des questions à toutes vos réponses!

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Bonjour,

    Est ce que tu peux m'expliquer en détails SVP parce que j'ai essayé plusieurs moyens mais sans solution?

    Si possible dis moi lequel je dois faire en design et lequel par code.

    Merci.

  11. #11
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textbox.DataBindings.Add("Text", bsPlan, "code", False, DataSourceUpdateMode.OnPropertyChanged)
    par le code ^^
    J’ai des questions à toutes vos réponses!

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Rebonjour,

    J'ai créé un dataset à l'aide de l'assistant et je l'ai ajouté un tableAdapter "Details" qui est une jointure entre "Article_Rayon" et "Article"
    Le problème est comment enregistrer ce tableadapter "Details" dans la base sachant que l'enregistrement des plans et leurs rayons ça marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Private Sub PlanBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlanBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.PlanBindingSource.EndEdit()
        Me.RayonBindingSource.EndEdit()
        If Me.Save Then
          MessageBox.Show("Vos plans sont enregistrés")
        End If
      End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'DsPlan.Plan' table. You can move, or remove it, as needed.
        Me.PlanTableAdapter.Fill(Me.DsPlan.Plan)
        'TODO: This line of code loads data into the 'DsPlan.Rayon' table. You can move, or remove it, as needed.
        Me.RayonTableAdapter.Fill(Me.DsPlan.Rayon)
        'TODO: This line of code loads data into the 'DsPlan.Details' table. You can move, or remove it, as needed.
        Me.DetailsTableAdapter.Fill(Me.DsPlan.Details)
     
      End Sub
    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
      Private Function Save() As Boolean
        Dim saved As Boolean = False
     
        If Me.DsPlan.HasChanges Then
     
          Try
     
            Dim planUpdates() As DataRow = Me.DsPlan.Plan.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)
            Dim rayonUpdates() As DataRow = Me.DsPlan.Rayon.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)
            'Dim detailsUpdates() As DataRow = Me.DsPlan.Details.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)
     
            Me.PlanTableAdapter.Update(planUpdates)
            Me.RayonTableAdapter.Update(rayonUpdates)
     
            Dim planDeletes() As DataRow = Me.DsPlan.Plan.Select("", "", DataViewRowState.Deleted)
            Dim rayonDeletes() As DataRow = Me.DsPlan.Rayon.Select("", "", DataViewRowState.Deleted)
     
            Me.RayonTableAdapter.Update(rayonDeletes)
            Me.PlanTableAdapter.Update(planDeletes)
     
            ''''''''''''' il me reste ici l'enregistrement des détails rayon '''''''''''''
     
     
            '''''''''''''''''''''''''''''''''''''''
     
            saved = True
     
          Catch ex As Exception
            MessageBox.Show(ex.ToString)
          End Try
     
        End If
    Images attachées Images attachées   

Discussions similaires

  1. requete avec jointure & group by
    Par de LANFRANCHI dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/07/2004, 14h31
  2. Mise à jour avec jointure
    Par taupain dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/07/2004, 11h27
  3. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  4. Script avec JOINTURE et CASE
    Par Labienus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/02/2004, 09h40
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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