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

HyperFileSQL Discussion :

HFSQL Numéro auto


Sujet :

HyperFileSQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Points : 33
    Points
    33
    Par défaut HFSQL Numéro auto
    Bonsoir a tous,

    Voila je vous expose ma question de ce soir:

    J'ai un fichier HFSQL qui posséde un champ n° auto qui sert comme souvent de cle unique.

    Mon soucis se situe dans le fait ou, lorsque je dois supprimer un enregistrement dans ce fichier de donnés, je supprime également ce n° unique.
    Je me retrouve donc avec des n° manquants:
    1
    2
    4
    6
    8
    etc...
    Comment faire pour retrouver une liste de n° propre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    num_enregistrement est un entier = 1
     
     
    HLitPremier(Stock,IDStock)
    TANTQUE HEnDehors(Stock) = Faux 
    	Stock.IDStock = num_enregistrement
    	HModifie(Stock)
    	num_enregistrement++
    	HLitSuivant()
    FIN
    Sans succès. Le champ semble ne pas être modifiable !

    Merci

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    je ne comprends pas pourquoi tu veux renuméroter ton id auto, mais bon...

    2 solutions :
    - tu modifies ta rubrique IDAuto en une rubrique numérique que tu modifies avec ton code.
    - tu regardes du côté de l'option hForceIdAuto et ton code devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Stock.IDStock = num_enregistrement
    	HModifie(Stock, hForceIdAuto)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 325
    Points : 785
    Points
    785
    Par défaut
    L'id auto (qui devrait se trouver dans TOUS les fichiers de la base, excepté certaines tables de liaisons où c'est sujet à discussion), ne doit pas être modifiable.
    Si tu veux un id que tu gères toi même, ajoutes une colonne. Il est normal qu'il y ai des trous dans les ID Auto si tu supprimes des enregistrements.

    Selon moi, hForceIDAuto même si c'est une solution tout à fait possible pour gérer l'id toi même, n'est pas une bonne idée pour la maintenabilité du code à long terme. Peu de dev s'attendront à ce qu'un ID Auto soit modifié de façon forcée à travers le code.

    Mais j'ai pas compris pourquoi le fait que les suppressions créent des trous te dérange? Y'a peut être une raison métier.

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Le fait de tout renuméroter risque de mettre un beau bazar dans les relations.
    C'est un coup à se retrouver (au mieux) avec des client réaffecté à un responsables clientèle sans que personne ne soit au courant, ou des factures envoyées au mauvais clients.
    Si tu utilises un numéro GUID ce ne sont plus des trous que tu vas avoir, même avec de enregistrements consécutifs, mais parfois le grand canyon.

    Sinon pour le "fun", en se basant sur le MLD suivant :
    Nom : screenshot0402202019h05n01_1cdcf26fa08c85979ba9de87ffaaabe3.png
Affichages : 182
Taille : 9,4 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PROCÉDURE NettoyerTable()
     
    SI PréparerTables()>1 ALORS
         Erreur(HErreurInfo)
    FIN
    Réaffecter()
    RetourModeNominal()

    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
     
    FONCTION PréparerTables():booléen
     
    HFerme(Contact)
    //On crée la table "Hors analyse" qui sera rempli
    HChangeNom(Contact,"NouveauContact")
    HCréation(Contact)
    HFerme(Contact)
     
    //On revient à la table "Normale"
    HChangeNom(Contact,"Contact")
    HOuvre(Contact)
     
    RENVOYER Vrai
    CAS ERREUR:
         RENVOYER HErreurInfo(hErrFichier)
    CAS EXCEPTION:
         RENVOYER HErreurInfo(hErrCodeSystème)

    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
     
    FONCTION Réaffecter():booléen
    NouveauContact est Source de Données
    sCheminTable est une chaîne
    EnrContact est un Enregistrement de Contact
     
    n8AncienFK est un entier sur 8 octets
    n8NouveauFK est entier sur 8
     
    REQ_Réaffectation est une Requête SQL =
    [
    UPDATE
         Atelier
    SET
         FK_Contact = {pNouveauContact}
    WHERE
         Atelier.FK_Contact = {pAncienContact}
    ]
     
     
    sCheminTable=fConstruitChemin(fRepDonnées,"NouveauContact","fic")
    HDéclareExterne(sCheminTable,NouveauContact)
     
    POUR TOUT Contact //On parcourt la table "à trous"
        n8AncienFK=Contact.PK_Contact
        EnrContact=Contact
        NouveauContact=EnrContact
        HAjoute(NouveauContact)
        n8NouveauFK=NouveauContact.PK_Contact
     
       REQ_Réaffectation.pAncienContact=n8AncienFK
       REQ_Réaffectation.pNouveauContact=n8NouveauFK
       HExécuteRequête(REQ_Réaffectation)
    FIN
     
    //Les données de Contact.FIC se trouvent dans NouveauContact.FIC
    //Les FK de la table Atelier sont à jour
    //On peut libérer les variables de travail
    HFerme(NouveauContact)
    HAnnuleDéclaration(REQ_Réaffectation)
    HAnnuleDéclaration(NouveauContact)
     
    RENVOYER Vrai
     
    CAS ERREUR:
    CAS EXCEPTION:
    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
     
    FONCTION RetourModeNominal():booléen
    sCheminContact est une chaîne
    sCheminSwap est une chaîne
     
    HFerme(Contact)
     
    //Ce n'est pas élégant mais c'est rapide, même avec la réindexation
    sCheminContact=fConstruitChemin(fRepDonnées,"Contact","*")
    fSupprime(sCheminContact)
    sCheminContact=fConstruitChemin(fRepDonnées,"Contact","FIC")
    sCheminSwap=fConstruitChemin(fRepDonnées,"NouveauContact","FIC")
    fRenomme(sCheminSwap,sCheminContact)
    sCheminSwap=fConstruitChemin(fRepDonnées,"NouveauContact","*")
    fSupprime(sCheminSwap)
     
    HRéindexe(Contact,hVérifieMémo)
    HOuvre(Contact)
     
    RENVOYER Vrai
    CAS ERREUR:
    CAS EXCEPTION:
    Et ça ce n'est que pour 2 tables.
    Dans l'absolu il faudrait faire ça pour toutes les tables de l'analyse et toutes leurs liaisons.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

Discussions similaires

  1. Numéro auto dans une requete
    Par genius99 dans le forum Access
    Réponses: 4
    Dernier message: 06/10/2005, 09h40
  2. Numéro auto-incrément
    Par mona dans le forum Débuter
    Réponses: 6
    Dernier message: 17/05/2005, 21h18
  3. Comment faire un numéro auto??
    Par the_new dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/03/2005, 16h49
  4. INSERT INTO numéro auto.
    Par Pfeffer dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/02/2005, 19h04
  5. Numéro auto ===== Question bête
    Par Nicos77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2003, 13h04

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