1. #1
    Membre éclairé Avatar de star
    Profil pro
    Subdivision commerciale
    Inscrit en
    février 2004
    Messages
    630
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Subdivision commerciale

    Informations forums :
    Inscription : février 2004
    Messages : 630
    Points : 778
    Points
    778

    Par défaut WPF - ADO.NET : Effacement des commandes à la consolidation :7

    VS2015 - WPF - ADO.NET - ACCESS

    Je fais face à un comportement anormal lorsque j'enregistre des commandes d'un client dans une relation Maître/Détail au travers de deux DataGrid.

    Lorsque je saisis un client sur la dernière ligne vide du contrôle DataGrid Maître, ensuite je saisis une commande de ce client dans le DataGrid Détail sur la dernière ligne de ce contrôle, et que je clique sur le bouton d'enregistrement, pendant la phase de consolidation dans la source de données, l'application efface le contenu du contrôle détail alors que la vue de la table des commandes a bien pris en compte la commande que je viens d'enregistrer.
    Si je relance l'application et que je me positionne sur le client que je viens de rentrer, la commande apparaît bien dans le DataGrid des commandes.

    J'ai tracé le parcours en phase de consolidation et m'aperçois que l'anomalie est liée à la fonctionnalité de mise à jour des clés étrangères des enregistrements du DataTable Commandes lorsque la numérotation automatique du client est effectuée dans l'évènement RowUpdated du Datable Clients. La propriété de la relation est Update Cascade.

    Avant lancement de la consolidation
    Nom : Capture Avant.PNG
Affichages : 44
Taille : 18,1 Ko

    Pendant
    Nom : Capture Pendant.PNG
Affichages : 36
Taille : 31,2 Ko

    Après consolidation
    Nom : Capture Apres.PNG
Affichages : 35
Taille : 18,1 Ko

    Je ne sais vraiment pas comment régler ce problème et cela fait quelques jours que je cherche désespérément. Je suis tombé sur des liens sur internet qui en parlent mais sans solution :
    https://stackoverflow.com/questions/...-from-datagrid
    https://connect.microsoft.com/Visual...-binding-issue

    Chose encore plus bizarre, lorsque je saisis un nouveau client et que je l'enregistre d'abord dans un premier temps, puis ensuite je saisis une commande, la colonne de clé étrangère de l'enregistrement Commande est initialisée de manière erronée avec une numérotation auto incrémentée, alors qu'elle devrait reprendre la valeur de la clé primaire de l'enregistrement Client. Mais bon, cela est un autre problème mais qui pourrait être cependant lié au premier.

    Aussi, je me permets de vous indiquer un lien de téléchargement de mon projet WPF pour éventuellement que vous puissiez reproduire le comportement et éventuellement m'aidez à résoudre ce problème qui est très bloquant pour moi et le projet sur lequel je travaille.

    https://drive.google.com/file/d/0B64...ew?usp=sharing

    Merci d'avance de votre aide
    .
    together we stand, divided we fall
    .

  2. #2
    Membre éclairé Avatar de star
    Profil pro
    Subdivision commerciale
    Inscrit en
    février 2004
    Messages
    630
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Subdivision commerciale

    Informations forums :
    Inscription : février 2004
    Messages : 630
    Points : 778
    Points
    778

    Par défaut

    Bonjour,
    Je souhaiterais corriger un point de mon post concernant la numérotation automatique du client qui est plutôt effectuée dans l'évènement RowUpdated du TableAdapter du DataTable Clients. La relation entre deux tables Clients et Commandes inclue la contrainte de clé étrangère et prévoie les règles Update Cascade, Delete Cascade et Accept/Reject None.

    le code de la méthode RowUpdated est :

    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
     
            private void dataadapterClients_RowUpdated(object sender, OdbcRowUpdatedEventArgs args)
            {
                if (args.RecordsAffected > 0)
                {
                    if (args.StatementType == StatementType.Insert)
                    {
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Attibue un numero d'ordre au client nouvellement cree");
     
                        OdbcCommand cmdIdentity = new OdbcCommand("SELECT @@IDENTITY", args.Command.Connection);
                        cmdIdentity.Transaction = Transaction;
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Avant numerotation automatique du client");
                        int id = (int)(cmdIdentity.ExecuteScalar());
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Client_ID : " + id);
                        args.Row.Table.Columns["Client_ID"].ReadOnly = false;
                        args.Row.Table.DataSet.Tables["Commandes"].Columns["Client_ID"].ReadOnly = false;
                        MessageBox.Show("Stop ??????????????????");
                        args.Row["Client_ID"] = id;
                        args.Row.Table.Columns["Client_ID"].ReadOnly = true;
                        args.Row.Table.DataSet.Tables["Commandes"].Columns["Client_ID"].ReadOnly = true;
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Apres numerotation automatique du client");
                    }
                    if (args.StatementType == StatementType.Insert || args.StatementType == StatementType.Update)
                    {
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Recuperation de l'horodatage de la ligne client. Type d'ordre : " + args.StatementType);
     
                        int intCriteria = 0;
                        if (args.StatementType == StatementType.Insert)
                            intCriteria = (int)args.Row["Client_ID"];
                        else
                            intCriteria = (int)args.Row["Client_ID", DataRowVersion.Original];
                        OdbcCommand cmdStamp = new OdbcCommand("SELECT Stamp FROM Clients WHERE Client_ID = " + intCriteria, args.Command.Connection);
                        cmdStamp.Transaction = Transaction;
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Avant ExecuteScalar");
                        DateTime dteStamp = (DateTime)(cmdStamp.ExecuteScalar()); // DateTime.Now
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Horodatage : " + dteStamp);
                        args.Row.Table.Columns["Stamp"].ReadOnly = false;
                        args.Row["Stamp"] = dteStamp;
                        args.Row.Table.Columns["Stamp"].ReadOnly = true; // true
                    }
                }
                else
                {
                    // args.Row.RowError = "Conflit d'acces concurrentiel optimiste rencontre"; // Concurrency Violation Encountered
                    // args.Status = UpdateStatus.SkipCurrentRow;
                }
            }
    J'ai donc une forte présomption que l'anomalie proviendrait de l'instruction située juste après le MessageBox.Show() qui initialise l'ID du client et propage la mise à jour (Update Rule Cascade) aux enregistrements enfants correspondant aux commandes du client (une seule commande dans le cas de l'exemple de mon post) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MessageBox.Show("Stop ??????????????????");
    args.Row["Client_ID"] = id;
    Le mécanisme de liaison "TwoWay Binding" de WPF devrait assurer la mise à jour de l'UI, mais dans le cas présent, je fais face à un effacement du DataGrid des commandes bien de la ligne de la commande ait été ajoutée à la table Commandes du Dataset ????

    Nom : Output.jpg
Affichages : 8
Taille : 78,8 Ko

    Est-ce que quelqu'un pourrait m'expliquer ce que j'aurais oublié de faire pour que cela fonctionne correctement ?

    Merci d'avance
    .
    together we stand, divided we fall
    .

  3. #3
    Membre éclairé Avatar de star
    Profil pro
    Subdivision commerciale
    Inscrit en
    février 2004
    Messages
    630
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Subdivision commerciale

    Informations forums :
    Inscription : février 2004
    Messages : 630
    Points : 778
    Points
    778

    Par défaut

    Je n'ai toujours pas réussi à trouver une solution mon problème de non affichage des enregistrements à l'issue d'une saisie sur la dernière ligne vide du DataGrid Détail.
    Je désespère...
    Merci à toute âme charitable qui pourrait m'aider à le résoudre
    .
    together we stand, divided we fall
    .

Discussions similaires

  1. Différence entre ADO.net LINQ et commandes SQL
    Par ramzichouchan dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 01/07/2015, 16h49
  2. ado.net, lecture des données spatiales
    Par Muller Guy dans le forum Développement
    Réponses: 2
    Dernier message: 13/09/2011, 16h57
  3. [WPF][ADO.NET] TableAdapterManager.UpdateAll vers Table Access?
    Par Masamunai dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 09/06/2011, 19h34
  4. [B.NET][ADO.NET] Créer des composants à la volée
    Par DotNET74 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/12/2007, 15h31
  5. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01

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