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

Forms Oracle Discussion :

[forms 10g] invocation de POST pour effectuer des calculs en temps réel


Sujet :

Forms 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 [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 ?

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    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'.

  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
    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

  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
    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.

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Bonjour
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ;

  6. #6
    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
    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

  7. #7
    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
    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 ?

  8. #8
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut ,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    declencher le timer ;
    post

  9. #9
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create tomporary table 
    la remplir par les trigger pre-update et pre-insert

  11. #11
    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
    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é.

  12. #12
    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
    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 ?

  13. #13
    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
    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

  14. #14
    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
    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.

  15. #15
    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
    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.

  16. #16
    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
    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

  17. #17
    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
    Citation Envoyé par Magnus
    Si nous ne somme pas sûrs la doc sur la built-in POST est catégorique
    Exact

  18. #18
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    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 ?

  19. #19
    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
    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

  20. #20
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Merci Magnus

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Repérer le titre d'une colonne pour effectuer des calculs
    Par Doriansticle dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/02/2013, 15h14
  2. Réponses: 7
    Dernier message: 30/05/2012, 14h36
  3. [Système] Problème pour effectuer des calculs
    Par tissard dans le forum Langage
    Réponses: 10
    Dernier message: 09/12/2005, 14h07

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