Seite 1 von 1

Gelöst Base Abfrage "Kriterium" zugriff auf Formulardaten?

Verfasst: Mo 26. Nov 2012, 08:57
von Mocke47
Hallo,
in Access kann man in einer Abfrage ein Kriterium wie folgt vergeben:

Kriterien: [Formulare]![Hauptformular]![Unterformular]![Textfeld1] wobei das Unterformular ein Endlosformular ist (in Base auch möglich?)

Funktion: Die erstellte Abfrage mit diesem Kriterium wurde in ein Formular "Datensatz Bearbeiten" als Datenherkunft eingefügt. Wenn man nun aus dem Formular "Datensatz Suchen" mit Unterformular "Datensatz Liste" den Button "Bearbeiten" klickte, wurde nur der gerade sektierte Datensatz im Formular "Datensatz bearbeiten" angezeigt.

Geht das in Libre Base auch so einfach?

Mocke47

Re: Base Abfrage "Kriterium" zugriff auf Formulardaten?

Verfasst: Mo 26. Nov 2012, 19:50
von gogo
Nein, da der Base-Editor nur so ähnlich aussieht wie der von Access. Einen Verweis auf ein Laufzeit-Objekt gibt's dabei nicht, dafür ist die Struktur des LO-Desktops nicht wirklich geeignet.

Wenn ich so ein Bearbeiten-Formular haben will, dann mach' ich das so:

Button erstellen, und folgendes Makro zuweisen:

Code: Alles auswählen

sub gefiltertes_Formular_oeffnen(oEvent)

oForm = oEvent.Source.Model.Parent
oTextfeld = oForm.getbyname("Textfeld1") ' Das wäre der Verweis auf [Formulare]![Hauptformular]![Unterformular]![Textfeld1]

oBearbForm = ThisComponent.Drawpage.Forms.getbyname("Bearbeiten-Formular").open
oBearbForm.Filter = ""Feldname" = " & CStr(oTextfeld.CurrentValue) ' oder sonst eine Property oder Methode die den Wert des
                                                                   ' Textfeldes liefert
                                                                   ' ggf mit cStr() in einen String verwandeln
oBearbForm.applyfilter = true
oBearbForm.reload
end sub
Den Button solltest Du in dem Formular erstellen, in dem das Textfeld ist.

kleiner Tip gratis (frei nach Robert G.):
oEvent.Source.Model ist der Button - der hat z.B. die Eigenschaft ".Tag" - das ist ein nicht genutzter String, den Du in den Kontrollelement-Eingenschaften ganz unten als "Zusatzinformation" findest. Wenn Du da z.B. reischreibst:
"Bearbeiten-Formular;Feldname"
dann kannst Du damit übergeben, dass die Sub das Formular "Bearbeiten-Formular" öffnen soll, und nach dem Wert im Feld "Feldname" filtern soll:

Code: Alles auswählen

aTextArray() = Split(oEvent.Source.Model.Tag, ";")
oTextfeld = oForm.getbyname(aTextArray(1))
oBearbForm = ThisComponent.Drawpage.Forms.getbyname(aTextArray(0)).open
Den Button kannst Du dann einfach kopieren und in ein anderes Formular einfügen - nach Anpassen der "Zusatzinformation" kannst Du dann regeln was geöffnet werden soll, und nach was gefiltert wird. Praktisch oder?

PS: die .open-Methode in der Sub funktioniert nur wenn das Formular in dem der Button ist (oForm) auch eine aktive Datenbankverbindung hat. Diese Eigenschaft erbt das oBearbForm dann ... sollte aber kein Problem sein, wenn im oForm Daten angezeigt werden.

Re: Base Abfrage "Kriterium" zugriff auf Formulardaten?

Verfasst: Di 27. Nov 2012, 07:46
von Mocke47
Morgen gogo,
erneut danke für die sehr gute Beschreibung.

In dieser Hinsicht hat Access ein dickes Plus, da die oben genannte Möglichkeit, einfach in einer Abfrage als Kriterium das Textfeld eines Formulares anzugeben, nicht mit der Base variante zu vergleichen ist (was Kürze und Verständlichkeit angeht). Aber war hat gesagt das der Umstieg leicht ist :-). Bin mittlerweile doch sehr beeindruckt von den Möglichkeiten die Libre Office (freie Software) bietet, da ich meine Access Datenbank schon fast (fehlen nur noch ein paar Kleinigkeiten wie halt obiges Problem) vollständig nutzen kann.

Ist zwar keine Rückmeldung auf Deine super Beschreibung, aber ich bin jetzt ein paar Tage nicht da und aus Anstand wollte ich mich nochmal melden.

Melde mich zum Thema, sowie ich einen Schritt weiter bin (mit Codeschnipsel und wahrscheinlich fragen dazu :-) ).

Mocke47

PS. Habe mir Xray-Tool geladen und werde mich mal damit auseinandersetzen.

Re: Base Abfrage "Kriterium" zugriff auf Formulardaten?

Verfasst: Do 11. Apr 2013, 10:50
von Mocke47
Sorry gogo das ich mich solange nicht gemeldet habe.

Hier nun meine Lösung des Problemes mit Access2Base Erweiterung:

Code: Alles auswählen

Sub FormularBearbeiten
	Dim sTextfeld as String
	
	sTextfeld = getValue("Forms!Formularname!Tabellenfeld!Spaltenbezeichnung") 'übergibt den gefilterten Wert an sTextfeld
	
	OpenForm "Formularname", , ("""Feldname"" = '" & sTextfeld & "'") ' Feldname ... ist das Textfeld welches im Bearbeitungsformular gefilter wird
End Sub
Funktioniert super :-)

Re: Gelöst Base Abfrage "Kriterium" zugriff auf Formulardate

Verfasst: Do 11. Apr 2013, 12:46
von gogo
Ja, aber Du musst für jeden Button ein eigenes Makro schreiben.

Wenn Du das Makro oben verwendest, und den Wert "Textfeld1" aus der .tag-Eigenschaft des Buttons ermittelst, dann kannst Du den Button überallhin kopieren, und musst das Makro nicht umschreiben, sondern nur immer im Feld "Zusatz" des Buttons den Namen des zu suchenden Filterfeldes ändern...

Das Makro kann natürlich auch noch in ganz andere Richtungen erweitert werden, z.B. kann man den Namen des zu öffnenden Formulars dazunehmen. So etwa:

Code: Alles auswählen

sub gefiltertes_Formular_oeffnen(oEvent)
' Konvention fuer .tag:
'   String
'   separiert durch: |
'   ZuOeffnendesFormular|FilterStringVorne|FeldNachDemGefiltertWerdeSoll|FilterStringHinten
'      sTag(0)=ZuOeffnendesFormular
'      sTag(1)=FilterStringVorne
'      sTag(2)=FeldNachDemGefiltertWerdeSoll
'      sTag(3)=FilterStringHinten

dim sTag() as String

oForm = oEvent.Source.Model.Parent
oButton = oEvent.Source.Model
sTag() = split(oButton.tag, "|")

if ubound(sTag)<>3 then
   msgbox ("Buttonkriterium '.tag' falsch angegeben!" & chr(10) _
                & "Fehler beim Lesen des Strings:" & chr(10) _
                & "oEvent.Source.Model.tag: '" & oButton.tag & "'")
   exit sub
end if

oTextfeld = oForm.getbyname(trim(sTag(2)))

oBearbForm = ThisComponent.Drawpage.Forms.getbyname(trim(sTag(0))).open
oBearbForm.Filter = sTag(1) & CStr(oTextfeld.CurrentValue) & sTag(3)
oBearbForm.applyfilter = true
oBearbForm.reload

end sub
... und es geht noch viel komplexer/praktischer ... wie man möchte.
Grundidee dahinter: im Feld .tag kann man damit den "Ausdrucks-Editor" von Access sozusagen im Kommandline-Modus nachampfinden ... je nach Lust und Laune.