VBA -> Basic - problem z bazami danych

Makropolecenia i funkcje w języku Basic
Ziker
Posty: 2
Rejestracja: wt sie 13, 2013 9:45 pm

VBA -> Basic - problem z bazami danych

Post autor: Ziker »

Witam

Założyłem temat, ponieważ mam ogromny problem przy konwersji makra z VBA na Basic. Do tej pory z poziomu makro w VBA byłem w stanie otworzyć plik .dbf (dBase IV), wczytać przy pomocy ADODB do recordset'u i dokonać dalszych zadań. Problem polega na tym, że w OpenOffice, z tego co zdążyłem zauważyć, należy zarejestrować bazę danych by z niej korzystać - niestety w moim przypadku jest to niemożliwe (z pozycji narzędzi ukrytych pod F4 przynajmniej), skoroszyt jest przenoszony, korzysta z różnych baz, na różnych komputerach, itp. Jedynym rozwiązaniem moim zdaniem jest zarejestrowanie w trakcie działania aplikacji, bazy danych przy użyciu makro (dialog otwarcia pliku -> nazwa -> otwarcie i rejestracja bazy) i następnie prace na takiej bazie.

Mój dotychczasowy kod (próbowałem przy użyciu RowSet wczytać jakoś dane z pliku, ale nie wiem czym powinno być Data Source Name i jaką nazwę tabeli podać w zapytaniu, skoro plik sam w sobie jest tabelą):

Kod: Zaznacz cały

Dim FilePicker As Object
Dim FilePath() As String
FilePicker=createUnoService("com.sun.star.ui.dialogs.FilePicker")
fResult = FilePicker.execute
FilePath()=FilePicker.GetFiles
dispdir=FilePicker.DisplayDirectory

	If fResult > 0 Then
	fPath = Right(Filepath(0), Len(Filepath(0)) - InStr(Filepath(0), "///") - 2)
	fName = Right(fPath, Len(fPath) - InStrRev(fPath, "/"))
	fPath = Left(fPath, InStrRev(fPath, "/"))
	
	rst = CreateUnoService("com.sun.star.sdb.RowSet")
	With rst
        .DataSourceName=fPath
        .CommandType=2 'table
        .Command="Select * From " & fName
        .execute()
   	End With
	Else
	MsgBox "No file has been chosen!", vbExclamation, "Error"
	Exit Sub
	End If
Z góry dziękuję za wszelkie odpowiedzi
OpenOffice 3.3 / Windows 7
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: VBA -> Basic - problem z bazami danych

Post autor: Jan_J »

Rejestracja ODB jest potrzebna tylko wtedy, kiedy chcemy mieć dostęp do źródła danych z poziomu GUI. Jeżeli dopuszczamy programowanie, cały świat stoi otworem.
W wątku http://forum.openoffice.org/pl/forum/vi ... =32&t=1202 nieadekwatnie zatytułowanym Otwarcie zestawu rekordów pod linuxem podałem kiedyś przykład dostępu do bazy za pomocą URL-a. W tamtym przypadku była to baza PostgreSQL osiągana przez jdbc, ale każdy inny URL też da się wtrynić, byle DatabaseContext umiał go obsłużyć. Nie wszystko teraz pamiętam, ale sądzę, że w przypadku ODB z bazą wbudowaną wystarczy URL postaci file:///...
Mam nadzieję, że wzorzec oraz podane przy nim linki da się spożytkować.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Ziker
Posty: 2
Rejestracja: wt sie 13, 2013 9:45 pm

Re: VBA -> Basic - problem z bazami danych

Post autor: Ziker »

Dziękuję bardzo, myślę, że będzie to bardzo pomocne. Niemniej jednak chciałbym zadać dwa dodatkowe pytania odnośnie tego, co wyczytałem w tamtym temacie:

1. Ponieważ moja baza to dBase IV tak naprawdę całą bazę tworzy folder, natomiast poszczególne pliki zawierają tabele, stąd pytanie: czy w URLu podajemy nazwę folderu, a w zapytaniu nazwę pliku, który zawiera tabelę? (tak mam w VBA i to wydaje się jedynym rozwiązaniem, ponieważ nazwa tabeli to nazwa pliku).

2. "Trzeba przejrzeć res", czy są jakieś metody do przeglądania res? Co muszę zrobić tak naprawdę: zbadać wartość w pewnej kolumnie i przefiltrować wiersze, potem je wrzucić do arkusza.

P.S.

Kiedy zrobiłem tak, jak napisałem w pkt pierwszym przy wywoływaniu zapytania wyrzuca błąd 91 (Błąd pracy BASIC'a, Type: sdbc.SQLException, Msg: Syntax error, unexpected $end, expecting '(' or '{' or NAME)

@EDIT 2

Najprawdopodobniej wszystko już mi działa (kod się wykonuje, nie wyrzuca błędu z SQLem), pozostaje pytanie numer dwa. Najlepiej gdyby było to podobne do VBA (result.FIelds(i).Value)
OpenOffice 3.3 / Windows 7
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: VBA -> Basic - problem z bazami danych

Post autor: Jan_J »

W cytowanym wyżej źródle jest kod procedury wynikiNaArkusz. Nie pamiętam szczegółów, ale spodziewam się, że obiekt (nazwany tam res) będący wynikiem executeQuery() powinien zostać przekazany jako pierwszy parametr do tej procedury -- formalnie nosi on w deklaracji nazwę wyniki. Oczywiście możesz to samo zrobić bez podprogramów, korzystając z pola Columns i metod Next, getString, getValue.

PS. Oprócz dokumentacji (http://api.openoffice.org, http://api.libreoffice.org) przydatne mogą się okazać narzędzia do inspekcji obiektów: X-Ray Tool (http://wiki.openoffice.org/wiki/Extensi ... #Xray_tool) oraz MRI (https://github.com/hanya/MRI).
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ