PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Base de Données HFSQL - réindexation clé automatique
Base de Données HFSQL - réindexation clé automatique
Iniciado por JVE, 03,feb. 2020 09:36 - 7 respuestas
Miembro registrado
48 mensajes
Publicado el 03,febrero 2020 - 09:36
Bonjour

Savez vous comment réindexer/réinitialiser la clé automatique d'un fichier d'une base HFSQL ? J'ai fait beaucoup de tests et avant de lancer l'application aux utilisateurs je souhaiterais faire le ménage sur cette clé (pour commencer à 1 par exemple)?

Merci pour votre aide
Miembro registrado
4.362 mensajes
Publicado el 03,febrero 2020 - 10:29
A part supprimer le fichier ?
Tout repasser en ordre "chronologique" sans "trous" va mettre un beau bazar au niveau des relations
Avec une PK GUID, le problème ne se pose plus.

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
2.321 mensajes
Publicado el 04,febrero 2020 - 08:22
Bonjour,

Faire une fonction qui copie les données du fichier existant dans un Alias ?

--
Bon dev,
Jean-Pierre
Miembro registrado
4.362 mensajes
Publicado el 04,febrero 2020 - 10:28
Jean-Pierre a écrit :
Faire une fonction qui copie les données du fichier existant dans un Alias ?

Et retrouver toutes les FK dans le reste de la base ?
Le problème va se résoudre de lui même lors de l'installation. Les tables vont être recrées vides et les PK auto vont seront initialisées à 1

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
2.321 mensajes
Publicado el 04,febrero 2020 - 18:37
Voroltinquo a écrit :
Jean-Pierre a écrit :
Faire une fonction qui copie les données du fichier existant dans un Alias ?

Et retrouver toutes les FK dans le reste de la base ?
Le problème va se résoudre de lui même lors de l'installation. Les tables vont être recrées vides et les PK auto vont seront initialisées à 1

--
Il y a peut être plus simple, mais, ça tourne


Désolé mais je ne suis pas Bac+6 en informatique…;-)
Que veut dire FK et PK ?

NB : la question initiale n'est pas claire :
- soit il n'y a pas de données, et il suffit d'un hCreation ou hCreationSiInexistant comme tu l'indiques,
- soit il y a des données à copier dans le projet et ma proposition est valable.

--
Bon dev,
Jean-Pierre
Miembro registrado
4.362 mensajes
Publicado el 04,febrero 2020 - 19:13
PK : Primary Key
FK : Foreign Key (c'est la rubrique qui sert de relation entre 2 tables)

Le problème est que si on modifie la PK (qui pointe sur d'autres enregistrements dans une autre table,) il faut rechercher tous les enregistrements reliés et modifierla FK en conséquence.
Prenons le cas suivant :




Avec les responsables suivants : Toto (PK 3 ), Titi (PK 8 ) et Tata (PK 9.)
Si on renumérote les PK (1,2 et 3,) les ateliers qui avaient Toto comme contacts (FK_Contact = 3) vont se voir affecter Tata.
De même Toto et Titi n'auront plus d'ateliers, ou auront les ateliers du contact avec la PK 1 (resp 3)

--
Il y a peut être plus simple, mais, ça tourne
Mensaje modificado, 04,febrero 2020 - 19:14
Miembro registrado
166 mensajes
Publicado el 04,febrero 2020 - 20:33
Miembro registrado
4.362 mensajes
Publicado el 05,febrero 2020 - 17:37
La petite procédure suivante devrait résoudre ton problème. Je n'ai pas fait les tests d'erreur pour chaque fonction, je te laisse un peu de boulot.
Il y a de la propagation d'erreur à mettre en place
Procedure NettoyerTable()

SI PréparerTables()>1 ALORS
Erreur(HErreurInfo)
FIN
Réaffecter()
RetourModeNominal()


FONCTION PréparerTables():booléen

HFerme(Contact)
//On crée la table "Hors analyse" qui sera rempli
HChangeNom(Contact,"NouveauContact")
HCreation(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)


FONCTION Réaffecter():booléen
NouveauContact est Source dede 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:


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:


--
Il y a peut être plus simple, mais, ça tourne