PDA

Vollständige Version anzeigen : Acces97 Abfrage Straße und Hausnummern


Udo44
23.09.2002, 11:30
Hallo Leute,
ich muss Adressdaten zum Beispiel die Seestraße 17 dem entsprechenden Straßenabschnitt zuordnen hier wäre das der Straßenabschnitt 16-39.
Hier noch mal ein Tabellenausschnitt:
Straßenabschnitt, Adresse
47-61, Seestr. 17
40-44, Seestr. 17
44a-46a, Seestr. 17
41-45, Seestr. 17
16-39, Seestr. 17
62-74, Seestr. 17
3-13, Seestr. 17

Die jeweilige Adresse darf nur einem Starßenabschnitt zugeordnet werden, die anderen Adresse mit der gleichen Hausnummer (hier 17) müssen gelöscht werden.
´So habe ich viele tausend Datensätze zu bearbeiten. Dies alles per Handarbeit ist sehr schwierig.
Hat jemand von Euch eine Idee?
Im Voraus vielen Dank.
Udo

PS.: Jedem Straßenabschnitt ist ein eindeutiger Kreisgemeindeschlüssel zugeordnet.

SNowack
23.09.2002, 11:34
Hallo Udo44,

warum den 16-39 und nicht 47-61 ???

Udo44
23.09.2002, 15:25
Hi snow,
entschuldige die späte Antwort.
Antwort: Ich darf die Hausnummer 17 nur dem Straßenabschnitt zuordnen, in dem es auch die Hausnummer gibt. In dem Fall geht der Starßenabschnitt von Hausnummer 16 bis 49.
Man muss sich einen Ort vorstellen, der mehrere Ortsunterteile besitzt. Wenn es jetzt eine z. B. Bundesstraße 9 gibt, durchschneidet diese Fernstraße den ganzen Ort einschließlich der Ortsteile. So hat jeder Ortsteil einen Straßenabschnitt, der z. B. von der Hausnummer 16 - 49 geht.
Ich hoffe, ich habe es rüberbringen können?!
Gruß Udo :)

SNowack
23.09.2002, 15:42
ist die Nummer in Strasse immer numerisch oder alphanumerisch(17a) ?

Udo44
24.09.2002, 08:31
Hallo snow,
danke für Dein Interesse,
leider wie im richtigen Leben wohnen auch Leute in Häusern mit dem Zusatz a oder b .....
Danke im Voraus.
Udo :)

SNowack
24.09.2002, 11:27
Hallo Udo,

dann mußt Du also insgesamt 3 Werte aus dem Feld ermitteln (von, bis, HausNr). Da die Werte variieren können (Länge, Zeichen) mußt Du so vorgehen, dass Du per Schleife die Daten aus dem String rausziehst und diese dann vergleichst.

Sollte ungefähr so gehen:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim von As Long
Dim bis As Long
Dim HausNr As Long
Dim ZeichenZaehler As Long ' Feld Zeichen für Zeichen durchforsten
Dim StartFeldWert As Long
Dim LaengeFeldWert As Long

Set db = CurrentDb
Set rs = db.OpenRecordset("DeineTabelle", dbOpenDynaset)

SNowack
24.09.2002, 11:29
hm... nochmal der Code:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim von As Long
Dim bis As Long
Dim HausNr As Long
Dim ZeichenZaehler As Long ' Feld Zeichen für Zeichen durchforsten
Dim StartFeldWert As Long
Dim LaengeFeldWert As Long

Set db = CurrentDb
Set rs = db.OpenRecordset("DeineTabelle", dbOpenDynaset)

If Not rs.BOF Then 'nur wenn Daten vorhanden
rs.MoveFirst
Do Until rs.EOF ' Schleife bis Datenende
ZeichenZaehler = 1 ' Immer von Vorne beginnen
StartFeldWert = 0
EndeFeldWert = 0
' Diese Schleife ermittel von und bis
Do Until ZeichenZaehler > Len(rs![Straßenabschnitt])
'Werte ermitteln
If StartFeldWert = 0 Then
If IsNumeric(Mid(rs![Straßenabschnitt], ZeichenZaehler, 1)) Then
StartFeldWert = ZeichenZaehler
End If
Else
If Not IsNumeric(Mid(rs![Straßenabschnitt], ZeichenZaehler, 1)) Or ZeichenZaehler = Len(rs![Straßenabschnitt]) Then
' Start und Ende sind ermittelt jetzt können die Variablen gefüllt werden.
If von = 0 Then
LaengeFeldWert = ZeichenZaehler - StartFeldWert
von = Mid(rs![Straßenabschnitt], StartFeldWert, LaengeFeldWert)
StartFeldWert = 0
Else
If Not IsNumeric(Mid(rs![Straßenabschnitt], ZeichenZaehler, 1)) Then
ZeichenZaehler = ZeichenZaehler - 1
End If
LaengeFeldWert = ZeichenZaehler - StartFeldWert + 1
'MsgBox StartFeldWert
'MsgBox LaengeFeldWert
bis = Mid(rs![Straßenabschnitt], StartFeldWert, LaengeFeldWert)
Exit Do
End If
End If
End If
ZeichenZaehler = ZeichenZaehler + 1
Loop

StartFeldWert = 0
LaengeFeldWert = 0
ZeichenZaehler = 1

' Diese Schleife ermittel die HausNr
Do Until ZeichenZaehler > Len(rs![Adresse])
'Werte ermitteln
If StartFeldWert = 0 Then
If IsNumeric(Mid(rs![Adresse], ZeichenZaehler, 1)) Then
StartFeldWert = ZeichenZaehler
End If
Else
If Not IsNumeric(Mid(rs![Adresse], ZeichenZaehler, 1)) Or ZeichenZaehler = Len(rs![Adresse]) Then
' Start und Ende sind ermittelt jetzt können die Variablen gefüllt werden.
If HausNr = 0 Then
If Not IsNumeric(Mid(rs![Adresse], ZeichenZaehler, 1)) Then
ZeichenZaehler = ZeichenZaehler - 1
End If
LaengeFeldWert = ZeichenZaehler - StartFeldWert + 1
HausNr = Mid(rs![Adresse], StartFeldWert, LaengeFeldWert)
Exit Do
End If
End If
End If
ZeichenZaehler = ZeichenZaehler + 1
Loop

StartFeldWert = 0
LaengeFeldWert = 0

MsgBox "HausNr: " & HausNr & " Abschnitt: " & von & "-" & bis

If HausNr < von Or HausNr > bis Then 'Wenn Hausnummer nicht in StrAbschnitt passt dann löschen
MsgBox "Datensatz wird gelöscht"
'rs.Delete
Else
MsgBox "Datensatz wird NICHT gelöscht"
End If

von = 0
bis = 0
HausNr = 0

rs.MoveNext
Loop
End If

Set rs = Nothing
Set db = Nothing

SNowack
24.09.2002, 11:30
Bei Bedarf kann ich Dir die Bsp-DB auch per E-Mail zukommen lassen.

Udo44
24.09.2002, 16:04
Hallo Stefan,

das war natürlich nur Zufall.

Es kommen alle Variationen vor.

Habe ich eine Hausnummer 17 und ich habe einen Straßenabschnitt mit D (D steht für durchgehend) gekennzeichnet (1-9999, D), so ist es egal ob die Hausnunner ungerade oder gerade ist.

Habe ich aber einen Straßenabschnitt mit einmal Seestraße 1-9999, U und mit einmal Seestraße 2-9998, G so darf die Seestraße 17 nur dem ungeraden Starßenabschnitt zugeordnet werden.

Hoffentlich schaffe ich es verständlich rüberzubringen.

Gruß Udo


;)

Udo44
26.09.2002, 13:09
Hallo snow,
du hast mir Super geholfen.
:top: :top: :top:

Jetzt frage ich das Forum,
ob in Access97 der Replace - Befehl vorhanden ist????????????????????? UAWG (Um Antwort wird gebeten).

Ich wollte den vollständigen Code, den snow gebastelt hat, allen anzeigen, aber scheinbar war der Code zu lang und es ging leider nicht.

Gruß an alle

Udo44
01.10.2002, 12:06
on top

Scorefun
01.10.2002, 12:28
den replace-befehl findest Du hier:
<a href="http://www.kraasch.de/vba003.htm" target="_blank">http://www.kraasch.de/vba003.htm</a>

YahooGreg
01.10.2002, 12:34
Hi Udo,
Acc97 kennt kein Replace Befehl, aber hier eine alte naive:

Public Function ReplaceText(mvInText As Variant, msOldTextPart As String, msNewTextPart As String) As Variant
'**************************************************************************
' Funktion: ReplaceText
' Ersteller: Gregor Hiemenz
' Erstellungsdatum: 24.07.2001
'--------------------------------------------------------------------------
' Beschreibung: Ersetzt eine Zeichenfolge in einem Text durch eine andere
'
' Parameter:
' mvmvInText Textfeld, welches bearbeitet werden soll
' msOldTextPart Zeichenfolge, welche ersetzt werden sollen
' msNewTextPart Zeichenfolge, welche ersetzt werden
'
' Rückgabewert: Den neuen Text mit den ersetzten Zeichen
'**************************************************************************
On Error GoTo Err_ReplaceText

' Lokale Variable
Dim mnOldTextLen As Integer '*** Länge der alten Textzeichenfolgen
Dim mnNewTextLen As Integer '*** Länge der neuen Textzeichenfolgen
Dim mnStartPos As Integer '*** Startposition der Suche nach der alten Textzeichenfolge
Dim mnFoundPos As Integer '*** Position an der die Textzeichenfolge gefunden wurde

mvInText = Trim(Nz(mvInText)) '*** Alle Leerzeichen in allen Übergabefelder entfernen
msOldTextPart = Trim(Nz(msOldTextPart))
msNewTextPart = Trim(Nz(msNewTextPart))

mnOldTextLen = Len(msOldTextPart) '*** Länge der alten Textzeichenfolgen ermitteln
mnNewTextLen = Len(msNewTextPart) '*** Länge der neuen Textzeichenfolgen ermitteln
mnStartPos = 1 '*** Beginne am Anfange des Textes mit der Suche

If mvInText <> "" Then '*** Steht überhaupt etwas in dem Textfeld
mnFoundPos = InStr(mnStartPos, mvInText, msOldTextPart) '*** Position an der die Textzeichenfolge gefunden wurde

While mnFoundPos > 0 '*** Wenn etwas gefunden wurde, ersetze alle alten Zeichenfolgen durch die neue
mvInText = Left(mvInText, mnFoundPos - 1) & msNewTextPart & Mid(mvInText, mnFoundPos + mnOldTextLen)
mnStartPos = mnFoundPos + mnNewTextLen
mnFoundPos = InStr(mnStartPos, mvInText, msOldTextPart) '*** Position an der die Textzeichenfolge gefunden wurde
Wend
ReplaceText = mvInText '*** Rückgabewert ist der neue Text
Else '*** Wenn nichts in dem Textfeld steht
ReplaceText = Null '*** Rückgabewert = Null
End If

Exit_ReplaceText:
Exit Function

Err_ReplaceText:
MsgBox "Fehler in Funktion ReplaceText: " & vbCr & Err.Description
Resume Exit_ReplaceText

End Function