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

Bases de données Delphi Discussion :

detecter le nom de colomne que l'utilisateur à modifier le champ (DBGrid+TTable)


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut detecter le nom de colomne que l'utilisateur à modifier le champ (DBGrid+TTable)
    salut à tous ,
    J'ai une base lié à un TTable lié avec un DBGrid , et j'ai un table Log qui doit contenir , la ligne modifier ainsi que la colomne exact que l'utilisateur a modifier le champ corresspondant plus quelques infos sur le temp , la table , et la date donc j'ai fait ceci:
    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
    48
    49
    50
    51
    52
    53
    54
    procedure TForm1.Table1AfterPost(DataSet: TDataSet);
    var
    tmp,tabname,H: string;
    newval : string;
    lign: integer;
    col : string;
     
    begin
     
    Lign :=table1.FieldValues['N°'];
    col:=DBGrid1.SelectedField.DisplayName;
     
     tmp:= FormatDateTime('dd"/"mm"/"yyyy', Now);
     H:= FormatDateTime('hh":"mm":"ss', Now);
     tabname:= table1.TableName ;
     newVal:=DBGrid1.SelectedField.value;
     
     
    //suppression d'une enregistrement ancien de meme champ s'il existe
     
    table2.First;
    while not table2.Eof do
    begin
     if (tabname=table2.FieldValues['Tables']) and  (lign=table2.FieldValues['ligne']) and (col=table2.FieldValues['colomne']) then
      begin
     
        ///suppression de l'ancien ligne de la table logtable local
     
        Query1.SQL.Clear;
        query1.sql.add('delete * from logTable');
        query1.SQL.add('where Tables =:n and ligne=:l and colomne=:c');
        Query1.ParambyName('n').value:=tabname;
        Query1.ParambyName('l').value:=lign;
        Query1.ParambyName('c').value:=col;
        Query1.ExecSQL;
     
      end;
      table2.next;
    end;
     
    //insertion dans la table log :
     
      Query1.SQL.Clear;
      Query1.SQL.Add('INSERT INTO logTable (heure,Version,tables,ligne,colomne,nouvValeur)');
      Query1.SQL.Add('VALUES (:H,:tmp,:tabname,:lign,:col,:newval)');
     
      Query1.Params[0].AsString := H;
      Query1.Params[1].AsString := tmp;
      Query1.Params[2].AsString := tabname;
      Query1.Params[3].Asinteger := lign;
      Query1.Params[4].AsString := col;
      Query1.Params[5].AsString := newval;
      Query1.ExecSQL;
     end;

    Ca marche 10/10 si on change une seul cellule et on clique sur un autre emplacement ,
    mais Si on change un champ puis on change un 2eme dans le meme ligne ca capte seullement le 2eme changement , ces intruction vons se faire pour le 2eme champ , le premier se change sans insertion dans la table LOG .



    j'attend votre aide

  2. #2
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut
    ou bien comment recupérer les arguments du post pour l'utiliser dans l'insertion, si c'est possible ca sera beaucoup plus mieux

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Peut être peux tu travailler plutôt avec les évènements de ton DBGrid (Par exemple le OnColExit) pour stocker toutes les modifs de ta ligne qui sont faites avant le Table1AfterPost ?

  4. #4
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut
    j'ai essayer ca , mais quand l'utlisateur ne change pas , il clique juste pour bien voir ou bien je ne sais pas .., dans ce cas toute champ selectionné sera ajouter dans Log , ce qui va etre un grand nombre d'enregistrement sans utilité.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par tomy_libre Voir le message
    j'ai essayer ca , mais quand l'utlisateur ne change pas , il clique juste pour bien voir ou bien je ne sais pas .., dans ce cas toute champ selectionné sera ajouter dans Log , ce qui va etre un grand nombre d'enregistrement sans utilité.
    Tu peux toujours comparer la valeur de ton champ en sortie de colonne avec la valeur qu'il avait en entrée avec les évènements OnCellClick ou OnColEnter pour ne tracer que les champs réellement modifiés.

    Dans le OnCellClick ou le OnColEnter tu récupères la valeur de ton champ que tu compares à la valeur qu'il a dans le OnColExit. Si il a changé tu le traces dans ton log sinon tu ne fais rien.

  6. #6
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Sitas Voir le message
    Tu peux toujours comparer la valeur de ton champ en sortie de colonne avec la valeur qu'il avait en entrée avec les évènements OnCellClick ou OnColEnter pour ne tracer que les champs réellement modifiés.

    Dans le OnCellClick ou le OnColEnter tu récupères la valeur de ton champ que tu compares à la valeur qu'il a dans le OnColExit. Si il a changé tu le traces dans ton log sinon tu ne fais rien.

    Merci bien , c une idée intérréssante que je le test d'apres hier, mais dans le OnColExit j'ai pas pu avoir la valeur rècement insérer, lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LastInsertedVal:=DBGrid1.SelectedField.Value;
    LastInsertedVal a la valeur de champ just avant l'insertion de la dernière.....

  7. #7
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut
    Le problème preciste toujours , je peut pas récupérer la nouvelle valeur de champ , ainsi le numéro de ligne précédente(pour la comparer avec la nouvelle et voire si on est en meme ligne), voila ce que j'ai fait et c toujours mall:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
    LastNumCol:=table1.FieldValues['N°'];
    LastInsertedVal:=DBGrid1.SelectedField.AsVariant;
    LastCol:=DBGrid1.SelectedField.DisplayName;
     
    end;
     
    procedure TForm1.DBGrid1ColEnter(Sender: TObject);
    begin
         //SI  LastNumCol= le numéro de ligne courant donc 
                    on est en meme ligne et on fait mainant notre travail
     
    end;


    , un but tellement facile mais je ne sais pas pourquoi c aussi compliqué !!!!!!!!!

  8. #8
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut
    Enfinnnnnnnnnnnnn, c résolu, merci bien à vous cher ami , voila commant peut etre des auters auront le meme probleme :

    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
    private
        { Private declarations }
     
        LastNumcol : integer;
        lastCol,LastInsertedVal: string;
        last : boolean;
    .
    .
    .
    .
    .
     
    procedure TForm1.Table1AfterEdit(DataSet: TDataSet);
    begin
    last:=true;
    LastNumCol:=table1.FieldValues['N°'];
    LastCol:=DBGrid1.SelectedField.DisplayName;
     
    end;
     
    procedure TForm1.DBGrid1ColEnter(Sender: TObject);
    begin 
     if (table1.FieldValues['N°']=LastNumcol) and last=true then
      begin 
      // on fait l'insertion dans la table Log avec les variable  LastNumCol et       //LasCol et surtout avec le nouveau contenu de champ modifier :
    //   table1.FieldValues[LastCol]
     
      last:=false;
      end;
    end;

    C simple non ?, mais au début ca été une malade , a+ et merci une autre fois.

  9. #9
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    tu as déjà solutionné ton problème apparemment, alors je soumets juste une idée. si ta BD supporte les triggers, tu pourrais les utiliser pour mettre en place le système de log des modifications.

  10. #10
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut merci
    merci bien, mais c'est résolu, en plus j'avais besoin d'une simple table de Log car j'en ai besoin pour faire une mise à jour entre deux tables et je veut pas compliqué choses plus tard,
    merci bien en tous cas

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

Discussions similaires

  1. [Débutant] Sauvegarder Excel avec un nom que l'utilisateur peut choisir
    Par yashiromah dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 03/08/2012, 20h26
  2. Réponses: 6
    Dernier message: 16/05/2006, 16h17
  3. [Afficher un message]Que l'utilisateur peut copier
    Par Terminator dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 28/04/2006, 10h02
  4. Réponses: 7
    Dernier message: 16/12/2005, 14h59
  5. Réponses: 20
    Dernier message: 07/12/2005, 15h32

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