Verknüpfung Base und Writer

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Verknüpfung Base und Writer

Beitrag 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?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag 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?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Re: Verknüpfung Base und Writer

Beitrag 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?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag von komma4 »

Nun, oForm muss besetzt werden (war nur ein snippet, was ich gepostet habe)

Bei einer Writer-Datei sollte diese Ergänzung helfen:

Code: Alles auswählen

oDok = ThisComponent
oForm = oDok.Drawpage.Forms(0)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Re: Verknüpfung Base und Writer

Beitrag 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! :D
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag 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.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Re: Verknüpfung Base und Writer

Beitrag 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...
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag 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.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Re: Verknüpfung Base und Writer

Beitrag 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

Code: Alles auswählen

oForm.getByName( "Vorname" )
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

Code: Alles auswählen

sPatientenname="Max_Mustermann.odt"
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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag von komma4 »

crazydoc hat geschrieben:Ich hab durch Herumprobieren mit den Codezeilen herausgefunden, dass

Code: Alles auswählen

oForm.getByName( "Vorname" )
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?

Code: Alles auswählen

xray oForm.ElementNames()
zum Überprüfen der in der Form vorhandenen Kontrollelemente...?!
crazydoc hat geschrieben:Die Datenbank sieht strukturell so aus:
Vielleicht doch "Vornamen" oder "vorname"
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Re: Verknüpfung Base und Writer

Beitrag 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.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag 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!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
crazydoc
Beiträge: 7
Registriert: Fr, 17.10.2008 12:00

Re: Verknüpfung Base und Writer

Beitrag 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*.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Verknüpfung Base und Writer

Beitrag 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
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Antworten