VBA -> Basic - problem z bazami danych

Makropolecenia i funkcje w języku Basic

VBA -> Basic - problem z bazami danych

Postprzez Ziker » Wt sie 13, 2013 9:51 pm

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   Rozszerz widokZwiń widok
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
Ziker
 
Posty: 2
Dołączył(a): Wt sie 13, 2013 9:45 pm

Re: VBA -> Basic - problem z bazami danych

Postprzez Jan_J » Wt sie 13, 2013 10:25 pm

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 viewtopic.php?f=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 (6.1|6.2) ∙ AOO 4.1.6 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3913
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: VBA -> Basic - problem z bazami danych

Postprzez Ziker » Śr sie 14, 2013 1:12 pm

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
Ziker
 
Posty: 2
Dołączył(a): Wt sie 13, 2013 9:45 pm

Re: VBA -> Basic - problem z bazami danych

Postprzez Jan_J » Śr sie 14, 2013 7:24 pm

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 (6.1|6.2) ∙ AOO 4.1.6 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3913
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław


Powrót do Basic

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości