07. september 2010 - 09:13Der er
6 kommentarer og 1 løsning
Problemer med foreign key
Hej,
Sidder med et stort problem. Jeg har en database hvor i jeg har nogle tabeller som gerne skulle have et One-To-Many relationship hvor jeg har en PK i min "main" tabel og så har jeg min ekstra tabel hvor jeg har en anden PK, og så har jeg det som skulle være en FK.
I følge Tools->Relationships så er der en forbindelse mellem mine to tabeller og der er et 1 tal ved min main tabel og et infinity tegn ved den anden tabel. I mit relationship er der sat flueben ved "Enforce Referential Integrity".
Umiddelbart vil jeg mene at mit relationship er i orden, men når jeg indsætter data i tabellen (via Visual Basic kode), så bliver der ikke automatisk indsat en FK, som jeg gerne vil have det..
Er der nogen som har erfaring med at skrive et stykke Visual Basic kode som automatisk indsætter PK i min hjælpe tabel når der bliver indsat noget i ens main tabel? Sådan fungere det jo normalt synes jeg.
Så vidt jeg forstår så opretter du en record i hovedtabellen, og ønsker FK i undertabellen når du opretter record(s) dér. Er det forstået korrekt?
Systemet kan - i VBA - ikke af sig selv gætte, hvilken specifik record i hovedtabellen du ønsker at pege på fra den nye record i undertabellen (og omvendt).Jeg ville tage PK fra hovedtabellen efter at den vedkommende record er oprettet (hovedtabel.PK) og indsætte den i dataene for den nye record i undertabellen (undertabel.FK=hovedtabel.PK)
Aha, se det troede jeg at VBA selve kunne finde ud af. Fungere det ikke sådan "normalt" ?
Min nuværende VBA kode:
Set db = CurrentDb()
Set myRS = db.OpenRecordset("Tabel1")
myRS.AddNew myRS!fileLink = fileLink.Value
myRS.Update myRS.Close
Det er sådan i hovedtræk hvordan jeg sætter data ind i "main" tabellen kaldet Tabel1. Efterfølgende gør jeg det samme ved Tabel2. Det jeg gerne vil have er altså at når der indsættes en record i Tabel1, så bliver der automatisk indsat en record i Tabel2 med det korrekte ID. Forstår du hvad jeg mener? Det troede jeg skete pr automatik.
Det kan ikke ske per automatik, da systemet ikke kan vide på forhånd, hvilken record i myRS du ønsker at knytte til de nye i din Tabel2. Referential Integrity sikrer blot, at du ikke kan oprette en undertabelrecord uden en tilknyttet overtabelrecord, og ikke kan delete en overtabel record hvis der stadig findes undertabelrecords knyttet til den.
Prøv nedenstående (med lidt forbehold, da jeg er lidt rusten her:-) Set db = CurrentDb()
Set myRS = db.OpenRecordset("Tabel1") Set myRS2 = db.OpenRecordset("Tabel2")
Så nu fik jeg det sku' alligevel til at fungere! :)
Har kun brugt ca. hele dagen i går på at løse dette problem i og med at jeg selv troede at VBA fandt ud af det, så jeg har hele tiden troet at problemet lå i database designet :)
Men super, send lige et svar. Det skal dog lige tilføjes at før det kan fungere korrekt, så skal man benytte denne linje kode som "flytter" sig til sidste nye record:
myRS.Bookmark = myRS.LastModified
Ellers så tager den ikke den sidste nye record i databasen hvilket betyder at ens PK og FK ikke stemmer overens.
Hehe rusten eller ej, så fik vi løst problemet ;) Tak for hjælpen!
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.