Ładowanie danych z dataset do VirtualStringTree

Ładowanie danych z dataset do VirtualStringTree
U3
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad rok
  • Postów:196
0

Witam,

mam pytanie, w jaki sposób (nie pytam czy się da, bo wszystko się da) chcąc zamienić komponent typu DBGrid na VirtualStringTree obsłużyć ładowanie danych, mając zapytanie

Kopiuj
select * from dupa_maryny

które zwraca przykładowo 30 000 rekordów?

Wiadomo, że grid ładuje tyle rekordów ile jest w stanie wyświetlić, a kolejne są wczytywane na OnScroll. Pytanie za milion punktów, jak ma się ta zasada do VirtualStringTree, aby odzwierciedlał dokładnie to samo zadanie uwzględniając jego virtualizację?

Czy ktoś ma z tym jakieś doświadczenie? Mam nadzieję, że pętla

Kopiuj
while not dataset eof

po 30 000 rekordach nie jest jedynym rozwiązaniem.

dodanie znacznika <code class="sql"> i tagu Delphi - furious programming

edytowany 1x, ostatnio: flowCRANE
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
2
  1. jeśli wyświetlasz userowi 30 000 rekordów to masz błąd na etapie projektowania.
  2. jeśli już bardzo chcesz wyświetlić mu te 30 000 rekordów od razu to to MUSI trwać (trwa nie samo dodawanie ich do VTV ale odczyt z bazy)
  3. jeśli chcesz wszystkie rekordy pokazać w VTV to musisz przejść przez wszystkie rekordy. Czy zrobisz to w pętli while not DataSet.EoF do czy przypiszesz VTV.RootNodeCount := Ilosc_rekordow i potem będziesz w OnInitNode przechodził do następnego rekordu to twoja decyzja.
  4. jeśli chcesz ładować po kawałku to sobie musisz sam zrealizować takie przepisywanie do VTV

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
U3
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad rok
  • Postów:196
0
  1. jeśli wyświetlasz userowi 30 000 rekordów to masz błąd na etapie projektowania.
  • Nie zgodzę się z Tobą, co jeśli masz bazę w chmurze i użytkownik wchodzi w selekcję danych w której wybiera sobie, że chce wyszukać zakres dokumentów od 2014-01-01 do 2014-12-31 żeby wydrukować zestawienie z wyszukanych danych i tak się składa, że nazbierało się tam sporo tyś. rekordów.
  1. jeśli chcesz ładować po kawałku to sobie musisz sam zrealizować takie przepisywanie do VTV
  • Własnie dlatego napisałem ten post, z myślą, że ktoś miał już podobne doświadczenie z tym i to jakoś oprogramował.

Czuję, że pozostaje mi póki co, lecieć po wszystkich rekordach, co raczej nie wchodzi w grę.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0
  1. jeśli to jest zestawienie to po co to ładować do VTV zamiast dać podgląd wydruku i/lub wydrukować?
  2. kiedyś się zastanawiałem nad podobnym dylematem (pisałem własną kontrolkę do automatycznego ładowania danych do VTV na podstawie pliku z definicją źródła danych, wyglądu i zachowania VTV, ale to opowieść na inny czas) i doszedłem do wniosku, że nie warto sobie głowy zawracać. Tylko, że ja mam zbiory po maksymalnie parę set rekordów (a to i tak wyjątki)

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
WL
  • Rejestracja:około 21 lat
  • Ostatnio:2 dni
  • Postów:1083
0
user322 napisał(a):

Witam,

mam pytanie, w jaki sposób (nie pytam czy się da, bo wszystko się da) chcąc zamienić komponent typu DBGrid na VirtualStringTree obsłużyć ładowanie danych, mając zapytanie select * from dupa_maryny, które zwraca przykładowo 30 000 rekordów?

Konkret - jaka baza danych i jakie komponenty do jej obsługi?
Przykładowo; FireDAC (i AnyDAC w wersji min. 6.x, o ile dobrze pamiętam) załatwia takie coś od ręki dla komponentu TFDTable.
Poczytaj o Live Data Window

Wiadomo, że grid ładuje tyle rekordów ile jest w stanie wyświetlić, a kolejne są wczytywane na OnScroll.

W OnScroll?
A możesz podać źródło tych rewelacji?

Pytanie za milion punktów, jak ma się ta zasada do VirtualStringTree, aby odzwierciedlał dokładnie to samo zadanie uwzględniając jego virtualizację?

Trzeba o zrealizować tak samo, czyli obsłużyć odpowiednie zdarzenia i napisać DataReader danych z bazy, ale w ten sposób aby wczytywał dane po kawałkach.

Czy ktoś ma z tym jakieś doświadczenie? Mam nadzieję, że pętla

Kopiuj
while not dataset eof

po 30 000 rekordach nie jest jedynym rozwiązaniem.

Ktoś pewnie ma (Zauważ, że przy tej ilości danych to nie tylko czas ładowania jest wąskim gardłem, ale i dostępna pamięć - po prostu może się skończyć, ponieważ TDataSet trzyma wszystkie pobrane dane w pamięci.), ale nie chce mi się pisać gotowca od początku.
Zatem jak mi przygotujesz projekt (taki proof-of-concept) który:

  1. Posiada bazę danych, może być np. baza MSSQL, Firebird, SQLite z wypełnionymi danymi dla rzeczonej tabeli.
  2. Projekt w Delphi, który łączy się do tej bazy za pomocą "normalnych" (najlepiej to co jest na pokładzie, a więc IBX, dbGO, DBExpress, FireDAC) komponentów.
  3. Ładuje dane do wymaganej kontrolki.

To postaram się napisać prezentację rozwiązania Twojego problemu.

edytowany 1x, ostatnio: wloochacz
U3
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad rok
  • Postów:196
0

@wloochacz

W OnScroll?
A możesz podać źródło tych rewelacji?

Mając grida podłączonego do źródła TDatasource i robiąc zapytanie select * from dupa_maryny gdzie liczba rekordów wynosi 30 000, dataset poradzi sobie z tym zapytaniem w mniej niz sekundę i wyświetli tyle rekordów ile mieści się na gridzie. Natomiast, jeżeli przewiniesz suwakiem Grida do krawędzi dolnej, wówczas zaczytuje wszystkie dane aż do EOF. Jeżeli scrollujesz klikając na strzałki, dane doczytywane są na bieżąco.

Oczywiście zgadzam się, że ciężko będzie wyświetlić wszystkie 30 000 rekordów, bo na 99% skończy się to Out of memory, ale metoda "doczytywania" danych spełniłaby tutaj swoją rolę.
Tutaj akurat chodzi o silnik Firebird komponenty IBDataset.

Bazę i programik postaram się przygotować.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:2 dni
  • Postów:1083
0
user322 napisał(a):

@wloochacz

W OnScroll?
A możesz podać źródło tych rewelacji?

Mając grida podłączonego do źródła TDatasource i robiąc zapytanie select * from dupa_maryny gdzie liczba rekordów wynosi 30 000, dataset poradzi sobie z tym zapytaniem w mniej niz sekundę i wyświetli tyle rekordów ile mieści się na gridzie. Natomiast, jeżeli przewiniesz suwakiem Grida do krawędzi dolnej, wówczas zaczytuje wszystkie dane aż do EOF. Jeżeli scrollujesz klikając na strzałki, dane doczytywane są na bieżąco.

Wiesz... ja wiem jak to działa i ładnie nam tu opisałeś swoje obserwacje, a chodzi o to, że działa o ciut inaczej - ale nieważne.

Oczywiście zgadzam się, że ciężko będzie wyświetlić wszystkie 30 000 rekordów, bo na 99% skończy się to Out of memory, ale metoda "doczytywania" danych spełniłaby tutaj swoją rolę.

Eeee... nie dopatrzyłem - 30K to jest pryszcz (aczkolwiek zależy co w tych danych jest i ile jest pól/typy danych/dane/itd.), myślałem, że chodzi o 300K albo o 3 mln rekordów...
30K to mi się do grida ładuje w ok. sekundę ;-)
Pamiętaj o tym, aby nie ładować BLOBów (zdjęcia, duże opisy, dane binarne itd.) do grida w tak dużym zestawie danych. poza tym to nie ma sensu (w standardowym TDBGrid) bo i tak takich danych nie wyświetlisz.

Tutaj akurat chodzi o silnik Firebird komponenty IBDataset.
Bazę i programik postaram się przygotować.

OK, czekam.
Ale pamiętaj, aby w programie przykładowym dane ładować do VirtualStringTree a nie do DBGrida!

edytowany 1x, ostatnio: wloochacz
U3
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad rok
  • Postów:196
0

aczkolwiek zależy co w tych danych jest i ile jest pól/typy danych/dane/itd.

Te dane to przeważnie stringi i integery.

30K to mi się do grida ładuje w ok. sekundę

Weź pod uwagę to, że grid ma obsłużone zdarzenia OnCellPain - wiersz wypełniany jest kolorem w zależności od danych w kolumnie np. STATUS = 'OPŁACONE' (zielony); STATUS = 'NIEOPŁACONE' (czerwony) itp. w gridzie malowanie strasznie zjada pamięć, to jest też m.in powód, dla którego chcę przejść na virtuala. Dodatkowo na uwzględnieniu trzeba mieć słabsze komputery, na których aplikacja będzie uruchamiana (a tak właśnie jest, bo program działa u różnych klientów, na różnych komputerach).

(w standardowym TDBGrid) bo i tak takich danych nie wyświetlisz.

Używam XDBGrid.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:2 dni
  • Postów:1083
0
user322 napisał(a):

aczkolwiek zależy co w tych danych jest i ile jest pól/typy danych/dane/itd.

Te dane to przeważnie stringi i integery.

30K to mi się do grida ładuje w ok. sekundę

Weź pod uwagę to, że grid ma obsłużone zdarzenia OnCellPain - wiersz wypełniany jest kolorem w zależności od danych w kolumnie np. STATUS = 'OPŁACONE' (zielony); STATUS = 'NIEOPŁACONE' (czerwony)

No i co z tego? Wystaw sobie, że ja takie rzeczy robię z dynamicznym obliczaniem warunków dla wiersza przez co uzyskuje efekt analogiczny do Excelowego formatowania warunkowego.
Różnica taka, że user może sam sobie ustawić warunki i styl wyróżniania danych. I jakoś nie mam problemów wydajnościowych, a narzut w stosunku do zwykłego sprawdzenia warunku i zmiany kolory czcionki/tła jest znacznie większy.

itp. w gridzie malowanie strasznie zjada pamięć, to jest też m.in powód, dla którego chcę przejść na virtuala. Dodatkowo na uwzględnieniu trzeba mieć słabsze komputery, na których aplikacja będzie uruchamiana (a tak właśnie jest, bo program działa u różnych klientów, na różnych komputerach).

To bez znaczenia, a jak Ci "w gridzie malowanie strasznie zjada pamięć" to po prostu coś spartoliłeś i tyle - albo kontrolka partoli...
Malowane są tylko te wiersze, które są widoczne. po drugie - oczywiście przez operacjami typu otwieranie danych, odświeżanie, filtrowanie, wyszukiwanie (locate) włączasz DataSet.DisableControls?
Chodzi o taką konstrukcję:

Kopiuj
  DataSet.DisableControls;
  try
    DataSet.CloseOpen;  
  finally
    DataSet.EnableControls;
  end;

Jeśli tego nie robisz, to czym prędzej zacznij.
Sprawdź wyniki i zamelduj o efektywności poprawek - ile będzie x szybciej? Tak na oko, to ze 4...

(w standardowym TDBGrid) bo i tak takich danych nie wyświetlisz.

Używam XDBGrid.

OK, ale ja go nie używam i instalować dema nie będę. Tak więc użyj zwykłego DBGrida, albo z DevExpress Quantum Grid, bo to mój podstawowy ;-)

U3
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad rok
  • Postów:196
0

DataSet.DisableControls;
try
DataSet.CloseOpen;
finally
DataSet.EnableControls;
end;

Oczywiście, że używam, różnica jest zauważalna, ale nie zmienia to faktu, że zjada pamięć im więcej rekordów wczytam i wyświetlę tym więcej zjada ale mniejsza o to.

OK, ale ja go nie używam i instalować dema nie będę. Tak więc użyj zwykłego DBGrida, albo z DevExpress Quantum Grid, bo to mój podstawowy
Grida nie użyję, miałem użyć VST i pętlę

Kopiuj
while not

zgadza się?

WL
  • Rejestracja:około 21 lat
  • Ostatnio:2 dni
  • Postów:1083
0
user322 napisał(a):

DataSet.DisableControls;
try
DataSet.CloseOpen;
finally
DataSet.EnableControls;
end;

Oczywiście, że używam, różnica jest zauważalna, ale nie zmienia to faktu, że zjada pamięć im więcej rekordów wczytam i wyświetlę tym więcej zjada ale mniejsza o to.

Eeee... to niemożliwe, albo czegoś nie zwalniasz - albo kontrolka.

OK, ale ja go nie używam i instalować dema nie będę. Tak więc użyj zwykłego DBGrida, albo z DevExpress Quantum Grid, bo to mój podstawowy
Grida nie użyję, miałem użyć VST i pętlę

Kopiuj
while not

zgadza się?

Zgadza się.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)