Avatar billede lyngedrengen Nybegynder
07. september 2002 - 11:25 Der er 17 kommentarer og
2 løsninger

Masser af tabeller og joins...kan det gøres smartere?

Hejsa!

Jeg sidder og er ved at lave en adresseliste for diverse udvalg m.m.

1 person kan være medlem af flere udvalg og udvalgene kan skifte struktur. Samtidig skal der være en del søge og redigeringsmuligheder, så DB'en skal være rimelig fleksibel.

Jeg har indtil videre lavet følgende tabeller med felter i parantes:

Personer, (Id, fornavn, efternavn...)
Indeholder navne og adresser på personer

Funktion, (Id, Titel)
Indeholder titler. Eksempelvis Direktør, økonomiansvarlig, næstformand etc.

Udvalg, (Id,udvalg)
Indeholder navnene på udvalgene, ex. hovedbestyrelse, ungdomsafdeling etc.

listen, (udvalg, funktion1, navn1, funktion2, navn2...)
Her har jeg så forsøgt at samle det hele forstået på den måde, at jeg ved hjælp af ID'erne i de andre tabeller får bygget adresselisten op. Først hvilket udvalg, så hvilken funktion og hvem der har den funktion.

Jeg har lavet relationer mellem de enkelte felter i "listen" og så over til Id-feltet i de andre tabeller.

Jeg har blot lidt svært ved at få lavet de rigtige SQL'er.

Måske er DB'en ikke bygget optimalt op og så hører jeg meget gerne alternativer

Jeg har lavet følgende SQL:
sql3 = "SELECT * FROM listen INNER JOIN funktion ON listen.funktion1 = funktion.id WHERE udvalg="&udvalgid

hvor udvalgid er en variabel, der bliver valgt i en FORM.

Men skal hvordan får jeg joinet navnene i samme SQL og skal der laves en join for hver funktion (funktion1, funktion2, funktion3 etc) samt for hvert navn (navn1, navn2 etc.) for at kunne liste et udvalg med titel og navne?

Håber der er nogen hajer, der kan hjælpe - på forhånd tak!

Mvh
Jan
Avatar billede neteffect Nybegynder
07. september 2002 - 11:48 #1
Tabellen "listen" virker overflødig.

Gå ind i din Acess-database og lav en query, der trækker "listen" ud.

Skift til SQL-view, og værsgo' dér har du din query i SQL!
Avatar billede misbruger Nybegynder
07. september 2002 - 11:48 #2
listen skal laves om til....
id, udvalg, funktion, person
hvor....
listen.Id (Int, index, unique, autoincrement)
listen.udvalg (Int, Not null) relation til udvalg.Id
listen.funktion (Int, Not null) relation til funktion.Id
listen.person (Int, Not null) relation til person.Id

Så vil din query se sådan ud......
SQL3 = "SELECT * FROM listen, udvalg, funktion, personer WHERE listen.person = person.Id AND listen.funktion = funktion.Id AND listen.udvalg = '"& udvalgid &"'"

Den vælger så alle personer i det angivede udvalg, og viser deres personlige oplysninger og funktioner...
Avatar billede misbruger Nybegynder
07. september 2002 - 11:53 #3
tabellen 'listen' er aldeles ikke overflødig...!
hvad hvis en person har flere funktioner i forskellige udvalg. Så skal personen oprettes flere gange i 'personer'......!

Selvfølgelig skal han bruge 'listen'

Det er en ganske fornuftig opsætning, men i tabellen 'listen' skal der ikke være mulighed for flere funktioner (funktion1, navn1, funktion2, navn2) pr post, men derimod mange poster på en funktioner, personer og udvalg, men så kan en person bare have flere poster, hvis han har en eller flere funktioner i et eller samme udvalg.....!
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 11:57 #4
Jeg tester på livet løs! Foreløbig tak for svaret, misbruger (hmm skal man ligge noget i navnet? ;-))

Du svarede på hvorvidt listen er overflødig, så det vil jeg ikke føje mere til.

Jeg vender tilbage ASAP
Avatar billede neteffect Nybegynder
07. september 2002 - 11:57 #5
Sorry, jeg overforenklede...

Du får brug for en tabel, som beskriver relationen mellem person og udvalg.

Tabellen kunne fx hedde "udvalgsdeltagere" med følgende indhold:

deltagerID, personId, udvalgsId, TitelId

deltagerId er ikke strengt nødvendig.
Avatar billede neteffect Nybegynder
07. september 2002 - 12:01 #6
misbruger> Klart, jeg tænkte mig ikke ordentligt om i første omgang. Jeg tror vi mener det samme.
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 12:03 #7
Misbruger: Kravene du har opstillet til de enkelte felter (listen.id, listen.person etc) synes jeg ikke helt jeg kan finde. Jeg benytter Access 2000 :-S.....
Avatar billede neteffect Nybegynder
07. september 2002 - 12:30 #8
id: autonumber
udvalg, funktion, person: number (long integer)
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 12:33 #9
Takker - det var også hvad jeg satte dem til :-)

Hej igen! Jeg får følgende fejlmeddelse:
----
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
----

Jeg har ikke kunne finde alle de krav du (misbruger) opstiller til variablene (så godt er jeg desværre heller ikke inde i Access)

Mht. relationerne skal der så være "Enforce referential integrity"? Hvis ja, så får jeg problem med, at felterne der relateres mellem ikke er samme datatype.

Any suggestions?
Avatar billede neteffect Nybegynder
07. september 2002 - 12:41 #10
Prøv at lave det offline i Access først. Undgå "Enforce referential integrity". Du kan fortælle query-builderen om relationerne ved at trække forbindelser mellem felterne, når bygger din query.
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 12:57 #11
-> Neteffect. Jeg får en "Datatypen stemmer ikke overens i kriterieudtrykket. Jeg synes alle de involverede felter er "Long integer"....hvad gør jeg galt?
Avatar billede neteffect Nybegynder
07. september 2002 - 13:04 #12
Skidtet plejer jo at have ret. Er du i Access eller pusler du direkte med SQL?
Hvis SQL, hvordan ser queryen ud?
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 13:12 #13
Jeg pusler direkte med SQL. Queryen er den "misbrug" præsenterede lidt længere oppe:

SQL3 = "SELECT * FROM listen, udvalg, funktion, personer WHERE listen.person = personer.Id AND listen.funktion = funktion.Id AND listen.udvalg = '"& udvalgid &"'"

Ja, irriterende, at det for det meste (læs:altid) er gutten der sidder 40 cm fra skærmen, der må erkende fejlen ;-)
Avatar billede neteffect Nybegynder
07. september 2002 - 13:21 #14
SQL3 = "SELECT * FROM listen, udvalg, funktion, personer WHERE listen.person = personer.Id AND listen.funktion = funktion.Id AND listen.udvalg = " & udvalgid

Der skal ikke ' om udvalgid

Jeg tror vi er på vej hen imod:

SQL4 = "SELECT personer.fornavn, personer.efternavn, funktion.titel, udvalg.udvalg FROM (((listen INNER JOIN personer ON listen.person=person.id) INNER JOIN udvalg ON udvalg.id=listen.udvalg) INNER JOIN funktion ON funktion.id=listen.funktion)"

Men som tidligere nævnt, lav det først i Access og snup SQL'en derfra.
Avatar billede neteffect Nybegynder
07. september 2002 - 13:22 #15
... jeg skal lige ned i byen en times tid.
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 13:24 #16
Selvfølgelig - jeg er glad for al den hjælp jeg kan få! :-)
Avatar billede lyngedrengen Nybegynder
07. september 2002 - 14:57 #17
Hej begge!

Jeg har fordelt pointene imellem jer og håber I begge er tilfredse.

Det hele virker nu, men jeg er ret sikker på, at der kan komme spørgsmål i forbindelse med sql'er i forbindelse med udvælgelse af data, men den tid den sorg ;-)

Under alle omstændigheder - mange tak for hjælpen!!!

(og så vil jeg sgu se landskamp!)
Avatar billede neteffect Nybegynder
07. september 2002 - 15:23 #18
Tak for points.
Avatar billede misbruger Nybegynder
07. september 2002 - 16:39 #19
Takker!
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