BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von pschulze59 » Fr 16. Nov 2018, 21:24

Hallo R.,
ich danke Dir für Deine Mühen. Ich schaue mir das mal intensiver demnächst an. Aber schon mal vorweg: Wenn ich in F-KONTAKTE auf "Zurück zum Berater" klicke, kommt de facto der gleiche Fehler wie bei mir im Beitrag zuvor beschrieben.

Also mittlerweile habe ich den Code zur Bildung der SELECT-Anweisung wie folgt geändert, allerdings mit gleicher Fehlermeldung:

Code: Alles auswählen

stSQL ="select * from ""Kont"" where ""ID"" = " + laktKontID
Entweder ist es ein syntaktisches Problem, oder es könnte noch damit zusammenhängen, dass ich in dem Formular auch aus anderen Tabellen die "sprechenden" Werte statt der ID anzeigen lasse, also z. B. "KontArt", "KontOrt".
Oder muss die Ansicht mit einer Anweisung nach dem execute der SELECT-Anweisung noch mal aktualisieren? Wenn ja, welche?
Oder hat es was mit der Firebird-DB zu tun?

Peter

F3K Total
Beiträge: 2409
Registriert: So 10. Apr 2011, 10:10

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von F3K Total » Sa 17. Nov 2018, 08:19

Moin, ist bei mir nicht der Fall, verwende LO 6.0.7, welche Version nutzt du? Habe mit 6.1.3 Probleme mit Formularen gehabt. Der Fehler tritt bei mir in 6.1.3 bei jedem Formular mit verknüpftem Unterformular auf, scheint ein BUG zu sein.
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

F3K Total
Beiträge: 2409
Registriert: So 10. Apr 2011, 10:10

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von F3K Total » So 18. Nov 2018, 17:28

Hallo Peter,
es handelt sich tatsächlich um einen Bug:https://bugs.documentfoundation.org/sho ... 117053#c15
Mit dem dort gezeigten Makro, einmal ausgeführt und die .odb gespeichert, ist das Problem behoben.
Ich habe es etwas verkürzt:

Code: Alles auswählen

Sub Set_ParameterNameSubstitution_true
    oController = ThisDatabaseDocument.CurrentController
 	if not oController.isConnected then oController.connect
 	ThisDatabaseDocument.DataSource.Settings.ParameterNameSubstitution = true
End Sub
Robert, per Mail zum Bug, hat geschrieben:Jetzt funktionieren alle neu erstellten Firebird-Datenbanken wohl wie
gewünscht (ich hatte kürzlich selbst eine mit Unterformular erstellt -
funktioniert in LO 6.1.3.2), aber die alten Datenbaken streiken.
Also anbei die mit dem Makro behandelte Datei. Läuft bei mir jetzt auch unter LO 6.1.3
Gruß R
Dateianhänge
pschulze59.zip
(18.47 KiB) 136-mal heruntergeladen
Windows 10: AOO, LO Linux Mint: AOO, LO

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von pschulze59 » Mi 21. Nov 2018, 20:44

... leider sind meine letzten zwei posts zu diesem thread nicht mehr vorhanden, seit dem wohl gestern Abend der Forumserver abgestürzt war ... :o
Es wurde vermutlich ein Backup vom Vortag eingespielt. ;) Ich versuche also noch mal zu rekapitulieren:

1. Danke an R. für seine Mühen. Sein Konstrukt läuft jetzt auch bei mir.
Ich bin mir sicher, das man das so auch bei meinem Projekt umsetzen kann. Allerdings leide ich an Altersstarrsinn und deswegen interessiert mich trotzdem, warum in meinem Konstrukt die Anwendung der gebildeten SQL-Anweisung nicht funktioniert!?
also

2. Ich verstehe nicht, warum die gebildete SQL-Anweisung mit execute.Query(stSQL) nicht zum gewünschten select im aufgerufenen Formular führt. Nachdem ich das Bilden des SQL-strings dafür noch mal angepasst habe, wird mittlerweile kein Fehler mehr generiert - aber es passiert auch nichts.
Hier ist noch mal der Code dazu:

Code: Alles auswählen

	oDoc2 = oForm1.getByName("SubForm2")
	laktKontID = oDoc2.getlong(1)
	'MainForm schließen und SubForm exclusiv als neues MainForm öffnen
	thisdatabasedocument.formdocuments.getByName("RB").close
	oDoc2 = thisdatabasedocument.formdocuments.getByName("Kont").open
	oDrawpage2 =oDoc2.Drawpage
	oForm2 = oDrawpage2.forms.getByName("MainForm")
	do
	    wait 10
	loop until oForm2.isloaded
	oConnection = oForm2.activeConnection()
	oSQL_Statement = oConnection.createStatement()
	stSQL ="select * from ""Kont"" where ""ID"" = '" + laktKontID +"'"
	'stSQL ="select * from ""Kont"" where ""ID"" = '3'" 
	msgbox(stSQL)
	oResult=oSQL_Statement.executeQuery(stSQL)
	oForm2.reload
3. Ich vermute, dass die gebildete SQL-Anweisung an der Firebird-DB nicht wirkt - sie wird einfach ignoriert. Kann das ein Ansatz sein? Ich verwende ja LO 6.1.3. unter Linux und die interne Firebird-DB.
Also wer kann mir da weiterhelfen? Muss der string für firebird anders definiert werden?

Peter

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von RobertG » Do 22. Nov 2018, 16:01

Hallo Peter,

mit Deinem Makro holst Du die Verbindungsdaten zu der Datenbank aus dem Formular. Dann erstellst Du eine Abfrage und packst die in ein Objekt oResult. Anschließend lädst Du das Formular neu. Woher soll das Formular von dem etwas wissen, was in oResult steht?

Da ich nicht mehr weiter verfolgt habe, was Du damit überhaupt erreichen willst, bleibt für mich die Intention unklar. Ich hätte

Code: Alles auswählen

oForm2.filter = " ""ID"" = '" + laktKontID +"'"
oForm2.ApplyFilter = TRUE
oForm2.reload()
Statt dieser ganzen Konstruktion um Verbindung und Abfrage gewählt. Denn das Formular hat doch vermutlich "Kont" als Datenquelle angegeben, oder?

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von pschulze59 » Do 22. Nov 2018, 20:34

Hallo Robert,

ich danke Dir für diesen Tipp! Genau das hatte mir gefehlt! Jetzt funktioniert es so, wie es sollte.

Erlaube mir dennoch einige Hinweise/Fragen:

1. So funktioniert es - der Ausgangspunkt war ursprünglich anders gemeint. Aber egal, denn das Ergebnis zählt.
Ursprünglich wollte ich einfach eine Anweisung, um einen Datensatz anhand eines Variablenwertes (laktKontID) und Vergleich in einem Index-Feld (ID) zu adressieren und im Formular (Kont) zur Bearbeitung anzeigen. Da ich aus anderen DBS das kenne, war ich der Meinung das geht hier auch (ohne select oder filter), aber offensichtlich geht das nicht anders.
Vielleicht hast Du dazu noch einen Vorschlag?

2. Also wollte ich mit einer SELECT-Anweisung über ein SQL-Statement das Ergebnis erreichen. Dabei wandte ich die Methode an, die Du im Handbuch an mehreren Stellen aufgeführt hast, nämlich einen String mit der SQL-Anweisung zu füllen und zu executen. Du hast mir zwar in Deinem letzten post beschrieben, dass das nicht gehen kann, aber Du sagst nicht, was ich hätte tun müssen, damit es so funktioniert. Im Handbuch habe ich nichts anderes gefunden (oder nicht verstanden). Also was wäre nötig gewesen? Oder war das prinzipiell der falsche Ansatz? Prinzipiell muss doch die Anwendung (execute) einer SQL-Anweisung auch dann angezeigt werden? Warum hätte ich denn das an das Formular weitergeben sollen. Ein Formular stellt doch nur die selektierte Datenmenge dar. Das Formular muss doch die SQL-Anweisung gar nicht verstehen, sondern nur die gefilterten Daten anzeigen. Wo ist hier mein Gedankenfehler? Auch wenn Deine andere Methode einfacher und eleganter ist und funktioniert, würde ich gern wissen, warum ich falsch lag.

3. Du schreibst
Woher soll das Formular von dem etwas wissen, was in oResult steht
. Neben der Frage aus 2. interessiert mich prinzipiell, wie man den Inhalt der Objektvariablen sich mal anzeigen lassen kann? Geht das überhaupt? Alle anderen Variablen zeige ich mir zur Kontrolle über eine MsgBox() an.

4. Ich ärgere mich darüber, dass ich erst durch Deinen Hinweis im post auch die betreffende Stelle im Handbuch gefunden habe. Eigentlich sollte es ja so sein, dass das Handbuch der Problemlöser sein soll. Du baust das Handbuch auch problemorientiert auf, aber es ist natürlich ziemlich aufwändig, wenn das Problem auftritt, die betreffende Stelle auf 600 Seiten zu finden. Daher habe ich einen Vorschlag (wenn ich mir das erlauben darf): Könntest Du einen Anhang machen, in dem Du unter der jeweiligen Kurzüberschrift des Problems die dazugehörigen "Schlüsselwörter" und die Seitenzahl aufführst? So hätte der Leser eine problemorientierte Kurzübersicht und kann zum entsprechenden Kapitel wechseln. Ich weiß, dass das ein Riesenaufwand ist, aber für newbies wie mich, wäre es eine Erleichterung.

Allen Beteiligten vielen Dank für die selbstlose Unterstützung!
Peter

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von RobertG » Do 22. Nov 2018, 21:25

Hallo Peter,

ich bäume das jetzt einmal von hinten auf:

Ja, da fehlt noch etwas die Struktur, die bei der Suche durch das Handbuch hilft. Das Stichwortverzeichnis ist am Anfang einmal erstellt worden und danach nicht mehr weiter gepflegt. Ich muss einmal sehen, ob es für so etwas nicht auch die Möglichkeit gibt, im Stichwortverzeichnis auf die entsprechende Seitenangabe zu klicken und dann zu der Seite zu kommen.

Die Geschichte mit dem Ergebnis einer Abfrage:
Das habe ich noch nie benutzt, um damit ein Formular zu füllen. Mit

Code: Alles auswählen

WHILE oResult.next  ' einen Datensatz nach dem anderen verarbeiten
rem übernimm die benötigten Werte in Variablen
stVar = oResult.getString(1)
inVar = oResult.getLong(2)
boVar = oResult.getBoolean(3)
rem mach etwas mit diesen Werten
WEND
hangelst Du Dich durch die Abfrage durch. Jeder einzelne Wert muss ausgelesen werden. Theoretisch könntest Du natürlich dort ausgelesene Werte auch in ein Formularfeld packen, um sie Dir anzusehen. Aber das Formular ist eigentlich an einen anderen Befehl gebunden - entweder Tabelle oder Abfrage oder SQL.
In der Regel benutze ich die Abfragen, um anschließend aufgrund der abgefragten Werte irgendwohin auch Daten mit dem Makro zu schreiben - das läuft alles neben den angezeigten Daten im Formular ab.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von pschulze59 » Do 22. Nov 2018, 22:29

Hallo Robert,

also ist - bzgl. der SQL-Anweisung - mein grundsätzlicher Gedankenfehler der, dass ich der Meinung war, dass ein Filter auf der Tabelle, automatisch zur selektiven Anzeige im Formular führt. Wenn Du nun schreibst, dass man Routinen programmieren muss, um das Formular mit den gefilterten Werten aus der Tabelle zu "füllen", dann kann ich nur sagen: "Mein Gott, ist das umständlich!" Und ich dachte, dass durch das Definieren der Datenverbindung und Datenfeldzuordnung beim Erstellen eines Formulars stets automatisch im Formular die gesamte oder eben die gefilterte Datenmenge angezeigt wird.
Jetzt ist mir klar, warum das Filter für das Form gesetzt werden muss und dagegen die SQL-Anweisung nutzlos ist.

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Methode zum Setzen des Datensatzzeigers anhand Feldinhalt ohne SELECT?

Beitrag von pschulze59 » Fr 23. Nov 2018, 22:51

Auch diesen thread möchte ich nun schließen.

Roberts einfache, kurze und knackige Methode, um einen Datensatz aus dem SubForm im eigenen Formular auszurufen und sofort bearbeiten zu können funktioniert gut. Die Tatsache, dass dabei ein Filter auf genau den einen (zu bearbeitenden) Datensatz gelegt wird, behindert mich in meiner Arbeit nicht.

Allerdings muss man, wenn die Bearbeitung abgeschlossen ist, auch wieder zurück in das "Hauptformular" (als dieses bezeichne ich hier mal das Formular, welches zwei Unterformulare hat und bei dem man für den angezeigten Datensatz im Hauptformular entweder einen der angezeigten Datensätze aus Unterformular 1 oder aus Unterformular2 bearbeiten muss). Verwendet man hier nun die selbe Methode, kann man nicht zu einem nächsten Datensatz wechseln, ohne das gesetzte Filter per GUI-Schaltfläche aufzulösen und damit ungewollt den Datensatz 1 aufzurufen. Dabei will man ja einfach nur den nächsten Datensatz (des Hauptformulars, oder dessen Einträge im Unterformular 1 oder 2) bearbeiten. Daher darf bei der Rückkehr aus einem der zwei Unterformulare kein Filter gesetzt sein.

Für mich ist nach wie vor völlig unverständlich, warum es keinen Befehl gibt (oder geben soll), den Datensatzzeiger in einem indizierten Feld und abhängig vom Wert des Indexfeldes ganz schnell und zielgerichtet zu setzen und so den Datensatz (im Formular) in Bearbeitung zu nehmen. Andere DBS kennen da Befehle wie FIND oder LOCATE. Genau an der Stelle greift ja der Sinn der Indizierung.

Mir blieb also nichts anderes übrig, als ein Loop einzusetzen, um die gesamte DB nach dem Feldwert zu durchsuchen, dann die "interne" Satznummer zu speichern und aufzurufen. Dies mag bei kalkulierten 10.000 Datensätzen (jetzt sind es bereits 2300) noch erträglich sein, aber eigentlich ist es Mist.

Hier zum Abschluss noch das Listing:

Code: Alles auswählen

	oForm1.beforeFirst()  'Zeiger vor den ersten Datensatz stellen
	Do while oForm1.next() and oForm1.getstring(1) <> laktRBID      'nächster Datensatz
	Loop
	loPos = oForm1.getrow()
	oForm1.absolute(loPos)
Vielen Dank an alle Unterstützer!
Peter

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten