Abfrage über wildcard Parameter

Parox

Neuer Benutzer
Beiträge
3
Hallo miteinander,

ich habe mir die letzten 2-3 Wochen etwas SQL beigebracht, da ich auf der Arbeit den Nutzen von queries in Verbindung mit unserem ERM System entdeckt habe.

Ich bin dementsprechend noch klar Anfänger, viel mehr als "select - from - where" beherrsche ich noch nicht.

Mein Problem ist nun folgendes:
In unserem System bekommen Kunden / Lieferanten eine eigene Konto-Nummer (für die FiBu) zugeteilt, diese sind fortlaufend in einem Zahlenbereich je nach Art dess Kontakts und Anfangsbuchstabe, zB 20100-20199 für Kunden, welche mit A beginnen, 80500-80599 für Lieferanten mit E.

Aus dem System heraus ist nicht klar ersichtlich, welches die nächste freie Nummer ist, daher wollte ich eine .dqy erstellen, welche mir in einem Excel Feld die nächste freie Nummer für den jeweiligen Buchstaben- und Kontakttyp ausgibt.

-> Datei aufrufen, Parameter 1 eingeben (D oder K für Debitor oder Kreditor), Parameter 2 eingeben für den Anfangsbuchstaben.

Die relevanten Datenbanken wären zB "kunde" und "name", in "kunde" sind mit kdn_lfdnr die laufende Nummer, kdn_typ der Typ (D oder K) und kdn_kontonr die Kontonummer für FiBu hinterlegt, in "name" unter n_name_001 der Name des Kontakts, n_lfdnr die laufende Nummer.

Bisher sieht meine Abfrage wie folgt aus:

SELECT k.kdn_kontonr AS Kontonummer, n.n_name_001 AS Name FROM kunde k, name n WHERE (k.kdn_lfdnr=n.n_lfdnr) AND (k.kdn_typ=?) ORDER BY k.kdn_kontonr

die nun Ausgegebene Tabelle enthält eine Auflistung der Kontakte (je nach Parametereingabe D oder K) mit der Kontonummer und dem Namen, z.B

Kontonummer Name
20100 Axxxx1
20101 Axxxx2
etc...

Meine Fragen:

erstes Ziel: wie kann ich einen Parameter setzen, der bei Eingabe eines Buchstabens alle Felder ausgibt, welche mit diesem Buchstaben beginnen? also zB A% für alle mit A beginnenden. Ich hatte verschiedene Varianten von "LIKE" versucht, keine brachte ein Ergebnis (Syntax Fehler oder leere Ausgabe)

zweites Ziel: ist es möglich, die nächste freie Zahl in einer Buchstabengruppe auszugeben, nachder ich diesen Buchstaben als Parameter gesetzt hatt? z.B. Parameterangabe A, 20100 - 20141 sind belegt, die Abfrage gibt den wert 20142 aus (die nächste freie Nummer).

um das ganze noch zu erschweren kommt das Beste zum Schluss: während wir die Nummern aufsteigend vergeben, geschieht dies (selten, aber es kommt vor) in der Buchhaltung absteigend, also bei A von 20199 -> 20198, 20197, ... Ich habe zwar noch wenig Durchblick, aber ich denke, dass ich erst die Zahlenbereiche für die Buchstaben zuordnen muss (in der Abfrage, geht nicht in der Tabelle), und dann die nächsthöchste freie (oder belegte) ausgeben könnte - das wird etwas schwerer, wenn zB die ersten 20 und letzten 3 belegt sind. (zB. 20100 - 20120 und 20197 - 20199 für A)

noch zur Info: ich arbeite mit .dqy MS Queries über Excel, welche ich aber fast immer in einem Editor (MS oder VIM) bearbeite. Die Datenbank soll laut Hersteller mit den Befehlen von SQLite 3.0 vertraut sein.

Falls mir hier jemand hefen könnte wäre ich sehr dankbar - aber auch ein "geht nicht" wäre hilfreich ... ;)
 
Werbung:
Also erstmal vorab:

Grade wenn du neu bist solltest du dir gleich explizite Joins angewöhnen, das ist gar nicht so schwer wie es sich anhört aber macht die Sache eindeutiger. Hier mal ein Beispiel für deinen bisherigen Code:
Code:
SELECT   k.kdn_kontonr AS Kontonummer,
     n.n_name_001 AS Name
FROM   kunde k
INNER JOIN name n
ON     k.kdn_lfdnr = n.n_lfdnr
WHERE   k.kdn_typ = ?
ORDER BY k.kdn_kontonr

Jetzt habe ich mit Excel und .dqy schon was gemacht, arbeite aber eigentlich direkt an der DB. Die ist auch nicht SQLite, ich weiß also nicht genau welchen Funktionsumfang wir nutzen können. Ich versuchs mal mit recht einfachen Mitteln.

LIKE:

LIKE kannst du ganz einfach nutzen. Du musst aber bedenken, das dein String ungefähr so aussehen muss
Code:
spalte LIKE '%string%'
Wenn jetzt deine Variable mit ? daher kommt müssen natürlich die Striche mit da es sich für SQL um einen String handeln muss. Also vermutlich etwa so:
Code:
SELECT   k.kdn_kontonr AS Kontonummer,
     n.n_name_001 AS Name
FROM   kunde k
INNER JOIN name n
ON     k.kdn_lfdnr = n.n_lfdnr
WHERE   n.n_name_001 LIKE '?%'
ORDER BY k.kdn_kontonr

Freie Nummern:

a) Freie Nummern, also Nummern die in der DB fehlen zu finden ist nicht ganz einfach. Natürlich geht das, dafür würde ich aber zu Mitteln greifen die in SQLite glaube ich nicht gehen. Willst du alle Freien Nummern angezeigt bekommen oder reicht dir die nächste freie?
b) Ich kenne das mit der Buchhaltung, wenn ein Kunde umfirmiert ändert sich nur der Name, nicht aber die Kontonummer. Angenommen, Kunden mit A belegen 20100 - 20141 und Kunden mit B belegen 20200 - 20210 und Kunde BB wird zu Kunde AB. Normalerweise würde ich jetzt daher gehen und nach der Höchsten Kundennummer mit dem Anfangsbuchstaben A suchen und ab da die erste nicht vergebene Nummer. Das wird in diesem Fall natürlich irgendwo bei zwischen 20200 und 20211 sein.
Vielleicht kannst du nochmal schauen, was dein ERP System wirklich für eine Datenbank hat. Ich glaube kaum das die SQLite verwenden.
 
Hallo ukulele,

danke für deine schnelle und ausführliche Antwort ;)

Ich werde deinem Rat folgen und mich mit Joins vertraut machen - SQL steckt ja doch voller netter Möglichkeiten.

Die Variante mit "LIKE '?%' " hatte ich schon versucht, erschien mir das logischste, allerdings nicht in Verbindung mit dem JOIN, sondern mit

Code:
SELECT k.kdn_kontonr AS Kontonummer, n.name_001 AS Name
FROM kunde k, name n
WHERE k.kdn_lfdnr = n.n_lfdnr
AND n.name_001 LIKE '?%'
ORDER BY k.kdn_kontonr

in diesem Fall gab es glaube ich eine leere Ausgabe zurück.

zu a) es reicht die nächste freie Nummer (für einen Buchstabenbereich), das wäre sogar das Beste. Ich bastel diese Abfrage in erster Linie nicht für mich, sondern für Kollegen welche teilweise auch nicht allzu vertraut mit dem Thema Computer sind. Je weniger Auswahl hier zur Verfügung steht, desto besser.

zu b) ich gehe davon aus, dass bisher nach einer Umfirmierung die alte Nummer beibehalten wurde - ich habe ein paar Firmen gefunden, welche eindeutig nicht in den richtigen Buchstabenbereichen liegen. Es kann aber auch sein, dass hier am Anfang noch nicht nach dem Muster eingetragen wurde, oder jemand eine Firma angelegt hat, ohne von dem Muster zu wissen. Des weiteren kann man so die Statistik wahrscheinlich besser im Blick behalten.
Welche Datenbank unser System genau verwendet weiß ich leider nicht - bisher konnte mir unsere Kontaktperson nur eben den Satz "wenn es in SQLite 3.0 geht, geht es auch hier".

Ich konnte heute zufällig in dem ERP System eine Tabelle finden, in welcher die Zuordnung der Buchstaben zu den Zahlenreihen augelistet ist, leider war es mir bisher nicht möglich, eine Verknüpfung dieser mit anderen Tabellen zu finden ( wie zB k.knd_lfdnr = n.n_lfdnr). Die relevanten Felder der Tabelle sind Buchstabe, Kontonr-Min, Kontonr-Max, Kundentyp.
zB Buchstabe Kontonr-Min Kontonr-Max Kundentyp
A 20100 20199 D
B 20200 20299 D
etc...
In wie fern mir diese Tabelle nützlich ist, weiß ich noch nicht, aber ich gehe davon aus dass sie zumindest die Zuordnung der freien Nummer nach Parametereingaben erleichtert.

Ich werde Montag im Büro erstmal die Joint Abfrage testen, wenn der Schritt geschafft ist, sehen wir weiter ;)

Vielen Dank nochmals, ich halte dich auf dem Laufenden.
 
Hallo,

ich habe nun nochmal etwas getestet, das Hauptproblem für mich ist nach wie vor der wildcard Parameter.
Testweise habe ich die Abfrage stark reduziert:

Code:
SELECT  n.name
FROM name n
WHERE n.name LIKE ?

Ergebnis: nach dem Starten der Abfrage wird der Parameter abgefragt, bei Eingabe 'A%' werden alle Namen beginnend mit A ausgegeben.
Bei Abänderung der Abfrage auf

Code:
WHERE n.name LIKE '7%'

gibt es keine Abfrage des Parameters mehr, die Ausgabe ist leer.

Normalerweise sollte doch die Abfrage auch direkt mit dem Platzhalter funktionieren, liegt das Problem hier bei meinem Code oder gibt es auch eine andere Erklärung?

Grüße
 
Werbung:
Zurück
Oben