Hej For at sige det som det er - Ja, jeg er ny i VBA.
Udfordring :
Jeg har lavet en DB, som skal lave følgende beregninger :
I en skydning kan der deltages med 3 forskellige typer våben. Hver skytte kan opnå følgende 5 resultater : Intet, Tilfredsstillende, Bronze, Sølv eller Guld.
Info : Våben 1 (Intet =< 120 Point) (imellem 121 og 139 Point = Tilfredsstillende (imellem 140 og 158 = Bronze) osv. Info : Våben 2 (Intet =< 118 Point) (imellem 119 og 137 Point = Tilfredsstillende) (imellem 138 og 156 = Bronze) osv.
Beregningen (skal foregå i tabelfelt "Opnået" - som nu skal udlæse Våbentype fra tabelfeltet "Våbentype", og ud fra denne udlæsning anvende de tal der nu er gældende (se f.eks Våben 1).
Beregningen skal nu udføres, og en tilsvarende (beregnet) tekstværdi ( Intet, Tilfredsstillende, Bronze, Sølv eller Guld) skal returneres, og indsættes i tabelfeltet "Opnået" i den aktuelle post.
Jeg håber at der er nogle dygtige mennesker herinde, der kan hjælpe med en løsning, snarest.
Du kan få en ide til hvordan det kunne lade sig gøre:
Forudsætninger:
- Dine beregninger skal ske i en formular (baseret på din skyderesultater). - I formularen har du bla. felterne "Våbentype", "Point" og "Opnået"
Det mest korrekte vi være at oprette en lille tabel, som indeholder grænseværdierne for de forskellige point-grænser:
- Tabellen kalder vi Våbentyper - Opret felterne Våbentype (Tekst) Max_Intet (Tal) Max_Tilfr (Tal) Max_Bronce (Tal) Max_Sølv (Tal) (vi går ud fra at alt, der er bedre end sølv, giver guld - så altså: ingen øvre grænse på guld)
- Læg de forskellige våbentypenavne og grænseværdier ind i tabellen
- I din skyderesultattabel-formular lægger du så følgende kode i Point-feltets AfterUpdate/EfterOpdatering hændelse:
Private Sub Point_AfterUpdate() If IsNull(Me.Point) Then Exit Sub
Dim Db As Database Dim Rst As Recordset Dim strSQL As String Dim Res As String
Set Db = CurrentDb strSQL = "SELECT Våbentyper.* FROM Våbentyper WHERE Våbentype='" & Me.Våbentype & "'" Set Rst = Db.OpenRecordset(strSQL, dbOpenSnapshot) With Rst If Not .EOF Then If Me.Point > 0 And Me.Point <= !Max_Intet Then Res = "Intet" If Me.Point > !Max_Intet And Me.Point <= !Max_Tilfr Then Res = "Tilfredsstillende" If Me.Point > !Max_Tilfr And Me.Point <= !Max_Bronce Then Res = "Bronce" If Me.Point > !Max_Bronce And Me.Point <= !Max_Sølv Then Res = "Sølv" If Me.Point > !Max_Sølv Then Res = "Guld" End If End With Set Rst = Nothing Set Db = Nothing
Har prøvet dette med iif, men kan ikke få det til at virke efter hensigten. Ville absolut være nemmest i udtryksgeneratoren, men der kommer amatøren til kort :-)
Her et eksempel fra en darabase der tildeler point i et spil kort. I pseudo kode sådan:
Hvis taæfelt er >20000 og talfelt er <30000 så skal udtryk1 være "ingenting", derefter følger en ny iif sætning o.s.v.
Udtryk1: IIf([Talfelt]>20000 And [talfelt]<30000;"Ingenting";IIf([Talfelt]>30000 And [talfelt]<40000;"Et par";IIf([Talfelt]>40000 And [talfelt]<50000;"To par")))
1. Carsten skrev: Beregningen skal nu udføres, og en tilsvarende (beregnet) tekstværdi skal returneres og indsættes i tabelfeltet "Opnået" i den aktuelle post.
2. Pointtildelingen er afhængig af våbentypen. Det vil i bedste fald kræve en forespørgsel pr. våbentype plus lidt programmering. I værste fald en pænt uoverskuelig monster-forespørgsel.
3. Fordelen ved en separat tabel er at det på en meget enkel måde vil være muligt at ændre "grænseværdierne" for de forskellige våbentyper
Hej - beklager min ignorante tilværelse :-) Fdata - du har fat i essensen af hvad det er jeg ønsker løst. Jeg skal såmænd bare bruge det på lørdag - så nej, hårklipning skal jeg ikke spekulere på, det næste lange stykke tid. Tak for dit indlæg. Jeg har prøvet med dit program, men jeg må gøre noget forkert. Skal jeg oprette en knap, og så tildele din kode som hændelsespricedure, eller hvilke andre skjulte metoder ligger der gemt for en amatør ?
1. Opret våbentypetabellen som beskrevet ovenfor 2. Åbn den formular, som du vil bruge til at registrere resultaterne i, i Designvisning 3. Marker feltet "Point" 4. Tast F4 for at fremkalde Egenskabsarket 5. På fanen Hændelser finder du hændelsen AfterUpdate/EfterOpdatering 6. Dobbeltklik for at vælge Hændelsesprocedure 7. Klik knappen med de tre små streger ude til højre 8. Erstat den tomme procedure med min kode ovenfor
Bemærk, at der er tale om en lidt rå form for kode. Det kan godt være at du skal tilrette lidt for at få det til at spille 100%; men selve idéen burde holde.
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.