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

Oracle Discussion :

[8i][forms 6i] trigger PRE-UPDATE


Sujet :

Oracle

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut [8i][forms 6i] trigger PRE-UPDATE
    Bonjour tout le monde,

    Je développe depuis quelques mois sous forms 6i et je pense que je viens de commettre une importante confusion donc j'aimerais avoir votre avis.

    Dans un formulaire, j'ai un bloc de données base table dans lequel j'utilise un trigger PRE-UPDATE pour mettre à jour un item de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :B2.IV_DATMOD := SYSDATE;
    Ce qui me surprend à l'exécution, c'est que le code du trigger PRE-UPDATE est effectué pour chaque enregistrement du bloc, que l'utilisateur l'ait modifié ou pas.

    En résumé : est-ce une bonne méthode d'utiliser le trigger PRE-UPDATE pour mettre à jour UNIQUEMENT des enregistrements modifiés par l'utilisateur ?

    Merci d'avance.

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut Re: [8i][forms 6i] trigger PRE-UPDATE
    Citation Envoyé par Magnus
    Ce qui me surprend à l'exécution, c'est que le code du trigger PRE-UPDATE est effectué pour chaque enregistrement du bloc, que l'utilisateur l'ait modifié ou pas.

    Non, le PRE-UPDATE n'est exécuté que si l'enregistrement a été modifié. Attention cette modification n'est pas obligatoirement une modification utilisateur, mais peut-être une modification forcée par le développeur (trigger POST_QUERY, PRE-RECORD, WHEN-NEW-RECORD-INSTANCE etc.)

    Vérifie ton record_status à l'arrivée et en sortie de ton enregistrement. SI celui-ci est à CHANGED c'est que ton enregistrement a été modifié.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut Re: [8i][forms 6i] trigger PRE-UPDATE
    Citation Envoyé par plaineR
    ...une modification forcée par le développeur (trigger POST_QUERY, PRE-RECORD, WHEN-NEW-RECORD-INSTANCE etc.)

    Vérifie ton record_status à l'arrivée et en sortie de ton enregistrement. SI celui-ci est à CHANGED c'est que ton enregistrement a été modifié.
    Salut plaineR,

    Après quelques tests supplémentaires, j'arrive à cette même conclusion que toi : dans le trigger POST-QUERY, j'ai ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    LIR_ST_CODE (:B2.TRA_ST_LEX,
                 :B2.LIB_ST_CODE_1,
                 :B2.LIB_ST_CODE_2,
                 :B2.LIB_ST_CODE_3,
                 :B2.TRA_CPTAGE,
                 :B2.ST_CODE);
    ...
    Or, l'item ST_CODE du bloc B2 est base table donc une fois passé dans cette fonction, le statut de chaque enregistrement est à CHANGED.

    Par conséquent, le titre de mon post ne reflète plus vraiment mon problème : je voudrais pouvoir déterminer pour chaque record s'il a été modifié par l'utilisateur et uniquement par celui-ci.

    Actuellement, j'ai déplacé mon code dans le trigger WHEN-VALIDATE-ITEM de chaque item que l'utilisateur peut modifier.

    Que penses-tu de cette alternative ?

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut Re: [8i][forms 6i] trigger PRE-UPDATE
    Citation Envoyé par Magnus
    Actuellement, j'ai déplacé mon code dans le trigger WHEN-VALIDATE-ITEM de chaque item que l'utilisateur peut modifier.
    Que penses-tu de cette alternative ?
    Bah, au niveau maintenabilité ce n'est pas terrible. Je préfère un seul WHEN-VALIDATE-ITEM au niveau block et tester les items concernés (à moins que tu n'aies que 2 ou 3 items concernés).

    Une autre solution qui me paraît meilleure, c'est dans ton POST-QUERY, remettre le statut de ton enregistrement à QUERY après ta procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set_record_property (:system.trigger_record, 'B2', record_status, QUERY_STATUS);
    [EDIT] J'ai remplacé :system.cursor_record par :system.trigger_record[/EDIT]

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut Re: [8i][forms 6i] trigger PRE-UPDATE
    Citation Envoyé par plaineR
    Je préfère un seul WHEN-VALIDATE-ITEM au niveau block et tester les items concernés (à moins que tu n'aies que 2 ou 3 items concernés).
    Je veux bien tester cette solution mais comment savoir quelle item a été modifié ?

    Citation Envoyé par plaineR
    Une autre solution qui me paraît meilleure, c'est dans ton POST-QUERY, remettre le statut de ton enregistrement à QUERY après ta procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set_record_property (:system.cursor_record, 'B2', record_status, QUERY_STATUS);
    J'ai testé cette méthode :
    - POST-QUERY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET_RECORD_PROPERTY(:SYSTEM.CURSOR_RECORD, 'B2', STATUS, QUERY_STATUS);
    - PRE-UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IF :SYSTEM.RECORD_STATUS = 'CHANGED' THEN
    	msg_box('maj de _datmod pour cursor_record = ' || :SYSTEM.CURSOR_RECORD); -- tmp !!!!
     
    	MAJ_DATMOD;
    END IF;
    - j'ai supprimé tous mes appels à MAJ_DATMOD dans les triggers niveau item WVI

    Conclusion : si je modifie une zone d'un seul enregistrement (celui de numéro 7) sur 7 alors la boite de dialogue est affichée 6 fois avec le CURSOR_RECORD = 7
    D'autre part, la variable B2.IV_DATMOD est mise à jour pour 6 enregistrements dont celui que j'ai modifié

    Là, j'en perds mon latin

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut Re: [8i][forms 6i] trigger PRE-UPDATE
    Citation Envoyé par Magnus
    Citation Envoyé par plaineR
    Je préfère un seul WHEN-VALIDATE-ITEM au niveau block et tester les items concernés (à moins que tu n'aies que 2 ou 3 items concernés).
    Je veux bien tester cette solution mais comment savoir quelle item a été modifié ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if :system.trigger_item = 'B2.MONITEM' then
    ...
    end if;
    Citation Envoyé par Magnus
    J'ai testé cette méthode :
    - POST-QUERY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET_RECORD_PROPERTY(:SYSTEM.CURSOR_RECORD, 'B2', STATUS, QUERY_STATUS);
    - PRE-UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IF :SYSTEM.RECORD_STATUS = 'CHANGED' THEN
    	msg_box('maj de _datmod pour cursor_record = ' || :SYSTEM.CURSOR_RECORD); -- tmp !!!!
     
    	MAJ_DATMOD;
    END IF;
    - j'ai supprimé tous mes appels à MAJ_DATMOD dans les triggers niveau item WVI

    Conclusion : si je modifie une zone d'un seul enregistrement (celui de numéro 7) sur 7 alors la boite de dialogue est affichée 6 fois avec le CURSOR_RECORD = 7
    Normal, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msg_box('maj de _datmod pour cursor_record = ' || :SYSTEM.TRIGGER_RECORD);
    Citation Envoyé par Magnus
    D'autre part, la variable B2.IV_DATMOD est mise à jour pour 6 enregistrements dont celui que j'ai modifié

    Là, j'en perds mon latin
    Ne modifies-tu pas des items ailleurs que dans le POST-QUERY ?

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut Re: [8i][forms 6i] trigger PRE-UPDATE
    Citation Envoyé par plaineR
    Normal, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msg_box('maj de _datmod pour cursor_record = ' || :SYSTEM.TRIGGER_RECORD);
    Ok, après avoir lu la doc sur ce trigger que je connaissais pas, j'ai réussi à implémenté la modification voulue.

    En résumé :
    - POST-QUERY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    -- ATTENTION : ne pas utiliser :SYSTEM.CURSOR_RECORD mais TRIGGER_RECORD
    SET_RECORD_PROPERTY(:SYSTEM.TRIGGER_RECORD, 'B2', STATUS, QUERY_STATUS);
    - PRE-UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF :SYSTEM.RECORD_STATUS = 'CHANGED' THEN
    	:B2.IV_NOMUSER := USER;
    	:B2.IV_DATMOD := SYSDATE;
    END IF;
    Merci beaucoup pour ton aide plaineR, tu m'as facilement évité de perdre 3-4 heures sur cette confusion

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

Discussions similaires

  1. Trigger et update
    Par Solovely dans le forum Oracle
    Réponses: 2
    Dernier message: 03/05/2006, 17h36
  2. Trigger if update
    Par b_lob dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 20/04/2006, 14h49
  3. TRIGGER After Update
    Par Nounoursonne dans le forum Oracle
    Réponses: 8
    Dernier message: 20/07/2005, 13h33
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. [forms] pre-update
    Par plaineR dans le forum Forms
    Réponses: 20
    Dernier message: 15/09/2004, 16h09

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