vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 18 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

DoCmd.RunSQL Odczyt danych z Access do Excel


otwartyotwarty rozpoczął: Zwierzak postów: 6



napisał: Zwierzak
postów: 31


umieszczony:
2 stycznia 2009
20:43

edytowany:
2 stycznia 2009
21:08

  
Im dalej w las, tym więcej drzew.
Poniższy kod działa cycuś-glancuś, jednak przy próbie uruchomienia bardziej złożonego kodu SQL, wyskakuje mi błąd:
Wyrażenie JOIN nie jest obsługiwane. (JOIN expression is not supported).
Szukałem na forach, błąd pojawia się dosyć często, jednak nigdzie nie znalazłem sensownego rozwiązania.
Kod, który chcę wpisać przedstawia się następująco:

strSQL = "SELECT TDokumenty_Normatywne.Symbol_instrukcji, TDokumenty_Normatywne.Nazwa_dokumentu, " & _
"TTest_Nieprawidłowości.Nieprawidłowość, TTest_Odp.Nr_wiersza, TKontrola_Mala.ID_jednostki_org " & _
"FROM (TTest_Nieprawidłowości INNER JOIN TDokumenty_Normatywne ON TTest_Nieprawidłowości.Id_nieprawidłowości " & _
"= TDokumenty_Normatywne.Id_nieprawidłowości.Value) INNER JOIN ((TStruktura_Organizacyjna " & _
"INNER JOIN TTest_Wersja ON TStruktura_Organizacyjna.Id_struktury_org = " & _
"TTest_Wersja.Id_komórki_org) INNER JOIN ((TKontrola_Duza INNER JOIN TKontrola_Mala " & _
"ON TKontrola_Duza.ID_kontroliD = TKontrola_Mala.ID_KontroliD) INNER JOIN (TTest_Wersja_Nieprawidłowość " & _
"INNER JOIN TTest_Odp ON TTest_Wersja_Nieprawidłowość.Id_wersja_nieprawidłowość = " & _
"TTest_Odp.Id_wersja_nieprawidłowości) ON TKontrola_Mala.ID_KontroliM = TTest_Odp.Id_kontroliM)" & _
"ON TTest_Wersja.Id_wersji_testu = TTest_Wersja_Nieprawidłowość.Id_wersji_testu) ON " & _
"TTest_Nieprawidłowości.Id_nieprawidłowości = TTest_Wersja_Nieprawidłowość.Id_nieprawidłowości" & _
"WHERE (((TKontrola_Duza.ID_kontroliD) = 1) And ((TStruktura_Organizacyjna.Id_struktury_org) = 1)" & _
"And ((TTest_Odp.Nieprawidłowość) = Yes))"



Jest to kod żywcem skopiowany z kwerendy MsAccess i działa w Access, natomiast nie działa jako kod macro w Excel.
Może ktoś wie jak to rozwikłać? Walczę z czasem.
Z góry serdeczne dzięki.
napisał: Zwierzak
postów: 31


umieszczony:
2 stycznia 2009
11:02

  
Udało mi się zrobić to przy użyciu biblioteki ADO.

Dim strSQL As String
Dim sciezka As String

sciezka = ThisWorkbook.Path & "\BAZA\KONTROLL_2.accdb"
strSQL = "SELECT TKontrola_Duza.ID_kontroliD, TUżytkownicy.Imię, TUżytkownicy.Nazwisko FROM TUżytkownicy _ INNER JOIN TKontrola_Duza ON TUżytkownicy.ID_Użytkownika = TKontrola_Duza.Przewodniczący WHERE _ (((TKontrola_Duza.ID_kontroliD)=1))"
Set Conn = CreateObject("ADODB.Connection")
Set Rs = CreateObject("ADODB.Recordset")

Conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sciezka & ";"

Rs.Open strSQL, Conn

For i = 0 To Rs.Fields.Count - 1
Sheets("Dane_baza").Cells(1, i + 1).Value = Rs.Fields(i).Name
Next
Sheets("Dane_baza").Range(Sheets("Dane_baza").Cells(1, 1), Sheets("Dane_baza").Cells(1, Rs.Fields.Count)).Font.Bold = True

Sheets("Dane_baza").Range("A2").CopyFromRecordset Rs
Sheets("Dane_baza").Select
Sheets("Dane_baza").Range("A1").Select
Selection.CurrentRegion.Select
Selection.Columns.AutoFit
Rs.Close



Pozdrawiam
napisał: Zwierzak
postów: 31


umieszczony:
2 stycznia 2009
09:17

  
Doczytałem, że funkcja DLookup zwraca tylko pierwszą wartość z pierwszego wiersza, więc mnie nie urządza, bo czasem zapytanie zwraca wiele rekordów.
Poza tym nie jest optymalne otwieranie za każdym razem nowego połączenia przy zwracaniu wartości przy użyciu kwerend.
Pozostają więc "Recordsety" i DAO/ADO.
Czy ktoś mógłby mi podesłać fragment kodu z DAO/ADO, który zwróciłby pożądane przeze mnie wartości dla poniższych przykładów?
Z góry dzięki.
napisał: Zwierzak
postów: 31


umieszczony:
1 stycznia 2009
22:57

  
Cytat:

Coś tu przekombinowane.

No, nie da się ukryć :)
Cytat:

1. Z poziomu jakiej aplikacji chcesz to zrobić? Access czy Excel?
2. Jeśli Excel - jakiej biblioteki chcesz do tego użyć? ADO czy DAO?

Chcę zrobić to z poziomu Excel, bo na danych, które pobieram muszę wykonać jeszcze dużo operacji matematycznych.
Co do ADO, DAO to nie do końca jeszcze wiem jaka jest różnica :).
Ale chcę to tak wykombinować, żeby działało pod Excel 2003.
Doczytałem, że metoda DoCmd.RunSQL nie działa z SELECT, dlatego dokopałem się do funkcji DLookup, która załatwia mi sprawę, ale nie do końca jeszcze znam składnię.
Kod SQL z poprzednich postów w DLookup będzie miał postać:
jakas_zmienna_1 = DLookup("Data_od", "TKontrola_Duza", "ID_KontroliD =" & 1)
jakas_zmienna_2 = DLookup("Data_do", "TKontrola_Duza", "ID_KontroliD =" & 1)


Jakieś rozwiązanie to jest, na pewno prostsze od używania bibliotek DAO, ADO i "Recordsetów", ale podejrzewam, że daje znacznie mniej możliwości.
Nie wiem jeszcze jak wykonać bardziej złożone zapytania do bazy np. jak połączyć powyższe dwie linie w jedną, raz używając DLookup.
Poza tym nie wiem jak w metodzie DLookup sklecić zapytanie:
SELECT TKontrola_Duza.ID_KontroliD, TUżytkownicy.Imię, TUżytkownicy.Nazwisko FROM TUżytkownicy INNER JOIN TKontrola_Duza ON TUżytkownicy.ID_Użytkownika = T.Kontrola_Duza.Przewodniczący WHERE (((TKontrola_Duza.ID_KontroliD) = 1));
Jeśli ktoś mógłby mi opisać składnię DLookup byłbym wdzięczny, zaoszczędziłoby mi to pewnie paru godzin poszukiwań.
Z góry dzięki i pozdrawiam
napisał: admin
postów: 613


umieszczony:
31 grudnia 2008
14:51

  
Coś tu przekombinowane.

Na początek parę pytań:
1. Z poziomu jakiej aplikacji chcesz to zrobić? Access czy Excel?
2. Jeśli Excel - jakiej biblioteki chcesz do tego użyć? ADO czy DAO?
napisał: Zwierzak
postów: 31


umieszczony:
31 grudnia 2008
11:56

  
Witam,
Czy ktoś mógłby podesłać mi fragment kodu, który pobierał dane z Access do Excel za pomocą kwerendy, której kod SQL zawarty byłby w kodzie VBA.
Próbowałem różnych metod, ale wyskakują mi błędy, bo nie wiem jak powinna wyglądać składnia.

Dim Db As Database
  Dim Rs As Recordset
  Dim Ws As Object
  Dim sciezka As String
  
  

  Baza = ThisWorkbook.Path & "\BAZA\KONTROLL_2.accdb"
  Set Db = Workspaces(0).OpenDatabase(Baza, ReadOnly:=True)
  
  Set Rs = Db.DoCmd.RunSQL "SELECT TKontrola_Duza.Data_od, TKontrola_Duza.Data_do FROM TKontrola_Duza_WHERE (((TKontrola_Duza.ID_kontroliD)=1))"



W powyższym kodzie wyskakuje mi błąd kompilacji ostatniego wiersza z komunikatem "Expected:End of Statement"
Czy ktoś mógłby mi podać jak wygląda składnia?
Będę wdzięczny.
Pozdrawiam


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z