Base: Wie einen Wert bei Formularwechsel übergeben?

Moin!

Das Problem (Ich bin nicht der Erste, der sich damit beschäftigt, aber
eine zündende Idee habe ich bis jetzt nirgends gefunden) geht so:

Ich Möchte aus Formular1 über eine Schaltfläche an die ein Makro
gebunden ist Forlular2 aufrufen. Formular2 soll nur Daten anzeigen, die
sich auf den gerade in Formular1 angezeigten aktiven Datensatz beziehen.
Einfaches Beispiel: Formular1 zeigt den Datensatz (z.B. einen Datensatz
mit Name und Anschrift eines Kunden) mit ein paar Auswahlbuttons an von
denen man z.B. einen benutzen kann um ein weiteres Formular aufzurufen
in dem der in Formular1 angezeigte Datensatz dann editiert werden kann.
Mir ist klar, dass man das einfacher haben kann, aber erstens ist das
nur ein möglichst einfaches Beispiel und zudem ist der tiefere Grund ist
eine übersichtliche Benutzerführung zu realisieren, die in allen
Teilbereichen der Anwendung gleich funktioniert. Und das Problem kommt
dann häufiger vor.

Meine Idee war, Formular2 auf eine Parameterabfrage zu gründen in der
die ID als Parameter abgefragt wird und die ID des Datensatzes aus
Formular1 dann an den Parameter für Formular2 übergeben wird, aber die
ID kommt in Formular2 nicht an, jedenfalls bekomme ich das nicht hin.
Ich schaffe es die relevante ID in eien Variable zu speichern, aber wie
übergebe ich die.

Ich habe paar Beispiele im Netz gefunden, die das lösen sollen, habe es
aber nicht hinbekommen.

Es gibt auch die Variante in dem zweiten Formular einen Filter
aufzurufen, der dann nachdem "übergebenen" Wert filtert, aber auch das
bekomme ich nicht hin.

Für eine Idee auf welchem Wege das klappen könnte wäre ich dankbar. Muss
ja nicht gleich die Lösung sein :slight_smile:

Gruß ..
Wolfgang

Hallo Wolfgang,

Meine Idee war, Formular2 auf eine Parameterabfrage zu gründen in der
die ID als Parameter abgefragt wird und die ID des Datensatzes aus
Formular1 dann an den Parameter für Formular2 übergeben wird, aber die
ID kommt in Formular2 nicht an, jedenfalls bekomme ich das nicht hin.
Ich schaffe es die relevante ID in eien Variable zu speichern, aber wie
übergebe ich die.

Am besten nicht mit einem Parameter, sondern über eine Filtertabelle.
Angenommen Du hast die ID auslesen können, dann speicherst Du den Wert
per Makro in einer Tabelle, die Du "Filter" nennst. Dein weiteres
Formular greift auf eine Abfrage zu. Diese Abfrage wird mit dem Wert aus
"Filter" angesteuert.

Gruß

Robert

Hallo Wolfgang,

Für eine Idee auf welchem Wege das klappen könnte wäre ich dankbar. Muss
ja nicht gleich die Lösung sein :slight_smile:

Die Extension "Access2Base" ist - so wie ich das verstanden habe -
eigentlich angetreten, solche Dinge zu vereinfachen.
Siehe auch
http://www.access2base.com

Immerhin sie durch direkte Aufnahme in LibreOffice seit Version 4.2 geadelt
worden. Leider gibt es bisher wenig
Dokumentation sowie Hinweise, ob das dauerhaft die Art der Base-
Programmierung werden soll bzw. ob das von der Community angenommen wird.

Aber allein die dortige Methode "OpenForm" bietet eine Menge mehr Optionen
als die reine, mir umständlicher erscheinende UNO-Programmierung.

Ich habe selbst noch keinen praktischen Umgang damit, ziehe das aber
ernsthaft für umfangreichere Anwendungen in Betracht...

Gruß
Stefan

Hallo Stefan,

Für eine Idee auf welchem Wege das klappen könnte wäre ich dankbar. Muss
ja nicht gleich die Lösung sein :slight_smile:

Die Extension "Access2Base" ist - so wie ich das verstanden habe -
eigentlich angetreten, solche Dinge zu vereinfachen.
Siehe auch
http://www.access2base.com

Immerhin sie durch direkte Aufnahme in LibreOffice seit Version 4.2 geadelt
worden.

Steckt, wenn ich das richtig sehe, in "LibreOffice Makros & Dialoge"

Leider gibt es bisher wenig
Dokumentation sowie Hinweise, ob das dauerhaft die Art der Base-
Programmierung werden soll bzw. ob das von der Community angenommen wird.

Das ist die Krux in vielen Softwarebereichen: Da kann jemand noch so gut
etwas programmieren - wenn es nicht entsprechend dokumentiert und
offensiv angesprochen wird, dann weiß davon niemand etwas. Ich habe
davon durch Dich zum ersten Mal erfahren. Obwohl ich für den Großteil
des Inhaltes des Base-Handbuches verantwortlich bin - da werde ich mich
nicht auch noch rein knien. Schließlich habe ich mit Access nie
gearbeitet. Das scheint mir eher etwas für Leute zu sein, die von dort
entsprechende Codeschreibweisen kennen und das übertragen wollen.

Aber allein die dortige Methode "OpenForm" bietet eine Menge mehr Optionen
als die reine, mir umständlicher erscheinende UNO-Programmierung.

Für die entsprechende von Wolfgang gewünschte Filterung reicht
ThisDatabaseDocument.FormDocuments.getByName( "Name des Formulars" ).open

Was ist daran umständlich?

Gruß

Robert

Hallo Robert,

ich habe das inzwischen so gelöst, dass ich den Wert der ID, der an das
zu öffnende Formular übergeben werden soll als INTEGER in eine
"formularfilter"-Tabelle speichere, die aus zwei Tabellenfeldern besteht
nämlich aus einem Indexfeld und einem normalen INTEGER Feld. Ich
speichere die ID des aufzurufenden Datensatzes mit einem SQL-Statement
immer in den ersten Datensatz, also 0. Und dann habe ich folgende
Abfrage erstellt:

SELECT "user"."u_nachname", "user"."u_vorname", "formularfilter"."ID",
"user"."u_ID" FROM "user", "formularfilter" WHERE "user"."u_ID" =
"formularfilter"."Wert" AND "formularfilter"."ID" = 0

Darauf ist jetzt das Formular aufgebaut. Ok, das funktioniert, aber ich
finde es irgendwie nicht elegant. Viel Aufwand um eine kleine Zahl aus
dem einen Formular einem anderen Formular bekannt zu machen :-)).

Trotzdem Danke ..
Wolfgang

Hallo Wolfgang,

ich habe das inzwischen so gelöst, dass ich den Wert der ID, der an das
zu öffnende Formular übergeben werden soll als INTEGER in eine
"formularfilter"-Tabelle speichere, die aus zwei Tabellenfeldern besteht
nämlich aus einem Indexfeld und einem normalen INTEGER Feld. Ich
speichere die ID des aufzurufenden Datensatzes mit einem SQL-Statement
immer in den ersten Datensatz, also 0.

Das Indexfeld stelle ich übrigens grundsätzlich bei dieser
Ein-Datensatz-Tabelle auf ein boolsches Ja/Nein-Feld ein.

Und dann habe ich folgende
Abfrage erstellt:

SELECT "user"."u_nachname", "user"."u_vorname", "formularfilter"."ID",
"user"."u_ID" FROM "user", "formularfilter" WHERE "user"."u_ID" =
"formularfilter"."Wert" AND "formularfilter"."ID" = 0

Geht auch einfacher:

SELECT * FROM "user" WHERE "u_ID" = ( SELECT "Wert" FROM
"formularfilter" WHERE "ID" = 0 )

Und wenn Du mit dem gleichen Formular einmal alle User anzeigen lassen
möchtest, also keine "u_ID" weitergibst, dann geht das folgendermaßen:

SELECT * FROM "user" WHERE "u_ID" = IFNULL(( SELECT "Wert" FROM
"formularfilter" WHERE "ID" = 0 ),"u_ID")

Darauf ist jetzt das Formular aufgebaut. Ok, das funktioniert, aber ich
finde es irgendwie nicht elegant. Viel Aufwand um eine kleine Zahl aus
dem einen Formular einem anderen Formular bekannt zu machen :-)).

Bei mir laufen sehr wenige Formulare direkt mit einer Tabelle. Da ist
dann sowieso immer eine Abfrage Grundlage. Dann habe ich Berechnungen im
Formular mit drin, stelle andere Werte dar usw.

Die Filtertabelle benutze ich primär zum Suchen und Filtern von
Datensätzen. Das geht bedeutend schneller als mit den eingebauten
Funktionen. Ob da dann nun ein Feld mehr steht.

Außerdem hat so ein Vorgehen auch den Vorteil, dass Du z.B. einen
Bericht auch von nur einem Datensatz anfertigen kannst. Ein Bericht wird
genbauso wie Dein Formular dann über die ID angesteuert.

Für mich ist das eine gut nutzbare Universallösung.

Gruß

Robert

Hallo Wolfgang,

noch eine Variante ohne Abfrage:
Setze einfach das ganze als Filter direkt in die Formular-Eigenschaften ein:
("user"."u_ID" = ( SELECT "Wert" FROM "formularfilter" WHERE "ID" = 0 ))
Dann kannst Du bei geöffnetem Formular den Filter an und aus schalten.

Gruß

Robert

Hallo Robert,

Das ist die Krux in vielen Softwarebereichen: Da kann jemand noch so gut
etwas programmieren - wenn es nicht entsprechend dokumentiert und
offensiv angesprochen wird, dann weiß davon niemand etwas. Ich habe
davon durch Dich zum ersten Mal erfahren. Obwohl ich für den Großteil
des Inhaltes des Base-Handbuches verantwortlich bin

Darin schmökere ich durchaus öfter herum, deshalb auch von mir ein
anerkennendes Dankeschön für Deine viele Arbeit daran.

- da werde ich mich
nicht auch noch rein knien. Schließlich habe ich mit Access nie
gearbeitet. Das scheint mir eher etwas für Leute zu sein, die von dort
entsprechende Codeschreibweisen kennen und das übertragen wollen.

Ich frage mich, ob da nicht doch mehr Potential dahinter ist. Ich hatte auch
noch nie mit Access zu tun, und würde mir Access2Base nicht ernsthaft
angucken, wenn es nur der Kompatibiltät zu Access geschuldet sein sollte.
Base erkunde ich im Beruf schon seit Jahren aber leider nur nebenher.
eigentlich würde ich langfristig eine uralte DB-Applikation mal ablösen, die
ich vor 20 Jahren mit FoxPro erstellte und seitdem auch nebenher "pflege".

Mir ist es noch nicht gelungen, mich in der nötigen Tiefe in die Makro-
Programmierung einzuarbeiten, um eine richtige größere Anwendung anzugehen.
Die Hürden sind Zeit, aber auch diese gigantische API.

Schon bei kleineren Aufgabenstellungen wie im OP erschliessen sich Lösungen
für meine Begriffe nicht so einfach.
Mich sprechen die Argumente der Access2Base-Entwickler
(http://www.access2base.com, siehe Why Access2Base ?) grundsätzlich an. Sie
bieten dort eine Abstraktionsschicht zur Vereinfachung der Funktionen, die
man speziell für DB-Anwendungen häufig braucht.

Ich würde irgendwie gerne wissen, was man sich bei LibreOffice dabei dachte,
es einzuverleiben...

Aber allein die dortige Methode "OpenForm" bietet eine Menge mehr
Optionen als die reine, mir umständlicher erscheinende
UNO-Programmierung.

Für die entsprechende von Wolfgang gewünschte Filterung reicht
ThisDatabaseDocument.FormDocuments.getByName( "Name des Formulars" ).open

Was ist daran umständlich?

Ich habe kein Problem damit.
Ich meine auch nicht die Frage der Gewohnheiten oder Programmierparadigma
(prozedural/objektorientiert).

Access2Base bietet hier die Aktion "OpenForm(FormName, View, Filter,
WhereCondition, ...)".

Damit ließe sich - so wie ich das verstehe - das originale Problem in einem
Befehl umsetzen, ohne Umwege zu gehen zu müssen.

(Auch wenn die Lösung mittels Filtertabelle seinen Reiz haben mag.)

Von solchen Nützlichkeiten sehe ich bei Access2Base einige. Aber wie gesagt,
praktische Erfahrung damit habe ich noch keine.

Gruß
Stefan