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 :

probleme de numerotation des données dans une table


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut probleme de numerotation des données dans une table
    Bonjour à tous!
    j'ai crée une table en access ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NR                 NumeroAuto indexé sans doublons  
             IDCONTACT     Numerique   indexé avec doublons
             NOMCONTACT  Texte
    Je voudrais que chaque enregistrement ait un IDCONTACT lors de l'encodage dans la base de données.
    Dans la partie programmation, je voudrais que le programme me donne toujours IDCONTACT+1 lors de l'encodage d'un NOMCONTACT et si je mets un IDCONTACT deja existant , il m'envoie un message d'erreur disant que ce numero existe deja dans la table .
    Dans l'evenement OnShow de ma feuille , j'ai mis ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TContactForm.FormShow(Sender: TObject);
    var nIDContact:variant;
    begin
      DM.tbContact.Last;
      nIDContact:=DM.tbContactIDCONTACT.Value + 1;
      Edit_Numero.Text:=IntToStr(nIDContact);
    ceci afin qu'il se donne toujours l'IDCONTACT+1 lorsque je veux encoder un nouveau NOMCONTACT.
    et dans l'evenement OnExit du l'Edit_Numero ce code ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TContactForm.Edit_Numero(Sender: TObject);
    var resultat, nIDContact:variant;
    begin
      resultat:=DM.tbContact.Locate('IDCONTACT',StrToInt(Edit_Numero),[]);
      if resultat then
      begin
        MessageDlg('        Ce numéro existe déjà !!!        ',
        mtInformation,[mbOk],0);
        DM.tbContact.Last;
        nIDContact:=DM.tbContactIDCONTACT.Value + 1;
        Edit_Numero.Text:=IntToStr(nIDContact);
        Edit1.SetFocus;
        exit;
    mais lorsque je suis sur cette feuille , il me donne bien l'IDCONTACT+1 ,et lorsque j'encode , il n'a pas encoder le numero dans la table, il n'a pris que le NOMCONTACT.
    je ne trouve pas l'erreur;
    merci pour votre aide à tous!

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je te conseille plutôt de mettre ton champ à AUTOINCREMENT UNIQUE comme ça le numéro est incrémenté automatiquement par la base.

  3. #3
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    j'utilise sa dans le cas ou je voudrai mieux controlé l'incrément

    je créer une reuqete avec le code SQL suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT TOP 1 IdContact AS Numero FROM MaTable
    ORDER BY IdContact DESC
    et dans ta table dans l'événement en OnNewRecord

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query1.requery();
    MaTabeIdContact.Value := Query1Numero.Value+1;

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    merci je vais essayer ce que vous avez dit.
    merci bcp

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    L'incrementation dans le code est dangereuse surtout si tu veux générer un numéro type index unique, car la base peut devenir incohérente si tu as une interruption (logiciel ou materiel) durant le deroulement du code . la cohérence de l'unicité d'un incrément doit être laissé au SGBD qui saura rétablir la donne en cas d'exception. la solution de philnext sera la plus robuste.
    Bon code

  6. #6
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    De plus le fait de le faire dans la base évite les problèmes en 'multi Clients' en effet dans l'exemple de aityahia si 2 sessions incrémentent au même moment elles auront le même numéro d'index.

  7. #7
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    efféctivement moi je n'utilse pas la méthode que j'ai proposé ,sauf pour codifier des enregistrements en instance de validation par exmple.

    je stock mes compteurs Table annexe ou incrémente mon compteur a chaque nouvel enregistrement, cette méthode me permet de réinitialiser mon compteur au début de l'année par exemple.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    La méthode de philnext te permettra sans conteste de résoudre ton problème.

    Une autre solution pour numéroter de façon unique tes enregsitrements consiste à utiliser un GUID. Chaque GUID est par définition unique donc tu n'auras pas de problème en ce qui concerne les doublons.

    Cette partie de code permet d'obtenir un GUID:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    uses comObj, ActiveX;
     
    function CreateGuid: string;
    var
      GUID: TGUID;
    begin
      Result := '';
      if CoCreateGuid(GUID) = S_OK then
        Result := GUIDToString(GUID);
    end;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    merci à tous pour votre aide.

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

Discussions similaires

  1. Enregistrer des données dans une table à partir du code
    Par Ragnarok85 dans le forum Access
    Réponses: 4
    Dernier message: 24/01/2007, 13h03
  2. [MySQL] Php, je ne comprends pas comment faire pour introduire des données dans une table
    Par Liondd dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 14/12/2006, 12h53
  3. extraction des données dans une table Access
    Par moabomotal dans le forum Access
    Réponses: 2
    Dernier message: 26/05/2006, 11h17
  4. Inserer des données dans une table access SQL
    Par ouellet5 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/11/2005, 21h11
  5. Réponses: 2
    Dernier message: 15/06/2005, 17h32

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