p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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 : 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
            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.

Discussions similaires

  1. mise à jour champs de base de données
    Par rghouly dans le forum AJAX
    Réponses: 1
    Dernier message: 18/01/2011, 17h25
  2. [OpenOffice][Texte] Mise à jour champs base dans writer
    Par Pgs dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 15/10/2010, 10h56
  3. Mise à Jour Champ Base de Donnée
    Par arjo54 dans le forum IHM
    Réponses: 0
    Dernier message: 10/10/2007, 15h38
  4. Mise à jour champ texte automatique
    Par Chlo dans le forum Access
    Réponses: 6
    Dernier message: 25/01/2007, 10h20
  5. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38

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