Abfrage mit Kombinationsfeld

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Bus
*
Beiträge: 15
Registriert: Di, 10.01.2012 18:17

Abfrage mit Kombinationsfeld

Beitrag von Bus » Mi, 17.04.2019 16:58

Moin,
ich habe bis jetzt immer in ACCESS programmiert, jetzt möchte ich aber eine Lösung in Base realisieren.

Ich habe eine Tabelle "Kunde" mit einer Spalte Rechnung-Datum TT.MM.JJJJ
Diese Daten werden in einem Formular "Kunde_frm" über eine Abfrage abgebildet "Kunde_abf"

Mittels einer zweiten Abfrage filtere ich das jeweilige Jahr aus dem Datum heraus und dieses ist die Datenauswahlbasis für eine Kombinationsfeld 1 auf dem Formular "Kunde_frm"

Ich möchte jetzt mit dem Kombinationsfeld ein Jahr auswählen und auf dem Formular sollen dann nur die Kunden mit dem Rechnungsdatum in dem Jahr erscheinen.

Bei ACCESS binde ich dann das Kombinationsfeld 1 als Kriterium in die Abfrage ein.

Geht sowas auch bei Base?

Vielen Dank

Liebe Grüße Bus

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Abfrage mit Kombinationsfeld

Beitrag von F3K Total » Mi, 17.04.2019 17:17

Hallo,
nein, das Feld in die Abfrage einzubinden ist nicht möglich.
Aber das Feld an eine kleine einzeilige Hilfstabelle zu binden um dann den dort hineingeschriebenen Wert in die Abfrage zu übernehmen, das geht, musste etwas umdenken, Beispiel mit Listenfeld statt Kombinationsfeld anbei.
Gruß R
EDIT: weitere Informationen zum Filtern in BASE findest du z.B. im Base Handbuch, Kapitel:
Allgemeines zu Datenbankaufgaben -> Datenfilterung
Dateianhänge
FILTER_RECHNUNGSDATUM.odb
(193.66 KiB) 36-mal heruntergeladen

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Abfrage mit Kombinationsfeld

Beitrag von F3K Total » Mi, 17.04.2019 17:29

Hi, hatte noch vergessen dem Filterformular das Zufügen oder Löschen von Datensätzen zu untersagen, nur "Ändern" ist jetzt eingestellt.
Gruß R
Dateianhänge
FILTER_RECHNUNGSDATUM.odb
(193.6 KiB) 37-mal heruntergeladen

Bus
*
Beiträge: 15
Registriert: Di, 10.01.2012 18:17

Re: Abfrage mit Kombinationsfeld

Beitrag von Bus » Mi, 17.04.2019 17:32

Moin,
habe mir das angesehen, etwas komplizierter bei Base aber soweit ich sehen kann, löst das mein Problem. Werde mich nachher mal dran setzen.

Vielen Dank.
Bus

peschiber
**
Beiträge: 41
Registriert: So, 28.04.2019 08:51

Re: Abfrage mit Kombinationsfeld

Beitrag von peschiber » So, 28.04.2019 11:40

Hallo,

vielen Dank für die Beispieldatei.
War unter anderem genau was ich gesucht habe auf dem mühseligen Weg mich als Neuling in Base einzuarbeiten.
Einzige was mich irritiert hat, dass die IDs in der Tabelle "KUNDEN_RECHNUNGSDATEN" völlig andere sind als im Formular "F_KUNDEN_RECHNUNGSDATEN".
War mir erst aufgefallen, als ich deine Abfrage modifiziert habe, statt nach Year, sollte nach ID gesucht werden.

Warum nach ID suchen?

Mein langfristiges Ziel:
1. Kombinationsfeld soll am Ende aller vorhandenen Stammdaten > ID, Name, Vorname, Geburtsdatum enthalten, als String dargestellt.

SELECT "ID" || ' , ' || "Nachname" || ' , ' || "Vorname" || ', ' || RIGHT( '0' || DAY( "geb" ), 2 ) || '. ' || RIGHT( '0' || MONTH( "geb" ), 2 ) || '.' || YEAR( "geb" ) || AS "ID, Nachname, Vorname, Geburtstag, FROM "tbl_Test_Stammdaten"

Die Anweisung.
RIGHT( '0' || DAY( "geb" ), 2 ) || '. ' || RIGHT( '0' || MONTH( "geb" ), 2 )
ist nur deshalb erforderlich, damit das dd:mm Format erhalten beleibt.
Ohne diese Anweisung würde wenn dd < 10 und mm < 10 nur 5. 5. 1985 statt 05. 05. 1985 ausgegeben.

Das könnte dann im im Kombinationsfeld z. B. so aussehen:
"15, Müller, Paul, 05. 05. 1985" > 15 ist die Stamm-ID
Bis hier habe ich mit Base kein Problem.

Aber dann weiß ich überhaupt nicht wie ich weiter vorgehen muss, um mein Ziel zu erreichen:

2. Filter die ID aus dem Text, z. B. "15, Müller, Paul, 15. 05. 1985" > "15" ist die ID der Stammdaten
In Basic scheint das zu gehen, indem man eine Textvariable einer Integer Variable übergibt.
In dem Beispiel würde die Integer-Variable den Wert "15" erhalten. Aber an Basic traue ich mich noch nicht heran.

3. Suche anschließend den Datensatz mit der ID (Primerschlüssel) "15" und aktualisiere die entsprechenden Felder im Formular.

Meine Frage:
Ist so etwas in einer SQL-Anweisung zu realisieren?
Übergib eine Stringvariable einer Integer-Variable, schreibe den Wert dann in die Filtertabelle und such dann den entsprechenden Datensatz?

Wenn ja, bitte eine entsprechende SQL-Anweisung mitteilen. Danke!

Wenn das nicht gehen sollte, wäre ich auch für eine Basic-Subrutine dankbar, aber dann bitte unbedingt mit reichlich Erklärung, damit ich das als Einsteiger nachvollziehen kann.

Ich weiß, mit einem Listenfeld wäre das alles viel einfacher, aber das nimmt mir in dem Formular zu viel Platz weg.

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Abfrage mit Kombinationsfeld

Beitrag von F3K Total » So, 28.04.2019 12:49

Hallo,
ein Listenfeld wäre das Mittel der Wahl, kannst du bitte mal erklären, warum das mehr Platz wegnehmen sollte als ein Kombinationsfeld?
Gruß R

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Abfrage mit Kombinationsfeld

Beitrag von F3K Total » So, 28.04.2019 13:46

Egal,
es geht beides, alledings ist die Abfrage mit dem Kombinationsfeld natürlich deutlich komplizierter, da die ID erst wieder per SQL aus dem String herausgefiltert werden muss, etwa so:

Code: Alles auswählen

SELECT "ID", "Nachname", "Vorname", "Strasse", "PLZ", "Ort" FROM "tbl_Test_Stammdaten" WHERE ( "ID" = CAST( SUBSTR( :qTEXTID, 1, LOCATE( ',', :qTEXTID ) - 1 ) AS INTEGER ) OR :qTEXTID IS NULL )
Beispiel anbei
Gruß R
Dateianhänge
Adressen_Filter_nach_ID.odb
(115.69 KiB) 36-mal heruntergeladen

peschiber
**
Beiträge: 41
Registriert: So, 28.04.2019 08:51

Re: Abfrage mit Kombinationsfeld

Beitrag von peschiber » So, 28.04.2019 22:00

Hallo Robert,

ganz herzlichen Dank für deine Beispieldatei.
Einfach genial. Auf diese Syntax wäre ich nie und nimmer gekommen.

Bei der Gelegenheit einen großen Dank an dich und die Mitautoren des Buches "Libre<Office, Base Handbuch", Ausgabe vom 30. 03. 2019.
Super erklärt, wenn auch an für Neueinsteiger oft schwierig nachzuvollziehen.
Da hilft wohl nicht nur lessen, sondern nach und nach die Beispiele selber abarbeiten.

Und dann noch einen weiteren Dank.
Ich bin wirklich geplättet, wie schnell unsereins eine Reaktion auf eine Antwort in diesem Forum erhält.
Das ermutigt mich mit Base weiter zu machen, auch wenn ich dafür eigentlich keine Zeit habe.

Danke

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Abfrage mit Kombinationsfeld

Beitrag von F3K Total » Mo, 29.04.2019 07:53

Hallo peschiber,
da liegt wohl eine Verwechselung vor, R ist nicht gleich Robert!
Robert = RobertG -> Libre-Office-Base-Handbuch
R = F3K Total-> ein paar Videotutorials
Wir sind zwei unterschiedliche Menschen, haben beide auf deine Fragen geantwortetet, da kann es schon zu Verwechselungen kommen. :lol:

Gruß R

peschiber
**
Beiträge: 41
Registriert: So, 28.04.2019 08:51

Re: Abfrage mit Kombinationsfeld

Beitrag von peschiber » Mo, 29.04.2019 08:15

Hallo F3K Total,

sorry, dass ich R ist nicht gleich Robert! nicht beachtet habe.
Werde ich mir merken, bin, wie du sicher gemerkt hast, neu in diesem Forum.

Dennoch, dich mit F3K Total oder nur R anzureden, da habe ich meine Schwierigkeiten, finde ich so unpersönlich.
Aber egal, wenn das o. k. für dich ist, werde ich versuchen dich zukünftig mit R anzureden, oder wie wäre es mit Roberto? statt R, klingt im Spanisch wie Musik, statt nur Hallo R.

Also auch dir, R, einen herzlichen Dank, für die superschnellen Antworten und Ratschläge, eine zusätzliche Motivation, nicht ganz so schnell mit Base aufzugeben.
Denn als Neueinsteiger, der das Ganze auch nur als Hobby betreibt und eigentlich dafür gar keine Zeit hat, stellt Base schon eine ganz schöne Anforderungen dar.


Liebe Grüße, Peter, El Salvador

peschiber
**
Beiträge: 41
Registriert: So, 28.04.2019 08:51

Re: Abfrage mit Kombinationsfeld

Beitrag von peschiber » Di, 30.04.2019 02:48

Hallo F3K Total,

mir ist es fast schon peinlich, dich noch mal in der Angelegenheit zu belästigen, aber trotz viele Versuche habe ich es einfach nicht hinbekommen, deinen SQL-Code für die Abfrage „Adressen_Filter_nach_ID“
so zu ändern, dass sie meinen Wünschen entspricht.

Die Anweisung lautet:
SELECT "ID", "Nachname", "Vorname", "Strasse", "PLZ", "Ort" FROM "tbl_Test_Stammdaten" WHERE ( "ID" = CAST( SUBSTR( :qTEXTID, 1, LOCATE( ',', :qTEXTID ) - 1 ) AS INTEGER ) OR :qTEXTID IS NULL )

wobei der letzte Teil

CAST( SUBSTR( :qTEXTID, 1, LOCATE( ',', :qTEXTID ) - 1 ) AS INTEGER )

dazu dienst, die „ID“ aus dem String herauszufiltern – steht vor dem ersten Komma - und dann den entsprechenden Datensatz zu suchen.

.Was ich bisher verstanden habe:
(CAST … ) as Integer > Konvertiert einen Wert einer Variable in einen Integer-Wert
(SUBSTR (…. > gibt einen Textwert innerhalb eines Strings wieder.
LOCATE (….) - 1
> gib in dem Beispiel die Position des ersten Kommas minus 1 wieder, weil davor die ID steht.

Nun habe ich die Reihenfolge in dem Kombinationsfeld geändert, die ID steht nicht mehr an erster Stelle, sondern an letzter.
Beispiel: "Müller , Manfred, 20. 04.1941 , 0" > („ID“ = 0), steht hinterm letzten Komma.

Der Grund:
Niemand merkt sich die „ID“, aber kennt in der Regel den Nachnamen, nach dem gesucht werden soll.
Das Kombinationsfeld bietet den Vorteil, dass z. B. nur „M“ für den gesuchten Namen „Müller“ oder Meier eingeben werden muss, und schon wird im Kombinationsfeld der erste Eintrag gezeigt, dessen Nachname mit „M“ beginnt.
Dieser Vorteil geht flöten, wenn im String als erstes die ID steht.

Die LOCATE Funktion müsste jetzt so geändert werden, dass das „letzte“ Komma gefunden wird und dann den Rest des Strings herausfiltert und als String übergeben wird.
(Wahrscheinlich wäre ein „;“ vor der "ID" noch besser als ein ",", um eventuell den Code für die Suche zu erleichtern, oder, falls später noch ein zusätzliches Feld vor der "ID" eingefügt oder gelöscht wird, die Anzahl der Kommata nicht jedes Mal geändert werden müsste.)
Ich habe es leider bislang nicht hinbekommen.

Von daher wäre ich dir sehr dankbar, wenn du mir mitteilen könntest, wie der geänderte SQL-Code lauten muss.
Da es in der Beispieldatei „Adressen_Filter_nach_ID“ leider mit der Anpassung des SQL- Codes allein nicht getan ist, sondern dann der Filter auch angepasst werden muss, wäre ich dir sehr dankbar, wenn du deine Beispieldatei „Adressen_Filter_nach_ID“ modifizieren könntest, denn ich gehe davon aus, dass das auch andere AnwenderInnen gebrauchen können.
Oder zumindest einen Hinweis gibt, was sonst noch in der Beispieldatei geändert werden muss, damit der geänderte SQL-Code > "ID" jetzt letzte Position auch funktioniert.

Ganz herzlichen Dank im voraus, Peter

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

Re: Abfrage mit Kombinationsfeld

Beitrag von RobertG » Di, 30.04.2019 07:39

Hallo Peter,
peschiber hat geschrieben:
Di, 30.04.2019 02:48
Die LOCATE Funktion müsste jetzt so geändert werden, dass das „letzte“ Komma gefunden wird und dann den Rest des Strings herausfiltert und als String übergeben wird.
Du wirst das letzte Komma nicht finden, da Suchfunktionen bei der internen HSQLDB immer von vorne mit der Suche beginnen. Ich würde das vereinfachen, indem ich ein Trennungszeichen nehme, das nur einmal vorkommt und auf keinen Fall in dem vorhergehenden Text stehen kann, z.B. ein ">".

Gruß

Robert

peschiber
**
Beiträge: 41
Registriert: So, 28.04.2019 08:51

Re: Abfrage mit Kombinationsfeld

Beitrag von peschiber » Di, 30.04.2019 07:58

Hallo Robert,

danke für die super schnelle Antwort.

Wie stelle ich sicher, dass der Wet z. B. nach ">" ausgelesen wird, und nicht der Wert, der vor dem ">" steht.

Kenne mich leider mit der Syntax von LOCATE nicht so aus.
Habe den Code von R:
CAST( SUBSTR( :qTEXTID, 1, LOCATE( ',', :qTEXTID ) - 1 ) AS INTEGER )
so interpretiert, dass der Wert der vor dem "," steht ausgewertet wird.

Da der ID Wert im String jetzt aber ganz hinten aufgeführt wird, müsste der Code anders aussehen, ich weiß aber leider nicht wie.
Ich hatte das "," schon durch ein ";" ersetzt, kommt im Sting nur einmal, unmittelbar vor der ID, aber irgendwie ist meine Syntax falsch, es klappt nicht.

Wäre dir also dankbar, wenn du mir auf die Sprünge helfen könntest.

Danke, Peter

F3K Total
********
Beiträge: 3359
Registriert: Mo, 28.02.2011 17:49

Re: Abfrage mit Kombinationsfeld

Beitrag von F3K Total » Di, 30.04.2019 16:05

Moin,
ich verstehe zwar immer noch nicht, warum du statt der einfachen Listenfeld-Lösung unbedingt das Kombinationsfeld nutzen willst, aber die beiden SQLs lauten z.B:
Fürs Kombinationsfeld:

Code: Alles auswählen

SELECT  "Nachname" || ' , ' || "Vorname" || ', ' || RIGHT( '0' || DAY( "Geburtstag" ), 2 ) || '. ' || RIGHT( '0' || MONTH( "Geburtstag" ), 2 ) || '.' || YEAR( "Geburtstag" )|| '>'||"ID"   FROM "tbl_Test_Stammdaten"
Für die Abfrage "qAdressen_Filter_Combobox":

Code: Alles auswählen

SELECT "ID", "Nachname", "Vorname", "Strasse", "PLZ", "Ort" FROM "tbl_Test_Stammdaten" WHERE ( "ID" = CAST( SUBSTR( :qTEXTID, LOCATE( '>', :qTEXTID ) + 1, 999 ) AS INTEGER ) OR :qTEXTID IS NULL )
Gruß R

peschiber
**
Beiträge: 41
Registriert: So, 28.04.2019 08:51

Re: Abfrage mit Kombinationsfeld

Beitrag von peschiber » Mi, 01.05.2019 02:26

Hallo R,

ganz herzlichen Dank, jetzt klappt es super.

Zu deinem Unverständnis:
ich verstehe zwar immer noch nicht, warum du statt der einfachen Listenfeld-Lösung unbedingt das Kombinationsfeld nutzen willst,
kann ich nachvollziehen, da das Kombinationsfeld viel mehr Aufwand erfordert und auch Einschränkungen unterliegt, z. B. Formatierung in Spalten.

Aus meiner Sicht bietet das Kombinationsfeld aber 3 Vorteile:
1. benötigt ein Kombinationsfeld weniger Platz in einem Formular als ein Tabellen-Steuerelement,
es ist mir bislang noch nicht gelungen in einem Listenfeld mehrere Werte, als ein String darzustellen.
(z. B: "Müller, Paul, 04. 04. 1944" In der Datenbank können vielleicht mehrere "Müller, Paul" gespeichert sein, aber es ist fast ausgeschlossen, dass mehrere Datensätze existieren mit gleichem Nachname, gleichem Vorname und gleichem Geburtstag.)
2. in einem Kombinationsfeld muss z. B. nur ein Buchstabe eingetippt werden, z. B. "M" und schon wird der erste Eintrag gezeigt, der mit dem Buchstaben "M" beginnt.
3. Die Liste im Kombi-Feld, sortiert nach Nachnamen, zeigt bei Eingabe von "M" z. B. sofort alle Einträge die mit dem Buchstaben "M" beginnen.
(siehe Datenanhang)

In meinem Datenanhang, Screenshot handelt es sich nicht um ein Listenfeld, sondern um ein Tabellen-Steuerelement, was nicht aufklappbar ist.

Falls es möglich sein sollte, Zeilen im Listenfeld mit zusammengesetzten Textfeldern zu erzeugen, lass es mich bitte wissen.
Bin mir sicher, dass ich als Neueinsteiger in Base das Potenzial eines Listenfeldes noch nicht erkannt habe.

Noch mal ganz lieben Dank, Peter
Dateianhänge
Kombi versus Listfeld.png
Kombi versus Listfeld.png (157.26 KiB) 1147 mal betrachtet

Antworten