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

SQL Firebird Discussion :

mise à jour après delete


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 173
    Points : 104
    Points
    104
    Par défaut mise à jour après delete
    bonjour,

    j'ai une table avec un id, un code et un numordre.


    l'id est autoincrementé.
    je peux avoir plusieurs enregistrements avec les même code avec des numéros d'ordre incrémenté lors de l'insertion (par programme).

    j'aimerais faire un trigger after delete qui me mette à jour mon champs numordre pour un code donné.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    id|code|numordre
    1|1    |1
    2|1    |2
    3|1    |3
    4|1    |4
    5|1    |5
    
    suppression de la ligne 2, le trigger met à jour le numordre des enregistrements suivant
    1|1    |1
    3|1    |2
    4|1    |3
    5|1    |4
    merci de votre aide

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 173
    Points : 104
    Points
    104
    Par défaut
    Merci Philippe de ce lien même si ce n'est pas ce que je veux faire.

    Je ne veux pas réserver des numéros qui auraient été supprimés pour les reboucher ensuite mais décalé les numéros suivants. Mais cela m'a donné la réponse tout de même.
    En faisant un trigger de cette sorte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     CREATE TRIGGER AD_MALIGNE FOR MATABLE ACTIVE AFTER DELETE
     POSITION 0 AS BEGIN
     UPDATE MATABLE SET 
     NUMORDRE = NUMORDRE -1
     WHERE NUMORDRE>OLD.NUMORDRE
      AND CODE = OLD.CODE;
     END
    Je testerais demain

  4. #4
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 173
    Points : 104
    Points
    104
    Par défaut
    Bonjour,

    le trigger after delete fonctionne parfaitement.
    J'ai une autre demande pour la mise à jour.
    Je reprend l'exemple avec un champ date en plus.
    Le champs ordre doit suivre la logique de l'ordre des dates sur un même code.
    J'ai 2 cas de modifications:
    - je modifie le code par un autre code ce qui me fait un trou dans l'odre de mon ancien code et un numéro d'ordre faux sur le nouveau
    - je modifie la date et l'ordre devient faux

    Il faudrait un trigger qui met à jour l'ordre de l'ensemble des enregistrements du ou des codes suivant la date

    exemple
    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
    Id|code|ordre|date
    1 |1   |1    |01/01/2009
    2 |1   |2    |02/01/2009
    3 |1   |3    |04/01/2009
    4 |1   |4    |05/01/2009
    5 |2   |1    |02/01/2009
    6 |2   |2    |06/01/2009
    7 |2   |3    |08/01/2009
    8 |3   |1    |03/01/2009
    
    si modif lgn 3 du code de 1 à 2
    sans trigger
    
    Id|code|ordre|date
    1 |1   |1    |01/01/2009
    2 |1   |2    |02/01/2009
    3 |2   |3    |04/01/2009
    4 |1   |4    |05/01/2009
    5 |2   |1    |02/01/2009
    6 |2   |2    |06/01/2009
    7 |2   |3    |08/01/2009
    8 |3   |1    |03/01/2009
    
    avec trigger
    Id|code|ordre|date
    1 |1   |1    |01/01/2009
    2 |1   |2    |02/01/2009
    3 |2   |2    |04/01/2009
    4 |1   |3    |05/01/2009
    5 |2   |1    |02/01/2009
    6 |2   |3    |06/01/2009
    7 |2   |4    |08/01/2009
    8 |3   |1    |03/01/2009
    le trigger devrais se faire sur le after udpdate du genre

    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
     
    index : integer;
     
    if old.code <> new.code then
    begin
      index := 0;
      for select id from matable where code = old.code order by date do
      begin
        update matabble set
         ordre = index 
        index := index +1
      end;
      index := 0;
      for select id from matable where code = new.code order by date do
      begin
        update matabble set
         ordre = index 
        index := index +1
      end;
    end
    else if old.date <> new.date then
    begin
      index := 0;
      for select id from matable where code = old.code order by date do
      begin
        update matabble set
         ordre = index 
        index := index +1
      end;
      index := 0;
     
    end;
    j'ai bien concience que ce n'est pas le code pour un trigger. j'aimerai savoir comment l'ecrire.
    merci

  5. #5
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 173
    Points : 104
    Points
    104
    Par défaut
    C'est bon, j'ai réussi à faire ce que je voulais.

    voici un bout de code

    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
     
    CREATE OR ALTER TRIGGER MATABLE_AU0 FOR MATABLE
    ACTIVE AFTER UPDATE POSITION 0
    AS
    declare variable idordre integer;
    declare variable boucle Integer;
    begin
      /* Trigger text */
      if (old.n_lot <> new.n_lot) then
      begin
        boucle = 1;
        for
          SELECT N_Id FROM matable
          WHERE N_Lot = old.N_Lot ORDER BY D_dateCoupe
          INTO :idordre
        DO
        BEGIN
          update matable set
            matable.n_numcoupe = :boucle
          where n_id = :idordre ;
          boucle = boucle + 1;
        END
     
        boucle = 1;
        FOR
          SELECT N_Id FROM matable
          WHERE N_Lot = new.N_Lot ORDER BY D_dateCoupe
          INTO :idordre
        DO
        BEGIN
          update matable set
            matable.n_numcoupe = :boucle
          where matable.n_id = :idordre ;
          boucle = boucle + 1;
        END
      end
      else IF (old.D_dateCoupe <> new.D_dateCoupe) then
      begin
        boucle = 1;
        FOR
          SELECT N_Id FROM matable
          WHERE N_Lot = new.N_Lot ORDER BY D_dateCoupe
          INTO :idordre
        DO
        BEGIN
          update matable set
            matable.n_numcoupe = :boucle
          where matable.n_id = :idordre ;
          boucle = boucle + 1;
        END
      end
    end

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/04/2008, 16h16
  2. Réponses: 3
    Dernier message: 10/05/2007, 07h43
  3. Réponses: 2
    Dernier message: 04/04/2007, 11h14
  4. Vue non mise à jour après modification d'une table
    Par cybernet35 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 13h54
  5. TAdoQuery et mise à jour après suppression
    Par kurkaine dans le forum C++Builder
    Réponses: 1
    Dernier message: 30/11/2005, 15h31

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