Anfänger mit Makro-Zugriffsproblem auf OOo-Datenbank

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Anfänger mit Makro-Zugriffsproblem auf OOo-Datenbank

von Toxitom » So, 17.09.2006 11:23

Hey Wurstsuppe,
Es ist wirklich ärgerlich, dass es nur wenig Dokumentation über Makroprogrammierung gibt.
Ändert sich mit der immer weiteren Verbreitung von OOo :-)

Im Übrigen musst du bedenken, dass Base erst seit knapp einem Jahr da ist und seit Frühling dieses Jahres wirklich nutzbar :-)

Ralf hat dir schon ein paar Literaturquellen genannt, und - natürlich ganz uneigennützig <Werbung an> kann ich dir das Buch vom Galileoverlag http://www.galileocomputing.de/1176?GPP=ooo "wärmstens" emfehlen. Darin sind auch die wesentlichen Programmierhinweise an Beispielen dargelegt <werbung aus> ;-)

Also, es gibt schon etwas. Aber natürlich - andere Programme bieten da deutlich mehr - sind natürlich auch schon länger im Lande und weiter verbreitet. Aber wir arbeiten daran....

Gruss
Thomas

Re: Danke

von Raindancer » Sa, 16.09.2006 17:16

Hallo Wurstsuppe,
Wurstsuppe hat geschrieben: ... Meine Lösung sieht etwas anders aus, ich betitle jetzt alle Datenbankspalten usw. einfach nur noch in Großbuchstaben.
Hatte ich auch kurz drüber nachgedacht. Gefällt mir persönlich nicht so gut, ist aber vielleicht doch einfacher.

Wenn die Tabelle bereits besteht und schon größer ist geht das leider nicht so einfach. Den Namen der Tabelle kann man ja noch ändern, aber die Änderung des Spaltennamens hat zwangsläufig eine leere Spalte zur Folge. Also geht nur neue (geänderte) Tabelle anlegen und Daten übertragen, alte Tab löschen.
Wurstsuppe hat geschrieben: ... Es ist wirklich ärgerlich, dass es nur wenig Dokumentation über Makroprogrammierung gibt.
Na ja, ich täte meinen es gibt doch schon reichlich und viele gute Seiten im "WWW".
z.B.
http://www.dannenhoefer.de/faqstarbasic/index.html
http://www.ooomacros.org/

Auch die Verlage und Autoren haben mittlerweile OOo mit einigen Büchern "entdeckt".
Dann natürlich dieses Forum, insbesondere ältere Beiträge. Hier gibt es offenkundig immer einen wissenden und hilfsbereiten Kreis.

Gruß
Ralf

Danke

von Wurstsuppe » Sa, 16.09.2006 14:14

Echt witzig, über genau dieses Problem bin auch gerade gestolpert. Danke für die tollen Hinweise.

Meine Lösung sieht etwas anders aus, ich betitle jetzt alle Datenbankspalten usw. einfach nur noch in Großbuchstaben.

Es ist wirklich ärgerlich, dass es nur wenig Dokumentation über Makroprogrammierung gibt.

von Raindancer » Do, 14.09.2006 22:42

Hi Thomas,

[Steht das so da, sollte dein Code auch funktionieren] - TUT ES !!!!! :D
Danke, danke, danke :D

Base verwandelt alle SQL Befehle in Großbuchstaben + DB-Case-Sensitiv! - das erklärt alles.
Darum läuft der Zugriff auf Bibliography - ist eine dBase-DB, der ist das dann egal, sprich nicht Case-Sensitiv.

Das mit den Hochdings habe ich begriffen. Allerdings sieht das ziemlich verwirrend aus. Das Gleiche Problem kommt dann ja wohl auch bei komplexeren SQL-Anweisungen, wenn diese auch noch Spaltenbezeichnungen etc. enthalten. Die sind dann auch Case-Sensitiv ?!
z.B. "SELECT Name, Type, Anzahl FROM karten"

Ich habe das mal versucht und bin irgendwo kläglich an den vielen """" gescheitert - entweder zu viel oder zu wenig oder an der falschen Stelle - Fehlermeldungen tummelten sich nur so.

Mir ist dabei eingefallen, dass ich vor Jahren mal Teilstrings in Variablen zusammenfügen musste und an bestimmten Stellen Hochkommas einzufügen waren - also ähnlich wie hier das Maskieren. Das habe ich damals mit chr(34) gelöst - und - das geht auch hier !!! :P

Also statt: "Select * from """ & sTabName & """"
nun: "Select * from " & chr(34) & sTabName & chr(34)

Etwas länger, aber ich finde besser lesbar und verständlicher.

Bei komplexen SQL-Anweisungen wird es natürlich noch länger,
z.B.:
sSQL = "SELECT " & chr(34) & "Name" & chr(34) & " , " & chr(34) & "Type" & chr(34) & " FROM " & chr(34) & sTabName & chr(34)

Ziemlich lang, aber lesbar und funzt !

Kommt noch eine Where-Klausel dazu, habe ich festgestellt, dass chr(34) nicht geht. In einem Script zu SQL habe ich gesehen, dass es dort Where Name = 'Müller' heißt. Also ein einfaches Hochkomma = chr(39).
Das geht auch hier:
Select ...... Where Name = 'Müller' ist dann:
Select ...... & " WHERE " & chr(34) & "Name" & chr(34) & " = " & chr(39) & "Müller" & chr(39)

Ich finde chr(34 / 39) lesbarer als diese """"-Orgie, aber das muss dann jeder für sich entscheiden.

Deine Hinweise waren sehr hilfreich und führten zu erheblichem Lerneffekt. Schade nur, dass kein Script über OOo-Base auf diesen wichtigen Punkt hinweist. (jedenfalls keines von denen, die ich bisher im www gefunden habe.)

Gruß
Ralf

von Toxitom » Mi, 13.09.2006 09:19

Hey Raindancer,

soweit alles OK, nur: OOo Base verwandelt alle SQL Befehle in Großbuchstaben! Dein Befehl lautet also intern:
"SELECT * FROM KARTEN" - so, und wenn die Tabelle nicht "KARTEN" heisst (Case-Sensitiv!), dann gibt es den Fehler.
Also: Maskier deinen efehl, dann sollte es funktionieren:

Code: Alles auswählen

sSQL = "Select * from """ & sTabName & """"
msgbox sSQL
oResultset = oStatment.executeQuery(sSQL)
Die Zeichen werden maskiert mit einem doppelten Hochzeichen("), um dieses im Basic-String zu realisieren, musst du es ebenfalls "maskieren", wieder mit einem doppelten Hochzeichen.
Deine Msgbox sollte nun folgendes zutage bringen:
Select * from "karten"
Steht das so da, sollte dein Code auch funktionieren :-)
Gruss
Thomas

Anfänger mit Makro-Zugriffsproblem auf OOo-Datenbank

von Raindancer » Mo, 11.09.2006 23:08

Hallöle,

und bitte nicht zu laut lachen, falls mein Problem denn doch zu einfach ist:

Ich möchte von einem Writer-Doc/Makro auf eine OOo-DB (odb-Datei) zugreifen.
Mein erstes Ziel ist insoweit erstmal DB öffnen und einfach seriell auf die Daten irgendeiner Spalte zugreifen. Mit weiterem beschäftige ich mich dann später. :-)

Also habe ich nach dem Studium etlicher WWW-Seiten und OOo-Anleitungen folgendes Makro gefertigt:

Dim oDatasoure As Object
Dim oConnection As Object
Dim oStatment As Object
Dim oResultset As Object
Dim oTable as Object
dim sDBName as string ' Name der odb-Datei
dim sTabName as string ' Name der Tabelle
dim a as string

sub Main

sDBName = "Kamigawa"
sTabName = "karten"

oDatasoure = createUnoService("com.sun.star.sdb.DatabaseContext").getByName(sDBName)
oConnection = oDatasoure.getConnection("","")
oStatment = oConnection.createStatement()

'oTable = oConnection.getTables().getByName(sTabName)
'a = otable.name
'msgbox a
'If ( oConnection.getTables().hasByName( sTabName ) ) Then msgbox "Tabelle Karten"

oResultset = oStatment.executeQuery("SELECT * FROM " & sTabName)

while (oResultset.next)
msgbox oResultset.getstring(5) ' Daten der 5.Spalte
wend

oResultset.close()
oConnection.close()

End Sub


Die odb-Datei (Kamigawa.odb) ist in OOo registriert (Extras\Optionen...Datenbanken). Mit der F4-Taste wird die DB auch im Fenster in Writer angezeigt.

Eigentlich bin ich der Meinung, dass alles richtig ist; zumal die auskommentierten Zeilen (oTable = ...) fehlerfrei arbeiten, ABER:

Wird das Makro ausgeführt, dann erhalte ich in der Zeile
oResultset = oStatment.executeQuery("SELECT * FROM " & sTabName)
folgende Fehlermeldung:

Basic Laufzeitfehler
Es ist eine Exception aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Table not found in Statement [Select * from karten]

Ersetze ich nun aber die beiden Zeilen:
sDBName = "Kamigawa"
sTabName = "karten"

durch

sDBName = "Bibliography"
sTabName = "biblio"

und greife also auf die mitgelieferte DB zu, dann läuft das Makro einwandfrei !!!???

Das Makro muss also eigentlich OK sein. Andererseits ist meine odb-Datei aber auch OK, weil in OOo erzeugt und ja zu sehen etc.

Wo stelle ich mich denn nun zu dusselig an?
Wäre Euch für einen hilfreichen Hinweis dankbar.

Nach oben