Avatar billede dsjk Novice
07. juli 2004 - 11:22 Der er 18 kommentarer og
3 løsninger

Del felt ud i flere felter

Hej

Jeg har en db, hvor jeg indlæser mange adresser i, adresserne er ofte delt op i:
Navn, adresse, postnr, bynavn, att, postboks

Jeg skal under indlæsningen af adresserne dele nogle af felterne op, det gælder navn, som skal deles op i fornavn og efternavn (sidste navn er efternavn resten er fornavn)
Endvidere skal adressefeltet også deles op, det er en del vanskligere da de ofte ikke står ens.
ex.
Vinkelvej 23 deles op i Vinkelvej og 23
Vinkelvej 23A eller Vinkelvej 23 A, deles op i Vinkelvej = vejnavn, 23 = husnr og A = husbogstav
Vinkelvej 23A, 1 st. deles op i Vinkelvej = vejnavn, 23 = hunnr, A = husbogstav, 1 = etage, st = position
Der kan dog være flere kombinationer af ovenstående, da det ikke er sikkert der er et , mellem husnr og sal, det kan bare være et mellemrum eller måske et .

Men hvordan kan jeg gøre dette i access?

/dsjk
07. juli 2004 - 11:39 #1
Det er lidt svært....du er nødt til at benytte VBA til at opsplitte de enkelte felter.

Fornavn og efternavn findes med disse 2 funktioner (som anbringes i et modul):

Public Function FindEfternavn(navn As String) As String
    Dim pos As Long
    pos = Len(navn)
    If InStr(1, navn, " ") = 0 Then
        FindEfternavn = navn
    Else
        Do
            pos = pos - 1
        Loop Until Mid(navn, pos, 1) = " " Or pos = 0
        FindEfternavn = Mid(navn, pos + 1)
    End If
End Function


Public Function FindFornavn(navn As String) As String
    FindFornavn = Left(navn, Len(navn) - Len(FindEfternavn(navn)) - 1)
End Function

Disse funtioner kan så bruges i en forespørgsel til f.eks. at flytte data over i en ny tabel. Eller hvis du i samme tabel har oprettet Fornavn og Efternavn ved siden af Navn, kan du lave en opdateringsforespørgsel, som ser således ud:

Update [Din tabel] Set Fornavn = FindFornavn(Navn), Efternavn = findEfternavn(Navn)

Adressen skal der lige tænkes lidt mere over...
07. juli 2004 - 11:47 #2
De næste 2 funktioner splitter en adresse op i gadenavn og husnr:

Public Function FindHusnr(Adresse As String) As String
    Dim Pos As Long
    Pos = 1
    Do
        Pos = Pos + 1
    Loop Until IsNumeric(Mid(Adresse, Pos, 1))
    FindHusnr = Mid(Adresse, Pos)
End Function

Public Function FindGadenavn(Adresse As String) As String
    FindGadenavn = Left(Adresse, Len(Adresse) - Len(FindHusnr(Adresse)) - 1)
End Function

Jeg ved godt, at du gerne ville have splittet det yderligere op, men det kan du måske selv arbeje lidt videre på. Der er mange fejlmuligheder. Er du sikker på, at Vinkelvej 23A, 1 st. altid skrive på den måde og ikke f.eks.:
Vinkelvej 23 A 1 st.?
Avatar billede proaccess Nybegynder
07. juli 2004 - 11:47 #3
Til Thomas:  du bruger alt for meget krudt på dine funktioner...  Se vedlagte 2 eksempler...

Public Function strEfternavn(strNavn As String) As String
  Dim strArray() As String
  strArray() = Split(strNavn)
  strEfternavn = strArray(UBound(strArray()))
End Function

Public Function strEfternavn(strNavn As String) As String
  strEfternavn = Mid(strNavn, InStrRev(strNavn, " ") + 1)
End Function
07. juli 2004 - 11:50 #4
ja, jeg glemmer altid den split-funktion :o)

Jeg havde nu min FindEfternavn/fornavn funktion liggende fra Access 2.0-tiden, så det var ikke det store arbejde lige at skrive den om til adresser også.
Men næste gang vil jeg prøve at huske det :o)
Avatar billede proaccess Nybegynder
07. juli 2004 - 11:51 #5
FindHusNr er der vist ikke nogen elegant løsning på...

Thomas's eksempel vil fejle ved "Christian den 4.'s gade 27, 2.th."
Avatar billede dsjk Novice
07. juli 2004 - 11:52 #6
Thomas, der er desværre ikke en konstant mår adressen skrives på, det kan være det er adskilt af et komma, men det kan også være, som du selv nævner, med mellemrum, eller måske står det sådan her Vinkelvej 23 A, 1st.
Derfor skal der vel tjekkes på om næste felt er et tal eller bogstav for at finde ud af om der er et husbogstav eller det næste er en sal.

Kigger lige på de funktioner du har sendt. :)

/dsjk
07. juli 2004 - 11:54 #7
Proaccess->hmm, ja du har vist ret....jeg kunne ikke umiddelbart huske nogen navne med tal i, hvorfor jeg mente, at isNumeric kunne bruges. Men det er der selvfølgelig :o(

Har du selv andre forslag?
Avatar billede proaccess Nybegynder
07. juli 2004 - 12:34 #8
NOPE, jeg er overbevist om at det (desværre) ikke kan lade sig gøre...
07. juli 2004 - 12:36 #9
ja, sålænge der ikke er helt præcise retningslinier, så tror jeg heller ikke at det er muligt.
Avatar billede dsjk Novice
07. juli 2004 - 12:38 #10
proaccess > hvor der er vilje er der vej (er der ik? ;) )

Thomas > får fejlen
Run-time error '5';
Invalid procedure call or argument

ved navnefunktionen.

/dsjk
07. juli 2004 - 12:48 #11
Kører du den fra en forespørgsel? Hvordan ser SQL'en ud?
Avatar billede dsjk Novice
07. juli 2004 - 12:51 #12
ja den kører fra en forspørgsel.

UPDATE KLS0001A SET Fornavn1 = FindFornavn(Fornavn), Efternavn1 = FindEfternavn(Fornavn);

Der er dog den hale ved lige denne test opgave at der står fornavn og efternavn allerede adskilt, men da der jo er nogle med flere fornavne bruger jeg det felt som navn felt.

/dsjk
Avatar billede dsjk Novice
07. juli 2004 - 12:53 #13
er det fordi at nogle fornavn fleter er blanke?
07. juli 2004 - 12:58 #14
hmm, jeg har lige prøvet selv....det virker fint selvom der er blanke...

Prøv at gå i debug-vinuet (ctrl+G) og skriv:

?FindFornavn("Ole Olsen")  [Efterfulgt af ENTER]

Virker det?
Avatar billede dsjk Novice
07. juli 2004 - 13:08 #15
ja, er det virker.
Er det så fordi der kun står et navn?

/dsjk
07. juli 2004 - 13:17 #16
ja, du har ret.

prøv at udskifte FinFornavn-funktionen med denne:

Public Function FindFornavn(navn As String) As String
    If InStr(1, navn, " ") = 0 Then
        FindFornavn = ""
    Else
        FindFornavn = Left(navn, Len(navn) - Len(FindEfternavn(navn)) - 1)
    End If
End Function
Avatar billede Jørgen Kirkegaard Professor
08. juli 2004 - 19:23 #17
Adresse funktionen er ikke veldefineret, og før den er det, kan den selvfølgelig ikke programmeres.
Avatar billede dsjk Novice
09. juli 2004 - 08:35 #18
Hle problematikken i adressefeltet ligger i at de adresser som er taste ind, er tastet ind gennem flere år, dvs. at der er flere personer der har tastet det ind, og de har hver deres måde at taste det ind på. Man kan derfor ikke få alle sammen det op, det ved jeg godt, men kan man komme til 80-90% vil det være fint i første omgang.

Men, det er en generel tråd gennem de fleste adresser, som jeg lige skal finde helt præcis, når den er fundet vil jeg lige skrive den her.

/dsjk
Avatar billede Jørgen Kirkegaard Professor
24. september 2004 - 02:52 #19
Hvis du bare skal klare "de fleste", så kan du bruge thomasjepsens metode -og så må du lige give ham nogle points...se evt. også http://www.eksperten.dk/spm/542116 som lige fik listet mig tilbage til denne.
Avatar billede dsjk Novice
24. september 2004 - 17:07 #20
lukker spørgsmålet.

Har fået det programmeret i dataflex, mere eller mindre, der er selvfølgelig nogle adresser som ikke kan fanges men det vil der altid være.

Deler pointene ud da løsningen sikkert kan bruges, og jeg vil sikkert kigge mere på den når jeg skal lave funktionen i access, men "nøjes" med dataflex.

/dsjk
24. september 2004 - 21:06 #21
Takker, selvom jeg er ked af, at du ikke fik løst problemet helt!
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