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 :

Champ séquenciel automatique


Sujet :

Forms Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 84
    Par défaut Champ séquenciel automatique
    Bonjour à tous,

    j'ai un item que je voudrai séquentiel , j'ai donc fait un trigger dans lequel j'ai initialisé ce champ:

    select s_num_res.nextval into :a_reservation.num_res from dual;

    jusque là pas de soucis, seulement en y réfléchissant mieux ce que je veux c'est la valeur courante car une fois nextval est générée on ne peut plus revenir en arrière.

    En écrivant ce même bout de code avec currval, le champ reste vide !!!

    Quelqu'un aurait-it une idée ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Pour avoir une valeur courante, il faut d'abord une valeur.
    Donc, d'abord tu fais nextval, et ta session "possede" une valeur. Ensuite tu peux faire currval pour récuperer la valeur que tu possede ou nextval pour en avoir une autre.

    En passant : ce n'est pas une question forms, c'est une question PL/SQL.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 84
    Par défaut
    Merci pour votre réponse, mais si vous aviez bien lu ma question vous auriez vu que je n'ai essayé le currval qu'apès avoir tenté le nextval , Donc la première initialisation de la séquence est déjà faite.

    Et c'est d'ailleurs pour cette raison que j'ai posé ma question ici, car en effectuant cette même opération avec pl/sql ça marche !

    Mais merci quand même pour la réponse.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Ben non, quand je lis votre intervention, je lis que vous avez fait un nextval, et qu'ensuite, vous avez modifié votre programme pour faire currval à la place. Comme quoi, c'est pas simple d'être clair.

    si vous avez d'abord fait un nextval puis, aprés un currval, il n'y a aucune raison que cela ne marche pas. [edit] Sauf si, entre temps, vous avez fait un commit. Dans ce cas, je pense que vous avez perdu votre valeur courante de sequence.

    Donnez votre code.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 84
    Par défaut


    Dans le trigger du bloc de données when-new-block-instance, j'ai écrit :

    select s_num_res.currval into :a_reservation.num_res from dual;

    après l'avoir déjà essayé avec nextval et atteint la valeur 3 de ma séquence.

    Avec nextval il affiche à chaque fois, alors qu'avec currval, rien n'est affiché dans le champ num_res.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 84
    Par défaut
    j'ai failli oublié, je n'ai aucun commit dans ce trigger

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Citation Envoyé par mayya Voir le message


    Dans le trigger du bloc de données when-new-block-instance, j'ai écrit :

    select s_num_res.currval into :a_reservation.num_res from dual;

    après l'avoir déjà essayé avec nextval et atteint la valeur 3 de ma séquence.

    Avec nextval il affiche à chaque fois, alors qu'avec currval, rien n'est affiché dans le champ num_res.
    me semble contradictoire avec :
    Citation Envoyé par mayya Voir le message
    Merci pour votre réponse, mais si vous aviez bien lu ma question vous auriez vu que je n'ai essayé le currval qu'apès avoir tenté le nextval , Donc la première initialisation de la séquence est déjà faite.

    Et c'est d'ailleurs pour cette raison que j'ai posé ma question ici, car en effectuant cette même opération avec pl/sql ça marche !

    Mais merci quand même pour la réponse.
    On tourne en rond :
    begin
    select s_num_res.nextval into :a_reservation.num_res from dual;
    -- initialise une valeur courante dans la sequence et vous l'attribue
    select s_num_res.currval into :a_reservation.num_res from dual;
    -- si vous voullez réutiliser une valeur de séquence qui vous a déja été attribuée
    end;

    si vous commencez votre programme par :
    select s_num_res.currval into :a_reservation.num_res from dual;
    comme vous n'avez pas de valeur attribuée, cela répond au mieux une erreur !

    Vous etes vraiment sûr que
    commit;
    select s_num_res.currval from dual;

    affiche quelque chose ?

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 84
    Par défaut
    le truc c'est que dans je veux que quand cette page se charge, il la valeur à laquelle la séquence est arrivée, de telle sorte que je n'incrémente que si l'user valide,

    par contre si l'utilisateur ne valide, je n'ai aucune raison d'incrémenter la valeur de la séquence car je vais l'utiliser comme clé primaire dans la base, et je voudrais qu'elle soit séquencielle successive,
    mais si je fais un nextval à chaque chargement de la page, les valeurs de clés primaires ne seront pas successives.

    Auriez-vous une proposition pour parvenir à résoudre se problème?

    J'ai d'ailleurs découvert aujourd'hui un autre soucis:même avec nextval, en appelant cette forme depuis un menu, cet item reste vide !

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Là, je déprime un bon coup. C'est à tuer les bonnes volontés.
    Si vous aviez seulement lu le lien que j'ai mis dans mon premier poste, vous sauriez que ce que vous faites c'est l'erreur de base du débutant.
    A votre avis, si j'ai mis ce lien, c'est pour faire joli ?

    Les choses ne sont pas magique, elles ne fonctionnent pas comme on en a envie, elle marchent comme dans la doc, sauf bug.

    Pour votre problème, la séquence n'est pas la solution.
    Une table avec une ligne et une colonne qui sert de compteur. par contre elle ne se lit pas en when-new-block-instance, elle se lit quand c'est necessaire et qu'on ne va pas la bloquer pour les autres users (pre-insert).

  10. #10
    Membre éclairé Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Par défaut
    je crois que vous voulez faire un champ qui s'incrémente a chaque fois que valider, essei de faire un déclencheur sur ton item de type pre text item , avec se code PL/SQL comme celui ci, je l'ai utiliser pour incrémenter le numéro de la commande
    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
    declare 
    	k  commande.ncom%type;
    	x commande.ncom%type;
     
    	cursor cmd is select ncom from commande order by ncom;
    begin
     
    	 open cmd;
    	 loop
    	 	fetch cmd into  k;
    	 	exit when cmd%notfound;
    	 	x:=k;
    	 end loop;
         close cmd;
       :commande.ncom:=x+1;
    	end;
    bon courage

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Bonjour

    pour Sofiane
    vous etes sûr de votre code???
    Vous lisez tous les records de la table commande pour avoir le dernier.
    un max + 1 me parait plus judicieux?

    Cdt

  12. #12
    Membre éclairé Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Par défaut
    salut,
    je suis sur de mon code, d'alleurs il s incrémente a chaque fois . vous faite un déclencheur pre-text-item. Donc a chaque fois que vous executer le forms il vous donnera le numéro automatiquement, vous n'auriez plus a chercher c'est quoi le dérnier,
    espérons bien que c'est la chose que vous chercher.
    bon courage.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Bonsoir,

    je doute pas du resultat mais seulement de la facon de l'atteindre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare 
    	prevcmd number(6);
    begin
    	 select max(ncom)+1
             INTO prevcmd
             FROM commande;
    end;
    au niveau performance, ca sera bien mieux.
    cdt

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 84
    Par défaut
    Merci à tous problème résolu.

    En fait mon idée en elle même était fausse car elle n' a pas pris en considération le fait que plusieurs clients peuvent ouvrir cette application, et donc les résultats ne seraient plus concordant et les valeurs dans la base ne seraient pas successives.
    L'idée étant alors, de ne pas montrer le numéro jusqu'à validation au cours de laquelle on insèrera le nextval tout simplement.
    ça marche et ça respecte la notion de serveur/clients .

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Citation Envoyé par mayya Voir le message
    Merci à tous problème résolu.

    En fait mon idée en elle même était fausse car elle n' a pas pris en considération le fait que plusieurs clients peuvent ouvrir cette application, et donc les résultats ne seraient plus concordant et les valeurs dans la base ne seraient pas successives.
    L'idée étant alors, de ne pas montrer le numéro jusqu'à validation au cours de laquelle on insèrera le nextval tout simplement.
    ça marche et ça respecte la notion de serveur/clients .

    Ce qui est en gras est faux.
    A chaque arret de la base, tu peux perdre des numéros. Quand tu donne le nextval, tu n'es pas sûr que ton commit va bien se passer et tu peux perdre un numéro.

    Comme je disais plus haut dans ce topic, les choses marchent "comme dans la doc", . Clairement, lire la doc est un concept difficile à faire passer. Et, dans la doc, il est écrit que quand on veut des numéros qui se suivent sans trou, on ne prend pas de séquences.

    C'est marrant, j'aurais expliqué la chose 3 fois, dont une fois avec un lien, pour voire finir le topic par : L'idée étant alors, de ne pas montrer le numéro jusqu'à validation au cours de laquelle on insèrera le nextval tout simplement.

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

Discussions similaires

  1. Remplir le champ CC automatiquement sous Outlook
    Par Labore dans le forum VBA Outlook
    Réponses: 19
    Dernier message: 26/05/2020, 12h00
  2. remplir des champs texte automatiquement avec base
    Par rvm31 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/11/2007, 09h55
  3. Créer des champs en automatique dans formulaire
    Par Daniel MOREAU dans le forum VBA Access
    Réponses: 5
    Dernier message: 28/06/2007, 18h14
  4. Mise à jour champ texte automatique
    Par Chlo dans le forum Access
    Réponses: 6
    Dernier message: 25/01/2007, 10h20
  5. champ numérique automatique
    Par clara2005 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 17/05/2006, 17h42

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