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
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 !???...
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.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
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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.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 : '
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager