dsjk
(14.493 point. Point ude: 0)
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
Skrevet ons. d. 07. juli 2004 kl. 11:39:32| #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...
Skrevet ons. d. 07. juli 2004 kl. 11:47:28| #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.?
Skrevet ons. d. 07. juli 2004 kl. 11:47:38| #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
Skrevet ons. d. 07. juli 2004 kl. 11:50:07| #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)
Skrevet ons. d. 07. juli 2004 kl. 11:51:16| #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."
Skrevet ons. d. 07. juli 2004 kl. 11:52:58| #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
Skrevet ons. d. 07. juli 2004 kl. 11:54:38| #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?
Skrevet ons. d. 07. juli 2004 kl. 12:34:27| #8
NOPE, jeg er overbevist om at det (desværre) ikke kan lade sig gøre...
Skrevet ons. d. 07. juli 2004 kl. 12:36:27| #9
ja, sålænge der ikke er helt præcise retningslinier, så tror jeg heller ikke at det er muligt.
Skrevet ons. d. 07. juli 2004 kl. 12:38:41| #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
Skrevet ons. d. 07. juli 2004 kl. 12:48:21| #11
Kører du den fra en forespørgsel? Hvordan ser SQL'en ud?
Skrevet ons. d. 07. juli 2004 kl. 12:51:05| #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
Skrevet ons. d. 07. juli 2004 kl. 12:53:34| #13
er det fordi at nogle fornavn fleter er blanke?
Skrevet ons. d. 07. juli 2004 kl. 12:58:37| #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?
Skrevet ons. d. 07. juli 2004 kl. 13:08:35| #15
ja, er det virker.
Er det så fordi der kun står et navn?
/dsjk
Skrevet ons. d. 07. juli 2004 kl. 13:17:14| #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
Skrevet tor. d. 08. juli 2004 kl. 19:23:23| #17
Adresse funktionen er ikke veldefineret, og før den er det, kan den selvfølgelig ikke programmeres.
Skrevet fre. d. 09. juli 2004 kl. 08:35:29| #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
Skrevet fre. d. 24. september 2004 kl. 02:52:09| #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/ (...) som lige fik listet mig tilbage til denne.
Skrevet fre. d. 24. september 2004 kl. 17:07:55| #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
Skrevet fre. d. 24. september 2004 kl. 21:06:10| #21
Takker, selvom jeg er ked af, at du ikke fik løst problemet helt!