Jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery?

Jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery?
Bartosz Mikołajczyk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:20
0

Witam jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery1.
Podejrzewam ze trzeba użyć ADOQuery1FetchProgress ale nie wiem jak się za to zabrać.
Bardzo dziękuje za odpowiedz.

edytowany 2x, ostatnio: flowCRANE
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Poznań
  • Postów:8766
4

Długo chyba nie szukałeś, co? :P

https://stackoverflow.com/questions/4237112/how-to-see-progress-of-query-execution-during-handle

Kopiuj
with ADOQuery1 do
begin
 SQL.Clear;
 SQL.Add('select * from tbl1 where id = '+Edit1.Text);
 ExecuteOptions:=[eoAsyncFetch];
 Open;
end;

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
  MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  ProgressBar1.Max      :=MaxProgress;
  ProgressBar1.Position :=Progress;
  Application.ProcessMessages;
end;

edytowany 1x, ostatnio: cerrato
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
2

Tylko, że to jest postęp pobierania danych z bazy do komponentu po wykonaniu zapytania przez bazę a do tego dochodzi jeszcze czas samego wykonania zapytania, którego nie jesteś w stanie zobrazować


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Bartosz Mikołajczyk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:20
0

Co napisał cerrato to u mnie nie działa. Zrobiłem tez tak jak jest tutaj napisane https://www.experts-exchange.com/questions/21375593/Progressbar-while-opening-DB.html

czyli

  1. you must set CursorLocation = clUseClient for your TADOQuery
  2. you must set CursorType = ctStatic
  3. you must include the eoAsyncFetchNonBlocking flag in ExecuteOptions property
  4. write next code in OnFetchProgress event:
Kopiuj
procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  Progressbar1.Max := MaxProgress;
  Progressbar1.Position := Progress;
end

Mam pytanie ten sposób co pokazaliście działa do każdego zapytania? Jak zrobię takie zapytanie:

Kopiuj
SQL.Add(" BACKUP DATABASE [PLATNIK] TO DISK = 'D:\platnik.bak' ");

to powinno zadziałać ?

edytowany 1x, ostatnio: flowCRANE
Patryk27
Co to znaczy nie działa?
flowCRANE
Po dodaniu znaczników kolorujących kod wnioskuję, że się nawet nie kompiluje – znaków " nie używa się do zapisu literałów.
Bartosz Mikołajczyk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:20
0

Dzięki za zainteresowanie Patryk27 "nie działa" oznacza to ze jak debuguje to nie wchodzi mi do tej procedury. Nawet nic nie wyświetla w Memo

Kopiuj
procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Memo.Lines.Add('jestem w procedurze ADOQuery1FetchProgress');
Progressbar1.Max := MaxProgress;
Progressbar1.Position := Progress;
end
edytowany 1x, ostatnio: flowCRANE
CL
  • Rejestracja:ponad 15 lat
  • Ostatnio:7 miesięcy
0

Bo trzeba dodać procedure w zdarzeniach Adoquery...

Bartosz Mikołajczyk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:20
0

Od tego zacząłem od dodanie procedury w zdarzeniach i ustawienia właściwości jak wyżej. Mimo to nie idzie, i raczej nie pójdzie tak myślę. Ponieważ te zapytanie nie zwraca żadnego rekordu, żadnych danych, tylko tworzy plik backup. Czyli procedura ADOQuery1FetchProgress nie ma nic do roboty ale nie jestem na 100 % pewien. Ma ktoś pomysł jak zrobić progressbar ?
Może zmodyfikować zapytanie SQL.Add(" BACKUP DATABASE [PLATNIK] TO DISK = 'D:\platnik.bak' WITH NOINIT, STATS = 10" "); jak myślicie ?

CL
  • Rejestracja:ponad 15 lat
  • Ostatnio:7 miesięcy
0

Jako "pseudo" progres możesz ustawić pasek postępu na marquee (chyba, pisze z telefonu) odpalić przed sql i wyłączyć po. Nie pamiętam tylko czy jest ta opcja w standardowych komponentach.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
2

napiszę jeszcze raz dużymi literami - FetchProgress REAGUJE TYLKO NA AKCJĘ, KIEDY DANE SĄ POBIERANE Z BAZY DO KOMPONENTU. Nie bierze pod uwagę przygotowania danych po stronie bazy. Wobec tego BACKUP DATABASE... nie będzie zgłaszało tego eventu ponieważ ŻADNE dane nie są pobierane do komponentu. FETCH ma miejsce w poleceniach SELECT


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Bartosz Mikołajczyk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:20
0

Dzięki abrakadaber ale do tego doszedłem. Ale problemu nie rozwiązałem. Może mógłbyś doradzić jak zrobić ProgressBar zrzutu bazy danych na dysk ?. Nie robił bym z tego problemu ale jak baza warzy 1 gb lub więcej chwile to trwa a mielące kuleczko każdego denerwuje. Clarc doradził zęby zrobić jakiś alternatywny ProgressBar ale tego nigdzie nie mogę znaleźć "marquee".

PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:26 minut
1

Musisz skorzystać ze zdarzenia OnInfoMessage dla ADOConnection (http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate3/EN/html/delphivclwin32/ADODB_TADOConnection_OnInfoMessage.html)
Ja w SDAC na Lazarusie obsługuję to tak:

Kopiuj
procedure TForm1.MSConnection1InfoMessage(Sender: TObject; E: EMSError);
begin
  if (pos('percent', E.Message)>0) or (pos('procent', E.Message)>0) then
  begin
    if pos(' percent', E.Message)>0 then
    ProgressBar1.Position:=StrToInt(copy(E.Message, 1, pos(' percent', E.Message)-1))
    else
    ProgressBar1.Position:=StrToInt(copy(E.Message, pos(': ', E.Message)+2, pos(' procent', E.Message)-pos(': ', E.Message)-2));
  end;
end;

pozdrawiam
paweld
Bartosz Mikołajczyk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:20
1

Witam problem rozwiązałem długo to trwało ale może komuś się przyda co prawda przeszedłem w miedzy czasie na delphi 10.2

Kopiuj
try

sql:='BACKUP DATABASE '+CheckList[i]+' TO DISK = '+#39+EditPathBase.Text+CheckList[i]+'_'+czas+'.bak'+#39+' WITH STATS = 1';

           ADOQuery1.CursorLocation:= clUseServer;
           ADOQuery1.CursorType:=ctStatic;
           ADOQuery1.SQL.Add(sql);
           ProgressBar1.Min:=1;
           ProgressBar1.Max:=100;
           ADOQuery1.Open;

 except
         
           on E: exception  do begin

           if E.Message <> 'ADOQuery1: CommandText does not return a result set' then 
                   begin
            messagelog('Nie oczekiwany blad tworzenia pliku backup: '+E.Message,Log);
            Exit;
                   end;
            end
           end;



procedure TForm2.ADOConnection1InfoMessage(Connection: TADOConnection;
  const Error: Error; var EventStatus: TEventStatus);
begin

if StringToProgressPosition(Error.Description) > -1 then
   Form1.ProgressBar1.Position:= StringToProgressPosition(Error.Description);

end;

function TForm2.StringToProgressPosition(napis:string):integer;
var temp:string;
    wynik:integer;
    liczba:byte;
Begin
liczba:=pos(' ',napis);
temp := copy(napis, 0, liczba -1);
wynik:=StrToIntDef(temp,-1);

  result:=wynik;
End;
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Tuchów
  • Postów:12165
0

@Bartosz Mikołajczyk: jak już podajesz rozwiązanie to przynajmniej sformatuj kod, aby nie wyglądał jak wymiociny.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
furious programming napisał(a):

@Bartosz Mikołajczyk: jak już podajesz rozwiązanie to przynajmniej sformatuj kod, aby nie wyglądał jak wymiociny.

I @Bartosz Mikołajczyk napisz wyraźnie, że to rozwiązanie nic a nic nie dotyczy tematu wątku.
Ponieważ "Jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery?" ma się nijak do postępu wykonania backupu przez serwer.
To są dwie zupełnie różne sprawy.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około godziny
  • Lokalizacja:Poznań
  • Postów:8766
1

@wloochacz: powyższy to Twój post o numerze 666, bije z niego agresja i negatywna energia. Przypadek? ;)

screenshot-20190627123453.png


WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1

To pewnie dlatego, że od rana swędzi mnie lewa część [wstaw se co chcesz].
Przypadek?

Jaka agresja?

A tak w ogóle zobacz na to:
4p.png

Więcej nie znaczy lepiej ;-)

  • 4p.png (68 KB) - ściągnięć: 78
Zobacz pozostałe 2 komentarze
WL
Z tym odgryzaniem to wiesz... 20 lat mi zajęło, aby tego nie robić zawsze - no ale cóż, krew nie woda :P A co do punktacji, primo - nie wiem jak to list liczone (ale podejrzewam, że np. oznaczenie postu jako wartościowy podbija licznik autora i oznaczającego. Bo klikasz na wszystko bez opamiętania, a ja mam... inne wartościowanie :D). A secundo, jak mnie nie swędzi, to mam to gdzieś ;-)
cerrato
Szkoda, że 20 lat poświęciłeś na pozbycie się tej fajnej cechy :D A w temacie punktacji - nic nie wiem o tym, żeby osoba dająca łapkę coś z tego miała. I nie uważam, żeby trzeba było je jakoś bardzo reglamentować. U mnie, jak widzę, że ktoś się udziela, coś pisze, angażuje to staram się dać. Może Ty na to inaczej patrzysz, ale dla mnie łapka nie jest czymś w stylu "WOW, jesteś geniuszem, to najlepsza odpowiedź w tym miesiącu" tylko raczej taki miły gest, coś na zasadzie "fajnie, że Ci się chce, że się angażujesz, że piszesz coś z sensem, że poświęcasz swój czas na pomoc"
cerrato
To trochę jak z byciem szefem albo rodzicem - moim zdaniem dobrze jest się często uśmiechnąć, czy pochwalić za jakiś drobiazg, a nie czekać aż ktoś zrobi coś totalnie wybitnego i dopiero wtedy okazać jakiś entuzjazm. Ale wnioskując z faktu, że Ty przez te 15 lat 2 razy (słownie: DWA) coś uznałeś za warte przyznania łapki - mamy chyba skrajnie odmienne podejście do tego zagadnienia ;)
WL
A nieprawda, bo TRZY razy :P
cerrato
No to juz mamy łapkę co 5 lat, a nie 7. jest jakiś postęp :D
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)