PDA

Vollständige Version anzeigen : Abfrage


ceki
22.10.2001, 14:22
Hallo Zusammen,

irgendwie dürfte ich total auf der Leitung stehen.

Ich habe in einer Tabelle (Tabelle1) u.a. ein Feld 'Friendly Name' (als Textfeld definiert). In diesem Feld sind neben Anmerkungen auch Standortnummern hinterlegt.

Nun möchte herausfinden, in welchen Datensätzen der Tabelle1 Standorte aus einer eigenen Standorttabelle (Tabelle2) zum Teil enthalten sind.

Mit einer 1:n Verknüpfung bekomme ich nur die Datensätze die absolut ident sind.

Gebe ich als Kriterium WIE ... an, werden ALLE Datensätze, die im Feld 'Friendly Name' nicht Null sind ausgegeben. Dieses Phänomen ist mir auch mittlerweile klar, weil ich durch die 1:n Verknüpfung ja einen 0-Wert für den gesuchen Standort bekomme, und der stimmt ja immer dann überein, sobald 'Friendly Name' befüllt ist.

Als Beispiel:

Tabelle1:
DS1: Act7: 132009807_Ried
DS2: 182009804, 182009805
DS3: xxx
DS4: Act7: 012009802_Feldk Ater TP 1
DS5: 'leer'

Tabelle2:
DS1: 182009805
DS2: 012009802

Anhand der Abfrage möchte ich nun, daß aus Tabelle1 zwar alle Datensätze angezeigt werden, jedoch in einem Feld am Ende des Datensatzes "1" oder "0" angezeigt wird wenn/wenn nicht der Feldinhalt zum Teil mit den Werten aus Tabelle2 übereinstimmt.

Mit den obigen Werten sollte das Ergebnis dann so aussehen:

DS1: 0
DS2: 1
DS3: 0
DS4: 1
DS5: 0

Alles unklar? Bei mir zumindest schon. *gg*

Bitte um Hilfe. Ich weiß einfach nicht mehr weiter.

Danke & Gruß
Karl

Anne Berg
23.10.2001, 11:12
Probier mal folgendes aus:
SELECT tst_Tabelle1.Feld1, ((select feld1 from tst_tabelle2
where tst_tabelle1.feld1 like "*" + tst_tabelle2.feld1 + "*")) AS k1,
IIf((select count(*) from tst_tabelle2
where tst_tabelle1.feld1 like "*" + tst_tabelle2.feld1 + "*")>0,1,0) AS k2,
IIf([k1] Is Null,0,1) AS k3
FROM tst_Tabelle1;


Dabei ist Feld1 dein 'Friendly Name' und das Feld in Tabelle2 muß ebenfalls Text sein.
Für die Ermittlung des Kennzeichens gibt es also mehrere Möglichkeiten. Nicht benötigte Spalten können ausgeblendet werden.
Bei größeren Datenmengen dürfte die Antwortzeit wohl in die Knie gehen...

ceki
23.10.2001, 11:27
nö, klappt leider nicht.
die abfrage wird zwar aufgebaut (schaut auch recht gut aus), aber noch bevor sie fertig aufgebaut ist, switchen alle felder auf "#Name?"

die "einfache" abfrage sieht so aus:

SELECT Tabelle1.[Friendly Name (HW)], Abfrage1.Ausdr1
FROM Abfrage1 INNER JOIN Tabelle1 ON Abfrage1.Ausdr1 = Tabelle1.[Friendly Name (HW)];

das einzige, das ich bräuchte wären "wildcards" vor und nach "Abfrage1.Ausdr1" in der FROM-Zeile

aber dein ansatz hat mir zumindest kurz schon mal ein ergebnis gebracht.

ich stell mal deinen auf meine felder geänderten code dazu:

SELECT Tabelle1.[Friendly Name (HW)], ((select [Friendly Name (HW)] from Abfrage1
where Tabelle1.[Friendly Name (HW)] like "*" + Abfrage1.[Ausdr1] + "*")) AS k1,
IIf((select count(*) from Abfrage1 where Tabelle1.[Friendly Name (HW)] like "*" + Abfrage1.[Ausdr1] + "*")>0,1,0) AS k2,
IIf([k1] Is Null,0,1) AS k3
FROM Tabelle1;

hab ich vielleicht irgendwo einen fehler gemacht?

Anne Berg
23.10.2001, 12:03
Wenn du jetzt noch deine 'Abfrage1' angibst, kann ich das ganze vielleicht nachvollziehen.

ceki
23.10.2001, 12:19
'Abfrage1' löscht mir nur aus der Standortliste die anführenden Nullen.
Drum hab ich sie einfach als "Abfrage1" belassen. "Ausdr1" in 'Abfrage1' ist dann die bereinigte Standortnummer, die ich in 'Tabelle1' dann suchen möchte.

Anne Berg
23.10.2001, 12:31
So wie ich das sehe, ist das Feld 'Friendly Name (HW)' in Tabelle1 und nicht in Tabelle2 und somit auch nicht in Abfrage1 enthalten - oder??

ceki
23.10.2001, 12:56
Richtig.

Mein DB-Aufbau ist folgendermaßen:

'Tabelle1'
- "TroubleTicket"
- "Friendly Name (HW)"

'Tabelle2'
- "Standort"

'Abfrage1'
- "Standort"
- "Ausdr1" (=Standort ohne anführender 0)

Und damit möchte ich herausfinden, welche Trouble-Tickets im Feld "Friendly Name (HW)" einen Standort aus der Tabelle 'Tabelle2' haben, wobei der Feldinhalt in "Friendly Name (HW)" ein Mix aus einer Standortnummer und einer Beschreibung sein kann.

md
23.10.2001, 18:02
Hallo ceki!
Ich habe das gerade für Dich gemacht mit folgendem Lösungsweg:
Erstelle eine Abfrage auf tABELLE1 :
Feld 1:Trouble Ticket
Feld2: Ausdr1: "'" & NurZahl([friendly name (HW)]) & "'"

Folgende Funktion ( muß in ein Modul ) liefert die Werte für dieses Feld:
Function NurZahl(Eingabe As String)
' ***********************************************************
' Entfernt alle nicht numerischen Werte und gibt die puren Ziffern zurück
' Ausschließlich gedacht, um z.B. aus Telefonnummern "/" oder "-" oder "(" ")"
' zu entfernen.
' Achtung: Es entfernt auch Komma oder Tausenderpunkt etc ohne Rücksicht.
' Die Funktion ist also für Zahlen mit Nachkommastellen ungeeignet !!!
' ***********************************************************

Dim I As Integer, Max As Integer, Tmp As String

NurZahl = ""

Max = Len(Trim(Nz(Eingabe)))

If Max = 0 Then
Exit Function
End If

For I = 1 To Max
Tmp = Mid(Eingabe, I, 1)
If Not (Tmp < Chr(48) Or Tmp > Chr(57)) Then
NurZahl = NurZahl & Tmp
End If
Next I

End Function

Jetzt hast Du im 2. Feld die reinen Zahlen aus [Friendly Name (HW)]

Diese feld ist ein Stringfeld und kann nicht gleich in Beziehung zu Standort gesetzt werden, da Standort ein Zahlfeld ist.
Also Abfrage2 mit einem einzigen Feld:
Stringstandort: "'" & [standort] & "'"

Abfrage 1 kann jetzt mit Abfrage 2 über die Felder Ausdruck1 (Abfrage1) und Stringstandort in beziehung gesetzt werden.
Bei mir klappt es.
Wenn Du willst schick ichs Dir, Email vorausgesetzt.
MD


Noch eine Abfrage auf Tabelle2

md
23.10.2001, 18:29
Hallo Ceki!
Noch eine letzte Idee:
Falls in dem friendly Feld noch andere Zahlen als Standtort sein können, gehts so nicht.
Dann müßtest Du mit der instr Funktion auf gleichem Weg prüfen, ob irgendein Standort Wert in dem momentan abgefragten Feld enthalten ist.
Der Rückgabewert des zweiten Feldes der Abfrage1 wäre dann true oder false.
Allerdings ist das aufwendiger, da jedesmal die gesamte Tabelle 2 mit einer Schleife durchlaufen werden muß.

Ich hoffe, das ist wenigstens eine Anregung

MD

md
23.10.2001, 19:30
Hier der code für die 2. variante:
Public Function enthalten(eingabe As String)
Dim db As Database, rs As Recordset, temprs, temp As String
Set db = CurrentDb
Set rs = db.OpenRecordset("tabelle2")
Do Until rs.EOF
temprs = rs!standort
temp = InStr(1, eingabe, temprs)
If temp = 1 Then
enthalten = 1
Exit Function
Else
enthalten = 0
rs.MoveNext
End If
Loop
End Function
gibt 1 für enthalten und 0 für nicht enthalten.
Unmittelbar vor und hinter der Standortnummer muß aber mindestens ein Buchstabe sein, denn 115 kann 11 & 5 oder auch 1 & 12 sein.
Grüße
MD

MarioR
23.10.2001, 20:57
Hallo Karl,

ich hätte hier eine Lösung mit 2 Abfragen.

Abfrage 1 (qryAbfrage1):

SELECT TroubleTicket, [Friendly Name (HW)]
FROM Tabelle1
WHERE EXIST (SELECT TOP 1 Standort
FROM Tabelle2
WHERE Nz(InStr([Friendly Name (HW)], Standort),0)>0);

Abfrage 2 (qryAbfrage2):

SELECT IIf(IsNull([qryAbfrage1].[TroubleTicket]),0,1) AS Ergebnis
FROM Tabelle1 LEFT JOIN qryAbfrage1
ON (Tabelle1.TroubleTicket = qryAbfrage1.TroubleTicket)
AND (Tabelle1.[Friendly Name (HW)] = qryAbfrage1.[Friendly Name (HW)]);

ceki
25.10.2001, 08:04
Hallo Leute!

Erstmal Danke für Eure Hilfe.
Mit Marios Version hats dann "auch" geklappt.
Ich hab nämlich gleichzeitig eine "Alternative" von einem Arbeitskollegen bekommen.
Mit dem "Grap" von Gnu kann man zwei Textfiles genau auf das hin vergleichen, wie ich das gebraucht hab.
Ich hab mir meine Liste dann über dieses nette kleine DOS-Programm gefiltert.
Die Access-Variante hatte zwar das selbe Ergebnis, nur um Lichtjahre später, weil immerhin ca. 21000 Datensätze mit einer Liste von ca. 3500 Einträgen verglichen werden mußte.
Der "Grap" hat das in ca. 1,5-2 sek. geschafft, während sich bei der Access-Variante 1 Kaffee und 3 Zigaretten ausgegangen sind.
Man muß ja nicht alles in Access machen. *ggg*

Danke auf jeden Fall nochmal.

Gruß
Karl