Avatar billede jvase Nybegynder
26. januar 2012 - 17:24 Der 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.

Hvad gør jeg forkert?
Avatar billede mugs Novice
26. januar 2012 - 17:38 #1
Sæt egenskaben synlig til nej for de felter du ikke vil se.
Avatar billede terry Ekspert
26. januar 2012 - 18:51 #2
is the field named m.kortnavn or kortnavn?
Avatar billede fdata Forsker
26. januar 2012 - 22:11 #3
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).
Avatar billede jvase Nybegynder
27. januar 2012 - 11:58 #4
Tak for svarene.

Problemet er jo, at når feltet kortnavn medtages:

select distinct a.id, a.adresse, a.postnr, m.kortnavn
from medarbejder m right join afdeling a on m.afd_id = a.id
order by 3,2

og der er 2 medarbejdere oprettet på samme afdeling, så kommer der jo 3 poster ud:

id, adresse, postnr,kortnavn
post 1: 1,gade1,postnr1
post 2: 1,gade1,postnr1,kortnavn1
post 3: 1,gade1,postnr1,kortnavn2

hvor jeg kun vil have én post nemlig post 1.

Hvorfor kan man ikke indsætte en where-sætning? Så er where-sætningen jo et filter!?
Avatar billede fdata Forsker
27. januar 2012 - 14:38 #5
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)
Avatar billede jvase Nybegynder
27. januar 2012 - 14:59 #6
Vi er enige om, at forespørgslen har følgende select:

select distinct a.id, a.adresse, a.postnr, m.kortnavn
from medarbejder m right join afdeling a on m.afd_id = a.id
order by 3,2

Hvis jeg vil lave et filter, åbner jeg formularen med:

DoCmd.Openform formnavn,AcNormal,FILTER,,...

og så skal m.kortnavn naturligvis med i select-linien.

MEN hvis jeg i stedet for filter, ønsker at lave forespørgslen med en where-sætning, skriver jeg:

DoCmd.Openform formnavn,AcNormal,,WHERE,...

så der nu IKKE er et filter sat ind, men en WHERE-sætning, som betyder, at m.kortnavn kan udelades i forespørgslen, der derefter ser således ud:

select distinct a.id, a.adresse, a.postnr
from medarbejder m right join afdeling a on m.afd_id = a.id
order by 3,

Mit tillægsspørgsmål er: Hvad er forskellen på at indsætte et filter og en WHERE-sætning?
Avatar billede fdata Forsker
27. januar 2012 - 16:16 #7
Ja, undskyld jeg brugte ordet filter. Du benyttede jo en WHERE sætning. Den skal jo bare se ud som i dit oprindelige spørgsmål.

Forskellen - tjah - tjek hjælpeteksten:

  FilterName: A string expression that's the valid name of a query.

  WhereCondition: A string expression that's a valid SQL WHERE clause.

Så det er jo lidt en smagssag, hvad man vælger. De fleste bruger nok en WHERE, fordi den er let at læse/vedligeholde.
Avatar billede jvase Nybegynder
27. januar 2012 - 18:06 #8
Ok.

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..
Avatar billede fdata Forsker
28. januar 2012 - 01:04 #9
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.
Avatar billede jvase Nybegynder
30. januar 2012 - 09:05 #10
Det er jeg enig med dig i, men WHERE sætningen i en DoCmd.Openform kræver som nævnt ovenfor, at det felt jeg vil 'filtrere' på er med i SELECT'en.

Det er ikke tilfældet, hvis jeg sætter WHERE sætningen direkte ind i SQL'en i forespørgslen:

select distinct a.id, a.adresse, a.postnr
from medarbejder m right join afdeling a on m.afd_id = a.id
where m.kortnavn = 'a'
order by 3,2;

så hvis WHERE sætningen nu f.eks. består af flere betingelser, er det uhensigtsmæssigt at skulle anføre alle disse felter i SELECT'en.
Avatar billede fdata Forsker
30. januar 2012 - 11:27 #11
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.
Avatar billede jvase Nybegynder
30. januar 2012 - 14:55 #12
Den er jeg med på :-).

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?
Avatar billede fdata Forsker
30. januar 2012 - 19:13 #13
Jeg bliver nødt til at trække håndbremsen nu.

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.
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