Avatar billede frederikschack Nybegynder
13. august 2010 - 12:40 Der er 8 kommentarer og
1 løsning

Afhængige drop-down-lister.

Hej,

Når man har en SQL-forespørgsel, der leverer indholdet til en drop-down liste i en formular, er det så muligt at gøre denne SQL-forespørgsel afhængig af hvad der er valgt i en anden drop-down liste?

Tabellen jeg arbejder i hedder Generaleftersyn og det hedder formularen også. Der er en række drop-down-lister, som trækker data fra andre tabeller. Der er f.eks. et felt der hedder Generaleftersyn.FloejMateriale og et der hedder Generaleftersyn.FloejSkadetype.

Feltet Generaleftersyn.FloejSkadetype henter valgmulighederne med følgende forespørgsel:

SELECT SkadetypeVurdering.Skadetype, Skadetyper.Skadetype
FROM Generaleftersyn INNER JOIN (Skadetyper INNER JOIN SkadetypeVurdering ON Skadetyper.SkadetypeId = SkadetypeVurdering.Skadetype) ON Generaleftersyn.FloejMateriale = SkadetypeVurdering.Materiale
GROUP BY SkadetypeVurdering.Skadetype, Skadetyper.Skadetype;

Mit mål er at jeg gerne vil have forespørgslen til at udvælge skadetypen, på grundlag af fløjmaterialet (Generaleftersyn.FloejMateriale) fra den pågældende post, som er åbnet i formularen. I praksis henter denne forespørgsel dog alle skadetyper, der er tilknyttet der er tilknyttet et generaleftersyn.

Er det ikke på en eller anden måde muligt at fortælle forespørgslen at den skal tage udgangspunkt i det pågældende generaleftersyn?
Avatar billede frederikschack Nybegynder
13. august 2010 - 12:46 #1
Vel at mærke uden at skulle have SQL'en ind i koden.
13. august 2010 - 20:01 #2
Det kan sikkert lade sig goere, men jeg skal lige vaere sikker paa at jeg forstaar dig rigtigt. 

Jeg forstaar at du har tre tabeller, Generaleftersyn, SkadetypeVurdering, og Skadetype.  Feltet Generaleftersyn.FloejSkadetype bruger du ikke i dit eksempel, saa det lader jeg ligge.  Til gengaeld antager jeg at du har et felt GeneraleftersynId i Generaleftersyn.  Generaleftersyn-tabellen lister du de relevante materialer.  I Skadetyper har du saa SkadetypeId og Skadetype.  Skadetype-tabellen lister de relevante skadetyper.  Der er en saakaldt mange-til-mange relation mellem materialer og skadetyper idet hvert materiale kan have forskellige skadetyper og hver skadetype kan forekomme paa forskellig materialer.  De relevante kombinationer af materialer og skadetyper har du saa i tabellen SkadetypeVurdering med tre felter, (1) id for kombinationen, (2) Skadetype der henviser til (har fremmednoegle med) skadetypeid i tabellen Skadetyper, og (3) Materiale der henviser til (har fremmednoegle med) GeneraleftersynId.

Du vil saa have en formular med en dropdown liste med alle floejmaterialerne i Generaleftersyn.  Naar brugeren vaelger et materiale fremkommer der en ny formular med en dropdownliste der lister de skadetyper der er relevant for det valgte materiale.

Det ville jeg kunne foreslaa en loesning paa hvis jeg maa bruge VBA kode.  Ellers ved jeg ikke om det kan laves.

Inden jeg gaar i gang spoerger jeg om jeg har forstaaet problemet og den soegte loesning rigtigt, og jeg spoerger om du vil have en loesning der goer brug af VBA.
15. august 2010 - 12:50 #3
frederikshack, fik du mit indlaeg?  Jeg ville vaere glad for at modtage din reaktion.
Avatar billede frederikschack Nybegynder
17. august 2010 - 10:28 #4
Hej Christian,

Jeg beklager det sene svar, men jeg har haft meget travlt og har været til møder. Jeg vil ændre min konto, så det bliver min arbejds e-mail at beskeder herfra bliver sendt til.

Jeg vil godt kunne lave en løsning med VBA, men tænkte at jeg var så tæt på at kunne lave det uden VBA. Det eneste der mangler, det er at forespørgslen kunne tage udgangspunkt i det generaleftersyn man arbejder med i formularen.

En lidt kluntet løsning ville være at lave en smule VBA der gemmer værdierne for den igangværende formular i en anden tabel og at man så bruger denne tabel i forespørgslen? Findes der en mere elegant løsning?

Tabelstrukturen:
http://6k.dk/eksperten/Generaleftersyn.bmp

Brugerens skærmbillede:
http://6k.dk/eksperten/Generaleftersyn2.bmp

Forespørgslen bag feltet Skadetype:
http://6k.dk/eksperten/Generaleftersyn3.bmp
Avatar billede frederikschack Nybegynder
17. august 2010 - 11:12 #5
Der er faktisk kun 1 til mange relationer i databasen.

Materialer er lidt speciel, fordi man krydser af om materialet skal forekomme i drop-down listen. Så man f.eks. ved materialet stål krydser af (boolean) at det skal forekomme i "Floeje". Derfor de mange ekstra felter. Det er en løsning jeg har valgt, fordi at det er de samme materialer der går igen i mange felter i Generaleftersynet og jeg gerne vil bruge den samme tabel, men begrænse valgmulighederne alt efter hvilket felt det drejer sig om.

M.v.h.
Frederik
17. august 2010 - 12:34 #6
Jamen det muligvis mig der ikke forstod spoergsmaalet.  Lad os se om tioeren nu er faldet:

Et generaleftersyn opstaar i virkelighedens verden ved at en sagkyndig (eller team) efterser en bestemt bro paa et bestemt tidspunk (eller i et bestemt tidsrum.)  Generaleftersynet opstaar i databasen naar dataerne for det fysiske generaleftersynet registreres i databasen.  Den formular du viser bruges til at registrere dataerne for eftersynet.  Den foerste dropdownliste viser alle de materialer der er i databasen.  For nummer to dropdownliste traekker din query alle skadetyper ud for materialer der bestaar i et eller andet generaleftersyn.  Det er mere end du har brug for.  Men hvad vil du have i stedet? 

Vil du have at naar man i den foerste dropdownliste har valgt et materiale saa befolkes skadetype dropdownlisten med de skadetyper der eksisterer for dette materiale?  I saa fald maa queryen blive noget i retning af:

SELECT SkadetypeVurdering.Skadetype, Skadetyper.Skadetype
FROM Skadetyper INNER JOIN SkadetypeVurdering ON Skadetyper.SkadetypeId = SkadetypeVurdering.Skadetype
WHERE SkadetypeVurdering.materiale = [det valgte materiale]

Det rejser saa to nye problemer: 

(1)  Vi skal skaffe en reference til det valgte material, den "itemdata" du vaelger I dropdownlisten.
(2) Formularen skal "refreshes" efter at du har valgt material.  Naar formularen forest loades kender systemet jo endnu ikke materialevalget.
(3) (jeg kan ikke taelle) Det kan laves ved hjaelp af VBA, men jeg kender ingen maade at lave det uden VBA.  Maaske andre medlemmer af Eksperten har forslag?

Eller vil du have noget andet I stedet?  Saa forklar.  Du sagde "....fortælle forespørgslen at den skal tage udgangspunkt i det pågældende generaleftersyn..." men det generaleftersyn bestaar vel ikke endnu men er foerst ved at blive lavet?
Avatar billede frederikschack Nybegynder
17. august 2010 - 12:46 #7
Hej Christian,

Min forklaring var måske heller ikke helt dækkende.

Du har ret i at generaleftersynet ikke eksisterer, så det kan man ikke. Kan man på en eller anden måde lave en reference til den formular man arbejder med?

En mulighed er at gemme de nuværende felters referencer i en tabel til formålet og så bruge denne tabel i forespørgslen. Her er jeg dog stødt ind i et lille teknisk problem, som jeg nok skal oprette et andet spørgsmål om.

Det er ikke noget problem at der bliver lavet lidt VBA, men jeg vil helst undgå at have SQL'en ind i koden og dermed skulle lave alt forespørgslens arbejde i koden.

Nedenstående fungerer fint til at refreshe en kontrol:
DoCmd.RunCommand acCmdSaveRecord
control.Requery
Avatar billede frederikschack Nybegynder
17. august 2010 - 15:00 #8
Hej Christian,

Det med at oprette en tabel til at gemme opslagsværdierne i fungerer og du hjalp mig til at komme ind i den rette tankebane, så smid et svar :) også for din tålmodighed med mig :o)

M.v.h.
Frederik
17. august 2010 - 16:10 #9
Svar fra mig.
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





White paper
Optimering af Source-to-Pay: Identificér oplagte gevinster og skær omkostninger