Question

Je suis en train de filtrer certains enregistrements d'une TADOQuery. Je mets la propriété filtrée à true et quand je mets le filtre à champ « valeur » =, tout fonctionne très bien. Je voudrais construire dynamiquement ce filtre en ajoutant

<space>AND field='value'

à une valeur toujours vrai, et je pensais que 1 = 1 ferait l'affaire. Je devrais donc 1 = 1 le filtre par défaut et puis juste ajouter à AND field='value' au besoin.

Ceci, cependant, ne fonctionne pas. Le message d'erreur se lit comme suit:

  

Les arguments sont de type incorrect, sont hors de la plage acceptable, ou sont en conflit avec un autre.

Quelqu'un pourrait-il s'il vous plaît me dire ce que je pourrais utiliser comme polyvalent expression toujours-vrai pour ce filtre?

Était-ce utile?

La solution

Je suppose que cela va sans dire, mais cela dépend du fournisseur OLE DB si oui ou non cela fonctionne. Lorsque vous définissez un filtre sur un jeu d'enregistrements existant, il finit par passer par une autre interface de OLE DB (IViewFilter si je me souviens bien). Donc, même si un filtre fonctionne dans une clause WHERE sur une instruction SQL, cela ne signifie pas nécessairement qu'il fonctionne comme un filtre. Le filtre que vous définissez finit par se parsé dans les morceaux en dehors des composants, puis transmis à l'interface OLE DB. Il se peut que la mise en œuvre du fournisseur ne s'y attend pas un filtre de la forme « constante = constante ». Pour contourner ce problème, vous pouvez essayer de régler tout cela dans la clause WHERE de l'instruction SQL.

Autres conseils

Vous devez définir la propriété « Filtrée » False si vous n'êtes pas quelque chose filtrez et mettez-le vrai et votre état quand vous voulez ResultSet à filtrer.

Je construirais dynamiquement la propriété SQL correcte mais afin que vous sachiez toujours exactement ce qui est d'envoyer à la base de données (et vous êtes sûr que seuls les enregistrements que vous voulez est reçu par votre programme).

Le 1 = 1 astuce fonctionne très bien dans la clause where d'une requête, mais pas dans la propriété filtrée. Si vous souhaitez désactiver le filtre, ensemble filtré à faux et tous les enregistrements seront retournés.

Le problème de filtrage est qu'elle est effectuée côté client. Si vous utilisez un moteur de base de données telles que SQL Server et attendre d'avoir un grand nombre d'enregistrements à filtrer, puis votre mieux servis en changeant la requête SQL qui permettra au serveur de base de données pour retourner uniquement les enregistrements demandés. Rappelez-vous de fermer votre TADOQuery d'abord, changer le SQL puis rouvrez-le.

Une astuce que j'utilise pour éviter de retourner l'ensemble de données entier (utilisé pour les grands ensembles de données) est d'envisager un nombre maximum d'enregistrements que je veux afficher, puis utilisez le TOP syntaxe SQL pour retourner un de plus que le nombre de dossiers que je voulais afficher « n » ... si j'atteins ce numéro, j'avertir l'utilisateur qu'il y avait plus de n-1 enregistrements renvoyés et pour ajuster les critères de recherche / filtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top