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 :
FRM-41331
Je vous donne le code de la procédure qui alimente la liste à titre indicatif :
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
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