Bonjour,
SVP j'ai un probleme pour appeler une API au niveau du groupe d'enregistrements qui remplit une LOV.
SI qlqun a une idée, je serai trés reconnaissant s'il me la partage....
Merci bcp
Version imprimable
Bonjour,
SVP j'ai un probleme pour appeler une API au niveau du groupe d'enregistrements qui remplit une LOV.
SI qlqun a une idée, je serai trés reconnaissant s'il me la partage....
Merci bcp
quelle API ? auriez-vous l'amabilité de fournir plus de renseignements ?
Je voulait dire par API dans ce cas, une procedure stockée qui retourne un type record avec lequel je veux remplir le groupe d'enregistrement de la liste de valeur. Avez vous une idée pour resoudre ce probleme?
Pourquoi une telle complexité ?
Pourquoi ne pas utiliser CREATE_GROUP_FROM_QUERY() en lui passant en paramètre un ordre Select constitué dynamiquement ?
Quelle est la finalité de votre besoin ?
Ok, je t'explique mon besoin... je te remercie pour ton interet et ton precieuse aide....
J'ai une tache d'adopter une application à une nouvelle architecture : avant il y avait des requetes SQL qui portent directement sur des tables existante, mnt, ces tables n'existent plus et les données qu'on estime avoir a partir de ces tables on les exploitent à partir des API sur un autre systeme alors ces API nous apportent le resultat qu'on attendait.
ex : select x,y from TABLE1 Where x=... et y=....;
devient
GET_INFO(x,y) ;
--------
Le probleme c'est que ca marche mais en exception pour les groupes d'enregistrements qui sont crées sur la base des ordres Select ... From ...
sur des tables qui n'existent plus et donc je suis obligé d'utiliser des API qui retournet un record pour alimenter le groupe d'enregistrements.
----
Le probleme c'est que j'arrive pas à définir les données du groupe à partir d'une API : procedure stoquée.
A noter que ces procedures stoquées sont crées sur un autre systemes et ne nous ramenent que le resultats.
Ok.
Quel type de données retourne la fonction GET_INFO(x,y) ?
peut-on voir un exemple des données retournées par cette fonction ?
Vous en voici un exemple de mon API qui retourne un record défini dans le paquage
---------------------------------------------------
CREATE OR REPLACE PACKAGE PA_TECHFAM AS
Type TechFam Is Record ( P_ID_TECHFAM NUMBER(12),
P_CTECHFAM VARCHAR2(60),
P_LIB_TECHFAM VARCHAR2(40));
Type R_TECHFAM Is TABLE OF TECHFAM
Index by Binary_integer;
Procedure GET_TECHFAM (T_TECHFAM OUT PA_TECHFAM.R_TECHFAM,
P_CODE_RETOUR OUT NUMBER);
END PA_TECHFAM;
CREATE OR REPLACE PACKAGE BODY PA_TECHFAM AS
Procedure GET_TECHFAM (T_TECHFAM OUT PA_TECHFAM.R_TECHFAM,
P_CODE_RETOUR OUT NUMBER) IS
Cursor c_element IS select c.ncli, c.nom, c.prenom1
from client c
where rownum < 10;
i NUMBER;
BEGIN
p_code_retour := 0;
i := 1;
--
Open c_element;
Loop
Fetch c_element Into T_TECHFAM(i).p_id_techfam,
T_TECHFAM(i).p_ctechfam,
T_TECHFAM(i).p_lib_techfam;
Exit when c_element%notfound;
i := i + 1;
--
p_code_retour := 1;
--
End loop;
Close c_element;
End GET_TECHFAM;
End PA_TECHFAM;
alors là, je ne comprends plus ! vous dites que les tables n'existent plus et pourtant votre package utilise un curseur sur la table client !???Citation:
...
Cursor c_element IS select c.ncli, c.nom, c.prenom1
from client c
where rownum < 10;
...
oui, en fait ce paquage n'est pas defini sur mon systeme mais sur un autre systeme qui lui communique via ces API.
Avez-vous une idée pour exploiter cette API pour remplir mon groupe d'enregistrements à partir du record qu'elle retourne?
Il doit y avoir un moyen (compliqué bien sur...). cependant gardez à l'esprit que vos LOV ne pourront pas être utilisées pour valider les items !!!
La seule solution que j'entrevoie, est de générer un ordre select basé sur DUAL avec le résultat de vos enregistrements
si le select généré s'avère correct, il ne reste plus qu'à l'attribuer au record_group.Citation:
Declare
LN$I NUMBER := 1 ;
LC$req VARCHAR2(20000) := 'Select ' ;
T_Rec PA_TECHFAM.R_TECHFAM
Begin
-- appel de votre fonction package avec le tableau T_Rec IN OUT --
-- Retour de la fonction --
For I IN T_Rec.first .. T_Rec.last Loop
If LN$I > 1 Then
LC$Req := LC$Req || ' UNION SELECT ' ;
End if ;
LC$Req := LC$Req || T_Rec(i).p_id_techfam || '"col1",' ;
LC$Req := LC$Req || T_Rec(i).p_ctechfam || '"col2",' ;
LC$Req := LC$Req || T_Rec(i).p_lib_techfam || "col3" ;
LC$Req := LC$Req || ' From DUAL ' ;
LN$I := LN$I + 1 ;
End loop ;
End ;
oui je comprend. Mais il reste comment alimenter le group à partir de la variable qui contient la requete à executer
Citation:
Declare
rg_name VARCHAR2(40) := 'MON_RG';
rg_id RecordGroup;
errcode number;
Begin
-- construction de la requête --
...
-- construction du record group --
rg_id := Find_Group( rg_name );
IF Not Id_Null(rg_id) THEN
Delete_group( rg_id ) ;
End if;
rg_id := Create_Group_From_Query( rg_name, LC$Req ) ;
errcode := Populate_Group( rg_id );
-- association LOV <-> record group --
Set_Lov_Property( 'Nom_de_la_lov', GROUP_NAME, rg_name ) ;
End;
Je vous remercie infiniment........
Je vais implementer cette solution immediatement......
Je vous signalerai le resultat......
Tout est clair mnt, et grace à vous...
Merci
@+
Comme le dédoublonnage est inutile, remplacez UNION par UNION ALL.
vous ferez l'économie d'un tri.
Et pour pouvoir créer votre LOV vous devez d'abord créer un record group bidon qui contient l'ordre select :
Code:select NULL "col1", NULL "col2", NULL "col3" FROM DUAL
ok, merci
SAlut
J'ai un petit probleme avec mon programme, c'est qu'un message d'erreur apparait indiquant qu'il est impossible d'effacer le groupe... cad que le DELET_GROUP a echoué
les causes possibles?
If not Id_Null -> on ne supprime le record group que s'il existe.Citation:
rg_id := Find_Group( rg_name );
IF Not Id_Null(rg_id) THEN
Delete_group( rg_id ) ;
End if;
Avez vous recopié correctement mon exemple ?
et SVP on initialise rg_name en quoi?
Peu importe, c'est un record group dynamique. mettez ce que vous voulez. (peut-être éviter le nom d'un record group physiquement présent dans la forme)
Mille Merci à vous....... ca marche à merveille....$*
ET voilà, c'est fait grace à vous biensur....
une reniere question : c'est est ce que vous connaissez une fonction qui elimine les caracteres speciaux sur SQL comme par ex : '
c'est à dire...
Si tu veux les supprimer tu peux utiliser
Code:REPLACE (tachaine,'''','')
La fonction Replace()
Code:Replace( 'coucou', 'c', '') -> ouou
Merci bcp pour votre aise précieuse concernant la création du groupe d'enregistrement à partir d'une requete basé sur DUAL.
J'ai un autre probleme lors de l'execution de mon probleme :
Un message forms apparait sous la forme :
Message Forms :Réservation de l'enregistrement impossible (2 essais). Voulez-vous
continuer ? oui / Non
si je choisit oui alors le meme message avec 4essais etc...... à l'infini.
Avez vous une idées sur d'où provient le probleme?
A quel moment ? sur quel évènement ? après l'affichage de la LOV ? en changeant d'enregistrement ?
Pouvez-vous investiguer précisément les actions qui amènenent ce message ?
cela se produit exactement avant le chargement de n'importe quel champs sur lequel est definie une liste de valeur....
Je n'avais pas ce probleme avant la modification du code pour realiser un groupe d'enregistrements pour le 4eme champs(item).
Il m'apparait que j'ai une anomalie qui propage sur tous les item avec LOV
Dans quel trigger faites-vous appel à votre procédure qui créé le record group dynamique ?
Voilà, j'ai ignoré la partie du code que j'ai ajouté et le probleme est disparu.....
Je fait appel à mon unité du code au trigger KEY_NEXT_ITEM defini sur l'item abrv_centre_essai. car j'ai besoin de cette valeur de l'abrv_centre_essai pour remplir mon record au niveau du paquage par la procedure GET_INFO.
Et donc, je fait executer mon code apres la validation de la valeur de abrv_centre_essai
Et donc votre problème est résolu ?
non.... car c'est bien quand j'ignore ma partie du code ajouté.
sinon, comment pourrai-je implenter mon code?
Combien de LOV de ce type avez-vous dans cette forme ?
Il faut autant de record group dynamique que de LOV différentes.
leur initialisation peut être faite une fois au démarrage de l'écran dans le trigger WHEN-NEW-FORM-INSTANCE
oui j'ai verifié....
8 LOV differentes avec 8 groupe d'enregistrements initialisés correctement
Mais à quoi vous sert donc le code sur vos triggers KEY-NEXT-ITEM ?
c'est le code que tu m'as donné hier pour remplir un groupe d'enregistrements. Il se base sur une requete dual pour extraire les données d'un autre systeme commercial(avec biensur un synonyme).
Il faut mettre l'appel de cette procédure une seule fois pour toutes dans le trigger WHEN-NEW-FORM-INSTANCE (1 appel pour chaque LOV)
ok merci.
Je vais le faire... et je te signalerai le resultat
voilà, j'arrive à localiser mon probleme.
J'ai un bloc dynamique lié à une table.... au chargement du bloc, on doit executer la requete(clause where) pour charger les données...
alors, il y a un probleme dans cette requette comme ca il y a un message d'erreur qui s'affiche indiquant que ce n'est pas possible de charger l'enregistrement...
avez vous une idée sur la cause et le remede?
Si cela n'a plus de rapport avec les LOV je suggère d'ouvrir un autre post