07. juli 2004 - 11:22Der 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 .
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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)
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.?
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
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)
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.
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(
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.
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
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.
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.
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.
Takker, selvom jeg er ked af, at du ikke fik løst problemet helt!
Synes godt om
Ny brugerNybegynder
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.