IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Forms Oracle Discussion :

[forms 9i] DELETE_LIST_ELEMENT sur liste instantanée


Sujet :

Forms Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    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 :
    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

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :monbloc.maliste := <une valeur>;
    set_item_property ('monbloc.maliste', required, property_true);

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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.

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    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

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/04/2013, 19h44
  2. [Form] Superposition d'une liste select sur une div 'absolute'
    Par BRAUKRIS dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 09/02/2007, 18h43
  3. [C#] [Win forms] Info bulle sur bouton
    Par RobinJulie dans le forum Windows Forms
    Réponses: 4
    Dernier message: 25/11/2004, 16h12
  4. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47
  5. [VB6] Déplacer la form sans cliquer sur la barre de titre
    Par Ingham dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/11/2002, 02h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo