Seite 1 von 1
Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 12:39
von crazydoc
Hallo!
Ich habe eine einfache Patientendatenbank und möchte nun auf dem Formular einen Button integrieren, bei dessen Betätigung folgendes geschehen soll:
1. Falls für diesen Datensatz (=Patienten) noch kein Writer-Dokument angelegt ist, soll dieses mit der Namensgebung Nachname_Vorname.odt geschehen und das (dann natürlich leere) Dokument mit Writer geöffnet werden.
2. Falls zu diesem Datensatz schon ein Writer-Dokument angelegt wurde, soll dieses mit Writer geöffnet werden.
Ich hab bis jetzt lediglich geschafft, einen Button zu integrieren, der ein - allerdings dann statisches - Writer-Dokument öffnet, was ja nicht viel Sinn macht, da jeder Patient sein eigenes odt-File haben soll, in dem dann übrigens laufend Befunde ergänzt werden.
Wie mache ich das?
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 14:19
von komma4
crazydoc hat geschrieben:Wie mache ich das?
Mit Basic?!!
Code: Alles auswählen
sVerzeichnis = "d:\daten\patienten\"
sPatientenName = oForm.getByName( "Name" ).getText() & "_" & oForm.getByName( "Vorname" ).getText()
' Hilfsbibliothek für Tools: ConvertToURL()
If _
( Not GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) ) _
Then
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
End If
sDateiName = ConvertToURL( sVerzeichnis & sPatientenName )
If ( FileExists( sDateiName ) ) Then
' load
oDok = LoadComponentFromURL( sDateiName, "_blank", 0, Array() )
Else
' aus Vorlage erstellen, hier: Standardvorlage
' kann natürlich auch eine benutzerdefinierte sein
oDok = LoadComponentFromURL( "private:factory/swriter", "_blank", 0, Array() )
oDok.storeAsURL( sDateiName, Array() )
End If
Hilft das weiter?
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 17:14
von crazydoc
Obwohl meine Programmierkenntnisse schon sehr eingerostet sind und es anno dazumal noch keine objektorientierte Programmierung gab, kann ich dir halbwegs folgen. Allerdings ergibt das Skript einen Laufzeitfehler "Objektvariable nicht belegt" in der Zeile
Code: Alles auswählen
sPatientenName = oForm.getByName( "Vorname" ).getText() & "_" & oForm.getByName( "Nachname" ).getText()
Die Testdatenbanksätze bestehen mittlerweile nur mehr aus 2 Feldern, die definitiv "Vorname" und "Nachname" heißen. Welche Objektvariable ist da nicht belegt?
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 17:44
von komma4
Nun,
oForm muss besetzt werden (war nur ein
snippet, was ich gepostet habe)
Bei einer Writer-Datei sollte diese Ergänzung helfen:
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 17:51
von crazydoc
Nach Einfügen dieser zwei Zeilen am Beginn des Skripts hat sich die Fehlermeldung verändert, betrifft aber immer noch dieselbe Zeile:
BASIC Laufzeitfehler.
Es ist eine Exception aufgetreten.
Type: com.sun.star.container.NoSuchElementException
Message:.
P.S.: Wenn ich sPatientenName einen fixen Wert, z.B. "Max_Mustermann.odt" zuweise, funktioniert das ganze Konstrukt genau so wie es soll. Danke schon einstweilen!

Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 19:23
von komma4
crazydoc hat geschrieben:Ich habe eine einfache Patientendatenbank und möchte nun auf dem Formular einen Button integrieren
Das Formular ist in einem Writer-Dokument? Oder in einer (der!) Base-Datei? Diese ist geöffnet... (Code durch
Makros>Makros ausführen..., nicht aus Basic-Editor gestartet)?
Oder hast Du einen
Dialog mit der Basic-IDE gestaltet?
Welches OOo? Betriebssystem?
Ich habe den Code in einer Base-Datei (Modul ans Formular gehängt, neues Feature der 3.0.0), das geht aber auch mit dem 2.4er Release,
ischschwör.
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 19:32
von crazydoc
komma4 hat geschrieben:
Das Formular ist in einem Writer-Dokument? Oder in einer (der!) Base-Datei? Diese ist geöffnet... (Code durch Makros>Makros ausführen..., nicht aus Basic-Editor gestartet)?
Das Formular ist im Base. Egal, ob ich das Makro direkt über Makros>Makros ausführen anwähle, oder ob ich den Klick auf einen Button damit verknüpfe, die Fehlermeldung bleibt die gleiche (in derselben Zeile).
komma4 hat geschrieben:Oder hast Du einen Dialog mit der Basic-IDE gestaltet?
Sagt mir leider gar nix. Ich hab das ganze in einem Fenster geschrieben, das sich "Meine Makros & Dialoge.Standard" nennt.
komma4 hat geschrieben:Welches OOo? Betriebssystem?
Windows XP, OOo 3.0
komma4 hat geschrieben:Ich habe den Code in einer Base-Datei (Modul ans Formular gehängt, neues Feature der 3.0.0), das geht aber auch mit dem 2.4er Release, ischschwör.
Wie hängst ein Modul ans Formular? Erklär kurz einmal...
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 19:55
von komma4
crazydoc hat geschrieben:komma4 hat geschrieben:Oder hast Du einen Dialog mit der Basic-IDE gestaltet?
Sagt mir leider gar nix. Ich hab das ganze in einem Fenster geschrieben, das sich "Meine Makros & Dialoge.Standard" nennt.
Du hast ein Formular!
(Das andere sind in Basic erstellte Dialoge: nicht an ein Writer-(oder sonstiges) Dokument gebundene
Fenster mit Kontrollelementen, die Du in einem graphischen Editor "zusammen klickst")
Kannst Du bitte mal Deinen Code hier posten (bitte in die CODE-tags setzen)... Du hast bestimmt einen Tippfehler irgendwo...
crazydoc hat geschrieben:Wie hängst ein Modul ans Formular? Erklär kurz einmal...
Ei: Base-Datei öffnen, Formular im Bearbeitungsmodus öffnen, Makros-Verwalten-Dialog, links:
BaseDateiName:FormName lokalisieren und
NEU drücken.
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 20:22
von crazydoc
komma4 hat geschrieben:
Base-Datei öffnen, Formular im Bearbeitungsmodus öffnen, Makros-Verwalten-Dialog, links: BaseDateiName:FormName lokalisieren und NEU drücken.
Dort steht genau das:
Code: Alles auswählen
Sub BefundAbspeichern
oDok = ThisComponent
oForm = oDok.DrawPage.forms.getbyindex(0)
sPatientenName = oForm.getByName( "Vorname" ).getText() & "_" & oForm.getByName( "Nachname" ).getText() & ".odt"
sVerzeichnis = "C:\Dokumente und Einstellungen\Andreas\Eigene Dateien\"
If _
( Not GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) ) _
Then
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
End If
'Vollständigen Dateinamen aus Pfad und Dateinamen zusammensetzen
sDateiName = ConvertToURL( sVerzeichnis & sPatientenName )
'Entweder neues Dokument mit Namen erstellen
'oder bestehendes Dokument des entsprechenden Namens öffnen
If ( FileExists( sDateiName ) ) Then
oDok = StarDesktop.loadComponentFromURL( sDateiName, "_blank", 0, Array() )
Else
oDok = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, Array() )
oDok.storeAsURL( sDateiName, Array() )
End If
End Sub
Ich hab durch Herumprobieren mit den Codezeilen herausgefunden, dass
gar nichts zurückliefert, also offenbar "leer" ist. Vielleicht liegt dort der Fehler.
Wenn man nämlich die Zeile, die mit "sPatientenname" auskommentiert und einfach
setzt, wird das Skript fehlerfrei durchlaufen. Nur ist halt der Dateiname immer derselbe, eh klar.
Die Datenbank sieht strukturell so aus:
ID Vorname Nachname
0 Ilse GuckindieLuft
1 Max Mustermann
2 Björn Borg
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 20:45
von komma4
crazydoc hat geschrieben:Ich hab durch Herumprobieren mit den Codezeilen herausgefunden, dass
gar nichts zurückliefert, also offenbar "leer" ist. Vielleicht liegt dort der Fehler.
Wenn leer: dann liegt dort der Fehler, bestimmt!
"Nachname" ist gefüllt/wird zurück geliefert?
Xray kennst Du zum Untersuchen Deines Codes?
zum Überprüfen der in der Form vorhandenen Kontrollelemente...?!
crazydoc hat geschrieben:Die Datenbank sieht strukturell so aus:
Vielleicht doch "Vornamen" oder "vorname"
Re: Verknüpfung Base und Writer
Verfasst: Fr, 17.10.2008 21:03
von crazydoc
xray liefert folgendes zurück:
Index min = 0, Index max = 4
0 | String : "txtVorname"
1 | String : "lblVorname"
2 | String : "txtNachname"
3 | String : "lblNachname"
4 | String : "PushButton"
Der Austausch von "Vorname" gegen "txtVorname" oder "lblVorname" gibt immer noch einen leeren Wert zurück (msgbox sPatientenName). Und "Nachname" ist auch leer.
Re: Verknüpfung Base und Writer
Verfasst: Sa, 18.10.2008 00:24
von komma4
Das sind die Namen der
controls. Deine Textfelder heissen "txtVorname" und "txtNachname".
[
lbl für: Label/Bezeichner]
Nächster Versuch:
Code: Alles auswählen
oFeld_VN = oForm.getByName( "txtVorname" )
oFeld_NN = oForm.getByName( "txtNachname" )
' xray oFeld_VN.Text
He - Kompliment für Deine verrosteten Basic-Kenntnisse!
Re: Verknüpfung Base und Writer
Verfasst: Sa, 18.10.2008 06:27
von crazydoc
Hey, dank deiner Hilfestellung (und xray - ein tooles Hilfsmittel!) hab ich es selbst hingekriegt. Schau einmal:
Code: Alles auswählen
Sub BefundAbspeichern
oDok = ThisComponent
oForm = oDok.DrawPage.forms.getbyindex(0)
oFeld_VN = oForm.getByName( "txtVorname" )
oFeld_NN = oForm.getByName( "txtNachname" )
'xray oFeld_VN.Text
'xray oFeld_NN.Text
sPatientenName = oFeld_VN.Text & oFeld_NN.Text & ".odt"
'xray sPatientenName
sVerzeichnis = "C:\Dokumente und Einstellungen\Nina\Eigene Dateien\TCM\"
If _
( Not GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) ) _
Then
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
End If
'Vollständigen Dateinamen aus Pfad und Dateinamen zusammensetzen
sDateiName = ConvertToURL( sVerzeichnis & sPatientenName )
'Entweder neues Dokument mit Namen erstellen
'oder bestehendes Dokument des entsprechenden Namens öffnen
If ( FileExists( sDateiName ) ) Then
oDok = StarDesktop.loadComponentFromURL( sDateiName, "_blank", 0, Array() )
Else
oDok = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, Array() )
oDok.storeAsURL( sDateiName, Array() )
End If
End Sub
Ich hab dann letztendlich nur mehr zwei Fragen:
1. Bei "unserem" Erstversuch wolltest du den Inhalt einer Stringvariablen mit .getText() auslesen, letztendlich geschieht es jetzt mit .Text (was die IDE übrigens blau anstatt grün schreibt???). Was ist da der Unterschied?
2. Gibts irgendwo im Netz eine Übersicht über verfügbare Libraries (wie in unserem Fall "Tools") und deren Inhalt?
Ich konnte mich schon gar nicht mehr erinnern, wie lustig und fesselnd es ist, sich durch Codezeilen zu "quälen". Danke für deine rasche & kompetente Hilfe. Vielleicht lern ich ja trotz meines hohen Alters doch noch eine dieser neuen objektorientierten Sprachen *ggg*.
Re: Verknüpfung Base und Writer
Verfasst: Sa, 18.10.2008 11:25
von komma4
crazydoc hat geschrieben:den Inhalt einer Stringvariablen mit .getText() auslesen, letztendlich geschieht es jetzt mit .Text (was die IDE übrigens blau anstatt grün schreibt???). Was ist da der Unterschied?
.Text ist die Eigenschaft (
property) des Objekts, in diesem Fall ...
xray oFeld_VN hat geschrieben:
Text string pseudo-prop, read-only
... eine verkürztes Schreibweise (Pseudo!) für die Methode
.getText().
Die blaue Farbe in der IDE zeigt "
Reservierter Ausdruck" an:
Exras>Optionen...>OpenOffice.org>Darstellung Benutzerdefinierte Farben>Basic Syntaxhervorhebung
crazydoc hat geschrieben:2. Gibts irgendwo im Netz eine Übersicht über verfügbare Libraries (wie in unserem Fall "Tools") und deren Inhalt?
Die Inhalte der Bibliotheken lese ich mit Basic aus und erstelle ein neues Dokument. Eine Quelle im Netz kenne ich deshalb nicht
BTL2 BasicTextListe2
Herzlichen Glückwunsch zur Fertigstellung Deines ersten OOo Makros.
Lesetipps:
http://www.ooomacros.org/dev.php http://www.pitonyak.org