Błąd w RecordCount

0

Mam pytanie : Czy spotkaliście się z problemem dotyczącym niewłaściwego podawania wartości ilości rekordów przez RecordCount dla obiektu IBQuery.
Otóż sprawa wygląda tak : Delphi 7 + Firebird + komponent IBQuery z zakładki InterBase.
Robimy najprostsze zapytanie typu :

SELECT * FROM tabelka

Zakładamy, że w wyniku wykonanai powyższego zapytania otrzymujemy 100 rekordów.
Zapytanie jest połączone z DBGride'em, który wyświetla 10 pierwszych rekordów i suwak do przesuwania w pionie dla wyświetlenia dalszych.
Jeśli wykonamy funkcję IBQuery.RecordCount Delphi zwraca 10 zamiast 100.
Pomaga przejście do ostatniego rekordu a następnie pierwszego według zapisu.

IBQuery.Last;
IBQuery.First;

Po tych dwóch linijkach jest już prawidłowa wartość IBQuery.RecordCount.
Bardzo mnie to zdziwiło, bo dla bazy Paradox'a nie było takiego problemu.
Czy coś jest skopane w Delphi 7? Czy można ściągnąć jakiś upgrade do komponentów (może być specjalne do Firebird'a). Będę wdzięczny za podpowiedź.

Powiem szczerze, że wyszło to po wdrożeniu programu, gdy baza się zapełniła i stąd trudno było to wychwycić podczas testów, gdzie zazwyczaj wprowadza się po kilka rekordów.

0

Jest tam taka metoda - FetchAll.
Po jej wykonaniu będziesz miał wszystko.

Czyli:

IBQuery.Open;
IBQuery.FetchAll;
IBQuery.RecordCount; // <-- pokaże Ci tyle, ile faktycznie jest
0

Dziękuje bardzo Juhas. Sądziłem, że będzie prościej przejść z Paradox'a na Firebird, ale jeszcze dużo nauki o bazach danych przede mną.

0

paradox to bazy płaskie, w których wszystkie dane są ściągane od razu. Dobre komponenty dostępu do baz C/S mają coś takiego jak buforowanie pobieranych danych, tzn jak dasz SELECT * FROM tabela_z_miliardem_rekordow to one zamiast zabić na jakiś czas zarówno aplikację jak i serwer i pobrać wszystkie rekordy, które i tak user nie jest w stanie objąć pobierają tylko część (zazwyczaj jest to kilkaset).
Metoda Last - First czy też FetchAll po prostu pobiera wszystkie rekordy. Jeśli bardzo Ci zależy na tym aby wiedzieć ile jest rekordów możesz zrobić najpierw select count(*) from tabela.

Inna sprawa, że aplikację C/S pisze się trochę inaczej niż aplikacje z bazami płaskimi (DBF, paradox). W aplikacjach C/S należy minimalizować ruch sieciowy, głównie przez wymuszanie na userze określanie jakie chce dane (czyli np. zamiast wyświetlać mu na dzień dobry listę wszystkich faktur kiedy potrzeban mu jest jedna konkretna trzeba wyświetlić okienko z warunkami do filtrowania faktur z np. domyślnie ustawionym warunkiem na faktury tylko z dzisiaj)

0

Dzięki Misiekd. Właśnie zauważyłem i próbuje się przestawić. Pisze aplikację trzy razy dłużej, bo chce przeanalizować dobre rozwiązania na przyszłość. Tak samo kiedyś było z Paradox'em. Myślałem o Select Count(*), ale wydawało mi się bardziej przejrzystym wykorzystać metody obiektu DataSet lub DBGrid. Po prostu mnie to zaskoczyło. Zmniałem CacheBuffor, ale nic, aż tu nagle są proste metody. Czasem chce za szybko przeskoczyć z Paradox'a na bardziej profesjonalną bazę a praktyka woła HOLA! :). Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1