Rientro nessun record se si traduce in FIndKey Falso?
Domanda
Usando TDataSet.FindKey è possibile individuare i record. Quando risulta in True cursore set di dati sarà posizionato sul record trovato. Quando il risultato è False il cursore non si sposta. Ciò si traduce nei dati del record prima di FindKey in emissione di essere visualizzati nei data componenti avveduto.
Come faccio a codificare il risultato di FindKey per restituire un record vuoto?
if Not tblSomeTable.FindKey([SomeSearchData]) then
begin
< code to return empty or move data cursor to neutral position >
end;
Aggiornamento: (atteso qualche giorno prima di scegliere la risposta giusta, come credo che sia la consuetudine e non wan per scoraggiare ulteriori commenti.) Ci sono stati diversi suggerimenti su come affrontare questa situazione anche se credo la risposta corretta era di Marcelo nel senso che non è possibile avere un cursore sia su un record. Diverse soluzioni sono state suggerite. Ho scelto uno dei miei. E 'andato qualcosa di simile:
If Not tblSomeTable.FindKey([SomeSearchData]) then
begin
tblSomeTable.FindKey([-1,2010]);
end
Quello che ho fatto è creare un manichino, record vuoto con un indice che i dati effettivi non possono mai essere, vale a dire: il primo valore dell'indice non sarà mai -1. Se la ricerca iniziale si presenta vuota allora la FindKey sarà posizionare il cursore in questo disco vuoto. Ciò fornirà l'effetto visivo che cercavo.
Soluzione
Questo non è possibile per quanto ne so. Il cursore deve sempre essere su un disco a meno Bof e Eof sono entrambi true (insieme di dati vuoto).
Altri suggerimenti
TDataSet non ha una "posizione neutra". Ma come sempre si hanno poche opzioni:
- Imposta insieme di dati in inserimento / aggiunta la modalità di registrazione. Così, i controlli e il codice vedranno record vuoto. Fate attenzione, come qualcosa può incidentalmente assegnare i dati a un campo e poi il nuovo record può essere inviato a DB.
- A seconda dei componenti di accesso ai dati, si utilizza, è possibile impostare set di dati in modalità cache aggiornamenti, inserto e post nuovo record vuoto nel set di dati, e contrassegnare tutti i cambiamenti applicati. Quindi assegnare un filtro, normalmente respingendo questo record vuoto. Poi nel codice devi attivare il filtro sopra, in modo che rifiuterà tutti i record, escludendo questo vuoto.
- Si consideri per scollegare il TDataSource dal set di dati e poi ricollegarlo.
Nota certo, ma probabilmente non ci può essere inventata alcuni altri approcci:)
Ciao,
uso SetRange invece di FindKey.
tblSomeTable.SetRange([SomeSearchData],[SomeSearchData]);
try
while not tblSomeTable.Eof do begin
<do something with the Record>
tblSomeTable.Next;
end;
finally
tblSomeTable.CanelRange;
end;
Quando i criteri assicura che il massimo di record corrispondenti è uno si recupera con la dichiarazione di cui sopra zero o un record.