April 21, 2021, 15:20:56

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Abfrage mit Wert aus einer anderen Tabelle

Begonnen von dumdidum, Februar 12, 2021, 13:41:43

⏪ vorheriges - nächstes ⏩

dumdidum

Hallo Zusammen, ich verzweifle gerade ein bisschen.

Ich habe 2 Tabellen

Tabelle 1 - Rufnummer

49201xxxxx  Müller
4940xxxxx Meier


Tabelle 2 - Vorwahlen

49201  Essen
4940  Hamburg



Jetzt hätte ich gerne eine Abfrage die mir folgendes liefert:


49201xxxx Müller Essen
4940xxxxx Meier Hamburg

Damit ich weiß das Müller in Essen sitz

In der Tabelle 1 sind ca 5000 Einträge drin

Die Tabellen sind nicht verknüpft  :P

Ich hoffe einer hat ein Tip für mich

ebs17

ZitatDie Tabellen sind nicht verknüpft
In einer Abfrage sollte man das tun. Worüber, sollte auch offenkundig sein.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

Oder man folgt den Normalisierungsregeln und speichert die Rufnummer in
Tabelle 1 atomar, - Vorwahl per FK hinterlegt.
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

dumdidum

Leider kann ich an Tabelle 1 keine Änderungen vornehmen.

Ich benötige ja eigentlich eine Abfrage die folgendes macht.

Schaue in Tabelle 1 auf die Rufnummer und wenn diese das Feld mit dem Wert aus Tabelle 2 (49201 oder 4940 oder...)enthält dann ergänze schreibe in der Abfrage den Ort aus Tabelle 2 dazu

Geht das ohne Verknüpfungen ?

MzKlMu

Hallo,
wie genau stehen die Telefonnummern in der Tabelle1, sind das die kompletten Rufnummern ohne Leerzeichen zwischen Vorwahl und Rufnummer ?
Ich gehen davon aus, dass da nicht wirklich xxxx drin steht.
Gruß
Klaus

ebs17

Zitat von: undefinedGeht das ohne Verknüpfungen ?
Kommt darauf an, was Du unter Verknüpfungen verstehst.

Eine Verknüpfung im Sinne einer Abfrage ist Vergleich und Zuordnung. Auf was kann man da verzichten?

Wenn Du Deine beschriebene Logik 1:1 umsetzt, also Schleifen in Schleife  und alles in VBA, müsstest Du immer noch vergleichen, das ganze Konstrukt wäre aber viel umständlicher.
Mit freundlichem Glück Auf!

Eberhard

dumdidum

Zitat von: MzKlMu am Februar 12, 2021, 16:04:17Hallo,
wie genau stehen die Telefonnummern in der Tabelle1, sind das die kompletten Rufnummern ohne Leerzeichen zwischen Vorwahl und Rufnummer ?
Ich gehen davon aus, dass da nicht wirklich xxxx drin steht.

+492018888 also die xxx sind zahlen

MzKlMu

Februar 12, 2021, 16:15:56 #7 Letzte Bearbeitung: Februar 12, 2021, 16:41:48 von MzKlMu
Hallo,
ich glaube, das Vorhaben ist nicht möglich. Wie willst Du die Vorwahlen unterscheiden, die können ja 3-6 stellig sein. Also die Positionen 5 bis 9 ist die Vorwahl. Wie willst Du das vom Beginn der Telefonnummer unterscheiden ? Mit anderen Worten, wo endet die Vorwahl und wo beginnt die Telefonnummer ?
Gruß
Klaus

andyfau

Guten Abend,

Vorwahlen sind in Deutschland immer eindeutig. Soll heißen, wenn es 040 gibt, gibt es als Vorwahl nicht die 0401. Hier gehört die 1 dann schon zur TelNr. Deshalb kann man über die Länge der Vorwahl diese prima abgrenzen. Siehe kleine Sub, die das macht. (Tabelle der Telefonnummern muss natürlich um die Spalte "Ort" vorher ergänzt werden.)

Sub FindeOrt()

Dim dB As Database
Dim tbV As Recordset
Dim tbA As Recordset

Set dB = CurrentDb
Set tbV = dB.OpenRecordset("tblVorwahlen", dbOpenDynaset)
Set tbA = dB.OpenRecordset("tblTelNr", dbOpenDynaset)

If tbV.RecordCount = 0 Then
  MsgBox (" Fehler: Tabelle Vorwahlen ist leer.")
  Exit Sub
End If
If tbA.RecordCount = 0 Then
  MsgBox (" Fehler: Tabelle TelNr ist leer.")
  Exit Sub
End If
tbV.MoveFirst
 Do While Not tbV.EOF
  tbA.MoveFirst
  Do While Not tbA.EOF
    If tbV!Vorwahl = Left$(tbA!TelNr, Len(tbV!Vorwahl)) Then
       tbA.Edit
       tbA!Ort = tbV!Ort
       tbA.Update
    End If
    tbA.MoveNext
  Loop
  tbV.MoveNext
Loop
Set tbA = Nothing
Set tbV = Nothing

End Sub

crystal

Hallo,
es könnte mir einer Public Function funktionieren. (Der Ansatz von andyfau geht ja wohl nicht, weil du keine Schreibrechte für die Tabelle hast.)

Etwa nach diesem Schema:

public function AddOrt(strTel as string) as string
Recordset auf Vorwahlen öffnen mit
  select Vnr, Ort from Vorwahlen where Vnr like "'" & left(telnr,4) & "*' ORDER By Vnr;"
Durch dieses recordset loopen, bis eine VNR gefunden wird, die in der Telnr komplett enthalten ist (Länge der Vorwahl)
und den Ort anfügen
oder "unbekannt".
Blöd ist nur, dass es in D Vorwahlen gibt, die für diverse Orte gelten, z. B. 0711 für Stuttgart, Esslingen, Leinfelden, Fellbach usw. Der Vorwahl 0711 schlicht Stuttgart zuzuordnen, ist da fast schon diskriminierend  :) , zumal man seine TNr auch beim Umzug mitnehmen kann...

Da eine Ortsvorwahl in D mindestens 2 Stellen lang ist (ohne führende 0, plus 2 Stellen Landesvorwahl), schränkt der obige Select die Zahl der möglichen Vorwahlen schon erheblich ein, so dass ein Treffer schneller gefunden würde. (Es gibt allerdings auch Landesvorwahlen mit nur 1 oder mit 3 Stellen.)
Der select würde also z. B. für 4971 zurückliefern:
49711 Stuttgart
497141 Ludwigsburg
497151...

Eine solche Funktion kannst du dann im eigentlichen Select einbauen:
  select TNr, AddOrt(TNr) as TelOrt from...

Man könnte in solch einer Funktion auch etwas anders vorgehen:
4 Stellen aus der TNr ausschneiden und nachsehen, ob es die exakt als Vorwahl gibt.
Wenn nicht weiter mit 5, 6, 7 oder 8 Stellen.
Das wären dann nur 5 DLookups statt eines Loops.

Und: was ist mit Mobil- oder Sondernummern?

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MzKlMu

Februar 13, 2021, 11:00:16 #10 Letzte Bearbeitung: Februar 13, 2021, 12:38:26 von MzKlMu
Hallo,
Zitat von: undefinedVorwahlen sind in Deutschland immer eindeutig.
nein, das stimmt so nicht, zumindest nicht auf den Ort (bzw. die Stadt) bezogen.
Die Vorwahl 0621 gilt für Ludwigshafen (RLP) und Mannheim (BW), also auch 2 verschiedene Bundesländer.
Und solche Konstellationen gibt es bestimmt auch noch mehr. Es gibt viele kleinere Orte/Städte die zu einer Vorwahl zusammengefasst sind.
Gruß
Klaus

andyfau

Das "eindeutig" bezieht sich auf die Ortnetzkennzahlen. Diese sind eindeutig definiert. Sie sind nicht gleichzusetzen mit dem Ort. Also ist es kein Problem wenn die Vorwahltabelle ordnungsgemäß gefüllt ist.

siehe auch
https://upload.wikimedia.org/wikipedia/commons/f/f6/Karte_Telefonvorwahlen_Deutschland.png

Dann eine simple Abfrage:
Sie dürfen in diesem Board keine Dateianhänge sehen.

MzKlMu

Hallo,
wenn in der ordnungsgemäß gefüllten Vorwahltabelle steht

0621 Ludwigshafen
0621 Mannheim

Wie willst Du in der Telefonnummer

0621123456 Lu
0621345678 Ma

den richtigen Ort herausfinden ?
Gruß
Klaus

andyfau

Hallo Klaus,

zwei Einträge mit der gleichen Vorwahl sind nicht ordnungsgemäß. (siehe Wikipedia-Link/Karte).
Es geht, wie gesagt, um die Ortsnetzkennzahlen, nicht um die Orte. Ortsnetzkennzahlen sind einmalig und richten sich nach den früher von der Post festgelegten Fernmeldeamtsbezirken. Somit sind in der Tabelle der Vorwahlen diese als non-duplicate einzutragen.

Ist also kein Datenbankproblem, sondern ein Datenproblem, vererbt aus alten Zeiten.
Hilft nur, mit einer TelNr auch die Adresse zu speichern. Oder, zumindest die PLZ, um dann darüber den Ort/Ortsteil zuordnen zu können.

Beste Grüße
Andreas

MzKlMu

Hallo,
in der PLZ Tabelle gibt es ein Feld für die Vorwahl und ein Feld für den Ort. Nur die Kombination aus Vorwahl und Ort ist eindeutig. Das siehst Du auch in der Wikipedia Karte, da stehen bei 0621 zwei Orte (Lu/Ma).

Auch die PLZ mit zu speichen würde nix nutzen, denn die PLZ ist nicht eindeutig. Es gibt Orte die zu einer PLZ zusammengefasst werden.
Gruß
Klaus