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

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

Beitrag von pschulze59 » Do 8. Nov 2018, 22:02

Hallo,

gibt es eine Methode in einem Makro den Datensatzzeiger auf ein indiziertes Feld anhand des Feldwertes/-inhalts zu setzen ohne die Menge der angezeigten Datensätze durch SELECT einzuschränken? ... und auch ohne irgendwelche langwierigen Schleifen zum Suchen zu benutzen? Andere DBS kennen da ein LOCATE oder FIND.
Das nutzbare absolute(n) setzt den Datensatzzeiger auf die n-te Zeile der Tabelle.
Werden aber Datensätze (resp. Zeilen in Tabellen) gelöscht, so stimmt eine Auto-ID nicht mehr mit der RowNumber, die durch absolute(RowNumber) angesprochen werden könnte, überein!

Peter
Zuletzt geändert von pschulze59 am Fr 23. Nov 2018, 22:51, insgesamt 1-mal geändert.

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 » Fr 9. Nov 2018, 11:21

Hallo Peter,

abhängig von der internen Datenbank kannst Du entweder

Code: Alles auswählen

LOCATE(Suchbegriff, Textfeld aus der Datenbank, Startposition der Suche)
(HSQLDB)
oder

Code: Alles auswählen

POSITION(Suchbegriff, Textfeld aus der Datenbank, Startposition der Suche)
(Firebird)
verwenden. Die Startposition muss nicht angegeben werden.
Ergibt die Funktion den Wert 0, so ist das gesuchte Element dort nicht enthalten.
Weiteres siehe Handbuch, S. 380, Suche mit Locate.

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 » Fr 9. Nov 2018, 15:37

Hallo Robert,

Habe gestern Abend diese zwei Möglichkeiten gefunden. Da ich die interne Firebird-DB verwende, muss ich POSITION() nehmen.
Da ich den zu markierenden Datensatz über das numerische Autoinkrementfeld "ID" suchen will, muss ich wohl eine Konvertierung zum Text (über temporäres Textfeld?) machen, weil ja nur in Textfeldern gesucht wird?
Noch mal zum Verständnis: Meine Aufgabe ist die, dass ein numerischer Wert "ID" an die aufgerufene Sub-Prozedur übergeben wird, die das MainForm aufruft und dort genau diesen Datensatz markieren soll. Da aber in der dazugehörigen Tabelle Datensätze gelöscht werden, entspricht das Feld "ID" nicht mehr der Nummer des Datensatzes, wodurch die Adressierung des richtigen Datensatzes über das Finden des richtigen Wertes in "ID" erfolgen soll.

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 » Fr 9. Nov 2018, 16:15

Hallo Peter,

wieso lässt Du nicht einfach genau diesen Datensatz mit der "ID" über den Filter im MainForm darstellen? Mir ist nicht klar, was Du da eigentlich erreichen willst.

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 » Fr 9. Nov 2018, 19:36

Hallo Robert,

bitte verzeih mir meine naiven Fragen - aber ich bin de facto Einsteiger.
Deine Frage ist jedenfalls berechtigt. Ich versuche es noch mal, zu beschreiben:

Eigentlich könnte ich mit .getRow die "wahre" Datensatznummer als Variable speichern, zu der ich mit .absolut(NumRow) zurückspringen kann. Das Dumme ist nun (zumindest in meinen Versuchen), dass .getRow auf eine gefilterte Datenmenge in einem Subform die Nummer des Datensatzes im Subform ermittelt - dies ist aber nicht die Nummer des Datensatzes in der eigentlichen Tabelle. Z.B. werden in einem SubForm durch den dahinterliegenden Filter der Datensatz 3 mit ID 5, Datensatz 5 mit ID 8 und Datensatz 12 mit ID 22 angezeigt. Da aber das Datum als Sortierkriterium festgelegt ist, werden diese in der Reihenfolge (im SubForm von oben nach unten) 1. DS5=ID8, 2. DS3=ID5 und 3. DS12=ID22 angezeigt. Wenn ich nun einen Datensatz aus dem Subform über getRow zur Bearbeitung in dessen eigentlichen Form aufrufen will, wird in Wirklichkeit z. B. der DS mit der ID22 nicht mit 12, sondern mit 3 adressiert, weil er der dritte DS im SubForm ist und damit ein falscher Datensatz im MainForm zur Bearbeitung angezeigt. Und Datensatz 5, der die ID8 hat, wird als Nummer 1 übergeben, weil er als erster Eintrag im SubForm steht. Damit kann ich .getRow und .absolute(n) nicht verwenden.
Ich brauche also eine Methode, die ID zum Finden des anzuzeigenden Datensatzes zu verwenden.
So, das war der Ausgangspunkt meiner Frage.
Aus anderen DBS kenne ich nun die Möglichkeit, einfach zu sagen "Setze den DS-Zeiger auf den DS, bei dem im Indexfeld "ID" der Wert "n" ist!". Dies ist kein Filter, der nur noch genau den Datensatz anzeigt, sondern der Datensatz wird angesprochen und alle nachfolgenden Befehle werden an diesem Datensatz ausgeführt. Und genau so was habe ich gesucht.Wenn es das nicht gibt, muss ich anders - wohl über "select" - gehen.

Hier einmal, was ich erreichen will:
Im Form "Berater" werden in einem Subform "Kontakt" alle zum Berater gehörenden Kontakte angezeigt. Die Kontakte stehen in einer Tabelle "Kontakte" und die beinhaltet logischerweise die Kontakte sämtlicher Berater. Die Kontakte haben eine eindeutige ID.
Mit Markieren des Kontakts im SubForm soll genau der Kontakt im eigentlichen Kontakt-Formular angezeigt werden. Danach ist das Makro beendet, der Bediener kann den Datensatz editieren oder löschen. Über ein anderes Makro geht er dann zum Berater-Formular zurück und sieht im SubForm die geänderten Kontakte.

Sorry, für die langen Ausführungen!

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 » Fr 9. Nov 2018, 20:31

Hallo Peter,

hast Du in Deinem Formular nicht genug Platz, um die in dem Subformular befindlichen Kontakte in einem SubSubFormular anzeigen zu lassen? So etwas geht ganz ohne irgendwelche Makros.
Ansonsten bleibt Dir doch die ID des Kontaktes. Was spricht dagegen, dem Formular, das Du öffnen willst, einfach als Filterwert die ID für den Kontakt mit zu geben? Warum willst Du mit den veränderlichen Zeilen irgendetwas regeln? Die Zeilennummer ist doch nur eine zufällige Nummer.

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 » Fr 9. Nov 2018, 21:00

Ja, ist ein Platzproblem, da schon ein weiteres SubForm viel Platz schluckt.
(Davon abgesehen, gebe ich zu, dass ich an die Möglichkeit noch nicht gedacht hatte :roll: )

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 » So 11. Nov 2018, 15:51

Hallo Andreas,

und warum startest Du nicht ein neues Formular mit der "ID" als Filterwert? "ID" in eine Tabelle schreiben, Formular starten, das nur einen Datensatz hat, der eben dieser "ID" entspricht.

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 » Fr 16. Nov 2018, 13:43

Sorry, Robert,

aber mir sind solche Vorgehen einfach noch zu fremd - mir fehlt da das Wissen, wie das umgesetzt werden kann.

Ich habe jetzt das so lösen wollen, dass ich das andere Formular "Kont" aufrufe und per SQL-"select"-Anweisung und der Globalen Variable "laktKontID" die ID des zu selektierenden Datensatzes übergebe.
Das würde funktionieren, wenn nicht irgendwie die ID beim Zusammenbau der SQL-Anweisung bzw. bei dessen Ausführung per execute nicht einen Fehler liefern würde. (Zur Kontrolle lasse ich mir mal die ID und die Select-Anweisung in der MsgBox vorher anzeigen.)

Code: Alles auswählen

	MsgBox (laktKontID)
	oConnection = oForm2.activeConnection()
	oSQL_Statement = oConnection.createStatement()
	stSQL ="select * from ""Kont"" where ""ID"" = laktKontID"
	msgbox(stSQL)
	oResult = oSQL_Statement.executeQuery(stSQL)
Die Fehlermeldung deutet darauf hin, dass laktKontID nicht interpretiert werden kann. Gebe ich aber bspw. einen festen Wert bei der Variablenbildung stSQL an, statt laktKontID z. B. 3

Code: Alles auswählen

stSQL ="select * from ""Kont"" where ""ID"" = 3"
, dann funktioniert die Sache. Muss ich laktKontID irgendwie noch convertieren/trimmen?
Die Fehlermeldung lautet übrigens:
error1.png
error1.png (16.52 KiB) 2922 mal betrachtet
Woran liegt das?

Peter

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

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

Beitrag von F3K Total » Fr 16. Nov 2018, 16:28

Moin,
anbei mal ein Beispiel zum Vorschlag von Robert

Gruß R (nicht Robert)
Dateianhänge
pschulze59.zip
(18.17 KiB) 174-mal heruntergeladen
Windows 10: AOO, LO Linux Mint: AOO, LO

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