Oprettet ons. d. 07. juli 2004 kl. 11:22:11

dsjk
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

proaccess
proaccess (44.908 point)
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

proaccess
proaccess (44.908 point)
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

dsjk
dsjk (14.493 point)
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

proaccess
proaccess (44.908 point)
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

dsjk
dsjk (14.493 point)
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

dsjk
dsjk (14.493 point)
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

dsjk
dsjk (14.493 point)
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

dsjk
dsjk (14.493 point)
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

staticdata
staticdata (14.984 point)
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

dsjk
dsjk (14.493 point)
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

staticdata
staticdata (14.984 point)
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

dsjk
dsjk (14.493 point)
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!

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Formular med flere paramtre

Oprettet den 9. februar 2012 kl. 16.48
stuegnu giver 100 point for svar | Giv et svar »

Kodemodul ???

Oprettet den 8. februar 2012 kl. 17.05
olejohn giver 200 point for svar | Giv et svar »

Tabeller og forespørgsler er usynlige

Oprettet den 8. februar 2012 kl. 15.33
jensch giver 60 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger