Avatar billede blolsen Juniormester
07. maj 2013 - 18:30 Der er 5 kommentarer og
1 løsning

kobling af 2 tabeller i Access 2010, hvor "nøglen" i den ene tabel er en del af en tekststreng i den anden tabel - dvs. de joinforbundne felter er ikke ens.

Jeg har 2 tabeller, som jeg gerne vil have koblet sammen i Access.

den første tabel ser sådan ud:

bruger    kunde konti
Karl    0001,0002,0003,0004
Kurt     0005,0006,0007
Jens    0008,0009,0010


Den anden tabel lister forskellige attributer til den enkelte kundekonto, dvs:

kundekonti    konto navn    aktiv
0001    afdeling A    Ja
0002    afdeling B    Ja
0003    afdeling C    Ja
0004    afdeling D    Ja
0005    afdeling E    nej
0006    afdeling F    Ja
0007    afdeling G    Ja
0008    afdeling H    nej
0009    afdeling I    Ja
0010    afdeling J    Ja


Problemt er at kontiene tilknyttet den enkelte bruger ligger i et felt adskildt af komma, så jeg kan ikke koble tabellerne på normalvis via en forespørgsel, da jeg ikke har en entyddig nøgle.

Kan der eksempelvis generes et udtyk via udtryksgeneratoren, som går ind og søger på kundekontiene på den enkelte bruger og som kan lave en returning af forskellige attributer på de enkelte kundekonti tilhørende den enkelte bruger fra tabel 2?

et resultat kunne se ud som følger


Bruger    kundekonti    konto navn    aktiv
Karl    0001    afdeling A    Ja
Karl    0002    afdeling B    Ja
Karl    0003    afdeling C    Ja
Karl    0004    afdeling D    Ja
Kurt    0005    afdeling E    nej
Kurt    0006    afdeling F    Ja
Kurt    0007    afdeling G    Ja
Jens    0008    afdeling H    nej
Jens    0009    afdeling I    Ja
Jens    0010    afdeling J    Ja
Avatar billede fdata Forsker
07. maj 2013 - 19:15 #1
Din databasestruktur vil kun give problemer. Du bør normalisere basen, så den første tabel indeholder:

bruger    kunde konto
Karl    0001
Karl    0002
Karl    0003
Karl    0004
Kurt    0005
Kurt    0006
Kurt    0007
Jens    0008
Jens    0009
Jens    0010

Hvis du absolut har brug for at se kontiene som f.eks. "0001,0002,0003,0004", kan du altid sætte kontonumrene sammen igen via en lille funktion.
Avatar billede blolsen Juniormester
07. maj 2013 - 19:45 #2
Hej fdata,

Det har jeg også overvejet, men hvordan får jeg flyttet de kommaadskildte værdier flyttet til til rækkeniveau? er det muligt at gøre via en funktion? Datamængden er på ca. 1550 brugere, som hver har adgang til mellem 1 og 60 kundekonti, så det er ikke muligt at gøre det manuelt

Kunne jeg bare transformere værdierne i kundekonti kolonnen til seperate rækker er mit problem sådan set løst, da jeg så kan sammenflette kundekontiattributerne med brugerne via en ny forespørgsel.
Avatar billede fdata Forsker
07. maj 2013 - 20:36 #3
Jamen, det kan da forholdsvis let lade sig gøre.

Forudsætninger:
Tabel1 indeholder dine data i felterne Bruger og Konti
Tabel2 oprettes med to felter: Bruger og Konto (begge tekst)

Kode:
Sub OpsplitPoster()
  Dim Rst As Recordset
  Dim p As Integer
  Dim Konti As String
  Dim k As String
 
  Set Rst = CurrentDb.OpenRecordset("Tabel1", dbOpenSnapshot)
  With Rst
    Do
      Konti = !Konti
      p = InStr(1, Konti, ",")
      While p > 0
        k = Left(Konti, p - 1)
        Call OpretPost(!Bruger, k)
        Konti = Mid(Konti, p + 1)
        p = InStr(1, Konti, ",")
      Wend
      Call OpretPost(!Bruger, Konti)
      .MoveNext
    Loop Until .EOF
    .Close
  End With
  Set Rst = Nothing
End Sub

Sub OpretPost(Bruger As String, Konto As String)
  DoCmd.SetWarnings False
  DoCmd.RunSQL "INSERT INTO Tabel2(Bruger,Konto)" & _
              " SELECT '" & Bruger & "','" & Konto & "'"
  DoCmd.SetWarnings True
End Sub

Hvis du opretter Konto-feltet i Tabel2 som et tal-felt, skal OpretPost rutinen oprettes som:

Sub OpretPost(Bruger As String, Konto As Long)
  DoCmd.SetWarnings False
  DoCmd.RunSQL "INSERT INTO Tabel2(Bruger,Konto)" & _
              " SELECT '" & Bruger & "'," & Konto
  DoCmd.SetWarnings True
End Sub
Avatar billede blolsen Juniormester
07. maj 2013 - 21:45 #4
det ser lige til ud:-) - et spørgsmål mere til en novice - hvor skal koden indsættes - er det via visual basic?
Avatar billede fdata Forsker
07. maj 2013 - 22:33 #5
OK. Fremgangsmåden:

1. Opret Tabel2 (eller hvad du nu vælger at kalde den)
2. Indsæt koden i et vilkårligt modul (evt. Alt-F11, Insert/Module)
3. Ret tabel- og feltnavne, så de passer med din virkelighed.
4. Placer markøren i rutinen OpsplitPoster og tryk F5 (Kør)

PS:
Nu er det jo ikke point, men gode løsninger, der driver eksperten; men det kunne måske undre nogen, at du i samme hug vælger at stille yderligere spørgsmål OG samtidig nappe pointene selv.
OBS: Du skal ikke lave det om! Pointene er som sagt kun for sjov.
Avatar billede blolsen Juniormester
07. maj 2013 - 22:59 #6
Hov det må du undskylde - det var meningen at du skulle have pointene :-( jeg troede at jeg kunne skrive et sidste spørgsmål samtidig med at du fik dem. Det beklager jeg. Er der en anden måde du kan få dem på så må du sige til. Men tusind tak for hjælpen
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