Domanda

Sto cercando di filtrare alcuni record da una TADOQuery. Ho impostato la proprietà filtrato su true e quando ho impostato il filtro di mettere in campo = 'valore', tutto funziona bene. Vorrei costruire dinamicamente questo filtro aggiungendo

<space>AND field='value'

ad un valore sempre vero, e ho pensato 1 = 1 farebbe il trucco. Così avrei 1 = 1 come filtro predefinito e poi basta aggiungere AND field='value' ad esso, se necessario.

Questo, tuttavia, non funziona. Il messaggio di errore si legge:

  

Gli argomenti sono di tipo errato, sono fuori intervallo accettabile o sono in conflitto tra loro.

Qualcuno potrebbe dirmi quello che ho potuto usare come un versatile sempre vera espressione per questo filtro?

È stato utile?

Soluzione

Suppongo che va da sé, ma dipende dal provider OLE DB se o non funziona. Quando si imposta un filtro su un set di record esistente, finisce per passare attraverso una diversa interfaccia OLE DB (IViewFilter se non ricordo male). Quindi, anche se un filtro lavora in una clausola WHERE in un'istruzione SQL, che non significa necessariamente che funzionerà come un filtro. Il filtro che si imposta finisce per essere analizzato a parte nelle parti componenti e poi passato all'interfaccia OLE DB. Può essere che l'implementazione del provider non si aspetta un filtro della forma "costante = costante". Come soluzione alternativa, si potrebbe provare a impostare il tutto nella clausola WHERE dell'istruzione SQL.

Altri suggerimenti

È necessario impostare la proprietà 'filtrato' False se non si filtrando qualcosa, e impostarlo su True e la sua condizione quando si desidera che il gruppo di risultati da filtrare.

Vorrei costruire dinamicamente la proprietà SQL corretta anche se in modo che sempre esattamente cosa è in fase di inviare al database (e si è sicuri che solo i record che si desidera viene ricevuto dal programma).

Il 1 = 1 trucco funziona bene nella clausola WHERE di una query, ma non nella proprietà filtrato. Se si desidera disattivare il filtro, insieme filtrato su false e tutti i record verranno restituiti.

Il problema con il filtraggio è che si è fatto lato client. Se si utilizza un motore di database come SQL Server e si aspettano di avere un grande insieme di record da filtrare, allora il vostro meglio servita modificando la query SQL che permetterà al server di database per restituire solo i record richiesti. Basta ricordarsi di chiudere il TADOQuery prima, modificare il codice SQL poi riaprire.

Un trucco che uso per evitare di tornare l'intero set di dati (utilizzata per grandi serie di dati) è di prendere in considerazione un numero massimo di record che voglio visualizzare, quindi utilizzare il TOP sintassi SQL per restituire uno in più rispetto al numero di record che volevo visualizzare 'n' ... se raggiungo quel numero, poi notificare l'utente che ci sono stati più di n-1 Documenti di ritorno e per regolare i criteri di ricerca / filtro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top