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 :

Manipulations sur le champ d'index


Sujet :

HyperFileSQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Par défaut Manipulations sur le champ d'index
    Bonjour ,
    J'ai importé dans une base de données HFSQL des tables d'une base MySQL en les convertissant via l'assistant.
    Le champ servant d'index à ces tables ayant été importé en tant que champ numérique je l'ai modifié en champ auto incrémenté.
    Le problème rencontré est que la numérotation automatique recommence à 1 au lieu de poursuivre .
    La solution que j'ai trouvée est de rechercher la valeur maximale de mon index , de faire un enregistrement forcé de cet index après l'avoir incrémenté et enfin de supprimer cet enregistrement .
    je souhaite avoir votre avis sur la méthode choisie ainsi que sur sa mise en oeuvre
    et , question subsidiaire ( en fait la vraie question ) : j'utilise ce procédé ( recherche de la valeur maximale de l'index ) pour récupérer l'index d'un enregistrement que je viens d'ajouter ( je n'ai pas trouvé d'équivalent à la commande mysql SELECT LAST_INSERT_ID ).
    J'ai essayé , ainsi qu'inscrit dans l'aide la syntaxe
    Lors de l'exécution d'une requête de type INSERT sur des fichiers de données HFSQL, il est possible de connaître l'identifiant automatique attribué au nouvel enregistrement grâce à la syntaxe <Nom Fichier>.<Nom Rubrique Identifiant automatique>.
    mais la commande me renvoie systématiquement 0; et si je fais un select etc j'ai tous les index.
    Donc ma vraie question est : quelle est la bonne méthode pour récupérer l'index d'un nouvel enregistrement que l'on vient de créer ?

    Voici le code décrit plus haut pour mettre à jour l'index auto incrémenté

    EDIT : j'ai mis à jour le code à la lumière de mes récents progrès
    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
    PROCEDURE Maj_Incremant(sFichier,sRubrique)
    //on récupère l'index le plus élevé
    nID est un entier
    SD est une Source de Données
    sSQL est une chaîne = ChaîneConstruit("SELECT MAX(%1)FROM %2;",sRubrique,sFichier)
    SI PAS HExécuteRequêteSQL(SD,gConnexionBase,hVérifieDoublon+hVérifieIntégrité,sSQL) ALORS
    	Erreur(ErreurInfo)
    	RETOUR
    FIN
    POUR TOUT SD
    	nID = HRécupèreEnregistrement( SD )
    FIN
    HLibère(SD)
     
    //on implémente le dernier index, on crée un enregistrement en forçant cet index avant de le supprimer
    //et on lit le last id pour controler
    nID ++
    sSQL = ChaîneConstruit("INSERT INTO %1 (%2) values (%3);DELETE FROM %1 WHERE %2 = %3;select last_insert_id () FROM %1 LIMIT 1;",sFichier,sRubrique,nID)
    SI PAS HExécuteRequêteSQL(SD,gConnexionBase,hRequêteSansCorrection,sSQL) ALORS
    	Erreur(ErreurInfo)
    	RETOUR
    SINON
    	POUR TOUT SD
    		nID = HRécupèreEnregistrement( SD )
    	FIN
    	HLibère(SD)
    	Info (ChaîneConstruit("l'ID de la table %1 a été mis à jour (%2)",sFichier,nID))
    FIN
    RETOUR
    Merci de m'avoir lu , et merci pour vos réponses
    T.Chatenet

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Par défaut Je me réponds à moi même
    J'ai eu du mal à trouver mais à force de lectures de la doc et des forums j'ai trouvé une solution plus satisfaisante que la recherche de l'index max.
    Je la publie ici en me disant qu'elle servira peut être un jour :-)
    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
    Req_Para est une Requête SQL = 
    [
    	INSERT INTO Table
    	(Rubrique)
    	VALUES
    	({ParamRubrique});
    	SELECT last_insert_id () AS id FROM Table LIMIT 1;
    ]
    Req_Para.ParamRubrique = "nouvel enregistrement"
    nID est un entier
     
    SI PAS HExécuteRequêteSQL(Req_Para,gConnexionBase) ALORS
    	Erreur(ErreurInfo)
    	RETOUR
    FIN
    POUR TOUT Req_Para
    	nID = HRécupèreEnregistrement(Req_Para)
    FIN
    HLibèreRequête(Req_Para)	
    Info ( nID)

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

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 3 000
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Regarde du côté de HAjoute avec l'option hFixeIdAuto

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Bonjour,
    Regarde du côté de HAjoute avec l'option hFixeIdAuto
    Bonjour ,
    Je découvre ta réponse avec quelques jours de retard , désolé .
    Ca fonctionne !
    Merci !

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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 : 345
    Par défaut
    J'ajouterais que désormais on peut s'épargner une requête supplémentaire avec last_insert_id grâce à la nouveauté de WD2024, RETURNING

    https://blogs.pcsoft.fr/fr/focus-nou...11114/read.awp

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

Discussions similaires

  1. Indexe sur les champs de type DATETIME
    Par Thierry8 dans le forum Requêtes
    Réponses: 9
    Dernier message: 25/06/2006, 20h45
  2. Undefined index sur un champs select
    Par kcizth dans le forum Langage
    Réponses: 1
    Dernier message: 06/04/2006, 10h47
  3. Réponses: 4
    Dernier message: 23/09/2005, 10h16
  4. [Index] votre avis sur 1 champ
    Par stailer dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 21/07/2004, 13h28
  5. n INDEXs sur chaque champ ou 1 seul INDEX sur n ch
    Par fourchette dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/04/2004, 11h55

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