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 :

MSAccess ne trouve pas le nombre d'enregistrements


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut MSAccess ne trouve pas le nombre d'enregistrements
    Bonjour,

    Avec le code suivant :
    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
    30
    31
    32
    function TPeekDM.SegmentationFromControlOk( var Control: TPeekControl;
                                                var Rec: TPeekSegmentsCfg): boolean;
    var
      k: integer;
    begin
      ADOConnection1.Close;
      ADOConnection1.ConnectionString := Format(_ConnString,[_UserName,_PassWord,CurDBPath]);
      ADOConnection1.LoginPrompt := False;
      ADOConnection1.Connected := True;
      qry.Connection := ADOConnection1;
      qry.Close;
      qry.SQL.Clear;
      qry.SQL.Text:= 'Select * from SEGCONTROL where SEGCONTROL_NO = '+IntToStr(Control.ControlNo);
      qry.Prepared := true;
      qry.Open;
      if qry.RecordCount = 0 then
      begin
        ShowMessage('Aucun Segment n''est enregistré');
        exit;
      end;
      Rec.NbrControl:= qry.RecordCount;
      ShowMessage('Nombre d''enregistremets : '+IntToStr(qry.RecordCount)+#13+' SEGCONTROL_NO = '+IntToStr(Control.ControlNo));
      qry.First;
      k:=0;
      while not qry.Eof do
      begin
        Rec.SegVec[k].SegNo:= qry.FieldByName('SEGCONTROL_SEGNO').AsInteger;
    // suite de la boucle qui se termine par
        qry.next;
        inc(k);
      end;
    end;
    Record count est à 1 quand il devrait être à 11 !!!

    J'ai vérifié sous access il existe bien dans cette table 11 enregistrements pour SEGCONTROL_NO=Control.ControlNo et la boucle while not qry.Eof do s'arrête à 1

    Où est l'erreur ?

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Le composant AdoConnection1 pointe-t-il sur la même base que celle que vous interrogez directement ?

    --
    Philippe.
    Philippe.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Oui je n'ai qu'une base.

  4. #4
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Il est possible que l'erreur se trouve dans la boucle (à la place de la ligne de commentaire) :

    Citation Envoyé par colorid Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      qry.First;
      k:=0;
      while not qry.Eof do
      begin
        Rec.SegVec[k].SegNo:= qry.FieldByName('SEGCONTROL_SEGNO').AsInteger;
    // suite de la boucle qui se termine par
        qry.next;
        inc(k);
      end;
    Record count est à 1 quand il devrait être à 11 !!!
    Peut-être une erreur d'affectation dans Rec.SegVec[k].UneVariable := qry.FieldByName('SEGCONTROL_SEGNO').AsXXXX; si UneVariable n'est pas du type XXXX indiqué : celà fait sortir de la boucle
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Quel est le type de la colonne SEGCONTROL_NO ? Integer ? Varchar ?
    Philippe.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    à la ligne 7 CurDBPath donne le chemin de lle base avec le nom de la base telque 'C:/Machin/Chose/truc.mdb' D'ailleurs curieusement le même type de fonction a été prcedemment utilisé dans l'appli sans poser de problème.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut voici le code de la boucle
    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
      while not qry.Eof do
      begin
        Rec.SegVec[k].SegNo:= qry.FieldByName('SEGCONTROL_SEGNO').AsInteger;
        Rec.SegVec[k].Color:= qry.FieldByName('SEGCONTROL_COLOR').AsInteger;
        Rec.SegVec[k].DeMax:= qry.FieldByName('SEGCONTROL_DE').AsFloat;
        Rec.SegVec[k].PerCent:= qry.FieldByName('SEGCONTROL_PERCENT').AsFloat;
        Rec.SegVec[k].CIELchMax.l:= qry.FieldByName('SEGCONTROL_L_MAX').AsFloat;
        Rec.SegVec[k].CIELchMax.C:= qry.FieldByName('SEGCONTROL_C_MAX').AsFloat;
        Rec.SegVec[k].CIELchMax.h:= qry.FieldByName('SEGCONTROL_H_MAX').AsFloat;
        Rec.SegVec[k].CIELchMin.L:= qry.FieldByName('SEGCONTROL_L_MIN').AsFloat;
        Rec.SegVec[k].CIELchMin.C:= qry.FieldByName('SEGCONTROL_C_MIN').AsFloat;
        Rec.SegVec[k].CIELchMin.h:= qry.FieldByName('SEGCONTROL_H_MIN').AsFloat;
        Rec.SegVec[k].CIELab.L:= qry.FieldByName('SEGCONTROL_L').AsFloat;
        Rec.SegVec[k].CIELab.a:= qry.FieldByName('SEGCONTROL_A').AsFloat;
        Rec.SegVec[k].CIELab.b:= qry.FieldByName('SEGCONTROL_B').AsFloat;
        Rec.SegVec[k].ControlOk:= StrToInt(qry.FieldByName('SEGCONTROL_DELTA_E_OK_BY_SEG').AsString)=-1;
        qry.Next;
        Inc(k);
      end;
      result:= Control.NbrSeg=k;
    A propos j'utilise avec Access les booleens du type StrToInt(qry.FieldByName(LE_CHAMP).AsString)=-1; qui sont déclarés en VARCHAR(2) pour rendre compatible les booleens Delphi avec les booléens Access. Depuis que j'utilise cela je b'ai eu aucun problème depuis plusieurs années

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    j'ai oublié de préciser que lors de l'enregistrement le champ Varchar(2) est rempli par un BoolToStr(Le_boolean) ce qui correspond à '-1' pour vrai et '0' pour faux alors qu'avec access je crois me souvenir que les booléens sont à 1 et à 0

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Voila la déclaration de la table :
    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
    30
      //********************************************************** table SegControl
      req:= 'CREATE TABLE SEGCONTROL (' +
      ' SEGCONTROL_NO AUTOINCREMENT, ' +
      ' SEGCONTROL_CONTROL_NO INTEGER NOT NULL, ' +
      ' CONSTRAINT FK_SegControl2Control FOREIGN KEY (SEGCONTROL_CONTROL_NO) '+
      ' REFERENCES CONTROL(CONTROL_NO) ON UPDATE CASCADE ON DELETE CASCADE, '+
      ' SEGCONTROL_SEGNO INTEGER NOT NULL, ' +
      ' SEGCONTROL_COLOR INTEGER NOT NULL, ' +
      ' SEGCONTROL_DE SINGLE NOT NULL, ' +
      ' SEGCONTROL_PERCENT SINGLE NOT NULL, ' +
      ' SEGCONTROL_L_MAX SINGLE NOT NULL, ' +
      ' SEGCONTROL_C_MAX SINGLE NOT NULL, ' +
      ' SEGCONTROL_H_MAX SINGLE NOT NULL, ' +
      ' SEGCONTROL_L_MIN SINGLE NOT NULL, ' +
      ' SEGCONTROL_C_MIN SINGLE NOT NULL, ' +
      ' SEGCONTROL_H_MIN SINGLE NOT NULL, ' +
      ' SEGCONTROL_L SINGLE NOT NULL, ' +
      ' SEGCONTROL_A SINGLE NOT NULL, ' +
      ' SEGCONTROL_B SINGLE NOT NULL, ' +
      ' SEGCONTROL_DELTA_E_OK_BY_SEG VARCHAR(2) DEFAULT 0, ' +
      ' SEGCONTROL_USED VARCHAR(2) DEFAULT -1 '+
      ')';
      ADOCommand1.CommandText := req;
      ADOCommand1.Execute;
     
      // ==================== Clé primaire
      req := 'ALTER TABLE SEGCONTROL ADD CONSTRAINT PK_SEGCONTROL '+
      'PRIMARY KEY (SEGCONTROL_NO);';
      ADOCommand1.CommandText := req;
      ADOCommand1.Execute;

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut encore un indice pour trouver
    Le premier enregistrement et le seul qu'il trouve est bon domage qu'il ne trouve pas les dix autres !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut On fait erreur en cherchant dans la boucle
    Regardez dans le premier message à la ligne 22 le recordcount est à 1 avant même d'avoir entamé la boucle alors que cette table dispose de 11 enregistrements ! L'erreur ne peut venir que dans les lignes <22

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut MILLE EXCUSES A TOUS
    C'est en localisant l'erreur avant la ligne 22 que j'ai trouvé mon erreur !

    Elle était dans l'écriture de la requête SQL :
    Ce n'est pas SEGCONTROL_NO qui doit être égal à Control.ControlNo mais SEGCONTROL_CONTROL_NO !

    Merci à tous pour le dérangement.

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

Discussions similaires

  1. [Toutes versions] Savoir si on se trouve ou pas sur le dernier enregistrement d'un formulaire
    Par Mat08 dans le forum VBA Access
    Réponses: 5
    Dernier message: 23/01/2010, 13h21
  2. Je ne trouve pas ce que j'ai enregistrer dans une table
    Par maxinformatique dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/05/2009, 20h42
  3. Réponses: 3
    Dernier message: 29/10/2007, 16h49
  4. Réponses: 7
    Dernier message: 29/03/2007, 15h30
  5. [SQL] Compter le nombre de dossiers, pas le nombre d'enregistrements
    Par lodan dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 11/01/2007, 19h42

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