Seite 1 von 1

Gewählten Datensatz in anderem Formular bearbeiten [gelöst]

Verfasst: Mo, 18.03.2013 14:35
von Jeremias
Hallo zusammen,

ich bin noch neu hier und bringe nicht sehr viel Erfahrung in der Datenbankentwicklung mit.
Inzwischen habe ich hier schon einige gute Tips erhalten, indem ich die vorhandenen Beiträge durchsucht habe.
Jetzt komme ich aber schon so lange an einer blöden Stelle nicht weiter, dass ich mal eine Frage stellen möchte, zu der ich die Antwort bisher nicht gefunden habe.

Situation ist eine Datenbank für den Bestand an einer Sammlung alter Bücher. Struktur ist: Hauptkategorie - Unterkategorie - Titel - Exemplar. Jede Tabelle hat eine eigene ID als Primärschlüssel. Diese vier wichtigsten Tabellen sind in dieser Reihenfolge miteinander 1:n-verknüpft.

Eine wesentliche Maske (also das Writer-Dokument, das meist als Formular im weiteren Sinne bezeichnet wird) dient zur Bearbeitung eines Datensatzes, indem für diesen die Informationen zum Titel (einschließlich zugehöriger Haupt- und Unterkategorie) sowie die damit verknüpften Exemplare angezeigt werden und bearbeitet werden können.

Eine zweite Maske dient der Auswahl eines Datensatzes zur Bearbeitung. Dazu habe ich die eindrucksvollen Instruktionen aus dem Makro-Handbuch v4.0 verwendet, die eine Suche über alle Felder ermöglicht. Dazu gehe ich allerdings nicht in eine Tabelle, sondern in eine Abfrage, die für jedes Exemplar eine Zeile mit allen verknüpften Informationen enthält.

Ziel ist es nun, dass ich im Suchergebnis eine Zeile (d. h. einen bestimmten Datensatz) markiere und über einen Makro die o. g. Bearbeitungsmaske aktiviere sowie deren Anzeige so filtere, dass sie nur den einen ausgewählten Datensatz zu bearbeiten gestattet. Nach Ende der Bearbeitung soll wieder die Suchmaske den Fokus erhalten.

Der Makro, der das leisten soll, liest also den Primärschlüssel des Buchtitels aus und aktiviert die Bearbeitungsmaske.
Dann will ich auf dieser Maske auf den relevanten Datensatz filtern. Dazu muss ich einen Filterstring erstellen und diesen auf die Maske anwenden. Dabei läuft der Makro aber auf den Fehler, dass er die Eigenschaft ".Filter" nicht kennt.

Langes Herumprobieren mit xray hat mich auch nicht weitergebracht. Daher jetzt die hoffnungsvolle Frage in die Runde, wie kann ich das beschriebene Ziel erreichen?

Ich gebe eine Fassung (von inzwischen vielen) dieses Makros mit dazu in der Hoffnung, dass das mein Problem erklärt.

Code: Alles auswählen

Sub Datensatz_uebertragen_red
  '
  ' Jeremias, 18.03.2013, LibreOffice 3.6.5
  '
  ' Der im Tabellenkontrollfeld (erste) markierte Datensatz soll
  ' zur Bearbeitung im Hauptbearbeitungsformular geöffnet werden.
  '
  Dim nID As Variant
  Dim oBearbForm As Object
  Dim oForm As Object
  Dim oForm2 As Object
  Dim oSpalte As Object
  Dim oSubForm As Object
  Dim sFilter As String

  ' Zunächst aus der Tabelle auf der Suchmaske 
  ' den markierten Datensatz bestimmen.
  oForm = ThisComponent.Drawpage.Forms.getByName("Frm_Suchmaske")
  oSubForm = oForm.getByName("TKF_Suchergebnis")
  oSpalte = oSubForm.getByName("spBuchID")
  nID = oSpalte.Text
  nID = CLng(nID)
  
  ' Sodann die Bearbeitungsmaske öffnen
  oDoc = ThisComponent.Parent
  oBearbForm = oDoc.Formdocuments.getByName("Frm_BuchBearbeitung")
  oBearbForm.open

  ' Schließlich den Filter setzen
  oBearbForm.Filter = " ""fdBuchID"" LIKE '" & CStr(nID) & "'"     ' <--- Fehler
    ' <fdBuchID> ist der Feldname des Primärschlüssels
  oBearbForm.ApplyFilter = True
  oBearbForm.reload()
End Sub
In der Zeile "oBearbForm.Filter = ..." läuft er auf den Fehler:

Code: Alles auswählen

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: Filter.

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 15:22
von juetho
Hallo und willkommen im Forum,

das Problem ist tatsächlich auf den unterschiedlichen Gebrauch des Begriffs "Formular" zurückzuführen. Mit

Code: Alles auswählen

oBearbForm = oDoc.Formdocuments.getByName("Frm_BuchBearbeitung")
bekommst du sozusagen die Benutzeroberfläche für das andere Formular, also das, was aus der Datenbank-Übersicht "Formulare" geöffnet wird. Deswegen benutze ich dafür keinen Bezeichner mit "...Form", sondern einen mit "...Forms"; denn aus diesem "Formular im weiteren Sinne" musst du erst noch auf das eigentliche Formular schalten, bis du dort den Filter setzen kannst:

Code: Alles auswählen

newForms = oDoc.Formdocuments.getByName("Frm_BuchBearbeitung")
newForm = newForms.drawpage.forms.getByName("MainForm")   ' oder wie das oberste Formular heißt
newForm.Open   ' zuerst muss es geöffnet werden, bevor dort Einstellungen gesetzt werden
newForm.Filter = "..."
Im Handbuch Seite 293 sowie iIn der Diskussion Parameter von Formular an Formular übergeben (und Links dort) stehen noch ein paar Informationen zum Wechsel zwischen Formularen.

Gruß Jürgen

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 19:16
von Jeremias
Hallo Jürgen,

vielen Dank für die Erläuterung und für den Willkommensgruß!

Dass der Begriff Formular auf zwei Ebenen verwendet wird, weiß ich ja schon. Aber dass das so weitreichende Folgerungen hat, habe ich bisher nicht durchblickt. Jetzt werde ich Deine Lösung mal in Ruhe durchexerzieren und mich mit dem Ergebnis melden.

Edit: Noch eine Zusatzfrage: Was genau ist "das Handbuch", in dem ich das nachlesen kann?

Schöne Grüße
Jeremias

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 20:05
von juetho
Jeremias hat geschrieben:Edit: Noch eine Zusatzfrage: Was genau ist "das Handbuch", in dem ich das nachlesen kann?
Oben hattest du vom Makro-Handbuch gesprochen; da dachte ich, dass dir diese Quelle bekannt ist (zum ausführlichen Base-Handbuch weit nach unten scrollen). Jürgen

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 20:08
von Jeremias
Hallo Jürgen,

ich habe es jetzt ausprobiert. Zunächst ging es noch nicht (Drawpage nicht bekannt ...), aber mit Hilfe des Links, den Du mir gegeben hast, konnte ich es dahin bringen, dass es nun doch geht.
Die nötigen Änderungen waren:
1. Mein oDoc war "ThisComponent.Parent". Das geht nicht. Wohl aber "ThisDatabaseDocument".
2. Ich muss nicht <newForm> öffnen, sondern <newForms>, und zwar vor dem Zugriff auf die Drawpage, sonst gibt es wiederum nur eine Fehlermeldung.

Ich öffne jetzt also zuerst aus der Sammlung der FormDocuments meine Maske "Frm_BuchBearbeitung" und kann anschließend in deren Drawpage auf die Sammlung der Forms wieder auf "Frm_BuchBearbeitung" zugreifen. Und darin schließlich finde ich die Zugriffsmöglichkeit auf Filter, aber auch auf alle einzelnen Felder der Maske.

Der entsprechende Teil des Codes lautet jetzt:

Code: Alles auswählen

  ' Sodann die Bearbeitungsmaske öffnen
  oFormDocs = ThisDatabaseDocument.FormDocuments.getByName("Frm_BuchBearbeitung").open
  oBearbForm = oFormDocs.Drawpage.Forms.getByName("Frm_BuchBearbeitung")
  'xray oBearbForm

  ' Schließlich den Filter setzen
  oBearbForm.Filter = " ""fdBuchID"" LIKE '" & CStr(nID) & "'"
Ich bin ganz happy, dass das jetzt mit Deiner Hilfe funktioniert! :D :D :D
(Besonders, nachdem ich rund zwei Tage mit der vergeblichen Suche zugebracht habe.) :(

Vielen Dank noch einmal!

Gruß
Jeremias

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 20:51
von Jeremias
juetho hat geschrieben:
Jeremias hat geschrieben:Edit: Noch eine Zusatzfrage: Was genau ist "das Handbuch", in dem ich das nachlesen kann?
Oben hattest du vom Makro-Handbuch gesprochen; da dachte ich, dass dir diese Quelle bekannt ist (zum ausführlichen Base-Handbuch weit nach unten scrollen). Jürgen
Sorry, irgendwie stehe ich auf der Leitung.

Ich habe mit "Handbuch" auf die Datei "Base_09_Makros_V40.pdf" abgehoben (Seite 30).
Das entspricht in der Gesamtausgabe "Base_Gesamtband_einseitig_V40.pdf" der Seite 277. Das ist die einzige mir bisher vorliegende Datei, die überhaupt mindestens 293 Seiten umfasst.

Wenn ich dort auf Seite 293 nachschaue, dann steht dort ein Abschnitt über "Tabellenindex heruntersetzen bei Autowert-Feldern". Das ist - soweit ich erkennen kann - nicht mein derzeitiges Thema. Daher meine Verwirrung.

Gruß
Jeremias

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 20:58
von F3K Total
... und hier eine kleine Klugscheisserei ...
Kann es sein, dass hier

Code: Alles auswählen

oBearbForm = oFormDocs.Drawpage.Forms.getByName("Frm_BuchBearbeitung")
ein

Code: Alles auswählen

.Component
fehlt und die Zeile eigentlich so

Code: Alles auswählen

oBearbForm = oFormDocs.Component.Drawpage.Forms.getByName("Frm_BuchBearbeitung")
heißen muß? :wink:

Gruß R

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 21:33
von Jeremias
Hallo "F3K Total",

vielen Dank für Deine Beteiligung!

Ich bin im Objektmodell noch nicht so weit zu Hause, dass ich den Hintergrund Deiner Anmerkung verstanden hätte.

Aber ich habe es einfach ausprobiert, ob es auch mit ".Component" geht. Nein, tut es nicht. Es läuft auf den Fehler, dass die Eigenschaft oder Methode "Component" nicht gefunden werde.

Gruß
Jeremias

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Mo, 18.03.2013 21:50
von F3K Total
Hallo Jeremias,
jetzt stehe ich auf der Leitung:
mit

Code: Alles auswählen

oFormDocs = ThisDatabaseDocument.FormDocuments.getByName("Frm_BuchBearbeitung")
oFormDocs.open
braucht man

Code: Alles auswählen

oBearbForm = oFormDocs.Component.Drawpage.Forms.getByName("Frm_BuchBearbeitung")
verwendet man dagegen

Code: Alles auswählen

oFormDocs = ThisDatabaseDocument.FormDocuments.getByName("Frm_BuchBearbeitung").open
öffnet sich das Formular mit

Code: Alles auswählen

oBearbForm = oFormDocs.Drawpage.Forms.getByName("Frm_BuchBearbeitung")
Das kapiere ich nicht!

Gruß R

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Di, 19.03.2013 00:01
von Jeremias
Ich habe das jetzt nachvollzogen und kann es bestätigen: Auch bei mir geht separates ".open" nur mit ".Component", während ".open" am Ende der Objektzuweisung nur ohne (!) ".Component" geht.

Über den Grund kann ich bei meinem aktuellen Wissensstand überhaupt keine Angaben machen. Ich habe jetzt aber aus trivialen Gründen (nämlich Zeilenlänge im Quellcode) Deine Version hergenommen.

Re: Ausgewählten Datensatz in anderem Formular bearbeiten

Verfasst: Di, 19.03.2013 09:04
von juetho
Jeremias hat geschrieben:Ich habe mit "Handbuch" auf die Datei "Base_09_Makros_V40.pdf" abgehoben (Seite 30).
Das entspricht in der Gesamtausgabe "Base_Gesamtband_einseitig_V40.pdf" der Seite 277. Das ist die einzige mir bisher vorliegende Datei, die überhaupt mindestens 293 Seiten umfasst.
Da muss ich die Links, die ich angebe, und die Handbücher, auf die ich (mit Seitenangabe) verweise, genauer prüfen:
  • Base_09_Makros_V40.odt habe ich selbst überarbeitet (der erste Abschnitt stammt überwiegend von mir); deshalb habe ich die pdf-Datei nicht angeschaut.
  • Auf der Handbuch-Seite steht fett die Version Base_Gesamtband_einseitig_V40.pdf zur Verfügung.
  • Dagegen zitiere ich die Version Base_Gesamtband_doppelseitig_V40.pdf.
Es ist denkbar, dass sich durch den anderen Umbruch auch andere Seitenzahlen ergeben.

Zu dem Problem mit thisDatabaseComponent und Component kann ich nicht mehr sagen als dass ich mich auch wundere. Ich stolpere auch immer wieder über solche Unklarheiten.

Jürgen

Re: Gewählten Datensatz in anderem Formular bearbeiten [gelö

Verfasst: Di, 19.03.2013 12:40
von Jeremias
Bei der Gelegenheit möchte ich einfach auch mal noch einen herzlichen Dank loswerden für die Erstellung dieses Handbuchs. Neben der fundierten Sachkenntnis, die darin zum Ausdruck kommt, ist es ja auch eine sehr umfangreiche Fleißarbeit, ein Dokument von rund 350 Seiten zusammenzustellen und zu allen angeschnittenen Themen auf aktuellem Stand zu halten.

Also allen daran Beteiligten: Ganz herzlichen Dank! :-D