VBA i ADO Zadanie 1 (Łączenie się serwerem MS SQL Server) ADO posiada kilka możliwości nawiązania połączenia z danymi SQL Servera. Najprościej jest skorzystać z dostawcy SQLOLEDB. Poniższy kod należy utworzyć w VBA jako moduł MS Accessa. Nawiązuje on połączenie z bazą pubs serwera o nazwie C115-25 na lokalnym komputerze. Nazwę C115-25 należy zmienić. Uwaga. Ze względu na sposób połączenia zdefiniowany w łańcuchu połączenia poniższego przykładu, serwer z którym się łączymy musi pracować w trybie autoryzacji „mixed”. Zmianę trybu autoryzacji można wykonać z poziomu Enteprise Managera: prawym przyciskiem myszy kliknąć na nazwie serwera, potem Properties | Security | Authentication | SQL Server and Windows. Sub Dim Dim Dim ConnectToMSSQL() conn As ADODB.Connection cmd As ADODB.Command rs As ADODB.Recordset Set conn = New ADODB.Connection Set cmd = New ADODB.Command conn.Provider = "SQLOLEDB" conn.ConnectionString = "Data Source=C115-25;” & _ ”Database=pubs;uid=sa;password=;" conn.Open If conn.State = adStateOpen Then MsgBox "Connection successful" End If conn.Close Set conn = Nothing End Sub Zadanie 2 Utworzymy kwerendę do zdalnego źródła danych. MS SQL Serwerem. Aby połączyć się z ze zdalnym źródłem danych MS SQL Servera kwerenda ma być skierowana do bazy danych o nazwie pubs na serwerze o nazwie TestMSSQL (jeżeli Twój serwer ma inną nazwę, to trzeba jej użyć). Po wykonaniu poniższej procedury wynik można obejrzeć w okienku Immediate. Sub Dim Dim Dim TestSQLOLEDB() conn As ADODB.Connection cmd As ADODB.Command rs As ADODB.Recordset ‘utworzenie połączenia z bazą danych Set conn = new ADODB.Connection Conn.provider = ”sqloledb” Conn.ConnectionString = ”data source=TestMSSQL;uid=sa;initial catalog=pubs” Conn.open ‘budowanie zapytanie SQL Set cmd = new ADODB.Command cmd.ActiveConnection = conn cmd.CommandText = ”SELECT authors.au_lname, authors.au_fname” & _ FROM authors” cmd.CommandType = adCmdText ‘wykonanie zapytania Set rs = cmd.adCmd.Execute Debug.Print = rs.GetString End sub Zadanie 3 Utworzyć formularz w MS Accessie, w którym będą dwa pole tekstowe i przycisk. Do pól wpisywać będziemy nazwę instancji MS SQL Servera, nazwę bazy danych i nazwę tabeli w tej bazie. Po kliknięciu przycisku powinno ostatecznie pojawić się okienko komunikatu z informacją o tym ile jest rekordów w podanej tabeli. Otwieranie bazy danych Microsoft Jet (czyli MS Access) w trybie do odczytu-zapisu Zadanie 4 Połączyć się z bazą MS Accessa (przykładowa baza Northwind). Poniżej jest pokazany podstawowy szkielet procedury. Sub ConnectToJet() Dim conn As ADODB.Connection Dim path As String path = "C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb" Set conn = New ADODB.Connection conn.Provider = "Microsoft.Jet.OLEDB.4.0" conn.ConnectionString = "Data source=" & path conn.Open ‘tutaj przetwarzamy dane, a nastęonie można połączenie zamknąć conn.Close Set conn = Nothing End Sub Zadanie 5 Rozbudować przykład z Zadania 4 w następujący sposób. Utworzyć formularz w Accessie z polem tekstowym, w które można wpisać ścieżkę do pliku z bazą danych Jet (pliki MS Accessa *.mdb). Następnie po kliknięciu przycisku na formularzy, w okienku Immediate pokazać się powinna lista tabel bazy, z którą się łączymy. Wsk. Należy skorzystać z obiektu ADOX.Catalog oraz ADOX.Table: Dim cat as new ADOX.Catalog Dim tbl as ADOX.Table ... cat.ActiveConnection = conn ... for each tbl In cat.Tables Debug.Print tbl.Name & ”---” & tbl.Type Next tbl 2 Zadanie 6 Skopiuj bazę danych kadry.mdb. Wykorzystując ADO napisz procedurę w VBA wypisującą osoby, które mają prawo jazdy. Następnie po wciśnięciu OK w oknie dialogowym procedura ta ma wykonać podwyżkę o 10% dla wszystkich takich osób. Przy wciśnięciu „Cancel” podwyżka nie będzie wykonana. Wsk. Należy wykorzystać funkcję MsgBox, która zwraca kod przyciśniętego przycisku (patrz pomoc do VBA). Można wykorzystać stałą vbCrLf, która oznacza przejście do nowej linii. Stała ta może być dołączana do ciągu znaków, jeśli chcemy by ciąg ten był wyświetlany w kilku liniach. a) Wykorzystaj obiekt ADO.Recordset, który pobierze dane z tabeli Pracownicy. Podwyżkę wykonuj na tym samym rekordsecie. Sub Dim Dim Dim Dim podwyzka() cnCurrent As ADODB.Connection rsPrac As New ADODB.Recordset policz As Long intRes As Integer Set cnCurrent = CurrentProject.Connection rsPrac.Open "Pracownicy", cnCurrent, adOpenDynamic, adLockOptimistic, adCmdTable policz = 0 rsPrac.MoveFirst While Not rsPrac.EOF If (rsPrac![prawo jazdy] = yes) Then policz = policz + 1 End If rsPrac.MoveNext Wend intRes = MsgBox("Liczba pracowników z prawem jazdy: " & policz & " & _ vbCrLf & "po naciśnięciu OK nastąpi podwyżka", vbOKCancel) If intRes = vbOK Then rsPrac.MoveFirst While Not rsPrac.EOF If (rsPrac![prawo jazdy] = yes) Then RsPrac!Stawka = rsPrac!Stawka*1.1 End If rsPrac.MoveNext Wend End If End Sub b) Wykorzystaj obiekt ADODB.Command i odpowiednie zdanie w SQL. Podwyżkę wykonaj jako zdanie SQL w obiekcie ADODB.Connection. Rekordset otwarty przez obiekt ADODB.Command jako zdanie SQL nie może być aktualizowany ani nieustawia poprawnie własności RecordCount. Dlatego w zadaniu tym po otwarciu rekordsetu wykonaj od razu podwyżkę, a liczbę zaktualizowanych rekordów wyświetl wykorzystując parametr RecordsAffected metody (procedury) Execute obniektu Command. 3 Sub Dim Dim Dim Dim podwyzka2() cnCurrent As ADODB.Connection rsPrac As New ADODB.Recordset cmdPrac As New ADODB.Command RecordsAffected As Integer Set cnCurrent = CurrentProject.Connection With cmdPrac Set .ActiveConnection = cnCurrent .CommandType = adCmdText .CommandText = "SELECT * From Pracownicy WHERE [data zatrudnienia]" _ & [Prawo jazdy]=yes" End With Set rsPrac = cmdPrac.Execute With cmdPrac Set .ActiveConnection = cnCurrent .CommandType = adCmdText .CommandText = “UPDATE Pracownicy SET stawka=stawka*1.1” & _ “WHERE [Prawo jazdy]=yes" End With cmdPrac.Execute RecordsAffected MsgBox "Zaktualizowano " & RecordsAffected & " rekordów" End Sub Otwieranie arkusza MS Excel przy użyciu ADO Zadanie 7 Przetestować poniższą procedurę, która demonstruje, w jaki sposób można otworzyć przy użyciu ADO arkusz kalkulacyjny. Sub ConnectToExcel() Dim conn As ADODB.Connection Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data source=C:\bazy_danych\raport.xls;Extended Properties=Excel 8.0" MsgBox "Arkusz zpstał otwarty." End Sub 4