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 :

Actualiser la base de données dans plusieurs tables


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 66
    Points
    66
    Par défaut Actualiser la base de données dans plusieurs tables
    Bonjour (encore moi )
    Dans mon application basée sur une bd Access, j'ai un datagridview rempli par une requête sql unissant plusieurs tables. Pas de problème pour l'affichage des données, là où ça se complique pour moi, c'est pour renvoyer les changements dans la base. Étant donné que plusieurs tables sont actualisées, je ne peux pas utiliser la fonction update et me demande qu'elle serait la meilleure solution (je veux dire la plus "professionnelle") pour faire ça. L'actualisation manuelle de chaque champ peut-être ?
    Un point en particulier me donne à penser*: j'ai une table vocabulaire (vocaID, allemand, francais) et une table Client (ClientID, nom) qui sont reliées par une relation n-n, j'ai donc une table voca-client (ID, VocaID, ClientID). Le problème c'est que lorsque je veux entrer un nouveau mot dans la table voca, il faut, lors de l'actualisation, que je transmette l'ID du nouveau voca dans la table de liaison pour pouvoir le relier au(x) client(s). Mais je me demande si je vais pouvoir récupérer facilement cet ID attribué par access à la nouvelle entrée.
    Est-ce que "addwithkey" peut aider ici ?
    Tout conseil est le bienvenu, je voudrais surtout être sûr de me lancer dans la méthode la plus adaptée car il y a pas mal de champs et de boulot...
    merci une fois de plus pour votre aide.

    Guillaume

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Mais je me demande si je vais pouvoir récupérer facilement cet ID attribué par access à la nouvelle entrée.
    Pour retrouver l'autoincrement de l'enregistrement ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Id = (new OleDbCommand("SELECT @@IDENTITY",MyOleDbConnection)).ExecuteScalar();
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Merci Graffito, j'en prend bonne note. Je peux pas encore tester, j'en suis encore qu'à imaginer comment je vais m'y prendre pour actualiser les différentes tables en jeu.
    Mon idée est d'avoir un form1 avec un datagridview basé sur une requête à plusieurs tables pour afficher l'ensemble des entrées voulues, et un form2 qui s'ouvrirait en cliquant sur une ligne du datagridview et qui afficherait tous les champs de l'enregistrement en question sous forme de plusieurs textbox.
    Par contre, je me demande comment retourner les valeurs entrées dans chaque textbox vers la table voulue et si il est possible sans problème de charger plusieurs tables sur un même form pour renvoyer des données vers plusieurs tables...
    Les tuto que j'ai trouvés passent toujours par un datagridview pour actualiser la base, mais il doit bien être possible d'envoyer le contenu de chaque textbox vers un champ d'une ou plusieurs tables.... Si vous connaissez des tutos ou sources à ce sujet, je suis preneur... merci

    Guillaume

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour voir dans le DGV plusieurs tables, tu mets dans le selectcommand des INNER ou OUTER JOIN des tables détails.

    Pour la table principale (comme éventuellement pour les tables détails) , tu fais des InsertCommand et des UpdateCommand normales.

    Et, si tu modifies aussi les tables détails, tu englobes l'ensemble des modifs de Form2 dans une transaction.
    Mon idée est d'avoir un form1 avec un datagridview basé sur une requête à plusieurs tables pour afficher l'ensemble des entrées voulues, et un form2 qui s'ouvrirait en cliquant sur une ligne du datagridview et qui afficherait tous les champs de l'enregistrement en question sous forme de plusieurs textbox.
    OUI, surtout n'édites pas directement dans le datagridview, c'est de grosses galères en perspective si tu veux y mettre un peu d'applicatif.
    Travaille sur la DataTable bindée au Dgv (table principale) et les autres datatables, et pour modifier les tables MyDataset.Update et pour chaque table MyDataTable.AcceptChanges.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Salut Graffito et merci.
    La solution que tu proposes a l'air d'être ce que je recherche mais voilà, j'arrive pas à la mettre en pratique

    Pour consulter et modifier, dans le form2, les données du datagridview du form1, j'ai utilisé le code suivant*:
    Pour le bouton du form1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            drv = dv(DataGridView1.CurrentRow.Index)
            Dim f2 As New Form2()
            f2.editKunde(drv)
            f2.Dispose()
        End Sub
    Dans le form2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub editKunde(ByVal drv As DataRowView)
                    TxtAS.Text = drv("EN").ToString()
                    CboKatGramAS.Text = drv("KatGramEN").ToString()
                    TxtAnmerkungAS.Text = drv("AnmerkungEN").ToString()
                    TxtAS2.Text = drv("DE").ToString()
    Etc...
    Le form2 est donc basé sur le datagridview et je ne sais pas trop comment mettre à jour dans la base de données les infos entrées dans les textbox...
    Je pensais faire une requête update, mais même ça j'y arrive pas

    Je pense qu'il faut que je fasse ce que tu dis :
    Travaille sur la DataTable bindée au Dgv (table principale) et les autres datatables, et pour modifier les tables MyDataset.Update et pour chaque table MyDataTable.AcceptChanges.
    Mais je ne sais pas comment m'y prendre...
    Si tu pouvais me donner un petit exemple, je t'en serais très reconnaissant...
    Merci !
    Guillaume

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    En fait, il faut travailler sur la datarow de la Datatable plûtot que sur la DataGridViewrow. On a donc besoin d'une correspondance entre lignes du DGV et DGV et ligne de la Datatable. Si il y a une clé primaire, pas de problème : une simple recherche séquentielle fera l'affaire. Sinon, tu peux utiliser une colonne masquée dans le DGV contenant l'index de la datarow dans la DataTable.

    Dans la procédure EditKunde, tu pourras avoir (N'étant pas VB, je te te mets les grandes lignes en C#):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DataRow MyDataRow=MaFonctionDeCorrespondanceàécrire(MyDataTable,drv) ;
    MyTextBox1.Text=MyDataRow("NomDeChamp1"] ;
    MyTextBox2.Text=MyDataRow("NomDeChamp2"] ;
    ...
    If ShowDialog()=...
    {
      MyDataRow("NomDeChamp1"]=MyTextBox1.Text ;
      MyDataRow("NomDeChamp2"]=MyTextBox2.Text;
      ...
      MyDataset.Update(...)
      MyDataTable.AcceptChanges() ;
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Merci Graffito pour ton aide et ta patience
    J'en abuse certainement mais j'ai encore un petit problème avec ce que tu appelles "la correspondance à écrire". Comment je peux établir cette correspondance ?
    Merci encore.

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Exemple (en c# toujours):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    internal DataRow MaFonctionDeCorrespondance(DatagridViewRow MyDatagridViewRow)
    {
      DataRow Result=null;
      for (int i=0;i<MyDataTable.Rows.Count;i++) 
        if (MyContactsDataTable.Rows[i]["ContactId"] ==
            MyDatagridViewRow.Cells["ContactId"].Value)
            Result=MyContactsDataTable.Rows[i] ;
      return Result ;
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Salut,

    Alors finalement, j'ai décidé de passer par le dataAdapter avec une requête UPDATE et des paramètres. Et ça y est, ça fonctionne.
    Je me garde quand même ta solution sous le coude pour quand j'en saurai un peu plus sur vb parce que pour le moment je rame un peu

    Merci en tout cas pour ton aide !

    Guillaume

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/10/2007, 14h16
  2. supprimer des données dans plusieurs tables
    Par mnssylvain dans le forum Access
    Réponses: 4
    Dernier message: 28/01/2007, 19h06
  3. Réponses: 19
    Dernier message: 28/07/2006, 10h57
  4. Réponses: 7
    Dernier message: 12/10/2004, 16h43
  5. Réponses: 6
    Dernier message: 15/04/2004, 11h04

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