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 6i] Garder le curseur sur la nouvelle ligne


Sujet :

Forms Oracle

  1. #1
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut [Forms 6i] Garder le curseur sur la nouvelle ligne
    Bonjour

    sous Forms 6i je possède une liste d'enregistrements .

    Au chargement 5 enregistrements sont ramenés et affichés. Ensuite quand l'utilisateur descend les enregistrement sont chargés/affichés au fur et à mesure

    l'utilisateur : a la possibilité d'insérer un nouvel enregistrement. Le problème se pose lors de la validation de l'enregistrement car la liste est automatiquement commitée puis rechargée mais le curseur ne se repositionne pas sur l'enregistrement qui vient d'être inséré

    existe-il un petit truc simple pour celui-ci reste sur le nouvel enregistrement :


  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    avant le commit tu sauves le current_record_indicator (à vérifier ) dans une variable et après tu fait un GO_RECORD

  3. #3
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    en faisant tout simplement un Last_Record, cela devrait marcher

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pas si il a inséré le record en plein milieu

  5. #5
    Membre actif Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Points : 208
    Points
    208
    Par défaut
    oooops désolé

  6. #6
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    j'essaye tout ça

    quand on inssère en plein milieu après le commit l'enregistrement se retrouve systématiquement à la fin car je fais aucun tri

    mais je vais quand même faire la solution de orafrance car sinon je jour où je mettrais un tri


  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
    Citation Envoyé par orafrance
    avant le commit tu sauves le current_record_indicator (à vérifier ) dans une variable et après tu fait un GO_RECORD
    Cela fonctionne uniquement si :
    - tu n'as pas de clause order by (sinon ton enregistrement inséré n'est plus obligatoirement à l'endroit où tu l'as inséré)
    - si tu ramènes les mêmes enregistrements (il ne faut pas que l'utilisateur ait fait un enter-query avant d'insérer son enregistrement)

    Mais bon, il n'y a pas d'autres solutions (à ma connaissance)
    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.

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut Re: [Forms 6i] Garder le curseur sur la nouvelle ligne
    Citation Envoyé par macben
    ... la liste est automatiquement commitée puis rechargée ...
    Pourquoi est-elle rechargée ?
    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

  9. #9
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    euh

    parce que c'est comme ça :

    Non en fait je ne sais pas si elle est rechargée, mais le fait que la ligne se déplace en dernier enregistrement lorsqu'elle est insérée entre 2 autres, et le fait que le curseur change d'enregistrement "J'ai" supposé que ... il y avait rechargement

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il faut conserver la valeur de la PK dans une variavle globale dans le trigger de niveau bloc : POST-INSERT

    Et ensuite, après l'instruction execute_query (puisqu'elle doit apparament exister) boucler sur les enregistrements jusqu'àu correspondant

    Trigger POST-INSERT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :global.new_cle := :block.item_pk ;
    Code qui contient le execute query :
    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
    execute_query ;
    If :global.new_cle IS NOT NULL Then
    First_record ;
    Loop
      If :block.item = :global.new_cle Then
         -- trouvé ! --
         Exit ;
      End if ;
      If :system.last_record = 'TRUE' Then
         First_record ;
         Exit ;
      End if ;
      Next_record ;
    End loop ;
    End if ;
    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

  11. #11
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut

  12. #12
    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 SheikYerbouti
    Et ensuite, après l'instruction execute_query (puisqu'elle doit apparament exister) boucler sur les enregistrements jusqu'àu correspondant
    Ca marche bien si tu n'as pas trop d'enregistrements, sinon les perf en prenne un coup...

    C'est quand même dommage qu'il n'y ait pas une commande qui permette de raffraichir les valeurs des champs en fonction de ce qu'il y a dans la base, sans avoir à faire d'execute_query
    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.

  13. #13
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Très honnêtement, je ne vois pas la plus-value de refaire execute_query après un insert !!!
    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

  14. #14
    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
    Quand il y a des triggers ! Ou alors il faut reporter tout le code des triggers de la base de données dans les triggers de forms, ce qui est un peu lourd à maintenir...

    Mais le problème du raffraichissement des champs ne se pose pas seulement lors des insert : par exemple quand on a un bouton qui appelle une procédure stockée qui fait des mises à jour, il faut refaire un execute_query, ce qui n'est pas l'idéal...
    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.

  15. #15
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    D'où l'intérêt de travailler sur des program unit et pas directement dans les triggers

  16. #16
    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 orafrance
    D'où l'intérêt de travailler sur des program unit et pas directement dans les triggers
    : Je ne vois pas le rapport ! Il y a des tables pour lesquelles les insertions peuvent être faites via des forms et via des traitements. Pour éviter d'avoir tout à gérer et dans les forms et dans les traitements on gère cela on niveau des triggers de la base de données. Le problème dans forms est que :
    1. On ne voit pas en temps réel ce qui est dans la base de données puisque certains champs ont été renseignés par les triggers
    2. Les enregistrements sont vérouillés puisque mis à jour par le trigger

    => d'où l'obligation de faire un execute_query.
    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.

  17. #17
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    En fait, il suffit de forcer l'exécution du trigger POST-QUERY pour synchroniser les valeurs.

    Créer un trigger POST-INSERT et POST-UPDATE sur le bloc et ajouter l'instruction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute_trigger('POST-QUERY');
    L'inconvénient mineur réside dans le fait qu'un nouvel enregistrement inséré n'est pas réordonné vis à vis de la clause ORDER BY.
    l'avantage majeur réside dans le fait qu'il n'est pas nécessaire de refaire le query de tout le bloc.
    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

  18. #18
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Maintenant, si un post-query ne suffit pas à retrouver les informations (cas des colonnes mises à jour par une procédure stockée) voici une autre solution un tantinet plus lourde :

    -- Script de la table de test --
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE TEST2 ( 
      COL1  VARCHAR2 (100)  NOT NULL, 
      COL2  VARCHAR2 (50), 
      SAL   NUMBER (6,2), 
      COMM  NUMBER (6,2), 
      PRIMARY KEY ( COL1 ) ) ;
    -- Fonction stockée en base (SQL dynamique) --
    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
    CREATE OR REPLACE FUNCTION FORMS_NUM_REC
      (
    	PC$Table  IN VARCHAR2, -- Nom de la table
    	PC$Where  IN VARCHAR2, -- Clause DEFAULT_WHERE du bloc
    	PC$Where2 IN VARCHAR2, -- Clause Where de l'item
    	PC$Order  IN VARCHAR2  -- Clause ORDER_BY du bloc
      ) RETURN PLS_INTEGER
    IS
      LC$Req  VARCHAR2(2000) ;
      LN$Rec  PLS_INTEGER ;
    BEGIN
      ---------------------------------------------------------------------------------------
      -- Cette fonction permet de traiter une requête du type :                            --
      -- SELECT COUNT&#40;*&#41; FROM TEST2 WHERE COL1 < 'nom5' AND COL1 <= 'nom201' ORDER BY COL1 --
      --                                                                                   --
      -- et de retourner le numéro d'ordre du nouvel enregistrement                        --
      ---------------------------------------------------------------------------------------
     
      LC$Req &#58;= 'SELECT COUNT&#40;*&#41; FROM ' || PC$Table ;
     
      If TRIM&#40;PC$Where&#41; IS NOT NULL Then
        LC$Req &#58;= LC$Req || ' WHERE ' || PC$Where ;
      End if ;
     
      If TRIM&#40;PC$Where2&#41; IS NOT NULL Then
        If TRIM&#40;PC$Where&#41; IS NOT NULL Then
    	   LC$Req &#58;= LC$Req || ' AND ' || PC$Where2 ;
    	Else
    	   LC$Req &#58;= LC$Req || ' WHERE ' || PC$Where2 ;	
    	End if ;
      End if ;  
     
      If TRIM&#40;PC$Order&#41; IS NOT NULL Then
        LC$Req &#58;= LC$Req || ' ORDER BY ' || PC$Order ;
      End if ;
     
      EXECUTE IMMEDIATE LC$Req INTO LN$Rec ;
     
      RETURN&#40; LN$Rec &#41; ;
     
    END FORMS_NUM_REC ;
    /
    -- Fonction a placer dans une librairie PL/SQL Forms (.pll) --
    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
    FUNCTION Get_Num_Rec&#40; PC$Clause IN VARCHAR2 &#41; RETURN PLS_INTEGER IS
    	LC$Bloc  Varchar&#40;60&#41; &#58;= Name_In&#40;'system.trigger_block'&#41; ;
    	LC$Table Varchar2&#40;30&#41; ;
    	LC$Source Varchar2&#40;30&#41; ;	
    	LC$Where Varchar2&#40;256&#41; ;
    	LC$Order Varchar2&#40;256&#41; ;
    	LN$Rec Pls_integer ;	
    Begin
    	LC$Table &#58;= Get_Block_Property&#40; LC$Bloc, DML_DATA_TARGET_NAME &#41; ;
    	LC$Source &#58;= Get_Block_Property&#40; LC$Bloc, QUERY_DATA_SOURCE_NAME &#41; ;	
    	LC$Where &#58;= Get_Block_Property&#40; LC$Bloc, DEFAULT_WHERE &#41; ;
    	LC$Order &#58;= Get_Block_Property&#40; LC$Bloc, ORDER_BY &#41; ;
     
      -- Appel de la fonction stockée --
      LN$Rec &#58;= FORMS_NUM_REC&#40;
        LC$Table,
        LC$Where,
        PC$Clause,
        LC$Order &#41; ;
     
      RETURN&#40; LN$Rec &#41; ;
     
    End ;
    -- Dans la forme --
    Trigger WHEN-NEW-FORM-INSTANCE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -- Création de la variable globale --
    &#58;GLOBAL.Num_Rec &#58;= '' ;
    Trigger POST-INSERT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Begin
      -- Appel de la fonction en librairie PL/SQL --
      &#58;GLOBAL.Rec_Num &#58;= GET_NUM_REC&#40; 'COL1 <= ''' || &#58;TEST2.COL1 || '''' &#41; ;
    End ;
    Trigger KEY-COMMIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Begin
     
      commit_form ;
     
      If &#58;GLOBAL.Rec_Num IS NOT NULL Then
    	execute_query ;
    	-- Saut direct à l'enregitrement concerné --	  
    	Go_Record&#40; &#58;GLOBAL.Rec_Num &#41; ;
      End if ;	
     
    End ;
    ATTENTION : La propriété Query All Records du bloc doit être à TRUE
    Cette solution ne fonctionne pas si tous les enregistrements ne sont pas lus



    Dernière solution :
    Dans le trigger POST-INSERT :

    - récupérer le ROWID créé : :GLOBAL.rowid := :BLOC.ROWID ;
    - Lire l'enregistrement en base
    - Appliquer les nouvelles valeurs aux items de l'enregistrement
    - Replacer le statut de l'enregistrement à QUERY :
    Set_Record_Property( Get_Block_Property( 'nom_bloc', CURRENT_RECORD ), 'nom_bloc', STATUS, QUERY_STATUS ) ;
    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

  19. #19
    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
    Merci pour tous ces exemples !

    J'ai essayé les différentes solutions :
    1. La première ne fonctionne pas ou alors je n'ai pas compris ce qu'il fallait faire, Sheik, peux-tu préciser STP ?

    2. Le deuxième fonctionne sans problème, si ce n'est qu'il faut tenir compte des champs entrés en ENTER-QUERY

    3. La troisième me renvoie comme je le pensais le message d'erreur FRM-40654 "Enregistrement mis à jour par un autre utilisateur"
    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.

  20. #20
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    La première force la ré-exécution du trigger POST-QUERY ( et donc le raffraichissement qu'il peut éventuellement contenir). Inutile, effectivement si tu n'as pas de trigger POST-QUERY ou s'il ne contient pas les instructions suffisantes pour afficher l'ensemble des modifications.

    pour la 2ème solution, il est facile de lui passer une clause where plus élaborée.
    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

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

Discussions similaires

  1. [Lazarus] Changer de curseur sur toute la Form
    Par TomErra dans le forum Lazarus
    Réponses: 3
    Dernier message: 12/03/2011, 23h38
  2. Garder le curseur dans le même champ dans un form
    Par merli dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/09/2009, 12h03
  3. Réponses: 2
    Dernier message: 30/01/2009, 15h01
  4. Curseur sur une form
    Par Seth77 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/09/2007, 21h42
  5. Comment écrire sur une nouvelle ligne ?
    Par cobra85 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 20/08/2007, 12h23

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