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

SQL Firebird Discussion :

Créer un générateur qui donne une séquence de chiffres


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut 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

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    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/arti...e/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

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    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/d2...ient-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/transla...ml&prev=search

    2- POUR LA SÉQUENCE PUR SANS TROUS
    https://octobinz.developpez.com/arti...e/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

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 679
    Points : 954
    Points
    954
    Par défaut
    Merci Sergio pour toutes ses précisions.

Discussions similaires

  1. Matisse : créer un formulaire qui gère UNE entité et pas une liste
    Par Chacual dans le forum NetBeans Platform
    Réponses: 0
    Dernier message: 11/06/2009, 19h09
  2. Créer un programme qui gère une webcam
    Par Zarbhi dans le forum Débuter
    Réponses: 8
    Dernier message: 09/06/2009, 17h10
  3. Réponses: 6
    Dernier message: 02/10/2008, 00h02
  4. Lien qui donne une valeur à une variable
    Par marie4449 dans le forum Langage
    Réponses: 1
    Dernier message: 10/04/2007, 13h08
  5. Créer un compte qui donne accès seulement à une imprimante
    Par bart64 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 06/09/2006, 19h19

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