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.
Długo chyba nie szukałeś, co? :P
https://stackoverflow.com/questions/4237112/how-to-see-progress-of-query-execution-during-handle
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;

- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
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ć

- Rejestracja:około 6 lat
- Ostatnio:prawie 3 lata
- Postów:20
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
- you must set
CursorLocation = clUseClient
for yourTADOQuery
- you must set
CursorType = ctStatic
- you must include the
eoAsyncFetchNonBlocking
flag inExecuteOptions
property- write next code in
OnFetchProgress
event: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:
SQL.Add(" BACKUP DATABASE [PLATNIK] TO DISK = 'D:\platnik.bak' ");
to powinno zadziałać ?

- Rejestracja:około 6 lat
- Ostatnio:prawie 3 lata
- Postów:20
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
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

- Rejestracja:około 6 lat
- Ostatnio:prawie 3 lata
- Postów:20
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 ?

- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
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

- Rejestracja:około 6 lat
- Ostatnio:prawie 3 lata
- Postów:20
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".
- Rejestracja:ponad 22 lata
- Ostatnio:26 minut
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:
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;

- Rejestracja:około 6 lat
- Ostatnio:prawie 3 lata
- Postów:20
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
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;

- Rejestracja:ponad 13 lat
- Ostatnio:około 8 godzin
- Lokalizacja:Tuchów
- Postów:12165
@Bartosz Mikołajczyk: jak już podajesz rozwiązanie to przynajmniej sformatuj kod, aby nie wyglądał jak wymiociny.
- Rejestracja:około 21 lat
- Ostatnio:około 2 miesiące
- Postów:1082
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.
@wloochacz: powyższy to Twój post o numerze 666, bije z niego agresja i negatywna energia. Przypadek? ;)
- screenshot-20190627123453.png (18 KB) - ściągnięć: 104
- Rejestracja:około 21 lat
- Ostatnio:około 2 miesiące
- Postów:1082
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:
Więcej nie znaczy lepiej ;-)
- 4p.png (68 KB) - ściągnięć: 78



"
nie używa się do zapisu literałów.