Avatar billede jensen363 Forsker
05. februar 2009 - 21:47 Der 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å.

Hvordan adskiller man denne tekststreng korrekt ?
Avatar billede fdata Forsker
05. februar 2009 - 23:56 #1
Måske noget i stil med:

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
 
  FindPostnr = s
End Function
Avatar billede jensen363 Forsker
06. februar 2009 - 08:49 #2
Perfekt ...

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
Avatar billede kabbak Professor
06. februar 2009 - 14:39 #3
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
Avatar billede fdata Forsker
06. februar 2009 - 18:56 #4
Et smukt eksempel på teamwork  ;o)
Avatar billede jensen363 Forsker
07. februar 2009 - 15:45 #5
Og det virker ...  vil I dele ?
Avatar billede jensen363 Forsker
07. februar 2009 - 19:15 #6
Kabbak > Var lidt for hurtig !!!

Hvordan virker den ... jeg skal jo have det adskilt i mindst postnummer og by i hver sin kolonne ???
Avatar billede kabbak Professor
07. februar 2009 - 19:20 #7
Land : FindPostn([sammensatfelt])(0)
Postnummer : FindPostn([sammensatfelt])(1)
BY : FindPostn([sammensatfelt])(2)

ret [sammensatfelt] til feltet i din database, som du har data i nu
Avatar billede kabbak Professor
07. februar 2009 - 19:24 #8
der var smuttet et r i kopieringen
Land : FindPostnr([sammensatfelt])(0)
Postnummer : FindPostnr([sammensatfelt])(1)
BY : FindPostnr([sammensatfelt])(2)
Avatar billede jensen363 Forsker
08. februar 2009 - 11:19 #9
Jeg kan fortsat ikke få det til at virke :-(

Hvad er syntaxen for det ene og det andet

FindPostnr([sammensatfelt])(1)
FindPostnr([sammensatfelt])(2)
virker ikke
Avatar billede kabbak Professor
08. februar 2009 - 13:53 #10
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
Avatar billede jensen363 Forsker
08. februar 2009 - 14:15 #11
Jeg har fulgt din anvisning fuldt ud, men får følgende fejlnmeddelelse :

The expression you entered has an invalid . (dot) or! operator or invalid parantes
Avatar billede kabbak Professor
08. februar 2009 - 14:21 #12
sæt lige din SQL kode herind, så jeg kan se den
Avatar billede jensen363 Forsker
08. februar 2009 - 14:29 #13
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"));


ASTDTA_KUNDERPF.KUADR3 svarer til adressefeltet
Avatar billede kabbak Professor
08. februar 2009 - 14:38 #14
Jeg kan ikke se at du kalder funktionen nogen steder.

Er ASTDTA_KUNDERPF ikke tabellen og KUADR3 er feltet, jeg bruger i hvert fald aldrig, punktum i et feltnavn.
Avatar billede jensen363 Forsker
08. februar 2009 - 14:43 #15
ASTDTA_KUNDERPF er tabellen og KUADR3 er feltet

Forespørgslen fungere indtil jeg forsøger at tilføje eksempelvis

plz : FindPostnr([KUADR3])(1)
Avatar billede kabbak Professor
08. februar 2009 - 14:50 #16
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)
Avatar billede jensen363 Forsker
08. februar 2009 - 15:02 #17
Se det lignede mere kode jeg kunne genkende :-)

Tak endnu engang
Avatar billede jensen363 Forsker
13. februar 2009 - 09:42 #18
Kabbak vil du dele point med fdata
Avatar billede kabbak Professor
13. februar 2009 - 10:23 #19
nej, giv ham dem alle.
Avatar billede jensen363 Forsker
13. februar 2009 - 10:25 #20
Ok, takker begge for hjælpen :-)
Avatar billede fdata Forsker
13. februar 2009 - 19:10 #21
Jamen så takker jeg da jer begge for point ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester