+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut Mise à jour champ base automatiquement

    Bonjour,

    J'ai Table1 contenant les champs
    - Champ1
    - ...
    - Champ999
    - TraceDateDerniereMiseAJourEnregistrement
    - TraceLogginAyantFaitLaDernièreMiseAJour
    J'espère être clair dans mes noms de champs!

    L'utilisateur se logue à mon application. Dans une windows form il navigue (bindingnavigator) sur tous les enregistrements de Table1. Je veux pour tout enregistrement modifié, modifier automatiquement les champs de 'trace'.
    Sur le Windows form j'ai un dataset et un bindingsource. Puis-je faire cela directement dans une partie code du dataset (comme je peux le faire en entity framework)? Sinon, sur quel évènement du bindingsource (ou du dataset) puis-je mettre un bout de code pour être sûr qu'il ne s'exécutera QUE lorsque l'utilisateur aura modifié un enregistrement.
    J'ai essayé sur le bindingSource curentItemChanged, CurrentChanged, ListChanged mais ces évènement sont levés même si je ne modifie pas d'enregistrement...

    Merci de m'aiguiller vers LA solution parfaite qui me ferait gagner du temps.
    Laumon.

  2. #2
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : février 2006
    Messages : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    Bonjour,

    Il n'y a pas de solution parfaite, il n'y a que des solutions adaptées à tes besoins.
    Une solution serait un trigger en base de données sur ta table.

    Bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Le trigger passerait pour la date, mais le login utilisateur est dans l'application. C'est à ce niveau que je bloque et c'est pourquoi je souhaite gérer ça dans l'application.
    Laumon.

  4. #4
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : février 2006
    Messages : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    Tu as une propriété HasChanges() sur le dataset et ensuite GetChanges() pour récupérer les modifications.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Bien, bien, bien...
    Alors en m'inspirant de l'excellent conseil de sisqo60 ( +1 pour toi ) j'ai créé une petite void de trace appelée avec un dataset et un nom de table. Je définis toujours mes champs de trace avec les mêmes noms (DateCre, DateMaj, Utilisateur).
    Ci-dessous le code que ça donne.
    Code :
    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
            private void Table1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
            {
                this.Validate();
                this.Table1BindingSource.EndEdit();
     
                if (dataSet1.HasChanges(DataRowState.Modified | DataRowState.Added))
                {
                    TraceValues(ref dataSet1, "Table1");
                }
                this.tableAdapterManager.UpdateAll(dataSet1);
            }
     
            private void TraceValues(ref dataSet1 dataSet, string pTableTracee)
            {
                foreach (DataRow row in dataSet.Tables[pTableTracee].Rows)
                {
                    if (row.RowState == DataRowState.Modified)
                    {
                        row["Utilisateur"] = "Login";
                        row["DateMaj"] = DateTime.Now;
                    }
                    if (row.RowState == DataRowState.Added)
                    {
                        row["Utilisateur"] = "Login";
                        row["DateCre"] = DateTime.Now;
                    }
                }
            }
    Remarquez que je n'ai pas utilisé le getChanges(), donc je suis obligé de parcourir toutes les lignes de la table. Le GetChanges() crée un nouveau Dataset "déconnecté" du dataset d'origine, donc le résultat d'un updateAll sur ce dataset2 ne met pas à jour le windows form. il faudrait ensuite recharger les données du formulaire. S'il y a une solution que je ne connais pas, je suis preneur.
    Je ne sais pas qu'est-ce qui est le plus rapide. Je suppose que (pour mes données) le parcours d'un dataset en mémoire est moins consommateur en temps qu'une relecture des données en base. J'ai donc opté pour la solution que je vous présente ici.

    Laumon.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •