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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    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 Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    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 confirmé Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    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 confirmé Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    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 Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    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

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/07/2014, 12h41
  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, 14h12
  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, 18h53
  4. Récupérer le numéro du dernier enregistrement
    Par Bazooka dans le forum Access
    Réponses: 3
    Dernier message: 27/01/2007, 00h22
  5. Réponses: 5
    Dernier message: 01/02/2005, 18h29

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