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

  1. #1
    Membre éclairé
    Créer un générateur qui donne une séquence de chiffres
    Bonjour à tous
    j'ai deux questions :
    1 - je voudrais savoir sil est possible de créer la série de nombre suivant avec un générateur :
    0001
    0002
    ....09
    0010
    ......
    0099
    0100
    2 - Peut on créer un générateur sans trous pour une table ? ou Comment supprimer les trous (chiffre non utiliser dans table) générer le générateur ?
    exemple :
    1
    2
    4 "Ici le 3 n'existe parce que non utiliser dans la table"

    Merci à tous
    vous connaitrez la vérité et la vérité vous affranchira !
    windev/firebird/Mkframework
    vous devez tous l'éssayer impressionnant pour Débutant, Confirmé et Expert
    http://mkframework.com/accueil.html
    http://sqlmanagerx.com/

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    1 - à partir du moment où le générateur est géré par un trigger et que la série est logique ce n'est qu'une question de code.

    2- un générateur sans trou ? Non je ne pense pas. Renuméroter et ré-initialiser le générateur oui c'est possible

    Exemple :

    Soit une table (UTILISATEUR) avec une colonne ID_UTILISATEUR utilisant une séquence GEN_ID_UTILISATEUR gérée par un trigger

    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
     
    SET TERM $; -- pour FlameRobin
    execute block
    as
    declare R int = 1;
    declare ID integer;
    declare TMP integer;
    begin
      for SELECT ID_UTILISATEUR FROM UTILISATEUR ORDER BY ID_UTILISATEUR INTO :ID 
      do
      begin
        UPDATE UTILISATEUR SET ID_UTILISATEUR=:R WHERE ID_UTILISATEUR=:ID AND ID_UTILISATEUR<>:R;
        R = R + 1;
      end
      R=R-1;
      tmp = GEN_ID(GEN_UTILISATEUR_ID, 0);
      if (tmp <> R) then
          tmp = GEN_ID(GEN_UTILISATEUR_ID, R-tmp);
    end$
    SET TERM ;$  -- Retour
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre éclairé
    BONJOUR SERGIO
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,
    1 - à partir du moment où le générateur est géré par un trigger et que la série est logique ce n'est qu'une question de code.
    Oui ici j'ai compris mais comment gérer le fait que j'ai 000 avant le 1 pour former 0001 ? puis que ici mon générateur est un entier et n'accepte pas les 0 a gauche du chiffre ?
    j'avoue que je sais comment faire ?

    Concernant le générateur sans trou je suis tombé sur ce article https://octobinz.developpez.com/articles/interbase/generateurs/, j'essaie en ce moment de le mettre en oeuvre
    Mais ma difficulté est qu'ici j'ai 4 tables qui doivent être sans trous. donc j'imagine un peu le travaille à faire .

    Merci Sergio et mercia à tous
    vous connaitrez la vérité et la vérité vous affranchira !
    windev/firebird/Mkframework
    vous devez tous l'éssayer impressionnant pour Débutant, Confirmé et Expert
    http://mkframework.com/accueil.html
    http://sqlmanagerx.com/

  4. #4
    Membre éclairé
    Bonjour à tous

    1- GÉNÉRATION DE CODE DE TYPE 0001 -00002 ect...

    Finalement en cherchant toujours je suis tombé sur cet post https://www.developpez.net/forums/d293885/bases-donnees/firebird/sql/incrementer-varchar-contient-chiffres/
    j'ai donc modifié et voici mon code (Pouvant être amélioré bien sur !):
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SET TERM ^ ;
    
    CREATE PROCEDURE NEW_MONTEST()
    RETURNS(
      MON_NUMERO VARCHAR(6) CHARACTER SET ISO8859_1)
    AS
    DECLARE VARIABLE TRAMP INTEGER;
    BEGIN
    TRAMP = gen_id(MONTEST,1);/*MONTEST est un générateur que j'ai crée*/
    MON_NUMERO  = LPAD(TRAMP,5,0); /* Fonction Lpad */
      SUSPEND;
    END^
    SET TERM ; ^

    Fonction LPAD : https://translate.google.com/translate?hl=fr&sl=en&u=https://firebirdsql.org/refdocs/langrefupd21-intfunc-lpad.html&prev=search

    2- POUR LA SÉQUENCE PUR SANS TROUS
    https://octobinz.developpez.com/articles/interbase/generateurs/
    Pour la Séquence sans trou j'essai d'avoir une fonction factorisée sur la base de l'article ci-dessus, pour éviter d'avoir plusieurs triggers par tables, dans mon cas j'ai 5 tables
    Je cherche toujours donc.

    Merci à tous
    vous connaitrez la vérité et la vérité vous affranchira !
    windev/firebird/Mkframework
    vous devez tous l'éssayer impressionnant pour Débutant, Confirmé et Expert
    http://mkframework.com/accueil.html
    http://sqlmanagerx.com/

  5. #5
    Rédacteur/Modérateur

    1- GÉNÉRATION DE CODE DE TYPE 0001 -00002 ect...
    Je n'avais pas compris qu'il s'agissait d'une question "cosmétique", je crois que la séquence sautait de 2 à 9 puis de x à y. Là vous parlez simplement d'un remplissage avec des zéros non significatif.
    AMHA cela n'a aucune utilité au sein de la base de données, une séquence reste et restera numérique. Que vous vouliez ensuite, pour des raisons de facilité de lecture, afficher des zéros non significatifs en utilisant LPAD se fait directement à l'intérieur d'un SELECT.
    Toujours à mon humble avis, utiliser un séquence pour obtenir une colonne VARCHAR c'est faire montre d'une structure de table éronnée
    2- POUR LA SÉQUENCE PURE SANS TROUS
    Vous n'avez qu'à utiliser un fichier avec plusieurs lignes (une par table) exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE NUMUNIQUES (NOMTABLE VARCHAR(30),LASTNUM INTEGER, CONSTRAINT PK_NUM PRIMARY KEY (LASTNUM));
    INSERT INTO NUMUNIQUES VALUES ('TABLE1',0);
    INSERT INTO NUMUNIQUES VALUES ('TABLE2',0);
    INSERT INTO NUMUNIQUES VALUES ('TABLE3',0);
    INSERT INTO NUMUNIQUES VALUES ('TABLE4',0);
    INSERT INTO NUMUNIQUES VALUES ('TABLE5',0);

    Cependant, à moins de gérer les incrémentations par programme, vous serez toujours obligé de faire un Trigger par table
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Membre éclairé
    Merci Sergio pour toutes ses précisions.
    vous connaitrez la vérité et la vérité vous affranchira !
    windev/firebird/Mkframework
    vous devez tous l'éssayer impressionnant pour Débutant, Confirmé et Expert
    http://mkframework.com/accueil.html
    http://sqlmanagerx.com/