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 25/11/2004, 17h18   #1
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
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 :

macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 17h26   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
avant le commit tu sauves le current_record_indicator (à vérifier ) dans une variable et après tu fait un GO_RECORD
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 17h31   #3
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
en faisant tout simplement un Last_Record, cela devrait marcher
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 17h36   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
pas si il a inséré le record en plein milieu
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 17h40   #5
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
oooops désolé
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 17h42   #6
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
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

macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 17h49   #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
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2004, 18h33   #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
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 09h47   #9
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
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
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 10h14   #10
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
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 :
:global.new_cle := :block.item_pk ;
Code qui contient le execute query :
Code :
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 10h29   #11
Membre éclairé
 
Avatar de macben
 
Inscription : mars 2004
Messages : 526
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2004
Messages : 526
Points : 379
Points : 379
Envoyer un message via AIM à macben Envoyer un message via MSN à macben
macben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 12h03   #12
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 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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 12h25   #13
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
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 15h04   #14
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
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 15h15   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
D'où l'intérêt de travailler sur des program unit et pas directement dans les triggers
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 15h27   #16
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 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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2004, 09h53   #17
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
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 :
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2004, 16h57   #18
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
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 :
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 :
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(*) FROM TEST2 WHERE COL1 < 'nom5' AND COL1 <= 'nom201' ORDER BY COL1 --
  --                                                                                   --
  -- et de retourner le numéro d'ordre du nouvel enregistrement                        --
  ---------------------------------------------------------------------------------------
 
  LC$Req := 'SELECT COUNT(*) FROM ' || PC$Table ;
 
  IF TRIM(PC$Where) IS NOT NULL Then
    LC$Req := LC$Req || ' WHERE ' || PC$Where ;
  End IF ;
 
  IF TRIM(PC$Where2) IS NOT NULL Then
    IF TRIM(PC$Where) IS NOT NULL Then
	   LC$Req := LC$Req || ' AND ' || PC$Where2 ;
	Else
	   LC$Req := LC$Req || ' WHERE ' || PC$Where2 ;	
	End IF ;
  End IF ;  
 
  IF TRIM(PC$Order) IS NOT NULL Then
    LC$Req := LC$Req || ' ORDER BY ' || PC$Order ;
  End IF ;
 
  EXECUTE IMMEDIATE LC$Req INTO LN$Rec ;
 
  RETURN( LN$Rec ) ;
 
END FORMS_NUM_REC ;
/
-- Fonction a placer dans une librairie PL/SQL Forms (.pll) --
Code :
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( PC$Clause IN VARCHAR2 ) RETURN PLS_INTEGER IS
	LC$Bloc  Varchar(60) := Name_In('system.trigger_block') ;
	LC$Table Varchar2(30) ;
	LC$Source Varchar2(30) ;	
	LC$Where Varchar2(256) ;
	LC$Order Varchar2(256) ;
	LN$Rec Pls_integer ;	
Begin
	LC$Table := Get_Block_Property( LC$Bloc, DML_DATA_TARGET_NAME ) ;
	LC$Source := Get_Block_Property( LC$Bloc, QUERY_DATA_SOURCE_NAME ) ;	
	LC$Where := Get_Block_Property( LC$Bloc, DEFAULT_WHERE ) ;
	LC$Order := Get_Block_Property( LC$Bloc, ORDER_BY ) ;
 
  -- Appel de la fonction stockée --
  LN$Rec := FORMS_NUM_REC(
    LC$Table,
    LC$Where,
    PC$Clause,
    LC$Order ) ;
 
  RETURN( LN$Rec ) ;
 
End ;
-- Dans la forme --
Trigger WHEN-NEW-FORM-INSTANCE :
Code :
1
2
-- Création de la variable globale --
:GLOBAL.Num_Rec := '' ;
Trigger POST-INSERT :
Code :
1
2
3
4
Begin
  -- Appel de la fonction en librairie PL/SQL --
  :GLOBAL.Rec_Num := GET_NUM_REC( 'COL1 <= ''' || :TEST2.COL1 || '''' ) ;
End ;
Trigger KEY-COMMIT :
Code :
1
2
3
4
5
6
7
8
9
10
11
Begin
 
  commit_form ;
 
  IF :GLOBAL.Rec_Num IS NOT NULL Then
	execute_query ;
	-- Saut direct à l'enregitrement concerné --	  
	Go_Record( :GLOBAL.Rec_Num ) ;
  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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 09h35   #19
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
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 18h24   #20
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 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
SheikYerbouti 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 08h54.


 
 
 
 
Partenaires

Hébergement Web