01. marts 2010 - 21:26Der 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.)
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
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]?
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?
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.
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.
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.
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.