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 18/01/2007, 10h12   #1
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Par défaut [forms 9i] DELETE_LIST_ELEMENT sur liste instantanée

Bonjour,

Au lancement d'un écran, je souhaiterais afficher une liste instantanée dont le contenu est déterminé par une procédure qui effectue une requête sur la base.

J'ai défini cette liste de la manière suivante :
- "Correspondance d'autres valeurs" = null
- "Element de bases de données" = non
J'ai été obligé de définir un élément dans la liste sinon je ne peux générer mon module, j'ai donc mis un couple bidon : (0,0)

A l'exécution, j'ai toujours un élément vide en plus dans ma liste.
En consultant la doc et l'article de SheikYerbouti sur les listes, j'ai donc :
- testé le status du bloc courant = NEW
- invoqué ABORT_QUERY
Quoi que je fasse soit je dispose de cet élément en plus, soit en essayant de supprimer cet élément dans une boucle, j'ai l'erreur décrite dans la doc :
Citation:
FRM-41331
Je vous donne le code de la procédure qui alimente la liste à titre indicatif :
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
FUNCTION FILLCOMBO(PC_combobox      VARCHAR2,
                   PC_colonne       VARCHAR2,
                   LC_table         VARCHAR2,
                   PC_msg_defaut		VARCHAR2 DEFAULT NULL,
                   PC_clause_where  VARCHAR2 DEFAULT NULL,
                   PC_val_where     VARCHAR2 DEFAULT NULL,
                   PC_clause_and    VARCHAR2 DEFAULT NULL,
                   PC_val_and       VARCHAR2 DEFAULT NULL) RETURN BOOLEAN IS
	LConn_conn_id   EXEC_SQL.CONNTYPE;
	LCu_lecture		  EXEC_SQL.CURSTYPE;
	LC_sql_stmt 	  VARCHAR2(500);
	LI_nIgn 			  PLS_INTEGER;
  LC_val_lue      VARCHAR2(50);
  LN_indice       NUMBER(4) := 1;
  LC_item_list		ITEM := FIND_ITEM(PC_combobox);
 
	ln_tmp number(12);
	lc_bidon varchar2(255);
BEGIN
	CLEAR_LIST(LC_item_list);
	lc_bidon := get_block_property( name_in('system.current_block'), STATUS);
	abort_query;
	ln_tmp := get_list_element_count(LC_item_list);
	while ln_tmp > 0 loop
		delete_list_element(LC_item_list,1);
		ln_tmp := get_list_element_count(LC_item_list);
	end loop;
 
	LConn_conn_id := EXEC_SQL.DEFAULT_CONNECTION;
	LCu_lecture := EXEC_SQL.OPEN_CURSOR(LConn_conn_id);
	LC_sql_stmt := ' SELECT   DISTINCT ' || PC_colonne ||
								 ' FROM     ' || LC_table;
  IF PC_clause_where IS NOT NULL THEN
  	LC_sql_stmt := LC_sql_stmt || PC_clause_where || ' = ' || ADD_QUOTE_STRING(PC_val_where);
  END IF;
  IF PC_clause_and IS NOT NULL THEN
  	LC_sql_stmt := LC_sql_stmt || PC_clause_and || ' = ' || ADD_QUOTE_STRING(PC_val_and);
  END IF;
 	LC_sql_stmt := LC_sql_stmt || ' ORDER BY ' || PC_colonne || ' ASC';
 
	EXEC_SQL.PARSE(LConn_conn_id, LCu_lecture, LC_sql_stmt);
	EXEC_SQL.DEFINE_COLUMN(LConn_conn_id, LCu_lecture, 1, LC_val_lue, 50);
 
	IF PC_msg_defaut IS NOT NULL THEN
    ADD_LIST_ELEMENT(LC_item_list, LN_indice, LC_val_lue, LC_val_lue);
		LN_indice := LN_indice + 1;
	END IF;
 
	LI_nIgn := EXEC_SQL.EXECUTE(LConn_conn_id, LCu_lecture);
	WHILE ( EXEC_SQL.FETCH_ROWS(LConn_conn_id, LCu_lecture) > 0 ) LOOP
		EXEC_SQL.COLUMN_VALUE(LConn_conn_id, LCu_lecture, 1, LC_val_lue);
    ADD_LIST_ELEMENT(LC_item_list, LN_indice, LC_val_lue, LC_val_lue);
    LN_indice := LN_indice + 1;
	END LOOP;
 
	EXEC_SQL.CLOSE_CURSOR(LConn_conn_id, LCu_lecture);
	EXEC_SQL.CLOSE_CONNECTION(LConn_conn_id);
	RETURN TRUE;
EXCEPTION WHEN EXEC_SQL.PACKAGE_ERROR THEN
  -- même si une erreur s'est produite il faut fermer les curseurs et la connexion
  IF EXEC_SQL.IS_CONNECTED(LConn_conn_id) THEN
    IF EXEC_SQL.IS_OPEN(LConn_conn_id, LCu_lecture) THEN
      EXEC_SQL.CLOSE_CURSOR(LConn_conn_id, LCu_lecture);
    END IF;
    EXEC_SQL.CLOSE_CONNECTION(LConn_conn_id);
  END IF;
	RETURN FALSE;
END;
Quelle erreur de base suis-je en train de commettre ?
Merci à tou(te)s
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 12h41   #2
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
Bonjour Magnus,

Il y a quelque chose dans ton code qui m'interpelle : tu fais un clear_list (=suppression de tous les éléments de ta liste) et ensuite tu essaies de faire un delete_list_element, ce qui provoque ton erreur puisqu'il n'y a plus rien à supprimer...

Je vois ce que tu vas me dire : "Oui mais je teste que le nombre d'éléments dans ma liste est supérieur à 0...", ce à quoi je réponds que si ta liste n'est pas required, il y a toujours au moins un élément... la valeur null.

Ce dernier point répond à ton deuxième problème : si tu ne veux pas avoir d'élément null dans ta liste il faut que tu fasses :
Code :
1
2
:monbloc.maliste := <une valeur>;
set_item_property ('monbloc.maliste', required, property_true);
__________________
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 18/01/2007, 16h50   #3
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Salut plaineR

Citation:
Envoyé par plaineR
Il y a quelque chose dans ton code qui m'interpelle : tu fais un clear_list (=suppression de tous les éléments de ta liste) et ensuite tu essaies de faire un delete_list_element, ce qui provoque ton erreur puisqu'il n'y a plus rien à supprimer
En fait il reste systématiquement un élément qui est la valeur null comme tu le dis après dans ton message.
J'ai donc appliqué la modification dont tu parlais (au design plutôt qu'à l'exécution) et effectivement je n'ai plus de ligne vide à l'affichage.

Cependant, j'aimerais bien que :
- tu m'expliques en quoi le fait de rendre la liste obligatoire permet de supprimer la valeur null par défaut ?
J'avoue que je ne vois pas le rapport
- où as-tu trouvé cette information ? Je ne l'ai vu ni dans la doc ni dans l'article de SheikYerbouti

Merci de ton aide qui m'a encore soulagé d'un problème épineux.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 17h08   #4
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 Magnus
Cependant, j'aimerais bien que :
- tu m'expliques en quoi le fait de rendre la liste obligatoire permet de supprimer la valeur null par défaut ?
J'avoue que je ne vois pas le rapport
Si tu rends un item obligatoire, c'est pour obliger l'utilisateur à saisir une valeur (cela revient à lui interdire la valeur null). Les listes sont des items comme les autres, sauf que tu limites les valeurs possibles :
  • dans une liste obligatoire tu ne laisses pas la possibilité de saisir la valeur null, cette valeur n'apparaît donc pas dans la liste des valeurs possibles
  • dans une liste facultative tu laisses la possibilité de saisir une valeur null, cette valeur apparaît donc dans la liste des valeurs possibles
__________________
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 18/01/2007, 17h20   #5
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Citation:
Envoyé par plaineR
dans une liste facultative tu laisses la possibilité de saisir une valeur null, cette valeur apparaît donc dans la liste des valeurs possibles
ah oui effectivement : si je crée une liste facultative que je l'alimente avec le code suivant :
Code :
1
2
3
4
CLEAR_LIST('bloc.liste');
ADD_LIST_ELEMENT('bloc.liste', ln_indice, 'XXX', 'XXX');
ADD_LIST_ELEMENT('bloc.liste', ln_indice, 'YYY', 'YYY');
...
alors maintenant je comprends que si le clear_list supprimait aussi la valeur null alors il y aurait toujours une valeur NON NULL dans cette liste donc elle ne serait plus réellement facultative.

C'est clair.
je te remercie plaineR.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 11h13   #6
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Je me permets de réouvrir ce sujet car je constate que sur une liste qui n'est PAS à sélection multiple, la modification de la propriété REQUIRED ne permet pas de supprimer la valeur nulle.

En compulsant la doc, ils préconisent d'interrompre les requêtes en cours par ABORT_QUERY, etc. mais ces méthodes ne permettent quand même pas de supprimer cette valeur nulle.

Auriez-vous une explication et surtout une manière de procéder ?

[EDIT]
Mon collègue a trouvé : cette suppression de la valeur nulle peut s'effectuer sur une liste instantanée ou une zone de liste déroulante mais pas sur une liste de sélection .
[/EDIT]
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus 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 20h09.


 
 
 
 
Partenaires

Hébergement Web