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 28/03/2007, 10h54   #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 10g] invocation de POST pour effectuer des calculs en temps réel

Hello,

Sous forms 10g, je développe actuellement des écrans où je fais des calculs en temps réel.
Pour être en temps réel, j'invoque systématiquement la built-in POST dans le trigger niveau bloc WNRI.

Une (pernicieuse) conséquence est qu'après un appel à POST, je ne suis plus capable d'identifier les records qui ont été modifiés par l'utilisateur.
En effet, les variables systèmes telles que :SYSTEM.RECORD_STATUS sont passés de INSERT ou CHANGED à QUERY.

Existe-t-il une alternative ou un moyen permettant de connaître les records modifiés mais non validés par COMMIT ?
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 16h37   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Je propose de créer dans ton block une case à cocher,
et avant ton post tu créer un timer , et dans le when-timer-expired
tu coches les enregistremets qui ont le statut <>'QUERY'.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 16h48   #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
Bonjour salim11 et merci de votre réponse.

Votre solution me plaît bien mais ce bloc est associé à une table et dans mes écrans, j'ai des traitements complexes qui requierent des appels à CLEAR_FORM.
L'invocation de cette dernière m'oblige donc à modifier la structure de ma table pour stocker la valeur de la case à cocher (ce que je préfère éviter) ou alors à utiliser une autre solution.

Voyez-vous un moyen de compléter simplement votre procédé avec ces informations ?
Si vous avez une autre idée, je suis aussi preneur
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 16h54   #4
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,

Pourquoi as-tu besoin de savoir quels sont les enregistrements modifiés ?

Je ne pense pas qu'il y ait de mécanique native dans forms pour mémoriser quels sont les enregistrements modifiés.

Une autre solution est de stocker par exemple dans une table temporaire les enregistrements modifiés/insérés lors de chaque post (en stockant clé primaire/unique).
=> lorsque tu committeras ils seront automatiquement effacés de ta table temporaire.
__________________
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 28/03/2007, 17h17   #5
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour
Citation:
L'invocation de cette dernière m'oblige donc à modifier la structure de ma
table pour stocker la valeur de la case à cocher (ce que je préfère éviter) ou
alors à utiliser une autre solution.
j'ai oublié de te dire que la case à est non basé
donc dons le when-trigger_expired
Code :
1
2
3
4
5
6
7
8
9
10
11
 
begin 
go_block('****');
first_record ;
loop 
exit when :system.last_record='TRUE';
IF :SYSTEM.RECORD_STATUS<>'QUERY'
Cocher la case à cocher ;
end ;
end loop;
end ;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 17h57   #6
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
Bien sûr, je l'avais compris comme cela que la case à cocher devait correspondre à un item non basé.
Le problème ne se pose pas lors du when-timer-expired mais bien lorsque je fais appel à CLEAR_FORM ou à CLEAR_BLOCK.
Ah mais que je suis bête, après ces 2 instructions, quel que soit le record, la case doit être décochée jusqu'à ce que l'utilisateur effectue au moins une modification et que le timer se déclenche à nouveau.

Hum... je vais approfondir ma réflexion parce qu'effectivement ces 2 built-in ne génèrent aucun souci.

Je vous tiens au courant.
Merci
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 18h22   #7
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
La solution de salim me paraît pour le moins bien compliquée... et un peu une usine à gaz :
- quand tu vas posté, tes enregistrements vont passé au statut query
=> tu as beau créé un timer à ce moment là, il ne seront jamais marqués comme modifiés, puisqu'ils auront le statut query
- par ailleurs l'utilisation des timers est déconseillé en mode web.

Il vaut mieux que tu flagues une variable (non basée et appartenant à ton bloc mis à jour) dans les triggers pre-update et pre-insert.

Il y a néanmoins quelque chose que je ne comprends pas : quand l'utilisateur fais un clear_block et ne souhaite pas enregistrer ces modifications, les enregistrements que tu as posté ne sont pas rollbackés. Comment gères-tu cela ?
__________________
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 28/03/2007, 18h26   #8
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut ,

Juste une petite remarque
je déclenche mon timer avant de faire le post les record gardent leurs status

Code :
1
2
3
 
declencher le timer ;
post
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2007, 18h29   #9
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
Citation:
Envoyé par salim11
Salut ,

Juste une petite remarque
je déclenche mon timer avant de faire le post les record gardent leurs status

Code :
1
2
3
 
declencher le timer ;
post
Non pas forcément, parce qu' à mon avis le post commence avant que le timer n'est flaggué tous les enregistrements. En plus les triggers pre-update et pre-insert sont là pour cela, alors autant les utiliser
__________________
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 28/03/2007, 18h49   #10
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut ,

c'est vrai un timer est déconsillé à l'utiliser souvent mais dans des cas ou on a pas d'ici en l'utlise
exemple
dans le when-validate-record j'ai pas le droit d'utliser le go_item mais si j'utilise un timer dans son when-timer_experired je peux mettre le go_item

Je vois bien qu'avec le timer pose des problèmes , en utilisant ta solution ca evite tout ca
Code :
1
2
3
create tomporary table 
la remplir par les trigger pre-update et pre-insert
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 10h28   #11
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 tous les 2,

Citation:
Envoyé par plaineR
- par ailleurs l'utilisation des timers est déconseillé en mode web
Ah bon et pourtant ce n'est pas le 1er écran où j'utilise des timers. Le seul inconvénient que j'ai rencontré jusqu'à maintenant est que selon les configurations, le paramètre de durée du timer peut varier.

[/quote]quand l'utilisateur fais un clear_block et ne souhaite pas enregistrer ces modifications, les enregistrements que tu as posté ne sont pas rollbackés. Comment gères-tu cela ?[/QUOTE]
plaineR, sauf erreur de ma part, CLEAR_BLOCK comme CLEAR_FORM annule l'invocation de POST.
En tout cas, je n'ai pas de message de conflit, ni de sauvegarde de modifications que j'aurais souhaité annulé.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 10h31   #12
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 plaineR
...le post commence avant que le timer n'est flaggué tous les enregistrements
A mon sens, on ne peut pas prédire si le timer va être déclenché avant ou après le POST.
D'ailleurs, d'une exécution à l'autre, il se peut qu'il soit déclenché une fois avant et une fois après, comme 2 fois avant ou 2 fois après.
Rien n'est garanti et c'est justement l'inconvénient des timers.
Me trompe-je ?
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 11h52   #13
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
Citation:
Envoyé par Magnus
Ah bon et pourtant ce n'est pas le 1er écran où j'utilise des timers.
J'ai dit déconseillée, pas proscrite.

Citation:
Envoyé par Magnus
plaineR, sauf erreur de ma part, CLEAR_BLOCK comme CLEAR_FORM annule l'invocation de POST.
Ah non, c'est justement là le problème. Si dans la même session oracle, tu vas dans un autre fmx et que tu commites, les modifications faites dans le fmx où tu as posté seront également commitées. Seul le clear_form (full_rollback) annule toutes les modifications.

Citation:
Envoyé par Magnus
A mon sens, on ne peut pas prédire si le timer va être déclenché avant ou après le POST.
D'ailleurs, d'une exécution à l'autre, il se peut qu'il soit déclenché une fois avant et une fois après, comme 2 fois avant ou 2 fois après.
Rien n'est garanti et c'est justement l'inconvénient des timers.
Me trompe-je ?
Pour moi (je ne suis pas un spécialiste des times, je les utilise rarement car cela provoque souvent des usines à gaz...), le timer s'exécute en même temps (ou après suivant le temps défini) que la suite du code. Dans ton cas parcourir tous les enregistrements pour cocher ceux dont le statut est différent de query est une action longu, donc c'est pour cela que je disais que le post aura commencé (et sans doute fini) avant que le timer n'ait parcouru toutes les lignes.

Encore une fois dans ton cas tu as vraiment intérêt à utiliser les triggers PRE-UPDATE et PRE-INSERT. C'est tellement plus simple, je ne comprend même pas que tu veuilles utiliser un timer
__________________
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 29/03/2007, 13h31   #14
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 plaineR
J'ai dit déconseillée, pas proscrite.
Oui mais justement ni dans la doc, ni sur ce forum, je n'avais rencontré de contre-indication des timers. Saurais-tu pourquoi ils sont déconseillés ?

Citation:
Envoyé par plaineR
Ah non, c'est justement là le problème. Si dans la même session oracle, tu vas dans un autre fmx et que tu commites, les modifications faites dans le fmx où tu as posté seront également commitées. Seul le clear_form (full_rollback) annule toutes les modifications.
avant d'invoquer un quelconque écran, j'appelle CLEAR_FORM(NO_VALIDATE) par sécurité donc, sans le savoir, j'ai agit comme il le fallait, non ?

Citation:
Envoyé par plaineR
Encore une fois dans ton cas tu as vraiment intérêt à utiliser les triggers PRE-UPDATE et PRE-INSERT. C'est tellement plus simple, je ne comprend même pas que tu veuilles utiliser un timer
En fait, je ne veux pas utiliser les timers suite à ta démonstration donc je vais étudier la faisabilité avec les triggers PRE-UPDATE et PRE-INSERT.

Merci à tous les 2 de votre intense participation.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 13h46   #15
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
Citation:
Envoyé par Magnus
Oui mais justement ni dans la doc, ni sur ce forum, je n'avais rencontré de contre-indication des timers. Saurais-tu pourquoi ils sont déconseillés ?
1. Parce que cela crée une charge réseau : c'est le poste client qui envoie une demande au serveur forms et celui-ci répond au poste client
2. Parce que tu sollicites le serveur web, il vaut mieux créer un javabean timer qui sera exécuté sur le poste client.
3. Parce que souvent leur utilisation peut-être contournée (avis personnel )

Si la fréquence d'exécution du timer n'est pas importante, c'est vrai que ce n'est pas trop pénalisant.

Citation:
Envoyé par Magnus
avant d'invoquer un quelconque écran, j'appelle CLEAR_FORM(NO_VALIDATE) par sécurité donc, sans le savoir, j'ai agit comme il le fallait, non ?
Je ne suis pas sûr que cela soit suffisant, puisque tu ne fais pas de rollback. Il faudrait tester.
__________________
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 29/03/2007, 14h17   #16
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 plaineR
Je ne suis pas sûr que cela soit suffisant, puisque tu ne fais pas de rollback. Il faudrait tester.
Si nous ne somme pas sûrs la doc sur la built-in POST est catégorique :
Citation:
Envoyé par la doc forms 10g
Any data that you post to the database is committed to the database by the next COMMIT_FORM that executes during the current Runform session. Alternatively, this data can be rolled back by the next CLEAR_FORM
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 14h48   #17
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
Citation:
Envoyé par Magnus
Si nous ne somme pas sûrs la doc sur la built-in POST est catégorique
Exact
__________________
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 29/03/2007, 15h22   #18
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Dans notre cas c'est vrai la solution de plaineR est la meilleure, mais dans des cas j'utilise un timer pour trouver une issue à mon problème.

par exemple : je suis dans un trigger et je veux mettre une instruction qui est interdite dans ce trigger, alors dans ce cas j'utilise le timer et dans le
when-timer-experied je mets mon instruction

est ce que vous avez d'autres idées ?
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 15h58   #19
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
Comme toi, j'ai souvent besoin d'utiliser des procédures restreintes dans des triggers pour lesquels c'est interdit.
Cependant, j'évite d'utiliser le trigger WTI comme un "fourre-tout" :
- car ce procédé serait antinomique par rapport à une programmation objet
- l'exécution de ce déclencheur est plutôt imprévisible dans la mesure où il s'exécute en parallèle du reste du code.

La plupart du temps, j'estime qu'on dispose d'assez de triggers pour ne pas utiliser WTI.
En effet, j'ai souvent recours à ceux-ci :
- when-validate-record, when-validate-item
- when-button-pressed
- when-new-record-instance, when-new-item-instance
- when-list-changed
- ...

Enfin, par expérience : j'ai installé un écran en production qui effectuait un traitement long et complexe dans un timer (je n'avais pas d'autre choix) sur un site en production dont le serveur est une configuration matérielle très proche de l'une des notres.
Seul souci, j'ai été obligé de mettre le délai du timer paramétrable car pour avoir le bon comportement à l'exécution, le client ne dispose pas du tout de la même valeur que nous sur notre serveur.
Je n'ai pas croisé plus loin mais j'en ai conclu que cette "surprise" était à imputer au WTI
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 16h22   #20
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Merci Magnus
salim11 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 05h42.


 
 
 
 
Partenaires

Hébergement Web