27. april 2005 - 22:20Der er
45 kommentarer og 1 løsning
Hvordan gemmes flere værdier fra en liste
Aloha Jeg er lige begyndt at lære access og aner ikke ret meget om det. Jeg skal lave en formular hvor jeg har en liste, hvor der er mulighed for at vælge flere værdier på listen. Mit spørgsmål er så hvordan gør jeg det? Har fundet frem til det er noget med at oprette to tabeller og lave nogle relationer. Er som sagt lige begyndt på access så vil gerne have det penslet helt ud.
Jeg har oprettet en hovedtabel. Hvor der gemmes forskellige data på medlemmer i en klub. Vil så gerne have en liste i en formular hvor det er muligt at vælge to værdier. Skal så kunne vælge flere af følgende: Sponsor Medlem a Medlem b Passiv medlem
Ok. Så jeg går ud fra at din hovedtabel holder medlemmerne i klubben. (Du kan evt. tænke på om en ting som "passivt medlem" i stedet skal registreres i en kolonne i hovedtabellen).
Men altså: Den nemmeste måde at lave det på er med en fortløbende underformular inde i hovedformularen. Hvis din hovedtabel hedder Medlemmer og har felterne medlemID (autonummer) og navn (tekst). Så skal du derudover have en tabel der fx. kunne hedde Medlemstyper med felterne medlemstypeID (autonummer) og medlemstype (tekst). Det er i denne tabel at du tilføjer nye typer af medlemmer hvis du finder på flere end sponster, medlem A, medlem B og passivt medlem.
Og så skal du have en tabel til at holde information om hvilke medlemmer der er hvilke typer. Den kunne hedde MedlemTyper og have felterne ID (autonummer), typeID (nummer) og medlemID (nummer). Det er denne tabel som du skal lave en fortløbende formular ud fra, som skal indsættes som underformular på din hovedformular. Kan du følge det?
hvordan får jeg så det hele kædet sammen så jeg kan gemme værdierne? Så jeg ved hjælp af en formular kan bladre frem og tilbage mellem de enkelte poster. og der fx. for en post er valgt sponsor og medlem b. og for den næste er valgt sponsor og medlem a ved ik om det giver mening :-)
Jo jo det giver mening. Du skal have en hovedformular baseret på tabellen Medlemmer. Har du det? Vi kan kalde den frmMedlemmer. Så skal du have lavet en fortløbende formular baseret på tabellen MedlemTyper. Den kan vi kalde frmSubMedlemTyper (jeg bruger en navnekonvention, men det er ligemeget hvad du kalder dem). Start med at oprette de to formularer.
Nu skal vi have frmSubMedlemTyper indlejret som underformular i hovedformularen. Der er et par måder at gøre det på men du kan fx.: Åbne frmMedlemmer i designvisning. Træk frmSubMedlemTyper fra databasevinduet direkte ind på det område i frmMedlemmer, hvor du vil have underformularen skal sidde. Kan du få de ting til at virke?
Når du er kommet så langt skal underformularen nok rettes noget til. Det er fordi i tabellen MedlemmerTyper, som underformularen er baseret på gemmer du jo kun tal hhv. medlemsID'er og typeID'er. Og det er jo ikke til at finde ud af hvad der er hvad. Så det tekstfelt på underformularen, der indeholder tallet for medlemstypeID'et kan fx. laves om til en comboboks (en dropdown). (højreklik på dem og så kan den laves om til encombobokse. Til sidst skal du have rettet datakilden for comboboksen til så du får en pænt udseende liste med sponser,medlemA,medlemB osv. som du kan vælge fra.
Nå ja jeg tænkte bare at du på din hovedformular frmMedlemmer øverst har felter til medlemID og navn som jo er i tabellen Medlemmer. Så skal du bare lige have lavet frmMedlemmer lidt større så der er plads til den underformular der skal indsættes. Har du oprettet en fortløbende formular baseret på tabellen MedlemTyper ?
ja det kan man godt men det er lidt mere langhåret. En normal listbox kan man jo referere til som Me!listboxnavn som giver værdien af den markerede linje. En multiselect listbox som du vil have kan ikke refereres på den måde. Dens værdier ligger i et variant array i egenskab "itemsselected" for den listbox. Du kan læse om det i VBA hjælpefilen. Hvis ikke du er hjemme i vba-programmering vil jeg ikke anbefale det. En løsning med fortløbende underformular er standardløsningen, som virker meget stabilt.
Med en multiselect listbox skal man 1) Markere de værdier man vil bruge 2) Med kode gennemløbe listboxens linjer og finde ud af hvilke der er valgt. 3) For hver valgt linje via kode tilføje nye poster i MedlemTyper-tabellen. 4) Når du klikker gennem posterne i hovedformularen skal du under hændelsen "Aktuel" (OnCurrent) lave noget kode, som finder de poster i tabellen MedlemTyper som hoved til det medlemID og via kode markere de linjer i listboxen som korresponderer hermed. Det er en noget mere omstændig løsning.
En sådan løsning ville jeg gerne komme frem til, men kan godt se det virker meget mere lang håret, men når det først er lavet vil det efter min mening lette indtastningen af nye poster en del. Hvor svært er det med den vba, kan noget php i forvejen men ligner vel ikke sindsygt meget.
Har oprettet en boks som jeg havde tænkt mig, hedder formular1. Det er så her jeg vil gemme forskille valg for hver medlem. Jeg har sendt den på mail. Vil også sove, og siger mange tak for hjælpen for i dag. back tomorrow.
jeg tænker lige lidt over det, men jeg vil sige at du skal være godt hjemme i vba for at du lave og debugge den løsning. Hvis ikke vil jeg foreslå den fortløbende model.
ok jeg kan se du har indsat listboxen ved siden af den fortløbende formular - men det er meningen at kun listboxen skal bruges til det ikke? Du vil af med den fortløbende?
Jeg har sendt dig et eksempel, hvor formularen frmMedlemmer2 virker lidt af vejen. Når du opretter nye poster indsætter den poster i den relaterede tabel svarende til din markering i listboxen. Og når du klikker igennem de allerede oprettede skifter markeringerne i listboxen afhængig af hvilke typer medlemmet hører under.
Det der mangler er at hvis man skifter markeringer i en allerede oprettet post skal det rettes i den relaterede tabel.
Ja det ligner mere det jeg havde i tankerne. Jeg kommer mere og mere på sporet. fremragende.. Er det ikke nogle sql quarys man skal have fat i for at komme videre
Inden du går videre fra en post til den næste post skal du tjekke om markeringerne på listen passer med der der ligger i tabellen MedlemmerTyper for medlemmet. Hvis det gør passer det - hvis det ikke gør skal du opdatere tabellen MedlemmerTyper så det passer med markeringerne. Det kunne man gøre ved at slette det der ligger i forvejen i MedlemmerTyper, men det vil give en masse unødige deletes. I stedet skal du løbe både listbox og tabel igennem, finde forskellen og opdatere MedlemmerTyper tilsvarende.
Alt dette kan enten gøres hver gang en allerede oprettet post forlades eller evt. hver gang der klikkes på listboxen. I så fald slipper du for det når posten forlades.
hehe det er rigtigt. Men når man sådan lige tænker over hvordan det bliver når det skal bruges virker det rimeligt simpelt. :-) Sådan er det tit med det dumme programmering. Tror jeg vil studere lidt vba og så kommer det forhåbentligt lige til mig en dag.
Normalt kan man jo referere til en listbox med den værdi der er i den bagvedliggende tabel. Men det du beder om er flere værdier fra en tabel i samme listbox og der er det ikke ligetil. En multiselect listbox har ikke en værdi ligesom en enkelt-select listbox har det. Men vba er ikke et svært sprog og man bliver hurtig produktiv, så det kan anbefales.
Ja har jeg, men gør det ved at slette de valgte poster. En lille ting hvordan får man den til at lade være med at spørge om den skal slætte/oprette en række.
Ja, det var så lidt og selv tak. Bruger du kommandoen docmd.runsql når du skal slette og oprette?
Nogle herinde anbefaler dette: docmd.setwarnings=false docmd.runsql...sql-sætning docmd.setwarnings=true og det virker (det er meget vigtigt at man sætter warnings tilbage til True efter, da ellers har deaktiveret det overalt i databasen).
Men den bedste måde er: currentdb.execute(SQL-sætning),dbFailOnError (hurtigere ved loops og spørger ikke om noget)
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.