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

Firebird Discussion :

Détecter le changement de valeur dans un champ


Sujet :

Firebird

  1. #1
    Membre à l'essai
    Détecter le changement de valeur dans un champ
    Bonjour, je veux détecter, avec une requête SQL (Firebird), le changement de valeur dans un champ, je veux ajouter un champ qui s’incrémente chaque fois que la valeur change.

    Merci

  2. #2
    Expert éminent sénior
    Salut Mahmoud_A.

    A chaque fois que l'une de vos colonnes est mise à jour, donc par un UPDATE, vous désirez incrémenter une autre colonne.
    Pour tester la modification de ladite colonne, il suffit de le faire au travers d'un déclencheur (trigger), en vérifiant la nouvelle valeur par rapport à l'ancienne.
    S'il y a bien modification alors vous incrémentez votre compteur sinon vous ne faites rien.

    Ce qui 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
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ===========================
    -- Création de la table 'test'
    -- ===========================
     
    create table test (
      id        smallint generated by default as identity not null,
      modif     varchar(20)                               not null,
      compteur  integer               default 0           not null,
      primary key (id)
    );
     
    -- =====================
    -- Insertion dans 'test'
    -- =====================
     
    insert into test (modif) values ('vide');
     
    -- ================
    -- Vidage de 'test'
    -- ================
     
    select  *  from  test;
     
         ID MODIF                    COMPTEUR
    ======= ==================== ============
          1 vide                            0
     
     
    -- =======
    -- Trigger
    -- =======
     
    SET TERM #;
     
    CREATE TRIGGER verif FOR test ACTIVE
    BEFORE UPDATE POSITION 0
    AS
    BEGIN
      IF (NEW.MODIF <> OLD.MODIF) THEN
      BEGIN
        NEW.COMPTEUR = OLD.COMPTEUR + 1;
      END
    END#
     
    SET TERM ;#
     
    commit;
     
    -- =======================
    -- Mise à jour dans 'test'
    -- =======================
     
    update test set modif = 'blabla' where id = 1;
     
    -- =====================
    -- Insertion dans 'test'
    -- =====================
     
    insert into test (modif) values ('rien à déclarer');
     
    -- ================
    -- Vidage de 'test'
    -- ================
     
    select  *  from  test;
     
         ID MODIF                    COMPTEUR
    ======= ==================== ============
          1 blabla                          1
          2 rien à déclarer                 0
     
     
    -- =======================
    -- Mise à jour dans 'test'
    -- =======================
     
    update test set modif = 'vide' where id = 1;
     
    -- ================
    -- Vidage de 'test'
    -- ================
     
    select  *  from  test;
     
         ID MODIF                    COMPTEUR
    ======= ==================== ============
          1 vide                            2
          2 rien à déclarer                 0
     
    exit;
     
    Appuyez sur une touche pour continuer...


    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    je fait la création de ma table en code (Delphi), et du coup la modification se fait lors du remplissage de la table: je crée ma table, je la remplie avec une requête SQL, et lors du remplissage je veux ajouter un champ qui s’incrémente automatiquement chaque fois que le champs N°_Ticket change. (Tout est en DELPHI)
    Merci et excusez mois si je l'ai pas bien exprimé

  4. #4
    Rédacteur/Modérateur

    Bonjour,

    Si vous voulez tout faire en code Delphi alors ce n'est pas le bon forum, la piste de recherche c'est l'événement OnBeforePost. La solution trigger est très certainement plus fiable et rapide mais c'est à vous de voir.
    Je ne comprends pas cette phrase
    je fais la création de ma table en code (Delphi)
    Sauf s'il s'agit d'une table temporaire et même ainsi il existe ce que l'on nomme les GTT (Global temporary table) qui évitent de refaire à chaque fois une structure
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd