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

Bases de données Delphi Discussion :

[ADO] Récupérer l'ID du dernier enregistrement sans requêter


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut [ADO] Récupérer l'ID du dernier enregistrement sans requêter
    Bonjour à tous !

    Je suis en train de coder une application qui récupère des lignes d'un fichier Excel et qui après traitement les enregistre dans une BDD access.

    Grosso modo, ce fichier excel représente une facture et chacune des lignes contient des informations sur l'entitée facturée (identifiant, montants...etc...).

    Mon processus se déroule de cette manière :
    - Copie des données du fichier excel dans une table temporaire de ma BDD
    - Requête type "Select * from TableTemporaire"
    - pour chaque ligne : création d'un objet facture + remplissage des membres en lisant le résultat de la requête précédente
    - Chaque objet facture génère une string type "Insert into Facture etc..."
    - Quand toutes les lignes sont traitées on exécute toutes les requêtes Insert Into

    En plus de ça, l'appli effectue des vérifications sur chacune des lignes et en cas d'erreur ajoute un enregistrement dans une table FACTURE_ERREUR dont la structure ressemble à : IDFacture, IDErreur.

    Le fichier excel contient environ 500 lignes, ce qui fait qu'au total à la fin du processus j'effectue un grand nombre de requêtes (enfin pour moi c'est un grand nombre). En gros ça fait : 500 + (500 * nombre d'erreurs) si les 500 lignes contiennent au moins une erreur.
    Ca commence à faire pas mal de requêtes !

    Mais le problème n'est pas là. En fait, après chaque insertion dans la table Facture j'aimerais récupérer l'ID de cette facture qui est en NuméroAuto dans Access, et j'aimerais le faire sans effectuer de requête du genre 'Select MAX(ID) from Facture' à chaque ligne de facture enregistrée parce que ça allongerait considérablement la durée du processus d'enregistrement.

    J'ai besoin de cet ID pour les insertions dans la table FACTURE_ERREUR.

    Existe-t-il une méthode ou une astuce avec un composant ADO (j'utilise des TADOQuery pour mes requêtes) pour récupérer cet ID qui s'incrémente automatiquement ?

    Merci d'avances pour vos réponses !

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut
    Tu executes une requête avant le premier insert pour avoir le Max + 1 que tu stockes dans une variable que tu incrémentes avant chaque fabrication d' Insert.

  3. #3
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    héhé, pas bête du tout !

    C'est un peu bricolé mais je pense que niveau performances je pourrais pas trouver mieux.

    Merci pour cette réponse, ALWEBER

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 112
    Points
    112
    Par défaut juste un bémol
    Cette technique est valable si tu es le seul à faire des insertions dans la table FACTURE. Si des insertions ont lieu dans ta table FACTURE parallèlement à ton traitement, tu risques d'avoir des incohérences dans ta table FACTURE_ERREUR.
    Pour que cette solution soit sans risque, il faut que tu "protèges" le déroulement de ton traitement au sein d'une transaction avec un verrou en écriture sur ta table FACTURE.

  5. #5
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Effectivemment, apad, tu as raison.

    Dans mon cas l'application est monoposte donc je ne rencontrerais pas ce problème.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    attention aussi si tu fais des suppression. si tu prend la sequence suivante:
    (NextId = 1)

    INSERT
    INSERT
    DELETE
    INSERT

    tu aura alors dans ta base les ids 1 et 3 !
    Numero auto ne prend pas Max+1 mais la prochaine valeur de son compteur interne

  7. #7
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Si je supprime toutes les données de la table, le NuméroAuto n'est pas reset.

    Mais si je requête pour avoir la valeur maximale il me retourne 0 (normal), alors qu'en réalité, le NuméroAuto est déjà bien plus élevé.

    En production ce cas ne devrait jamais se présenter mais je préfère quand même me méfier.
    Il n'existe pas d'autres façons de connaitre la valeur du NuméroAuto ? Ou, au pire, de le faire repartir de zéro via mon application (avec Access j'ai peu d'espoir).

  8. #8
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    je crois pas que ce soit possible

    j'utilise une methode un peu bourrin, qui vaut ce qu'elle vaut (pas tres efficace mais pratique, surtout si ta table a des acces concurents), c'est d'avoir un champ (j'utilise un float pour une comparaison plus rapide) dans lequel tu stock une valeur unique (un timestamp par exemple + qqchose qui va le differencier d'un autre timestamp identique sur une autre machine). Ainsi, tu insere cette valeur en meme temps que tes données, et tu es quasiment sur de pouvoir le recuperer en faisant un select sur cette valeur.
    Ca vaut ce que ca vaut, ca depanne mais si tu utilisait postgres par exemple, tu pourrai faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nextval('MonCompteur')
    qui te retournerai la prochaine valeur de compteur tout en l'incrementant.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/07/2014, 11h41
  2. Récupérer les 10 derniers enregistrements sans order by
    Par supcomingenieur dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2013, 13h12
  3. [MySQL] Récupérer l'id du dernier enregistrement
    Par philippef dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/10/2007, 17h53
  4. Récupérer le numéro du dernier enregistrement
    Par Bazooka dans le forum Access
    Réponses: 3
    Dernier message: 26/01/2007, 23h22
  5. Réponses: 5
    Dernier message: 01/02/2005, 17h29

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