Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2006, 09h21   #1
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Par défaut [forms 9i] détecter que l'utilisateur a modifié une valeur

Bonjour.

Je développe sous forms 9i un écran dans lequel l'utilisateur peut modifier des items qui peuvent aussi être chargés (via le code) par d'autres items.

Pour un quelconque item, je voudrais pouvoir détecter - i.e. positionner un booléen TRA_UPDATED_USER := 'TRUE' - quand l'utilisateur a modifié une valeur et SEULEMENT quand c'est l'utilisateur qui a effectué cette modification.
Autrement dit, quand c'est le programme qui a déterminé cette valeur alors la valeur du booléen doit être 'FALSE'.

Actuellement, je procède de cette manière :
1/ je créée un trigger WHEN-NEW-ITEM-INSTANCE sur cet item :
Code :
:GLOBAL.GC_old_value := :B1.TRA_IC;
2/ je créée un trigger WHEN-VALIDE-ITEM sur cet item :
Code :
1
2
3
4
5
DEFAULT_VALUE('NULL','GLOBAL.GC_old_value');
IF :GLOBAL.GC_old_value <> 'NULL' THEN
	:B1.TRA_UPDATED_USER := 'O';
END IF;
ERASE('GLOBAL.GC_old_value');
Je fais donc appel à vos services afin d'avoir votre avis sur ma manière de procéder.
Le fait d'utiliser une SEULE variable globale et un SEUL item (i.e. le booléen) pour détecter que l'utilisateur a modifié une valeur m'expose t'il à des effets de bord ou autres ?

Merci d'avance de vos réponses.

PS : je procède de cette manière pour factoriser mon code étant donné le nombre d'items que je dois "surveiller"
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 09h49   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
A priori, cela devrait marcher si le nom de l'item changé manuellement n'a pas d'importance.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 11h15   #3
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Citation:
Envoyé par SheikYerbouti
A priori, cela devrait marcher si le nom de l'item changé manuellement n'a pas d'importance.
Peu importe lequel de ces N items l'utilisateur a modifié.
Donc tu confirmes le fonctionnement de mon procédé.

Je te remercie.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 11h19   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
J'ajoute que si l'item par lui-même n'a aucune importance, il suffit d'un seul trigger de niveau module pour gérer tous les items de la forme.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 12h29   #5
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Mais je ne veux déclenchez ce code que pour 20 des 30 items (environ) du bloc.
Il faut donc que j'écrive alors un IF colossal où je teste l'item validé, non ?
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 12h44   #6
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Salut Magnus,

Moi je trouve cela un peu lourd à mettre en place comme méthode.

Il suffit de faire quand c'est le programme qui charge la valeur :
Code :
set_item_property ('monItem', item_is_valid, property_true);
pour que le trigger when-validate-item ne se déclenche pas.

Autre idée : quand c'est le programme qui indique les valeurs, remettre le block status à query (ou à new). Après tu n'as qu'à tester ton record status, s'il est à INSERT ou CHANGED, c'est que l'utilisateur a modifié une valeur .
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 15h30   #7
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Hello plaineR,

Je pense avoir compris tes 2 idées mais elles ne sont pas adéquates à mon contexte que j'ai simplifié ici.
En effet, il est possible que je me trompe mais modifier la propriété ITEM_VALID va inhiber complètement le code du trigger WVR de l'item concerné alors que je veux continuer à déclencher certaines instructions de ce trigger.

Concernant la 2ème solution, elle doit effectivement être adaptée mais elle me semble "risquée" dans la mesure où si le status du bloc change entre temps alors je ne serai pas dans le contexte que je teste.

Si ça peut te rassurer, la proposition de Sheikyerbouti d'utiliser un trigger niveau module (et d'utiliser la variable :SYSTEM.TRIGGER_ITEM) n'est pas adaptée non plus.
En fait, le seul souci réside dans l'utilisation d'un trigger WNII niveau bloc car je ne sais pas stocker dans ma variable globale la valeur de l'item courant.
Et donc je ne peux pas tester dans le WVI niveau bloc si la valeur de l'item courant a changé par rapport au contenu de la variable globale.

Ceci dit, c'est un problème général que j'ai avec forms et qui m'oblige à dupliquer des fois un grand nombre de fois des appels de procédures, des tests car je ne sais pas faire référence au contenu.
Ex : jusqu'à maintenant je n'arrive pas à retrouver la valeur d'un item à partir du moment où je dispose de son nom stocké dans une chaîne de caractères i.e. quelle est la valeur de l'item 'B1.TRA_PA_12' ?

Merci encore de votre participation les gars, mais la solution que j'ai retenue (et je ne vois pas comment la simplifier) consiste à mettre en place 2 triggers pour chaque item à surveiller : WNII et WVI
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 15h38   #8
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
La valeur de l'item courrant peut être connue facilement avec:

Code :
Name_In( :SYSTEM.TRIGGER_ITEM )
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 16h34   #9
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
OUAISSSSSSSSSSSSS !

J'avais complètement oublié les procédures internes NAME_IN et COPY qui font exactement ce que je veux.

Merci mille fois.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h27.


 
 
 
 
Partenaires

Hébergement Web