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 :

UPDATE à partir d'un DatagridView alimenté par une requête OUTER JOIN paramétrée


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut UPDATE à partir d'un DatagridView alimenté par une requête OUTER JOIN paramétrée
    Bonjour,

    Je débute dans l'apprentissage de vb.net et je tourne en rond pour la mise à jour de mon DGV vers la base de donnée (Access). Je développe sur VS2012.

    Mon DGV est alimenté par une requête paramétrée avec un OUTER JOIN après sélection d'une valeur dans le form.

    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
     
    Private Sub T_HUIBindingSource_PositionChanged(sender As Object, e As EventArgs) Handles T_HUIBindingSource.PositionChanged, T_HUIBindingSource.BindingComplete
            Dim objDataview As New DataView
            Dim strCon As String
            Dim objCon As OleDb.OleDbConnection
            Dim objCommand As OleDb.OleDbCommand
            Dim objParameter As OleDb.OleDbParameter
            Dim objAdapter As OleDb.OleDbDataAdapter
            Dim objDataset As DataSet
            Dim strSQL As String
     
            strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= C:\Users\Utilisateur1\Documents\Visual Studio 2012\Projects\Project01\Base022.accdb"
            objCon = New OleDb.OleDbConnection(strCon)
     
            If IsDBNull(NHUI) Or NHUI.Text = "" Then
                Exit Sub
                strSQL = "SELECT C_HCT_NHCT, C_HCT_NHUI, C_HCT_NCRT, C_HCT_CRT FROM T_HCT WHERE C_HCT_NHUI = 1"
                objCommand = New OleDb.OleDbCommand(strSQL)
            Else
                strSQL = "SELECT * FROM T_CRT t1 LEFT OUTER JOIN (SELECT * FROM T_HCT WHERE C_HCT_NHUI = @NHUI) t2 ON t1.C_CRT_NCRT=t2.C_HCT_NCRT"
                objCommand = New OleDb.OleDbCommand(strSQL)
                objParameter = New OleDb.OleDbParameter
                objParameter.ParameterName = "@NHUI"
                objParameter.Value = NHUI.Text
                objCommand.Parameters.Add(objParameter)
            End If
     
            objCommand.Connection = objCon
            objAdapter = New OleDb.OleDbDataAdapter(objCommand)
            objDataset = New DataSet
            objAdapter.Fill(objDataset)
            T_HCTDataGridView.DataSource = objDataset
            T_HCTDataGridView.DataMember = objDataset.Tables(0).TableName
     
        End Sub
    La visualisation fonctionne tant bien que mal mais je n'arrive pas à gérer l'enregistrement des modifications dans la BdD.( UPDATE, INSERT et DELETE)
    J'ai bien compris que le DataAdapter n'impliquait qu'une DataTable à la fois.
    Je suis prêt à "creuser" de mon côté pour trouver mais pourriez-vous m'orienter pour mes recherches.
    Je ne sais pas si il faut modifier (et si oui comment ?) les requêtes de mises à jour du DataAdapter ou faut-il traiter le problème autrement ?

    Ce cas de figure est relativement courant (Un DataGridView alimenté par une requête avec plusieurs tables) et je suis coincé pour poursuivre mon apprentissage.

    Merci d'avance pour vos coups de pouce.
    Cordialement,

  2. #2
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bon, je vais essayer d'être, peut-être, un peu plus précis :
    J'ai une table T_CRT (Identifiant C_CRT_NCRT) qui regroupe un ensemble de "caractéristique" décrit dans C_CRT_CRTF :
    Caract 1
    Caract 2
    ...
    Caract 7

    J'ai une autre table T_HUI (identifiant C_HUI_NHUI) qui regroupe un ensemble d'objets (C_HUI_HUIF) :
    Objet 1
    ...
    Objet n

    Chaque "objet" doit être décrit par une valeur correspondant de T_CRT.
    Pour ce faire j'ai créé une autre table T_HCT composée de :

    C_HCT_NHCT (Id la clé)
    C_HCT_NHUI (clé étrangère vers T_HUI)
    C_HCT_NCRT(clé étrangère vers T_CRT)
    C_HCT_CRT (valeur de i° caractéristique-C_HCT_NCRT pour le j° objet -C_HCT_NHUI)

    Pour l'objet 1 je dois pouvoir définir les 7 caractéristiques. Afin de proposer un interface agréable, je souhaite que le DGV affiche dans la 1° colonne le libellé de toutes les caractéristiques (C_CRT_CRTF) et dans la colonne adjacente la valeur de cette caractéristique pour l'objet(C_HCT_CRT) sélectionné.

    Est-ce clair ??
    C'est pour cette raison que j'utilise une requête JOIN et que je souhaite mettre à jour la table qui est du côté de la jointure.
    à chaque changement de sélection C_HUI_NHUI je modifie le datasource du DGV :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     strSQL = "SELECT * FROM T_CRT t1 LEFT OUTER JOIN (SELECT * FROM T_HCT WHERE C_HCT_NHUI = @NHUI) t2 ON t1.C_CRT_NCRT=t2.C_HCT_NCRT"
    ...
    Je me suis rendu aperçu que lorsque je renseigne une zone C_HCT_CRT qui était au préalable nulle ( il n'y avait donc pas d'enregistrement de T_HCT qui correspond aux clés C_HUI_NHUI et C_CT_NCRT) l'identifiant de T_HCT (C_HCT_NHCT) n'est pas renseigné dans le DGV. J'en conclu qu'aucun enregistrement n'a été ajouté dans la DataTable T_HCT. Est-ce là le problème ???

    ... Ou peut-être que je ne prends pas le problème par le bon bout ...?

    Merci pour vos idées

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    ta question semble trop complexe pour des objets en général utilisé par des débutants
    avec des dataadapter il faut faire des choses simples

    enfin je me moque mais je ne connais pas trop le dataadapter donc je ne peux pas trop t'aider de ce côté là

    par contre ta requete ca devrait plutot être ca :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
      FROM T_CRT t1 
          LEFT OUTER JOIN T_HCT t2 ON t1.C_CRT_NCRT=t2.C_HCT_NCRT
      WHERE t2.C_HCT_NHUI = @NHUI OR t2.C_HCT_NHUI IS NULL
    il faut éviter les sous requetes autant que possible
    avec un peu de chance le dataadapter arrivera à retrouver les tables à manipuler ...
    sinon ca sera requetes à la main

  4. #4
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Merci Pol63 de t'intéresser à mon problème.

    J'ai déjà simplifié ma requête c'est un bon début.
    Après mes nombreuses recherches je me doutais que DataAdapter n'était pas trop "adapté" pour traiter ce genre de travail !
    Si on oublie le DataAdapter quelle sont les pistes que je dois explorer pour avancer ? (J'espère qu'elles seront accessibles pour un grand débutant ...)

    Merci d'avance

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    s'occuper des requêtes soit même je pense
    peut être qu'il faut alors un modèle objet correspondant à la base ...

  6. #6
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Que puis-je faire de mieux au niveau de la requête ??
    Qu'entends-tu par
    un modèle objet correspondant à la base ...

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    ce que je veux dire c'est que si en cas de modification dans la datagrid (non lié directement donc) c'est toi qui génère la requete d'update ou d'insert tu pourras faire ce que tu veux

    après pour le modèle objet, certains développeurs font en général des classes identiques à la structure de la base de données, leur permettant de faire des générateurs de requetes plutot que taper toutes les requetes à la main
    enfin ca c'était avant l'arrivée d'entity framework, si tu as une version payante de vs tu peux tester ca

  8. #8
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Je vais essayer de découvrir tout progressivement. En attendant que je m'attaques à entity framework, comment faut-il gérer ces requêtes UPDATE et INSERT pour obtenir le résultat attendu ? Dans quel évènement faut-il que je travaille ? Désolé d'être insistant mais vb.net est nouveau pour moi et j'ai besoin d'un coup de main.

    Merci d'avance.

  9. #9
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bonsoir,

    Quelqu'un aurait-il quelques bons tutos ou articles que je pourrais étudier pour résoudre mon problème ?

    Merci d'avance pour un pôvre débutant en vb.net !

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    normalement y ca : http://plasserre.developpez.com/cours/vb-net/
    mais je ne sais pas si tu y trouveras ton bonheur

    désolé de ne pouvoir aider plus ...

Discussions similaires

  1. [AC-2010] Etat alimenté par une requête paramétrée (paramètre issu d'un formulaire)
    Par metalleuse dans le forum VBA Access
    Réponses: 6
    Dernier message: 12/06/2015, 16h05
  2. [AC-2007] Utilisation d'un sous-formulaire alimenté par une requête
    Par BR4562 dans le forum Access
    Réponses: 13
    Dernier message: 13/03/2014, 19h20
  3. Réponses: 5
    Dernier message: 19/06/2013, 14h05
  4. [WD17] Planning Alimenté par une Requête
    Par b_reda31 dans le forum WinDev
    Réponses: 7
    Dernier message: 29/10/2012, 10h22
  5. [AC-2007] Ajout élément Liste déroulante alimenter par une requête
    Par morinxav dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/04/2012, 11h35

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