[ Pobierz całość w formacie PDF ]
.Oto przykład równoważnypoprzedniemu:with Table1 dobegin// pierwszy etapSetKey;Fields[0].AsInteger := 123;Fields[1].AsString := 'Hello';// drugi etapRecordFound := GotoKey;end;Numery pól odnoszą się tutaj do ich kolejności w indeksie, nie w rekordzie  numer 0 oznacza pierwsze poleindeksujące, itp.Uważny czytelnik mógłby zapytać w tym miejscu, dlaczego instrukcjaFields[0].AsInteger := 123;nie powoduje przypisania wartości 123 pierwszemu polu indeksującemu? Skąd komponent TTable wie, iż jestto definiowanie kryterium wyszukiwania?Otóż wywołanie metody SetKey() powoduje specyficzne przełączenie buforów  mamy więc faktycznie doczynienia z zapisem wartości do pól, nie są to jednak pola bieżącego rekordu, lecz tzw.rekordu kluczowego.Wywołanie metody GotoKey() przywraca pierwotny stan buforów. Opisane rozwiązanie nie uwalnia nas jeszcze od konieczności pamiętania kolejności pól w indeksie; koniecznośćta zniknie jednak, jeżeli w miejsce numerów pól będziemy się posługiwać ich nazwami:with Table1 dobegin// pierwszy etapSetKey;Fields['Factory'].AsInteger := 123;Fields['Passwd'].AsString := 'Hello';// drugi etapRecordFound := GotoKey;end;Dozwolone jest jednak używanie wyłącznie pól indeksujących; mimo wszystko musimy pamiętać ich zestaw.I jeszcze ciekawostka  ponieważ obydwie opisane metody wykonują w gruncie rzeczy to samo zadanie,można by podejrzewać między nimi jakiś związek w bibliotece VCL.Istotnie:function TTable.FindKey(const KeyValues: array of const): Boolean;beginCheckBrowseMode;SetKeyFields(kiLookup, KeyValues);Result := GotoKey;end;Wyszukiwanie przybliżone  kryterium najlepszego dopasowaniaMetody FindKey()oraz SetKey().GotoKey() poszukują rekordu, którego zawartości pól są dokładnierówne wartościom poszukiwanym.Delphi oferuje analogiczne mechanizmy dla wyszukiwania przybliżonego,prowadzącego do znalezienia rekordu o zawartości pól najlepiej pasującej3 do poszukiwanego kryterium.Ichmetodyka jest dokładnie taka sama, inne są tylko nazwy metod, będących notabene procedurami, nie funkcjami:// pierwszy sposób:Table1.FindNearest([123, 'CustNo']);// drugi sposóbwith Table1 dobegin// pierwszy etapSetKey;Fields['Factory'].AsInteger := 123;Fields['Passwd'].AsString := 'Hello';// drugi etapGotoNearest;end;3Tak naprawdę jest to wartość bezpośrednio większa (w kolejności aktywnego indeksu) od szukanej  podobnie jak przyposzukiwaniu SOFTSEEK ON w dBase (przyp.tłum.). Jeśli poszukiwanie zostanie uwieńczone sukcesem i właściwość KeyExclusive zbioru danych równa będzieFalse, bieżącym rekordem bazy stanie się rekord znaleziony; jeżeli KeyExclusive równa będzie True,rekordem bieżącym stanie się rekord następny (w kolejności indeksu) po znalezionym.WskazówkaWszędzie, gdzie to jest możliwe, należy używać metod FindKey()/FindNearest() zamiastSetkey()& GotoKey()/GotoNearest(), ponieważ te ostatnie wymagają więcej kodowania i jako takie sąbardziej podatne na błędy programisty.Który indeks?Dotychczas zakładaliśmy milcząco, że aktywnym indeksem jest tzw.indeks główny tabeli (primary index).Użycie w tej roli innego indeksu wymaga odpowiedniego ustawienia właściwości IndexName, zawierającejnazwę indeksu.Oto przykład użycia, jako aktywnego, indeksu po polu Company, nazwanego byCompany wcelu poszukiwania rekordu, w którym pole to ma wartość 'Unisco':with Table1 dobeginIndexName := 'ByCompany';SetKey;FieldValues['Company'] := 'Unisco';GotoKey;end;WskazówkaPrzełączeniu aktywnego indeksu towarzyszą pewne czynności dodatkowe, które mogą powodowaćkilkusekundową zwłokę w działaniu aplikacji.Połączeniem filtrowania z indeksowaniem jest w Delphi mechanizm zakresów (ranges).Do zakresu rekordównależy każdy rekord zbioru danych, którego wyrażenie kluczowe (rozumiane jako konkatenacja pólindeksujących) nie wykracza poza zadane wartości graniczne.Definiowanie zakresu może odbywać sięjednoetapowo, za pomocą metody SetRange(), bądz  na raty , za pomocą metod SetRangeStart(),SetRangeEnd() i ApplyRange().OstrzeżenieDla tabel dBase a i Paradoxa pola definiujące zakres muszą być polami indeksującymi.Dla baz SQL-awarunek ten nie musi być spełniony, lecz wówczas może pogorszyć się efektywność filtrowania [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • wpserwis.htw.pl