Avatar billede visto Professor
08. oktober 2015 - 22:59 Der er 51 kommentarer og
1 løsning

Flueben skal afgøre hvilken underformular der vises

I en relationsdatabase har jeg en formular (A) med en underformularplads (B).

Jeg har brug for følgende:
Ved oprettelse af en ny post i formular A skal der på B's plads default vises en formular (B0). Til denne situation skal svare, at et afkrydsningsfelt i formular A er slået fra (= intet flueben i feltet). Ved tilvalg (= flueben i feltet) skal en anden underformular (B1) vises på B's plads.

Hvordan gør man det?

Jeg bruger Access 2003.
Avatar billede bvirk Guru
09. oktober 2015 - 09:33 #1
Du kan tilknytte vba kode til hændelsen at der klikkes i fluebenet.

Private Sub flueben_AfterUpdate()
    If flueben Then
        B.SourceObject = "b1"
    Else
        B.SourceObject = "b0": End If
End Sub


Hvis B0 eller B1 også udvælger de poster der skal vises efter værdien af et kontrolelement på A skal følgende også tildeles den rette værdi i subrutinen herover.

B.LinkChildFields
B.LinkMasterFields
Avatar billede visto Professor
09. oktober 2015 - 12:08 #2
Tak.
Jeg har ikke prøvet den type kode før. Med mine første forsøg får jeg indtryk af, at der ikke må indgå mellemrum i formularenes navne. Er det korrekt?

B1 viser forskellige poster, afhængigt af hvilken post der vises i A. Der er knyttet flere underposter i B1 til hver post i A. Er det det, du mener, med "Hvis B1 også udvælger de poster der skal vises efter værdien af et kontrolelement på A"?
Avatar billede visto Professor
09. oktober 2015 - 13:28 #3
Jeg har prøvet mig lidt frem. Men jeg får til stadighed en "Compile Error, Variabel not defined", når jeg sætter eller fjerner flueben. Når koden herefter åbnes, er det der svarer til din B (før .source) blåmarkeret. Eller i hvert fald den sidste del af det. Min B hedder 1200 VURD, men kun VURD blåmarkeres, hvilket fik mig til at tænke på at der måske ikke må være mellemrum i formularens navn.
Når jeg derefter trykker OK i dialogboksen, peger en gul pil på et nu gulmarkeret område, hvor der aktuelt står Private Sub Afkrydsningsfelt71_AfterUpdate() Mit fluebensfelt hedder Afkrydsningsfelt71.

Kan du - eller andre - hjælpe mig på sporet af, hvad der galt
Avatar billede terry Ekspert
09. oktober 2015 - 14:29 #4
Maybe if you show your code we might be able to see the problem.

Something else. Í assume you will also some code in form A's on current event so that the correct form is shown when you move through existing records.
Avatar billede visto Professor
09. oktober 2015 - 15:02 #5
The code is here (VURD mentioned before was abrieviations):
Koden er her (VURD nævnt før var forkortelser)

Private Sub Afkrydsningsfelt71_AfterUpdate()
    If Afkrydsningsfelt71 Then
1200        VURDERINGER.SourceObject = "1200 VURDERINGER"
    Else
1200        VURDERINGER.SourceObject = "1200 Ikke vurderet": End If
End Sub

There is only one space between 1200 and VURDERINGER; the extra spaces are added without me being able to prevent it.
Der er kun et mellemrum mellem 1200 og VURDERINGER; de ekstra mellemrum indsættes uden at jeg kan forhindre det.

Now that I write this, I realize that I probably should not have 1200 VURDERINGER both before .SourceObject and after it. But if so I don't know what to put before .SourceObject.
Nu hvor jeg skriver dette, indser jeg at jeg sikkert ikke skulle have 1200 VURDERINGER både før .SourceObject og efter. Men i givet fald jeg ved ikke hvad der skal være før .SourceObject.
Avatar billede terry Ekspert
09. oktober 2015 - 15:18 #6
Obviously the problem is the names your using with spaces. Its always best not to use spaces and other special characters including Danish in names.

You can try putting the name in []
Avatar billede terry Ekspert
09. oktober 2015 - 15:22 #7
I understand Danish, just too lazy to write in Danish :-)

The object containing the subform normally gets the same name as the sub form used when creating it. You can change this though to EG. frmSubObject. And in my opinion I would change the names of the forms too :-)

EG frmSub1200Vurdering and frmSub1200IkkeVurderet
Avatar billede terry Ekspert
09. oktober 2015 - 15:24 #8
Avatar billede visto Professor
09. oktober 2015 - 15:38 #9
OK. Det kunne klares ved at sætte [] omkring, og så kører det.
Tak også for rådene om navngivning og kutymer omkring dette.

>bvirk og terry: læg venligst svar til point. Og tak for hjælpen til jer begge.
Avatar billede visto Professor
09. oktober 2015 - 15:46 #10
Hov der er lige et par udfordringer mere. Fluebenet står godt nok default som fravalgt - men formularen der vises er den der kun skal vises, når fluebenet er sat: tilvalgt.
OG når jeg fravælger/fjerner flueben, så vises den rigtige formular godt nok, men når jeg så lukker databasen og åbner den igen, så vises den formular, der skal vises ved tilvalgt, samtidig med at der ikke er noget flueben.
Avatar billede visto Professor
09. oktober 2015 - 15:51 #11
Og endnu en ting:

Når jeg fravælger, så vises den formular, der hører til dette valg, for ALLE poster i formular A. Valg/fravalg i formular B skal jo være specifikt gældende for hver post i formular A.
Avatar billede terry Ekspert
09. oktober 2015 - 15:55 #12
"Fluebenet står godt nok default som fravalgt - men formularen der vises er den der kun skal vises, når fluebenet er sat: tilvalgt."

Change form in design view and save.

Did you see my comment regarding OnCurrent event?

If you use the form to view records then when you change record, dont you want to see the sub form used when creating the records?
IE. If check box is selected and you use "1200 VURDERINGER" then I would expect to see the same sub form when viewing records too.

But that is only going to work if check box is bound (in table)
Avatar billede terry Ekspert
09. oktober 2015 - 15:57 #13
"Når jeg fravælger, så vises den formular, der hører til dette valg, for ALLE poster i formular A. Valg/fravalg i formular B skal jo være specifikt gældende for hver post i formular A.

If I understand you correctly, this is the reason I mentioned OnCurrent event.

And it requires thát the check box is a field in the tabel so that the chosen value is saved and can be used to show correct form when viewing records.
Avatar billede visto Professor
09. oktober 2015 - 16:24 #14
Jeg har ikke set nogen kommentar ang. OnCurrent event. Der er ikke noget om det i denne tråd.

Lad mig være konkret ang. brug. Databasen handler om vin. Når jeg efter køb opretter en ny vin, så skal underformular B, hvor vinen vurderes efter konsumption, vise en formular, der blot indeholder teksten "Vinen er ikke vurderet" (1200 Ikke vurderet) og fluebenet skal være slået fra. Det er default nu efter at jeg skiftede formular i design og gemte, som du skrev.
Når vinen er drukket og skal vurderes, skal vurderingsformularen (1200 VURDERINGER) vises, når jeg sætter flueben. Det sker også. Men flubens til- eller fravalg gælder aktuelt og fejlagtigt for samtlige vine, hvor det selvfølgelig skal afhænge af den enkelte vin, og om den er vurderet eller ikke.
Avatar billede terry Ekspert
09. oktober 2015 - 16:50 #15
Skrevet fre. d. 09. oktober 2015 kl. 14:29:42| #4

"...in form A's on current event ..."


You need a field (yes/no) in the table, you could name it cbVurderet for example. This is defaulted to No (false) .

In the onCurrent event of teh main form you need similar code as you have in the checkboxes AfterUpdate event.

This should show the correct sub form, also after you have "drukket og vurderet" and set the check box to Yes (true)
Avatar billede visto Professor
09. oktober 2015 - 17:23 #16
Jeg har mistet orienteringen. Det ja/nej felt, du siger jeg skal have, i hvilken formular skal det være?

Jeg går ud fra at onCurrent event svarer til det danske "VedAktuel" under Hændelser. Hvad mener du med "similar code"? Skal det være samme kode eller en tilsvarende? Hvis tilsvarende, så ved jeg ikke, hvad jeg skal skrive.
Avatar billede terry Ekspert
09. oktober 2015 - 17:44 #17
The Ja/Nej field has to be in the TABLE which you have on main form. Then the check box which you already have on the main from has to be BOUND to the field in the table. So that when you check/uncheck the checkbox, the value is stored in the table.

VedAktuel = OnCurrent

Try copying the code from the checkbox afterupdate event to the VedAktuel event of the main form.
Avatar billede visto Professor
09. oktober 2015 - 18:12 #18
OK. Gjort.

Der kommer nu nogle fejl:
1) Når jeg vil sætte flueben i tjekboxen, eller hvis jeg vil prøve atskifte post (hvilket nu ikke kan lade sig gøre): "Udtrykket FørOpdatering, du indtastede som indstilling af hændelsesegenskaben, gav en fejl: Ambigous name detected: Afkrydsningsfelt71_AfterUpdate."
Og med småt derunder:
* Udtrykket resulterer måske ikke i navnet på en makro, i navnet på en brugerdefineret funktion eller en [Hændelsesprocedure]
* Der opstod måske en fejl under evalueringen af funktionen, hændelsen eller makroen".

De bliver du nok klogere af end jeg gør...
Avatar billede terry Ekspert
09. oktober 2015 - 18:19 #19
Is it possible to see the dB?

ekspertenATsanthell.dk
AT = @
Avatar billede terry Ekspert
09. oktober 2015 - 18:22 #20
when you copied the code from the Afterupdate event to the OnCurrent it is only the code BETWEEN the


Private Sub flueben_AfterUpdate()


and

End Sub
Avatar billede terry Ekspert
09. oktober 2015 - 18:33 #21
I hope you understand why it is necessary to have a ja/nej field in the table, and also the reason for the code in the OnCurrent event.

Once its all working I'm sure you will.
Avatar billede visto Professor
09. oktober 2015 - 19:08 #22
Jeg tager lige en aftensmadspause :-)
Avatar billede terry Ekspert
09. oktober 2015 - 19:57 #23
OK.
I'll take a look again tomorrow morning.

velbekomme
Avatar billede visto Professor
09. oktober 2015 - 22:13 #24
Jeg fulgte din:

when you copied the code from the Afterupdate event to the OnCurrent it is only the code BETWEEN the

Private Sub flueben_AfterUpdate()

and

End Sub

Og så forsvandt fejlmeddelelserne.

Et kort tjek tyder på, at det muligvis virker. Så lad være med at ulejlige dig yderligere, før jeg melder tilbage efter et mere detaljeret (og vågent) tjek.
Avatar billede visto Professor
09. oktober 2015 - 23:24 #25
Jeg mener nu at have tjekket. Og det ser ud til at virke som det skal.
To ting resterer:

1) Når jeg vil oprette en ny post i overformular A, får jeg fejlmeddelelsen: "Run-time error '94': Invalid use of Null". Debug's gule pil peger på If Afkrydsningsfelt71 Then lige under Private Sub Form_Current()

2) Et magelighedsproblem: Databasen har over 3000 poster (=vine), hvor alle på nær 4-5 stykker er vurderet. Men nu står alle disse med formularen 1200 Ikke vurderet. Det kunne være rart at kunne sørge for at de kom til at stå med formularen 1200 VURDERINGER uden at jeg skal sidde og sætte flueben over 3000 gange. Og at jeg så kan fjerne flueben for de par stykker der ikke er vurderet. Kan det lade sig gøre midlertidigt at lave sådan en indstilling? Hvorefter jeg vil gå tilbage til 1200 Ikke vurderet som default ved oprettelse af nye vine? Jeg har prøvet med standardværdi Ja et par steder men uden resultat. Det er hele tiden 1200 Ikke vurderet, der vises.
Avatar billede terry Ekspert
10. oktober 2015 - 10:23 #26
1) I think this is because the default value for the new ja/nej field in the table is empty (NULL). You should  be able to change it to Nej so that new records will show your "ikke vurderet" form. Or another way is to change

If Afkrydsningsfelt71 Then

to

If Me.NewRecord or Afkrydsningsfelt71 Then 


2) Yes its possible. I'll get back to you shortly with solution. You have 1) to look at at the moment :-)
Avatar billede terry Ekspert
10. oktober 2015 - 10:27 #27
2) In the debug window (CTRL+G) enter the following,


DoCmd.RunSQL "UPDATE NameOfTableGoesHere SET NameOfFieldGoesHere = -1"


First alter NameOfTableGoesHere and NameOfFieldGoesHere to correct names. Then once you have done that press enter.
Avatar billede visto Professor
10. oktober 2015 - 12:05 #28
1) er klaret med
If Me.NewRecord or Afkrydsningsfelt71 Then

men, når jeg opretter en ny post vises 1200 VURDERINGER underformularen, hvor default skulle være 1200 Ikke vurderet. Sidsnævnte er den man ser, når overformularen er i designvisning, og Ja/nej feltet i tabellen er sat til standardværdien Nej.

?

Er ikke nået til 2)
Avatar billede visto Professor
10. oktober 2015 - 12:09 #29
Ang. 2:
Hvilken tabel og hvilket felt er det der skal angives ved
NameOfTableGoesHere og NameOfFieldGoesHere?
Avatar billede terry Ekspert
10. oktober 2015 - 12:30 #30
1) You need to alter the code so that the IKKE Vurderet form is show when NewRecord or if ja/nej field is NULL.

Something like this.

If Me.NewRecord or IsNull(Afkrydsningsfelt71) Then

Put code here to show IKKEVURDERET

ELSE

Put code here to show VURDERET

END IF


2)
NameOfTableGoesHere is the table which is used on main form and also contains the  JaNej which is also = NameOfFieldGoesHere
Avatar billede visto Professor
10. oktober 2015 - 14:21 #31
1) OK. Nu begynder jeg at forstå de koder lidt. Men jeg er i tvivl om, hvordan jeg efter at være kommet ind i debug-vindue skal indsætte nyt. Der er jo vandrette linjer mellem de enkelte kodesektioner. Hvordan laver jeg plads til et nyt sæt koder? For nu skal jeg jo have skilt If Me.NewRecord Or Afkrydsningsfelt71 ad.
Avatar billede terry Ekspert
10. oktober 2015 - 15:07 #32
Not quite sure I understand.

The debug window (CTRL+G)is the window at the bottom where you should be able to see the word "Immediate" in the blue bar.

The code for the form is in the (code) window where you can see the name of the form followed be (code) in the blue bar.

So it depends what you are trying to do.

If you are trying to enter
DoCmd.RunSQL "UPDATE NameOfTableGoesHere ....

then you can do that in the debug window which is the window at the bottom.

This window can be used for executing bits of code and also seeing valued in variables. So it isn't saved after you close the window. The code in the code window (the window at the top) is the code used in the form.
Avatar billede visto Professor
10. oktober 2015 - 17:50 #33
Jeg måtte lige starte forfra, da der gik ged i det.

Jeg er nu igen ved 1) (ikke kommet igang med 2). Det gik den rigtige vej, da jeg fulgte din anvisning i #26, altså udskiftede
If Afkrydsningsfelt71 Then

med

If Me.NewRecord or Afkrydsningsfelt71 Then

Ny post kunne nu oprettes MEN med 1200 VURDERINGER som vist, og det skulle jo være 1200 Ikke vurderet.

Jeg prøvede så, at ombytte placeringen af
[1200 VURDERINGER].SourceObject = "1200 VURDERINGER"
og
[1200 VURDERINGER].SourceObject = "1200 Ikke vurderet"
Og nu blev ny post oprettet med 1200 Ikke vurderet. Men fluebenet får nu omvendt funktion, så fravalgt betyder at anmeldelse vises, og tilvalgt betyder at 1200 Ikke vurderet vises.

Jeg tænkte så, om jeg kunne adskille If Me.NewRecord or Afkrydsningsfelt71 til to betingelser (eller hvad man kalder det), så If Me.NewRecord ville give 1200 Ikke vurderet, mens If Afkrydsningsfelt71 ville give 1200 VURDERINGER.

Men jeg kunne ikke finde ud af, hvordan det skulle skrives i kodeafdelingen, eller om jeg skulle oprette koderne ved at gå ind i kodegenerator et eller andet sted fra. Ikke så let, synes jeg.
Avatar billede terry Ekspert
10. oktober 2015 - 23:15 #34
Vi snakkes ved i morgen ...
Avatar billede terry Ekspert
11. oktober 2015 - 11:49 #35
Did you notice that the first line of code is also changed?

From
If Me.NewRecord or Afkrydsningsfelt71

to

If Me.NewRecord or IsNull(Afkrydsningsfelt71) Then
Avatar billede visto Professor
11. oktober 2015 - 12:05 #36
Den havde jeg ikke med i sidste forsøg.
Hvis det ser sådan ud:

If Me.NewRecord Or IsNull(Afkrydsningsfelt73) Then
[1200 VURDERINGER].SourceObject = "1200 Ikke vurderet"
    Else
[1200 VURDERINGER].SourceObject = "1200 VURDERINGER": End If

så oprettes ny post som den skal med Ikke vurderet. Men alle andre poster vises med VURDERINGER og fluebenet virker slet ikke.
Avatar billede visto Professor
11. oktober 2015 - 12:10 #37
vent lidt. prøver lige noget. der er en fejl et sted
Avatar billede terry Ekspert
11. oktober 2015 - 12:12 #38
OK
Avatar billede visto Professor
11. oktober 2015 - 12:18 #39
Det jeg skrev i #36 er rigtigt observeret, altså: Der oprettes ny post, som den skal med Ikke vurderet. Men alle andre poster vises med VURDERINGER og fluebenet virker slet ikke.

Hvis jeg fjerner IsNull, så virker fluebenet, men har den omvendte funktion: altså intet flueben > VURDERINGER, med flueben: Ikke vurderet.
Avatar billede terry Ekspert
11. oktober 2015 - 12:44 #40
I'm a bit puzzled. Not easy to see whats happening :-(

Is it possible to see the dB or at least the part your having problems with?

Things will go much faster if I can see whats going on.

My email is above somewhere
Avatar billede visto Professor
11. oktober 2015 - 12:58 #41
Jeg vil prøve at lave en version til dig.
Avatar billede terry Ekspert
11. oktober 2015 - 13:01 #42
OK
Will be away for an hour or so but will look later
Avatar billede visto Professor
11. oktober 2015 - 14:14 #43
En nedbarberet version, hvor kun det, der er nødvendigt til at indkredse problemet er sendt.
Avatar billede visto Professor
11. oktober 2015 - 17:22 #44
Ja, det hjalp jo. Så er 1) på plads. Jeg holder lige en "pause", før jeg går i gang med 2)

Tak for strålende hjælp.
Avatar billede terry Ekspert
11. oktober 2015 - 17:52 #45
Made some code very similar to original example given by bvirk but also executed in On Current event.
Avatar billede visto Professor
11. oktober 2015 - 18:04 #46
>bvirk: Læg også du venligst et svar, så du får et par point for at lede på sporet. Også tak til dig.
Avatar billede visto Professor
13. oktober 2015 - 10:22 #47
Tråden kan jo afsluttes, i og med at det oprindelige spørgsmål er besvaret. Da bvirk ikk har svaret, vælger jeg at uddele point nu.

Hvis du gider, terry, vil jeg gerne vide om 2) som beskrevet i #27 m.fl. stadig vil virke, nu hvor du har ændret de oprindeligt foreslåede koder?
Avatar billede terry Ekspert
13. oktober 2015 - 10:40 #48
Thanks
Yes the code I gave should work. It really has nothing to do with the code we have made.

What it does it goes directly into the table and updates the ja/nej field to True (ja) so that ALL records will now be "vurderet".

Remember the code has to be written in the box below where the other code is. Its only use once to update the table and will not be saved.
Avatar billede visto Professor
13. oktober 2015 - 11:18 #49
Når jeg har indsat koden i Immediate vinduet forneden, hvad skal der så til for at eksekvere den?
Hvis jeg blot lukker det overordnede vindue, er koden stadig i Immediate, når jeg taster Ctrl + G igen.
Avatar billede terry Ekspert
13. oktober 2015 - 12:40 #50
To execute just press return at end of line

The box at bottom shows text "Immediate" if you close all of the windows and press ctrl+g again you will see the Immediate again.
Avatar billede visto Professor
13. oktober 2015 - 12:49 #51
Yes. Så er den også klaret. Du kan da ellers noget med Access, skal jeg love for. Endnu en gang stor tak.

Havde jeg vidst, hvor meget der var i spørgsmålet, havde jeg oprettet det med 60 point. Så sig til, hvis jeg skal oprette et spørgsmål mere med det formål at give dig ekstra 30 point.
Avatar billede terry Ekspert
13. oktober 2015 - 13:10 #52
Great you got it working.
I've worked as IT consultant/programmer for around 30 years but retired in January (efterløn) :-)
Done lots of work in Access and other database systems.

Dont worry about the points, if they were pints that that would be another matter :-)
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

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