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

Lazarus Pascal Discussion :

Le nombre d'enregistrements d'une table filtrée [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut Le nombre d'enregistrements d'une table filtrée
    Bonjour à tous

    Je veut connaître le nombre d'enregistrements d'une table filtrée, mais le code suivant donne un nombre constant
    égale au nombre d’enregistrement d'une table sans filtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TMAINFORM.RadioGroup1Click(Sender: TObject);
    begin
       umdt.MDT.TABLE.Close;
      case  MAINFORM.RadioGroup1.ItemIndex of
       0: begin umdt.MDT.TABLE.Filter:='SRT_ELV=0'; RadioGroup1.Color:=$00F15645 end;
       1: begin umdt.MDT.TABLE.Filter:='SRT_ELV=1'; RadioGroup1.Color:=$005933F0 end;
       2: begin umdt.MDT.TABLE.Filter:='SRT_ELV<2'; RadioGroup1.Color:=$003EE1E6 end;
       end;
      umdt.MDT.TABLE.Open;
      umdt.MDT.TABLE.Filtered:=True;
     
      Label12.Caption:=IntToStr(umdt.MDT.TABLE.RecordCount);
    end;
    merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Il me semble que recordcount devrait être remplacé par exactrecordcount ( Ça marche au moins pour le le format DBF ).

    PS: C'est vraiment nécessaire de fermer et ré-ouvrir la table avant de la filtrer ?

  3. #3
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonjour à tous

    @mm_71

    Citation Envoyé par mm_71 Voir le message
    Il me semble que recordcount devrait être remplacé par exactrecordcount ( Ça marche au moins pour le le format DBF ).
    J'ai vérifié tous les DataSets natifs de Laz 1.8 rc5 mais seulement le Dbf possède cette propriété (ExactRecordCount), moi j'utilise SqlQuery.

    Citation Envoyé par mm_71 Voir le message
    PS: C'est vraiment nécessaire de fermer et ré-ouvrir la table avant de la filtrer ?
    AMHA ce qui est nécessaire d'être entre Table.Close et Table.Open est uniquement la définition du filtre ici (TABLE.Filter:='SRT_ELV=N')
    mais le placement de l'activation du filtre ici (TABLE.Filtered:=True) n'a pas d'importance.


    merci

  4. #4
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Je connais moins bien SQL que DBF mais je n'ai jamais eu besoin d'utiliser filter, je me demande même si ça marche ? Si tu affiches le résultat dans une grille ou le mets dans un tstringlist après il est filtré ou pas ? Si oui tu pourrais compter les lignes reçues après l'opération mais c'est un peu vicelard.

    Pour tout ce que j'ai eu à faire en SQL j'ai toujours employé un truc du genre:

    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
    Sql_DoIt(Fmain.SQLQuery, 'Select * FROM '+TableSQL_Name+' where CODE="'+C_Code+'"'); 
    Et au retour de la fonction  Fmain.SQLQuery.RecordCount donne un résultat correct.
     
    Function Sql_DoIt ( Query:TZQuery; Instru:String ):Boolean;
    Begin
      Result:=False;
      with Query do
      begin
        Close;
        SQL.Text:=Instru;
        try
          Open;
          Result:=True;
        except
          ShowMessage ('Erreur '+Query.SQL.Text );
        end;
      end;
    end;

  5. #5
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonjour

    1. En fait j'évite d'utiliser une table comme requête paramétrée, ce n'est pas très pratique.
    une table fonction mieux avec les filtres.

    si je cherche à trouver une solution je la ferai en une seule ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    begin umdt.MDT.TABLE.Last; a:=umdt.MDT.TABLE.RecNo; umdt.MDT.TABLE.First; b:=umdt.MDT.TABLE.RecNo end;
      Label12.Caption:=IntToStr(a-b+1);   //a,b:integer;
    mais ce n'est pas pratique non plus du moment qu'il existe une fonction destinée pour ça (recordCount),
    Donc la question est pour quelle raison cette fonction ne fonctionne pas correctement?

    merci

  6. #6
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Cela fait longtemps que je ne fais plus de programmation bases de données, mais pour autant que je me souvienne:
    j'ai toujours préféré l'événement OnFilterRecord à la propriété Filter. L'événement est appelé dès table.filtered = true.
    En plaçant, dans cet événement, une variable "compteur" qui s'incrémente quand Accept = true, cela devrait te donner le nombre d'enregistrements filtrés.

    Cordialement
    Thierry

  7. #7
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonsoir Thierry

    en fait j'ai fais une bonne série d'exemples avec OnFilterRecord() et je suis parvenu à une conclusion:

    Recordcount fonctionne indépendamment d'un filtre.
    C'est comme si ils fonctionnent à deux niveaux différents.

    merci Thierry.

  8. #8
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Bonjour,
    J'utilise des bases de données avec sqlite et les composants natifs et pour rechercher certaines données j'utilise un filtre pour ouvrir la table puis j'affiche le nombre d'enregistrements comme ci-dessous et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MFILTRE:='NON';
      FermeGrid;
      PTitre.Caption:=MTITRE+ ' DE BANK NON VERIFIEES';
      PTitre.Update;
      data.bank.close;
      data.bank.SQL:='select * from BANK WHERE VERIFIE='+quotedstr(MFILTRE); // ok
      data.bank.open;
      TotalNonpointer;
      Navigateur.DataSource:=data.SourceBank;
      GridBank.Visible:=True;
      Edit1.Text:=IntToStr(data.bank.RecordCount);
    A+

  9. #9
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonjour à tous,

    @ Ovni76

    Oui effectivement le recordcount d'une table est exacte en exécutant SQL,
    c'est ce que d'ailleur à proposé mm_71.

    J'évitais d'appliquer SQL à une table,
    mais il s'avère que c'est inévitable, à moins que on utilise la 2 ème méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Table.DisableControls;
     Table.Last; a:=Table.RecNo; Table.First; b:=Table.RecNo ;
     Table.EnableControls;
     
     Label1.Caption:=IntToStr(a-b+1);   //a,b:integer
    je mets cette discussion comme résolue.

    merci à vous tous

  10. #10
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Un ultime truc qui vaut ce qu'il vaut: Mettre les enregistrements filtrés dans un dbgrid avec visible à false et récupérer le nombre de lignes de cette grille.

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

Discussions similaires

  1. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  2. Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/08/2006, 13h21
  3. [DB] Nombre d'enregistrements d'une table
    Par Mister Nono dans le forum Bases de données
    Réponses: 26
    Dernier message: 09/05/2006, 09h51
  4. [SQL] nombre d enregistrement d une table
    Par sharpeye dans le forum Access
    Réponses: 1
    Dernier message: 03/11/2005, 18h46
  5. Nombre d'enregistrement dans une table MySQL
    Par tom06440 dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 21/10/2005, 19h07

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