01. marts 2010 - 21:26 Der er 10 kommentarer og
1 løsning

Fjerne redundancy mellem hovedformular og subformular

Jeg har en tabel over personer der frekventerer et velfaerdscenter.  Der kan vaere flere personer paa en adresse, medlemmerne af en familier.  Adresse er derfor i en saerskilt tabel med adresseid, gade, postnummer, og by.  Person-tabellen indeholder en adresseid med fremmednoegle til Adresse.adresseid, og jeg benytter Access's look-up mulighed saaledes at persontabellen viser gade&' '&postnummer&' '&by.

Jeg har saa en formular "frmPerson" der for hver person viser de personlige oplysninger.  Et af felterne hedder "navn" og indeholder fornavn&' '&efternavn.  I en subformular "subPaaAdresse" vises hvilke personer der bor paa samme adresse.  Subformularen er baseret paa en query "SELECT a.adresseid, p.fornavn&' '&p.efternavn FROM adresse a INNER JOIN Person p ON a.adresseid = p.adresseid".  Subformularen er koplet til hovedformularen ved hjaelp af de to adresseid'er.  Subformularen har to tekstfelter, "adresseid" og "subnavn".

Formularen med subformular kan for eksempel se saadan ud:

Hans Jensen - 13/4/1944 - Turensesgade 13, 8000 Odense.

Hans Jensen
Hansine Jensen
Ole Jensen

Og det virker uden problemer.  (Formularen indeholder et antal andre subformularer med oplysninger baseret paa join queries til andre tabeller, og det virker ligeledes upaaklageligt.)

Men da Hans Jensen, ligesom alle andre, bor paa sin egen adresse forekommer hans navn baade i hovedformularen og i subformularen.  Denne redundancy vil jeg gerne fjerne saaledes at subformularen viser de der bor paa samme adresse som en person undtagen personen selv.

Men at goere det ligger over mit nuvaerende Access niveau.  Jeg forestiller mig at jeg skal skrive en modul.  Skal det saa vaere en modul for subformularen, for subformularens formular, eller for hovedformularen?  Det maa vaere noget med i subformularen at vaelge alle de navne for hvilke adresseid = hovedformularens adresseid undtagen det navn der staar i hovedformularens felt "navn".  Jeg soeger hjaelp fra eksperter (and from experts.)
Avatar billede mugs Novice
01. marts 2010 - 21:38 #1
Ikke afprøvet:

I den forespørgsel der ligger til grund for subfrm, må der kunne indtastes et kriterie der ikke medtager parentfrm's post i stil med dette:

Not Like [Forms]![Form1]![Felt1]
01. marts 2010 - 22:40 #2
Den fanger jeg ikke lige - queryen er "SELECT a.adresseid, p.fornavn&' '&p.efternavn FROM adresse a INNER JOIN Person p ON a.adresseid = p.adresseid" (som ovenfor citeret).  Jeg brainstormer lige, fortael mig hvis det er "rubbish" - Naar jeg koerer querien alene giver den alle adresseid'er med tilhoerende navne.  Paa det tidspunkt (naar jeg koerer querien alene) vides det ikke hvad indholdet vil vaere i en hovedform der ikke er aabnet endnu.  Saa kriteriet kan formodenlig ikke indsaettes i selve queryen.  Jeg forestiller mig saa at naar formularen aabnes, med et konkret navn og adresseid, og subformularen derved aabnes, saa fyres queryen af og subformularen modtager hele listen.  Derefter sorteres listen saa i henhold til kriteriet for kobling mellem hovedfelt og subfelt, og foerst derefter, igen min brainstorming/formodning, kan man smide den vaerdi vaek der er Like [Forms]![Form1]![Felt1].  Kan der vaere mulighed for at spille paa koblingen mellem hoved- og subformular saa koblingen ikke er paa hovedformular adresseid subformular adresseid men addresseid Not Like [Forms]![Form1]![Felt1]?
Avatar billede mugs Novice
02. marts 2010 - 08:05 #3
Når du indsætter et kriterie der refererer til en formular, er du nødt til at køre query'en fra formularen.

Jeg mener ikke, at du kan anvende Not Like... i overordnede / underordnedefelter i formularen.
Avatar billede mugs Novice
02. marts 2010 - 08:19 #4
Jeg har afprøvet mit forslag og det fungerer. SQL til underformularens forespørgsel ser således ud:

SELECT Tabel2.Gade, Tabel2.Postrnr, Tabel2.By, Tabel2.id
FROM Tabel2
WHERE (((Tabel2.id) Not Like [Forms]![FRM1]![id]));
02. marts 2010 - 17:38 #5
Det er noteret.  Saa haaber jeg paa at faa det til at virke hos mig ogsaa.  Foreloebig kokser jeg i det, saa der er nok noget jeg ikke har forstaaet forkert.  Lad mig lige forklare:

Jeg har tabellen Persoon der (blandt andet) har kolonnerne voornaam, achternaam, og adres.  Kolonnen adres indeholder en index med fremmednoegle til en saerskilt tabel Adres med adresserne.

Saa har jeg formularen frmPersoon med kilde Persoon.  Der har jeg en tekstbox "naam" med kilde =[voornaam]&' '&[achternaam].  Altsaa jeg viser i tekstboksen baade fornavnet og efternavnet.  Saa det fulde navn for tekstboksen naam maa vaere [Forms]![frmPersoon]![naam] - lyder det rigtigt?

Saa vil jeg paa frmPersoon have en subformular med navne paa de personer der bor paa samme adresse som personen.  Min oprindelige metode var denne:

Jeg lavede en "qryOpAdres" query saaledes: 
SELECT a.adresid, voornaam & ' ' & achternaam AS naam
FROM Adres AS a INNER JOIN Persoon AS p ON a.adresid = p.adres;

Saa lavede jeg en formular "subOpAdres" med qryAdres som kilde og jeg indsatte teksbokse for adresid og naam.

I frmPersoon indsatte jeg saa en subformular og gav den som kilde subOpAdres og linkede hovedfelt = adres med subfelt = adresid.  Saa den finder navnene paa alle de der har samme adresse som personen.  Det virkede. Jeg faarogsaa navnet paa personen selv hvilket er logisk fordi personen ogsaa bor paa sin adresse.

Siger du saa at jeg skal lave queryen om til det foelgende og saa skulle jeg faa navnene paa de der bor paa adressen bortset fra personen selv?

SELECT a.adresid, voornaam & ' ' & achternaam AS naam
FROM Adres AS a INNER JOIN Persoon AS p ON a.adresid = p.adres
WHERE naam NOT LIKE [Forms]![frmPersoon]![naam]

Men saa faar jeg ingen navne i subformularen.  Og naar jeg har frmPersoon i designmode og jeg skifter til formularmode saa faar jeg en alert der beder mig definere Forms!frmPersoon!naam.  Det kan den aabenbart ikke genkende.

Kan jeg bede dig kikke paa dette og fortaelle hvor jeg gaar forkert?
Avatar billede mugs Novice
02. marts 2010 - 18:13 #6
Kan du sende db som en .zip fil konverteret til 2000:

mugs snabelting mail.dk
02. marts 2010 - 22:16 #7
Den er paa vej.
Lidt forklaring:  frmPersoon viser paa foerste side Nancy Adriaenssen og viser i subOpAdres at hende selv og Wesley Noblesse boor paa hendes adresse.

I frmPersoon1 har jeg proevet at foelge din vejledning.  Jeg har skiftet subOpAdres ud med subOpZelfdeAdres der har qryOpZelfdeAdres som kilde.  Det maerkelige er at hvor jeg i eftermiddags overhovedet intet fik i subOpZelfdeAdres saa faar jeg nu foerste gang jeg aabner frmPersoon1 korrekt input for den foerste side (du vil se at kun Wesley Noblesse er vist paa samme adresse) men det gamle input paa de andre sider (paa side 2 skal der ikke vaere input, paa side 3 vil du se Kristel Arnouts baade i toppen og paa samme adresse.

Saa dit kodeforslag virker delvis men ikke fuldstaendig.  Jeg ser frem til en forklaring af to grunde:  Saa jeg kan fjerne den redundant information og saa jeg kan maaske kan laere at goere det korrekt naeste gang.
Avatar billede mugs Novice
02. marts 2010 - 22:31 #8
OK - Ser på det imorgen.
Avatar billede mugs Novice
03. marts 2010 - 08:56 #9
Db rettet og returneret.
03. marts 2010 - 21:19 #10
Saa er jeg med igen.  Jeg har modtaget din email.  Jeg erkender at frmPersoon virker som oenskes og at det virker ifoelge din oprindelige ide at aendre den underliggende query.  Saa jeg har faaet en loesning paa det konkrete problem og en vigtig indlaering.  Jeg kvitterer med points.

Og dog er det maerkeligt.  Den formular jeg haabede du ville kikke paa var ikke frmPersoon med subOpAdres og qryOpAdres men (som naevnede i #7) frmPersoon1 med subformular subOpZelfdeAdres og query qryOpZelfdeAdres.  frmPersoon var den gamle form som jeg lod staa for sammenligning, og saa startede jeg forfra med at lave qryOpZelfdeAdres og derfra subOpZelfdeAdres.  Jeg lavede saa en kopi af frmPersoon som frmPersoon1 og indsatte subOpZelfdeAdres.  Som saa ikke virker.

Hvis du har mere energi kan jeg saa faa dig til, i den fil jeg sendte, at kikke paa frmPersoon1/subOpZelfdeAdres/qryOpZelfdeAdres og undersoege om du kan se aarsagen (eller aarsagerne) til at det ikke virker.  I saa fald vil jeg oprette et nyt spoergsmaal Points til mugs.

Kan det have noget at goere med raekkefoelgen af handlingerne?  Jeg proevede forfra med at lave en query og derfra en subformular som jeg indsatte i hovedformularen, men med det samme resultat, den spoerger efter Forms!frmPersoon!naam.  Da jeg saa lod den bestaaende frmPersoon med subformular og query staa bortset fra at jeg i queryen indsatte kriteriet, [Forms]![frmPersoon]![naam], saa virkede det.
Avatar billede mugs Novice
03. marts 2010 - 22:50 #11
Det er mange ord, som jeg ikke kan læse nu. Jeg tager den lige med på arbejde og ser på det imorgen.

Når Access spørger efter Forms!frmPersoon!naam, er det fordi eet af objekterne ikke genkendes. De mest almindelige årsager er:

- Formularen er ikke åben. 
- Feltet naam eksisterer ikke i formularen.

Jeg er ikke klar over, om de manglende [] kan have en årsag. Men jeg sætter altid objekterne i [] således:

[forms]![frmPersoon]![naam]

Sætningen starter fra oven i objekthierakiet og skal læses som:

[Navn på objektsamlingen: Forms]!
[Navn på objektet i samlingen: frmPersoon]!
[Navn på objektet i objektet: naam]

Måske er det nemmere for dig at læse det bagfra i pseudokode:

Jeg skal hente strengen i feltet naam i den formular der hedder frmPersoon i samlingen af formularer.
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