Seite 1 von 1

Verfasst: Di, 04.07.2006 23:19
von laura36
Hallo,
leider habe ich keine Antwort auf deine Frage. Im Gegenteil: Ich suche eine Lösung für ein Problem, das du bereits gelöst zu haben scheinst:

Ich möchte aus einem Formular heraus ein anderes Formular öffnen, in dem die Details eines Datensatzes (der im ersten Formular ausgewählt wurde) steht. Meine Frage nun:

Wie öffne ich ein Formular so, dass ein Filter gesetzt ist, der nur die spezielle ID anzeigt?

Ich habe so gut wie keine Ahnung von OpenOffice Basic und stehe völlig am Anfang. Was mir bislang gelingt ist, das Dokument zu öffnen und die entsprechende ID in eine Variable zu schreiben. Aber wie mache ich das mit dem Filter.

Über eine Antwort würde ich mich riesig freuen.

grüße
laura

Verfasst: Mi, 05.07.2006 08:36
von Toxitom
Hey Laura,

(ich habe deinen Thread "rausgezogen" und verselbstständigt)

Doch nun zu deinem Thema:
Wie öffne ich ein Formular so, dass ein Filter gesetzt ist, der nur die spezielle ID anzeigt?
In dem du das Formular entsprechend "konfektionierst". Jedes Formular stellt intern ein ResultSet einer Abfrage dar, die beim Aufruf direkt ausgeführt wird. In den Formulareigenschaften kannst du festlegen, wie die Abfrage aussehen soll. Die Abfrage selbst ist dann ein SQL-String (eine SQL Befehlssequenz), die du natürlich auch per Basic setzen kannst. Also soetwas wie:

Code: Alles auswählen

SELECT * FROM myTabelle WHERE ID = 123
Denke aber dran, dass - falls du die HSQLDB nutzt, die Feldnamen "maskiert " werden müssen - mit doppelten Hochzeichen.
Ich habe so gut wie keine Ahnung von OpenOffice Basic und stehe völlig am Anfang
Dann allerdings sehe ich das als ziemlich "schwierig" an. Datenbank-Manipulationen in zusammenhang mit Formularen setzt einfach schon "erweitertes" Wissen der OOo API, Basic, SQL und so weiter voraus. Damit direkt anzufangen.... :?:
Also, da empfehle ich dir, dich zunächst in die API (das Objektmodell etc) einzuarbeiten, dan ein wenig SQL zu machen, und dann erst das zu wagen.

Viele Grüße
Thomas

Verfasst: Mi, 05.07.2006 10:01
von Mr.Ioes
Toxitom hat geschrieben:...
Datenbank-Manipulationen in zusammenhang mit Formularen setzt einfach schon "erweitertes" Wissen der OOo API, Basic, SQL und so weiter voraus. Damit direkt anzufangen.... :?:
Also, da empfehle ich dir, dich zunächst in die API (das Objektmodell etc) einzuarbeiten, dan ein wenig SQL zu machen, und dann erst das zu wagen.
Hallo Thomas,

da auch ich schon öfters an der Aufgabe mir eine halbwegs produktive Datenbank zu erstellen gescheitert bin, bitte ich Dich die von Dir vorgeschlagenen Lernschritte — bei Gelegenheit — etwas genauer zu beschreiben, vielleicht sogar mit Links und/oder Literaturvorschlägen. Insbesondere frage ich mich, wie Du das mit der Einareitung in die API genau meinst.

Vorsorglich schon mal vielen Dank!

Gruß - Mr.Ioes

Verfasst: Mi, 05.07.2006 10:58
von laura36
Hallo Mr.Ioes,

vielen Dankf für Thread-Erstellung :D .
Aber ist das wirklich so kompliziert. Ich hatte mir etwas in der Art vorgestellt:

1. Per Makro öffne ich ein neues Dokument (das klappt). Der URL gebe ich aber noch einen Parameter mit, z.B. die ID des Datensatzes den ich im Detail sehen will.

2. Das neu geöffnete Dokument (ein Formular) nimmt den übergebenen Parameter, akzeptiert ihn als "named parameter" in einer Abfrage (die im Formular als Datenquelle steht) und zeigt den Datensatz an.

Stellen sich also die Fragen: kann man beim Öffnen eines neuen Dokumentes einen Parameter mitgeben? Wie?

Wie benutze ich den übergebenen Parameter im Dokument als Variable: direkt im SQL-Statement (wäre das einfachste, so, wie man ja einfach ein ":variable" in die SQL-Abfrage schreiben kann und dann öffnet ein Datenbank-Objekt von OpenOffice automatisch ein Dialogfeld mit der Abfrage dieses Parameters) oder per Macro, wie lese ich den übergebenen Parameter also aus und verwende ihn als Filter...

Meine Hoffnung war (da das ja quasi eine Standardanwendung ist ;-)), dass das schon mal jemand gemacht hat und mir beschreiben kann, was er da tut, ohne dass ich mich wesentlich tiefer in die API einarbeiten muß. (Mit Datenbanken und SQL komme ich zurecht ...).

grüße
carsten

Verfasst: Mi, 05.07.2006 11:34
von Mr.Ioes
laura36 hat geschrieben:Hallo Mr.Ioes,

vielen Dankf für Thread-Erstellung :D .
Du meinst "Hallo Thomas".

laura36 hat geschrieben:1. Per Makro öffne ich ein neues Dokument (das klappt). Der URL gebe ich aber noch einen Parameter mit, z.B. die ID des Datensatzes den ich im Detail sehen will.
Du willst also kein neues Base-Formular öffenen sondern eine (Writer-/Calc-/Draw-/Impress-)Dateivorlage
laura36 hat geschrieben:2. Das neu geöffnete Dokument (ein Formular) nimmt den übergebenen Parameter, akzeptiert ihn als "named parameter" in einer Abfrage (die im Formular als Datenquelle steht) und zeigt den Datensatz an.
und in diese dabei automatisch mit Daten aus einem bestimmten (aus einer Abfrage generierten) Datensatz füllen?

Gruß - Mr.Ioes

Verfasst: Mi, 05.07.2006 13:19
von Toxitom
Hey
Stellen sich also die Fragen: kann man beim Öffnen eines neuen Dokumentes einen Parameter mitgeben? Wie?
In dem Fall ist das doch gar nicht nötig. Wenn du per Basic das neue Dokument öffnest, kannst du doch auch gleich im Basic (dem laufenden Makro) alle anderen Einstellungen vornehmen. Da brauchst du keine "Parameterübergabe".
Meine Hoffnung war (da das ja quasi eine Standardanwendung ist ), dass das schon mal jemand gemacht hat und mir beschreiben kann, was er da tut, ohne dass ich mich wesentlich tiefer in die API einarbeiten muß.
Das ist eben die Problematik. Mit Datenbanken gibt es nichts mehr "Standard" - hier wird es immer kompliziert. Solange du nichts anders möchtest, als das, was der Assistent in Base zustande bringt - OK, das ist Standard. Aber jeder kleine Schritt weiter erfordert eben schon seeeeeeehr viel Wissen über das "Wie". Dazwischen gibt es leider keine Bewegungszone.

Auch @Mr.Joes:
Es kommt jetzt bald mein Base-Buch auf den Markt, dort sind Beispiele ausführlich beschrieben - aber auch hier muss ich (leider) sagen: Wer sich in die fortgeschrittenen Kapitel (mit den Basic-Codes) vorwagt, muss Ahnung davon haben. Ich kann dort nicht alles erläutern - also setze ich Erfahrungen mit der API, mit Formularen und Dialogen etc. voraus und zeige die Anwendung und Applikationserzeugung.

Bei Datenbank-Anwendungen kann man leider keinen "Marko-Rekorder" mitlaufen lassen zur Aufzeichnung einfacher Schritte - hier muss man sich sehr bewusst den Ablauf durchdenken und dann die entsprechenden Vorgehensweisen planen.

@laura:
Beschreib doch mal etwas ausführlicher, was das denn eigentlich werden soll. Wahrscheinlich gibt es ganz andere Lösungen - eventuell reicht ja auch schon ein Unterformulatr?

Gruss
Thomas

Verfasst: Mi, 05.07.2006 14:12
von laura36
Hallo Toxitom,
hallo Mr.Ioes

danke für die Antwort,
ich bin mittlerweile schon ein ganzes Stück weiter
Du willst also kein neues Base-Formular öffenen sondern eine (Writer-/Calc-/Draw-/Impress-)Dateivorlage
Ja, genau. Erstens, weil mir ersteres zu schwierig erscheint, zweitens, weil das in OpenOffice 2.0 nicht sonderlich stabil ist. Jedenfalls ist mir mehrfach beim Erstellen des Formulars OpenOffice abgestürzt und das Formular war weg, nicht mehr in der Datenbank, obwohl ich es gespeichert hatte und die Datenbank selbst auch. Außerdem sollen die Formulare direkt von den NutzerInnen geöffnet werden können.
In dem Fall ist das doch gar nicht nötig. Wenn du per Basic das neue Dokument öffnest, kannst du doch auch gleich im Basic (dem laufenden Makro) alle anderen Einstellungen vornehmen. Da brauchst du keine "Parameterübergabe".
genau, das hatte ich mittlerweile auch festgestellt. (wie gesagt, ich habe keine Ahnung von Makros, wußte also auch nicht, dass sich "thiscomponent" immer auf das aktuelle Dokuement bezieht...
Beschreib doch mal etwas ausführlicher, was das denn eigentlich werden soll. Wahrscheinlich gibt es ganz andere Lösungen - eventuell reicht ja auch schon ein Unterformulatr?
Also:

Es gibt eine Datenbank, in der es folgende Tabellen git:
* Organisationen
* Eigenschaften von Organisationen (es ist eine Datenbank, mit der sich NGOs nach bestimmten Kriterien suchen lassen sollen)
* Rubriken

Jetzt gibt es ein Formular, in dem aus der Tabelle "eigenschaften" ein Datensatz angezeigt wird. Der Name der zugehörigen Organisation ist per Fremdschlüssel aus der Tabelle Organisationen per Listenfeld zu sehen bzw. bei neuen Datensätzen auszuwählen.

In einem Unterformular wird nun angezeigt, in welchen verschiedenen Rubriken der jeweilige Eintrag ist. (Für jede Rubrik ist der Eintrag in einer Tabelle als Zeile referenziert).

Weil nicht alle relevanten Informationen übersichtlich auf das Blatt passen und außerdem zu einer Organisation wieder verschiedene andere Tabellen existieren (Mitgliedschaften, Ansprechpersonen, etc.) soll per Schaltfläche für den aktuellen Datensatz ein Formular geöffnet werden, in dem die Organisation mit all ihren Daten steht. (-> dort soll es dann wieder Schaltflächen für die Details z.B. von Ansprechpersonen geben etc.)

Mein Code sieht aktuell so aus und funktioniert:
* die zugehörige Tabelle heißt organisationen und der Primärschlüssel oid
* in der Tabelle auf der das erste Formular beruht ist die Spalte 2 der Fremschlüssel der auf "organisationen.oid" verweist.

Code: Alles auswählen

Sub DatensatzDetails
	odoc=thiscomponent
REM	Hier wird der aktuelle Datensatz in der Variable AktuelleID gespeichert
    oform=odoc.drawpage.forms.getbyindex(0)
    AktuelleID=oform.getstring(2)	REM Die Nummer steht für die Spalte in der Tabelle, um die es geht...
	'MsgBox ( "Datensatz Nr.: " & AktuelleID )
	
	sFile = "Pfad_zu_Formular_fuer_Details.odt" 		REM welches Formular soll geöffnet werden
    sURL = ConvertToURL(sFile) REM konvertiert Dateiname in URL
    	Dim myProps(0) as New com.sun.star.beans.PropertyValue				REM öffnet Dokument schreibgeschützt
		myProps(0).Name="ReadOnly"
		myProps(0).Value = true
	oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, myProps()) 	REM öffnet Formular
	
REM Jetzt ist das neue Formular geöffnet. Als Formular wird das erste Formular (0) definiert.
REM Und als "command" ein SQL-Befehl. (Wichtig: Eigenschaften des Formulars müssen als Datenquelle SQL-Befehl ausweisen)
    oForm = oDoc.DrawPage.Forms(0)
    oForm.command = "select * from organisationen where oid = " & AktuelleID 
    oForm.reload

end sub
Vorerst ist das auch schon fast alles, was ich will. Hoffentlich klappt das auch in der Praxis...

Ein Problem habe ich aktuell noch:
Wenn ich in dem neu geöffneten Formular wiederum per Schaltfläche ein Makro auführen möchte, funktioniert das nicht, wenn das Formular bereits durch das Makro geöffnet wurde. (Das neue Makro befindet sich im neuen Dokument). Offensichtlich läuft das andere noch und verhindert die Ausführung eines neuen??

Vielen Dank & grüße
laura36[/quote][/quote]

Verfasst: Mi, 05.07.2006 14:27
von Mihilist
Hallo Laura.

Eine kleine Kritik hätte ich noch...
laura36 hat geschrieben:Wie öffne ich ein Formular so, dass ein Filter gesetzt ist, der nur die spezielle ID anzeigt?
Im Moment, also mit dem angegebenen Code, setzt du keinen Filter, sondern lädst die Daten nur selektiv [man möge mich korrigieren, falls ich falsch liege, aber ich bin mir relativ sicher :) ]

Wenn du alle Daten laden und filtern willst verwendest du statt der Zeile

Code: Alles auswählen

oForm.command = "select * from organisationen where oid = " & AktuelleID
einfach

Code: Alles auswählen

oForm.Filter = "oid = '" + Str(AktuelleID) + "'"
das mit ' und + und Str ist das, was ich machen würde... Wenn es bei deiner DB mit & und ohne ' klappt musst du's halt entsprechend ändern *g*

Unterschied ist (denke ich), dass er nun alles lädt, der Benbutzer kann somit im schon geöffneten Dokument den Filter noch ändern. Ob das für dich wünschenswert ist oder nicht weiß ich nicht, wollte es nur anmerken.

Grüße
Thomas

PS: Bei dem Makro-Problem kann ich leider nicht helfen :(

Verfasst: Mi, 05.07.2006 19:26
von Toxitom
Hey Laura,

soweit sieht das doch ganz gut aus.

Bei demem SQL -Command denke ich jedoch, dass es nicht funktionieren wird! Wenn du nämlich eine die eingebaute HSQL-DB als Datenquelle nutzt, könnte es zu einer Fehlermeldung kommen. Nicht immer, aber manchmal....
Dann solltest du den String wie folgt ändern:

Code: Alles auswählen

"select * from ""organisationen"" where oid = " & AktuelleID
UNd OID wird numerisch übergeben? Eigentlich ja nicht (siehe weiter oben: ...getString()). Dann müsste eigentlich auch noch die folgende Ergänzung hin:

Code: Alles auswählen

"select * from ""organisationen"" where oid = '" & AktuelleID & "'"
Also: Maskierung der Feldnamen und Übergabe als String. Zur Not ein wenig experimentieren :-)

Gruss
Thomas

Verfasst: Mi, 05.07.2006 21:06
von laura36
Hallo Thomas, hallo Thomas,

vielen Dank für den Tip mit dem Filter. Ich wußte schlichtweg den Befehl nicht. Jetzt gibt es beide Möglichkeiten - kann ich mir eine aussuchen. Die eine ist eleganter, die andere universeller. Mal sehen.
Bei demem SQL -Command denke ich jedoch, dass es nicht funktionieren wird! Wenn du nämlich eine die eingebaute HSQL-DB als Datenquelle nutzt, könnte es zu einer Fehlermeldung kommen. Nicht immer, aber manchmal....
Danke auch für die Hinweise zur korrekten Maskierung im SQL-Statement. Ich arbeite mit MySQL und bisher klappte es so. Gut zu wissen, dass es nicht immer klappt, sonst stehe ich sicher das nächste Mal auf dem Schlauch, wenn es daran liegt ...

Hat jemand noch eine Idee, woran das liegt, dass mein Macro im zweiten Dokument nicht ausgeführt wird?
Ein Problem habe ich aktuell noch:
Wenn ich in dem neu geöffneten Formular wiederum per Schaltfläche ein Makro auführen möchte, funktioniert das nicht, wenn das Formular bereits durch das Makro geöffnet wurde. (Das neue Makro befindet sich im neuen Dokument). Offensichtlich läuft das andere noch und verhindert die Ausführung eines neuen??
grüße
carsten

Verfasst: Do, 06.07.2006 08:00
von Toxitom
Hallo Carsten,
Ich arbeite mit MySQL und bisher klappte es so
Ja, OK, mit MySQL oder anderen SQL Datenbanken brauchst du keine "Maskierung". Da geht es auch immer so :-) Nur eben bei der HSQLDB nicht - eine beliebte Fehlerquelle ....

Zum anderen Problem:
Nun ja, das Laufen eines Makros verhindert nicht das Starten eines anderen - nur im gleichen Controller geht das extern nicht. Andererseits: Warum sollte dein altes Makro noch laufen? Es wird doch abgearbeitet - bis zum end. Oder hast du eine Endlosschlaife drin?

Ich denke, da ist etwas anderes "faul". Dazu bräuchte man natürlich den Code und das Vorgehen :-)

Gruss
Thomas