Direkt in Resultset suchen?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Stephan
********
Beiträge: 10642
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Direkt in Resultset suchen?

Beitrag von Stephan » Fr, 15.06.2018 22:32

Hallo,

ist es möglich in einem Resultset direkt etwas zu suchen ohne durch das Resultset interieren zu müssen?


Worum geht es?
Ich habe eine Datenbank mit 2 Tabellen und 1:n Beziehung. Zur Eingabe und zum Bearbeiten dr DAtensätze dient ein Basic-Dialog (kein Formular) den ich natürlich per Makros mit Inhalt füllen muss.

Ein zentrales Element des Dialogs ist eine Combobox worin ich zunächst alle Firmennamen aus der Datenbank einlese.
WEnn nun der Nutzer per Tastaur in diese Combobox Eingaben mach wird automatisch die Eingabe (schrittweise) vervollständigt wenn es in der Liste (.stringitemList) der Combobox einen passenden Eintrag gibt.
In dem Moment wo es einen passenden Eintrag gibt sollen nun aber alle Felder des Dialogs mit den jeweis passenden WErten aus der Datenbank gefüllt werden, also muss icvh per Makro/SQL die Datenbank abfragen und dann in die Felder eintragen, für Formular und Unterformular.

Problem ist:
wenn der Anwender auch nur halbwegs flott tippt muss ich mehrmals pro Sekunde die SQL-Abfrage der Datenbank neu ausführen und neue Werte ins Formular schreiben.
Hierbei kommt LO geschwindigkeitsmäßig völlig an seine Grenzen. MIndestens ist eine deutliche Verzögerung zu merken, teilweise aber 'hängt' sich LO mehrere Sekunden lang auf, ehe es wieder reagiert.

Was kann ich tun?

Eine Hoffnung von mir wäre einmalig die gesamte Tabelle auszulesen, also (sinngemäß):

Code: Alles auswählen

sql_string = "Select * FROM ""Firma"""
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = oBaseContext.getByName(DB_name) 'DB_name, siehe Modul "_info"
oCon = oDataSource.getConnection(sUser, sPassword)
oStatement = oCon.createStatement()
oAbfrageergebnis = oStatement.executeQuery(sql_string)
und dann jeweils nur in oAbfrageergebnis direkt zu suchen. Nur, geht das überhaupt?
(Ständig durch oAbfrageergebnis zu interieren ist hingegen leider zu langsam)

Oder hat jemand einen anderen Ansatz?



Gruß
Stephan

RobertG
*******
Beiträge: 1727
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Direkt in Resultset suchen?

Beitrag von RobertG » Sa, 16.06.2018 09:53

Hallo Stephan,

hast Du einmal mit

Code: Alles auswählen

oStatement.ResultSetType = 1004
versucht, das Ergebnis so zu bekommen, dass Du nicht nur in eine Richtung (vom ersten zum letzten Datensatz) navigieren kannst?

Aus dem Handbuch:
In dem so erstellten Ergebnis ist allerdings keine Navigation möglich. Nur einzelne Schritte zum nächsten Datensatz sind erlaubt. Um innerhalb der Datensätze navigieren zu können, muss der ResultSetType bei der Erstellung der Abfrage bekannt sein. Hierauf wird über
oSQL_Anweisung.ResultSetType = 1004
oder
oSQL_Anweisung.ResultSetType = 1005
zugegriffen. Der Typ 1004 - SCROLL_INTENSIVE erlaubt eine beliebige Navigation. Allerdings bleibt eine Änderung an den Originaldaten während des Auslesens unbemerkt. Der Typ 1005 – SCROLL_SENSITIVE berücksichtigt zusätzlich gegebenenfalls Änderungen an den Originaldaten, die das Abfrageergebnis beeinflussen könnten.
Gruß

Robert

Stephan
********
Beiträge: 10642
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Direkt in Resultset suchen?

Beitrag von Stephan » So, 17.06.2018 12:34

RobertG hat geschrieben:
Sa, 16.06.2018 09:53
Hallo Stephan,

hast Du einmal mit

Code: Alles auswählen

oStatement.ResultSetType = 1004
versucht, das Ergebnis so zu bekommen, dass Du nicht nur in eine Richtung (vom ersten zum letzten Datensatz) navigieren kannst?
Hallo Robert,

das habe ich noch nicht versucht, nur verstehe ich nicht was das nutzen soll, denn ich muss doch ohnehin nur von oben nach unten durch die Datensätze navigieren - genauer gesagt:

da in der Combobox die Einträge alphabetisch geordnet sind gibt es beim ersten Tastendruck (Eintrag des ersten Buchstaben) nur eine 50:50 Chance ob es günstiger/schneller ist im Resultset von oben nach unten oder von unten nach oben zu navigieren.
Jeder zusätzliche Tastendruck aber (zweiter und weitere Buchstaben) hat, aufgrund der alphabetischen Sortierung) eine klare Präferenz das navigieren nach unten schneller ist - Beispiel:

in der Combobox stünden die Firmennamen:

123Reinigung GmbH
Abfallentsorgung Petersen
Almatec Pumpen
Analytik Müller GbR
Automatische Bewässrungssysteme GmbH
Autoreparatur Meyer

und es wäre bereits "Al" eingeben, so hat die Combobox automatisch den Eintrag "Almatec Pumpen" aktiviert und Die Eingabe eines beliebigen weiteren Buchstabens wird immer in Richtung unten navigieren (beliebiger Buchstabe außer "m") oder auf gleicher Höhe bleiben ("m"), es ist unmöglich irgendeinen Buchstaben einzugeben, der dazu führen würde das ein Eintrag oberhalb "Almatec Pumpen" zum aktuell aktivierten Eintrag würde.


Vielleicht sollte ich auch betonen:
es geht bei meiner Frage letztlich um Bedienergonomie, wobei es nicht allein darum geht die Such-/Navigiergeschwindigkeit im Resultset (oder auf anderem Weg) zu steigern sondern der Such-/Navigiervorgang muss für beliebige Datensätze immer unter ca. 0,1 Sekunden liegen (eigentlich noch kleiner), weil bei diesem Wert 0,1 Sekunden ungefähr die Zeitschwelle liegt ab der der Anwender die Verzögerung merkt.
Die derzeitige praktische Geschwindigkeit in meiner konkreten Datenbank ist bei vielleicht ungefähr 0,5 Sekunden, was also immer zu Konfusion führt wenn die Eingabe des Anwenders schneller ist als 1 Buchstabe in 0,5 Sekunden, d.h. der Nutzer bekommt vom Dialog keine zeitnahe optische Rückmeldung und hat deshalb das Gefühl er tippt ins Leere.
Ich fürchte insgesamt hier sind LO/OO an ihrer Leistungsgrenze was Basic als Programmiersprache betrifft.


Gruß
Stephan

Antworten