05. februar 2009 - 21:47Der er
20 kommentarer og 1 løsning
udtræk af postnummer fra adressefelt
Fra en tysk internetportal får jeg leveret oplysninger om tyske kunder, med navn, adresse o.s.v.
Landekode, postnummer og by stammer alle fra et og samme felt, og er altså en een og samme tekststreng, som jeg har behov for at få adskilt i minimum 3 felter ( landekode, postnummer, by )
Hvis alle vore tyske kunder overholdt standarden, var der ingen problemer med at adskille disse data, men der hersker ren anarki i forbindelse med indtastningen, hvorfor en given record kan se således ud :
D 12345 Bynavn D-12345 Bynavn D12345 Bynavn 12345 Bynavn
Dette er med garanti berørt herinde adskillige gange, enten er det mig som ikke kan finde ud af den nye søgerobot herinde, eller også er emnet ikke behandlet tidligere, hvilket jeg tvivler på.
Private Sub Test_FindPostNr() Debug.Print FindPostnr("D 12345 Bynavn") Debug.Print FindPostnr("D-12345 Bynavn") Debug.Print FindPostnr("D12345 Bynavn") Debug.Print FindPostnr("12345 Bynavn") End Sub
Function FindPostnr(PnrStr As String) As String Dim i As Integer Dim s As String Dim Igang As Boolean
Igang = False
For i = 1 To Len(PnrStr) If IsNumeric(Mid(PnrStr, i, 1)) Then If Not Igang Then Igang = True s = Mid(PnrStr, i, 1) Else s = s & Mid(PnrStr, i, 1) End If Else If Igang Then Exit For End If Next i
Kan du også klare de tre første karakterer af bynavnet, som IKKE ALTID STÅR I DIREKTE FORLÆNGELSE AF POSTNUMMER ( altså med et eller flere mellemrum ) ... suk
Jeg tilføjer lige lidt kode til den udmærkede kode fdata har lavet
Nu retunerer den alle 3 værdier
Private Sub Test_FindPostNr() Dim PNR As Variant, I As Integer PNR = Array("D 12345 Bynavn", "D-12345 Bynavn", "D12345 Bynavn", "12345 Bynavn") For I = 0 To UBound(PNR) Debug.Print "Land = " & FindPostnr(PNR(I))(0), "PostNr = " & FindPostnr(PNR(I))(1), "BY = " & FindPostnr(PNR(I))(2) Next End Sub
Function FindPostnr(PnrStr As Variant) As Variant Dim I As Integer Dim s As String Dim PostNr(2) As Variant Dim Igang As Boolean PnrStr = Replace(PnrStr, "-", " ", 1) Igang = False For I = 1 To Len(PnrStr) If IsNumeric(Mid(PnrStr, I, 1)) Then
If Not Igang Then Igang = True s = Mid(PnrStr, I, 1) PostNr(0) = Trim(Mid(PnrStr, 1, I - 1)) Else s = s & Mid(PnrStr, I, 1) End If
Else If Igang Then Exit For End If Next I PostNr(1) = s PostNr(2) = Trim(Mid(PnrStr, I, (Len(PnrStr) + 1) - I)) FindPostnr = PostNr End Function
der var smuttet et r i kopieringen Land : FindPostnr([sammensatfelt])(0) Postnummer : FindPostnr([sammensatfelt])(1) BY : FindPostnr([sammensatfelt])(2)
Hvis du laver en forespørgsel, baseret på din tabel.
Då tager du dit felt, der hvor du har det samlet i, her kaldet [sammensatfelt], det skal selvfølgelig rettes til dit felt's navn.
så sætter du det jeg skrev 19:24:39 ind i hver sit felt, og du kan tage dit eget felt med for at sammenligne.
Koden herunder, skal du have i et modul, dem finder du nederst i objekter, samme sted som du vælger tabeller, forespørgeler mm. hvis du ikke har et modul der, laver du et nyt og sætter koden ind.
Function FindPostnr(PnrStr As Variant) As Variant Dim I As Integer Dim s As String Dim PostNr(2) As Variant Dim Igang As Boolean PnrStr = Replace(PnrStr, "-", " ", 1) Igang = False For I = 1 To Len(PnrStr) If IsNumeric(Mid(PnrStr, I, 1)) Then
If Not Igang Then Igang = True s = Mid(PnrStr, I, 1) PostNr(0) = Trim(Mid(PnrStr, 1, I - 1)) Else s = s & Mid(PnrStr, I, 1) End If
Else If Igang Then Exit For End If Next I PostNr(1) = s PostNr(2) = Trim(Mid(PnrStr, I, (Len(PnrStr) + 1) - I)) FindPostnr = PostNr End Function
SELECT Int([KUKUND]) AS AGENT, ASTDTA_KUNDERPF.KUKUND AS [Agent No], ASTDTA_KUNDERPF.KUAGTX AS [Agent Name], ASTDTA_KUNDERPF.KUKGRP AS [Agent Group No], Region.Region, ASTDTA_KUNDERPF.KULALA AS Land, ASTDTA_KUNDERPF.KUADR3 FROM ASTDTA_KUNDERPF INNER JOIN Region ON ASTDTA_KUNDERPF.KUSÆLG = Region.[Region ID] WHERE (((Int([KUKUND])) Between 2000000 And 2999999) AND ((ASTDTA_KUNDERPF.KULALA)="D"));
jeg har lige testet, det lader til at Access ikke tillader det sidste i kaldet, så vi ændrer lidt i koden
Koden ser nu sådan ud Function FindPostnr(PnrStr As Variant, NR) As Variant Dim I As Integer Dim s As String Dim PostNr(2) As Variant Dim Igang As Boolean PnrStr = Replace(PnrStr, "-", " ", 1) Igang = False For I = 1 To Len(PnrStr) If IsNumeric(Mid(PnrStr, I, 1)) Then
If Not Igang Then Igang = True s = Mid(PnrStr, I, 1) PostNr(0) = Trim(Mid(PnrStr, 1, I - 1)) Else s = s & Mid(PnrStr, I, 1) End If
Else If Igang Then Exit For End If Next I PostNr(1) = s PostNr(2) = Trim(Mid(PnrStr, I, (Len(PnrStr) + 1) - I)) FindPostnr = PostNr(NR) End Function
Og kaldet vil så være Land : FindPostnr([ASTDTA_KUNDERPF].[KUADR3];0) Postnummer : FindPostnr([ASTDTA_KUNDERPF].[KUADR3];1) BY : FindPostnr([ASTDTA_KUNDERPF].[KUADR3];2)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.