796 Aufrufe
Gefragt in Datenbanken von peters Mitglied (460 Punkte)
Hallo zusammen,

ich habe eine Tabelle, in welcher es ein Feld gibt, in dem mehrer Informationen gespeichert sind. Diese sind mit einem Zeichen (~) voneinander getrennt.

Ich möchte nun diese Informationen in einer Abfrage aufgeteilt verarbeiten.

Da die Informationen unterschiedlich lang sind, kann ich die TEIL-Funktion nich tnutzen, sondern müsste es hinbekommen, dass ich eine Abfrage ungefähr in der Form erstelle wie

"Suche nach den ersten ~ und gib mir den Inhalt bis zum nächsten ~ aus"
"Suche nach den zweiten ~ und gib mir den Inhalt bis zum nächsten ~ aus"

usw.

Hat da jemand eine Idee?

Grüße

Peter

4 Antworten

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)

Hallo nochmal,

einen Teilerfolg habe ich inzwischen erzielt.

In meinem Feld "VAR01" habe ich Daten, die durch $!~@ getrennt werden und so 4 Datenstrings aufnehmen kann. Der Inhalt sieht also so aus:
24$2!12321~86f08@

Nun habe ich Ausdrücke erstellt wie z.B. um den Wert "12321" auszugeben, was auch funktioniert:

Ausdr3: Teil([VAR01];InStr(1;[VAR01];"!")+1;(InStr(1;[VAR01];"~")-1)-(InStr(1;[VAR01];"!")))

Das einzig verbleibende Problem ist nun, dass, wenn im Feld VAR01 nichts eingetragen ist oder in einer anderen Form, wird "#Fehler" in der Abfrage ausgegeben.

Weiß jemand eine Möglichkeit, dieses zu verhindern?
Ich dachte an die wenn()-Funktion in der Art, wenn die Formel einen Fehler ergibt, zeige nichts an.

Aber ich bekomme das irgendwie nicht eingebaut. Hat da jemand eine Idee?

Grüße

Peter

0 Punkte
Beantwortet von peters Mitglied (460 Punkte)

Das Problem mit der Ausgabe "#Fehler" habe ich gelöst. Ich habe einch unter Kriterien

[VAR01] Ist Nicht Null

gesetzt.

Aber:

Hat jemand eine Idee, wie ich die Abfrage verändern kann, um nicht mit verschiedenen Zeichen arbeiten zu müssen?

Statt der Trennzeichen $!~@ würde ich z.B. lieber ausschließlich das "~" benutzen und die Abfrage so gestalten, das nach dem ersten, zweiten, dritten usw. Auftauchen des Zeichens "~" suche.

Das bekomme ich baer nicht hingebastelt.

Gruß

Peter

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)

Hallo,

bei einer unbestimmten Anzahl würde ich die Tabelle Normalisieren, hier mal ein Bsp. wie man dann diesen String aufteilt:

Public Sub slittest()
Dim v() As String
Dim i As Integer
Dim teststring As String

teststring = "test1~test2~test3~test4"

v = Split(teststring, "~", 1000)
For i = LBound(v) To UBound(v)
    Debug.Print v(i)
Next

End Sub

das Ergebnis wäre dann (im Direktbereich):

test1
test2
test3
test4

Mit jedem einzelnen Wert würde ich dann eine neue Tabelle aufbauen und immer die restlichen Werte der Tabelle dazunehmen. Ist die Anzahl der Teilstrings kleiner als z.B. 5, würde das mit erträglichem Aufwand auch mit Kombinationen aus "Teil" und "Instr" Funktionen gehen, sieht aber "sch..." aus.

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)

Hallo,

Achtung, jetzt kommt die scheußliche Variante als reine Abfrage, hier mit maximal 5 Elemente, die mit ~ getrennt sind (Tabelle und Feld in der innersten FROM-Klausel entsprechend ersetzen und als SQL in eine Abfrage kopieren). Ist einfach erweiterbar. - ich entschuldige mich jetzt schon dafür:

SELECT F1, F2, F3, F4, Mid([ts4],1, iif(InStr(1, [ts4],"~")-1>0, InStr(1, [ts4],"~")-1,9999) ) AS F5
FROM ( SELECT F1, F2, F3, ts3, Mid([ts3],1, iif(InStr(1, [ts3],"~")-1>0, InStr(1, [ts3],"~")-1,9999) ) AS F4, iif(InStr(1, [ts3],"~")-1>0,mid(ts3, InStr(1, [ts3],"~")+1),"") as ts4
FROM ( SELECT F1, F2, ts2, Mid([ts2],1, iif(InStr(1, [ts2],"~")-1>0, InStr(1, [ts2],"~")-1,9999) ) AS F3, iif(InStr(1, [ts2],"~")-1>0,mid(ts2, InStr(1, [ts2],"~")+1),"") as ts3
FROM ( SELECT F1, ts1, Mid([ts1],1, iif(InStr(1, [ts1],"~")-1>0, InStr(1, [ts1],"~")-1,9999) ) AS F2, iif(InStr(1, [ts1],"~")-1>0,mid(ts1, InStr(1, [ts1],"~")+1),"") as ts2
FROM ( SELECT Mid([ts0],1, iif(InStr(1, [ts0],"~")-1>0, InStr(1, [ts0],"~")-1,9999) ) AS F1, iif(InStr(1, [ts0],"~")-1>0,mid(ts0, InStr(1, [ts0],"~")+1),"") as ts1
FROM ( SELECT teststring as ts0 FROM splittest )
))));
...