Formular per Basic öffenen - mit Auswahl?
Moderator: Moderatoren
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
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
Hey Laura,
(ich habe deinen Thread "rausgezogen" und verselbstständigt)
Doch nun zu deinem Thema:
Denke aber dran, dass - falls du die HSQLDB nutzt, die Feldnamen "maskiert " werden müssen - mit doppelten Hochzeichen.
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
(ich habe deinen Thread "rausgezogen" und verselbstständigt)
Doch nun zu deinem Thema:
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:Wie öffne ich ein Formular so, dass ein Filter gesetzt ist, der nur die spezielle ID anzeigt?
Code: Alles auswählen
SELECT * FROM myTabelle WHERE ID = 123
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....Ich habe so gut wie keine Ahnung von OpenOffice Basic und stehe völlig am Anfang

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo Thomas,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.
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
Hallo Mr.Ioes,
vielen Dankf für Thread-Erstellung
.
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
vielen Dankf für Thread-Erstellung

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

grüße
carsten
Du meinst "Hallo Thomas".laura36 hat geschrieben:Hallo Mr.Ioes,
vielen Dankf für Thread-Erstellung.
Du willst also kein neues Base-Formular öffenen sondern eine (Writer-/Calc-/Draw-/Impress-)Dateivorlagelaura36 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.
und in diese dabei automatisch mit Daten aus einem bestimmten (aus einer Abfrage generierten) Datensatz füllen?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.
Gruß - Mr.Ioes
Hey
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
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".Stellen sich also die Fragen: kann man beim Öffnen eines neuen Dokumentes einen Parameter mitgeben? Wie?
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.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ß.
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo Toxitom,
hallo Mr.Ioes
danke für die Antwort,
ich bin mittlerweile schon ein ganzes Stück weiter
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.
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]
hallo Mr.Ioes
danke für die Antwort,
ich bin mittlerweile schon ein ganzes Stück weiter
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.Du willst also kein neues Base-Formular öffenen sondern eine (Writer-/Calc-/Draw-/Impress-)Dateivorlage
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...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".
Also: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?
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
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]
Hallo Laura.
Eine kleine Kritik hätte ich noch...
]
Wenn du alle Daten laden und filtern willst verwendest du statt der Zeile
einfach
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
Eine kleine Kritik hätte ich noch...
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 sicherlaura36 hat geschrieben:Wie öffne ich ein Formular so, dass ein Filter gesetzt ist, der nur die spezielle ID anzeigt?

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
Code: Alles auswählen
oForm.Filter = "oid = '" + Str(AktuelleID) + "'"
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

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:
UNd OID wird numerisch übergeben? Eigentlich ja nicht (siehe weiter oben: ...getString()). Dann müsste eigentlich auch noch die folgende Ergänzung hin:
Also: Maskierung der Feldnamen und Übergabe als String. Zur Not ein wenig experimentieren 
Gruss
Thomas
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
Code: Alles auswählen
"select * from ""organisationen"" where oid = '" & AktuelleID & "'"

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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.
Hat jemand noch eine Idee, woran das liegt, dass mein Macro im zweiten Dokument nicht ausgeführt wird?
carsten
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.
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 ...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....
Hat jemand noch eine Idee, woran das liegt, dass mein Macro im zweiten Dokument nicht ausgeführt wird?
grüßeEin 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??
carsten
Hallo Carsten,
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
Ja, OK, mit MySQL oder anderen SQL Datenbanken brauchst du keine "Maskierung". Da geht es auch immer soIch arbeite mit MySQL und bisher klappte es so

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic