Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 4
  • 196

Witam.

Co jest bardziej wydajne, wykonywanie SQL z poziomu kodu VBA (wpisanego bezpośrednio w kod) czy uruchamianie jako kwerendy Accessowe (DoCmd.OpenQuery "Nazwa kwerendy")? 

Ja na chwilę obecną preferuję tę drugą możliwość, czyli tworzę osobno kwerendy i uruchamiam je za pomocą DoCmd.OpenQuery "Nazwa kwerendy".

Pozdrawiam.
Michał.

Michał_Gwiazdonik
  • Zapytał
  • @ Michał_Gwiazdonik | 13.05.2016
    • lider
    • laureat
    • 13
    • 9
    • 51

Odpowiedzi (2)

  • 9

Witam.

Jeśli chodzi o różnicę w szybkości działania między wykonaniem zapisanej kwerendy poprzez instrukcję „Docmd.OpenQuery”, a wykonaniem kwerendy poprzez instrukcję „Docmd.RunSQL” to nie powinno ich być.

Aby to sprawdzić napisałem dwie procedury, obydwie służą do załączenia pierwszych 1000 rekordów do nowej tabeli. Procedury wykonują te operacje w pętli for, przy czym pierwsza wykorzystuje metodę „OpenQuery”, a druga „RunSQL”. Po wykonaniu kilku testów czas wykonania operacji w obydwu przypadkach był podobny, ok 4,5 sekundy.

Aby przyspieszyć wykonywanie kwerend z poziomu VBA można wykorzystać komendę „CurrentDb.Execute”. Zaletą wykorzystania tej instrukcji jest fakt, że nie trzeba jej poprzedzać komendą wyłączającą ostrzeżenia. Daje ona także możliwość zdefiniowania sposobu obsługi błędów oraz umożliwia w przypadku kwerend APPEND/UPDATE/DELETE uzyskanie informacji, ile rekordów zostało zaktualizowanych. Minusem tej metody jest fakt, że w kodzie SQL nie można umieścić bezpośrednio parametrów pochodzących z referencji do formularzy lub raportów i najpierw trzeba te parametry przekształcić do postaci finalnej, a następnie umieścić je w treści zapytania SQL. Powodem tego jest fakt, że metoda „Execute” jest członkiem obiektu DAO, który nie posiada w swoim zakresie widoczności modelu obiektowego Access’a.

Powyższy test wykonałem również przy użyciu metody „Execute” – w tym przypadku czas wykonywania procedury kształtował się na poziomie ok 2,5 sekundy, zatem jest to znaczne przyspieszenie względem metod „OpenQuery/RunSQL”.

Pozdrawiam.
Łukasz.

Łukasz_Szydłowski
  • Odpowiedział
  • @ Łukasz_Szydłowski | 17.05.2016
    • 2
    • 1
    • 2
Komentarze
Witam Łukasz, dziękuję za wyczerpującą odpowiedź. Zaciekawiła mnie szczególnie komenda „CurrentDb.Execute”. Będę testował. Pozdrawiam. Michał.
Skomentował : @ Michał_Gwiazdonik ,17.05.2016
  • 13
  • 9
  • 51
  • 3

DAO nie do końca "nie widzi" obiektów Accessa, bo ma też kolekcję Containers, która na to pozwala. Tym niemniej faktycznie nie daje dostępu do wartości kontrolek.

  • Odpowiedział
  • @ | 05.09.2016
  • TRENER ALTKOM AKADEMII