26. januar 2012 - 17:24Der er
12 kommentarer og 1 løsning
DoCmd.Openform - where clause
En form har en underliggende forespørgsel, så jeg kun får vist afdelingens id, adresse og postnummer, efter brugeren har indtastet 'kortnavn', der er et felt i tabel m.
Forespørgsel: select distinct a.id, a.adresse, a.postnr from medarbejder m right join afdeling a on m.afd_id = a.id order by 3,2
Brugerindtastning: 'Jensen' indtastes i variablen 'var'
Når jeg åbner formularen med: DoCmd.Openform formnavn, AcNormal, ,"m.kortnavn='" & var & "'", acFormReadOnly, adWindowNormal
prompter Access for feltet 'm.kortnavn'..??
Jeg kan uden problemer i selve forespørgslen skrive: WHERE m.kortnavn = 'Jensen'.
Hvis jeg i select'en ovenfor tilføjer feltet 'm.kortnavn' virker DoCmd.Openform, men jeg ønsker kun at få de tre viste felter med.
Din formular kender jo kun de felter, der er i den underliggende forespørgsel, altså id, adresse og postnummer. Så kan du ikke filtrere på kortnavn. Som mugs skriver: Medtag kortnavn og gør feltet usynligt (eller skjul kolonnen, hvis formularen er i dataark format).
Ja, det er helt korrekt, at forespørgslen så indeholder alle poster; men så kobler du jo filteret på i kaldet: DoCmd.Openform formnavn, AcNormal, ,"m.kortnavn='" & var & "'", ... så du i formularen kun ser den aktuelle medarbejder (og her kan du skjule kortnavnet)
Jeg forstår ikke hvorfor Access ikke blot indsætter WHERE-sætningen i den SELECT-sætning, som formularen kalder, og jeg derfor IKKE behøver at tage feltet m.kortnavn med, som jeg naturligvis skal, hvis jeg bruger et filter.
Der er altså IKKE forskel på om jeg sætter et filter eller en WHERE sætning ind i DoCmd.Openform??
Hvis nu min afdelingstabel indeholder 100.000 poster, burde det da være den oprindelige sql-sætning MED WHERE-sætningen, der bliver sendt til databasen, så jeg kun får få poster ud som resultat, i stedet for dem alle 100.000, som så efterfølgende skal filtreres..
Pointen er jo, at du "udvider" forespørgselskriterierne med din WHERE sætning, altså (for at bruge dit eksempel): Giv mig alle 100.000 poster; men KUN dem, hvor m.kortnavn = 'Jensen' - og det er jo ikke alle 100.000 poster.
Forespørgslen - i dens oprindelige form - udføres jo aldrig, med mindre du åbner formularen direkte. Så vil du helt korrekt se alle 100.000 poster.
Når du udformer din forespørgsel, kan Access "se" hele tabellen (FROM Medarbejder) og dermed går det godt med en WHERE på et felt, der ikke specifikt er nævnt i SELECT. Sagt på en anden måde: Du ville kunne selecte feltet Kortnavn, hvis du havde lyst.
Når du derimod kører op mod din forespørgsel, kan Access kun se de felter, som forespørgslen består af. Du ville her ikke kunne selecte feltet Kortnavn. Du har altså en "amputeret" tabel uden feltet Kortnavn, som du derfor ikke kan måle på, når du åbner din Form.
... og "uhensigtsmæssigt" eller ej. Du er nødt til at inkludere alle felter, som du senere vil bruge. Hvis du synes, det er besværligt at specificere de enkelte felter, kan du jo bare bruge m.*, så har du alle felter til rådighed i ét hug.
Nu er det bare sådan, at jeg kun vil have vist en afdeling én gang i udtrækket, så hvis jeg nu i stedet for
WHERE m.kortnavn = 'a'
ønsker kriteriet udvidet med m.gruppe = 1, altså
WHERE m.kortnavn = 'a' OR m.gruppe = 1
og værdifeltet for gruppe i tabellen medarbejder indeholder den arbejdsgruppe, som medarbejderen er tilknyttet, da vil jeg ikke kunne lave en SELECT distinct og kun få afdelingen ud én gang, hvis der f.eks. er 10 medarbejdere tilknyttet arbejdsgruppe 1, da jeg i så fald skulle medtage BÅDE m.kortnavn og m.gruppe i SELECT'en?
Min fornemmelse er at vi er på vej ud i en lidt akademisk diskussion. Jeg glæder mig over at du skriver, at du er med på hvordan tingene hænger sammen og jeg er overvist om at du kan løse din opgave inden for Access' rammer. Om det så er "uhensigtsmæssigt", som du skriver. Tjah.
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.