Forfatter |
Emne Søg Emne funktioner
|
CarstenH
Bronze bruger
Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
|
Emne: Beregning i Database Sendt: 14-10-2014 kl. 07:11 |
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.
På forhånd tak
|
|
|
|
|
hkh
Sølv bruger
Medlem: 15-08-2012
Status: Offline
Point: 320
|
Sendt: 14-10-2014 kl. 10:32 |
CarstenH skrev:
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.
På forhånd tak | Jeg har prøvet at give dig et bud. Tildeling aktiveres fra en formular med en knap kaldet: Knap_Resultat I knappens hændelse ved klik indtastes følgende. Private Sub Knap_Resultat_Click() 'Klargør datasæt Dim resultat As Recordset 'gem aktuel post, hvis den er ændret DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
'Åben datasæt Set resultat = CurrentDb.OpenRecordset("Navnet på din tabel") ' Alle skytter gennemgås While resultat.EOF = False 'åben tabellen for ændring resultat.Edit 'våbentype 1 start If resultat!Våbentype = 1 Then ' hvis points er over minimum for opnåelse af præmie If resultat!Points >= 121 Then 'Tilfredsstillende resultat If resultat!Points >= 121 And resultat!Points <= 139 Then resultat!opnået = "Tilfredsstillende." 'bronce If resultat!Points >= 140 And resultat!Points <= 158 Then resultat!opnået = "Bronce." 'sølv If resultat!Points >= 159 And resultat!Points <= 180 Then resultat!opnået = "Sølv." 'guld If resultat!Points >= 181 And resultat!Points <= 200 Then resultat!opnået = "Guld." Else ' points er mindre end 121 resultat!opnået = "Intet" End If End If 'våbentype 1 slut resultat.Update resultat.MoveNext Wend Set resultat = Nothing
End Sub Jeg har gået ud fra, at våbentypen er gemt i samme tabel som points og opnået. Hvis knappen er på samme formular,som du benytter til indtastning af points skal posten gemmes, ellers kan den linje udelades. Flere våbentyper indsættes ved at kopiere fra våbentype 1 start til våbentype 1 slut og indsætte det umiddelbart efter våbentype 1 slut. OBS Hvis våbentype ikke er et tal, skal der ændres i linjen. Hvis våbentype er en Pistol ændres til resultat!Våbentype = "Pistol" Du har også mulighed for at zippe en tom database (Access 2003) og vedhæfte den til et indlæg, så skal jeg se hvad jeg kan gøre, hvis det ikke kommer til at virke.
|
Hans
|
|
CarstenH
Bronze bruger
Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
|
Sendt: 14-10-2014 kl. 12:26 |
Hej Hans
Tusind tak for dit forslag.
Nu kan det kun gå for langsomt med at få fri fra arbejde, og komme hjem og prøve.
Gemmer denne rutine under HVER post ?
Resultatet skulle gerne være til at få med i en rapport, når der skal genereres en samlet rapport for alle skytter.
Jeg har lavet en fin formular, og lavet en knap nederst der er navngivet "Gem post" (en af de foruddefinerede). Vil det stadig fungere ?
Mvh
Carsten
|
|
hkh
Sølv bruger
Medlem: 15-08-2012
Status: Offline
Point: 320
|
Sendt: 14-10-2014 kl. 16:27 |
Ja rutinen gemmer, hver post
Du kan også benytte feltet points's hændelse:Efter Opdatering i stedet for en knap, så vil du kunne se svaret straks.
While - Wend gentager koden imellem While og Wend så længe While betingelsen er sand resultat.edit åbner tabellen for ændring. resultat.update gemmer posten, inder der flyttes til næste post. resultat.mowenext flytter til næste post, hvis der ikke er flere poster bliver betingelsen i While-sætningen falsk og der fortsættes med næste kommando efter Wend. set resultat=nothing rydder op, så hukommelsen bliver frigivet igen.
Private Sub Knap_Resultat_Click() 'Klargør datasæt Dim resultat As Recordset 'gem aktuel post, hvis den er ændret DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
'Åben datasæt Set resultat = CurrentDb.OpenRecordset("Navnet på din tabel") ' Alle skytter gennemgås While resultat.EOF = False 'åben tabellen for ændring resultat.Edit 'våbentype 1 start If resultat!Våbentype = 1 Then ' hvis points er over minimum for opnåelse af præmie If resultat!Points >= 121 Then 'Tilfredsstillende resultat If resultat!Points >= 121 And resultat!Points <= 139 Then resultat!opnået = "Tilfredsstillende." 'bronce If resultat!Points >= 140 And resultat!Points <= 158 Then resultat!opnået = "Bronce." 'sølv If resultat!Points >= 159 And resultat!Points <= 180 Then resultat!opnået = "Sølv." 'guld If resultat!Points >= 181 And resultat!Points <= 200 Then resultat!opnået = "Guld." Else ' points er mindre end 121 resultat!opnået = "Intet" End If End If 'våbentype 1 slut 'gem aktuel post. resultat.Update
' flyt til næste post. resultat.MoveNext Wend Set resultat = Nothing End Sub
|
Hans
|
|
hkh
Sølv bruger
Medlem: 15-08-2012
Status: Offline
Point: 320
|
Sendt: 14-10-2014 kl. 20:28 |
Hvis du vil bruge Hændelsen efter update for pointsfeltet, kan du klare dig med følgende:
If Våbentype = 1 Then ' hvis points er over minimum for opnåelse af præmie If Points >= 121 Then 'Tilfredsstillende resultat If Points >= 121 And Points <= 139 Then opnået = "Tilfredsstillende." 'bronce If Points >= 140 And Points <= 158 Then opnået = "Bronce." 'sølv If Points >= 159 And Points <= 180 Then opnået = "Sølv." 'guld If Points >= 181 And Points <= 200 Then opnået = "Guld." Else ' points er mindre end 121 opnået = "Intet" End If End If 'våbentype 1 slut 'våbentype 2 If Våbentype = 2 Then ' hvis points er over minimum for opnåelse af præmie If Points >= 121 Then 'Tilfredsstillende resultat If Points >= 121 And Points <= 139 Then opnået = "Tilfredsstillende." 'bronce If Points >= 140 And Points <= 158 Then opnået = "Bronce." 'sølv If Points >= 159 And Points <= 180 Then opnået = "Sølv." 'guld If Points >= 181 And Points <= 200 Then opnået = "Guld." Else ' points er mindre end 121 opnået = "Intet" End If End If
|
Hans
|
|
CarstenH
Bronze bruger
Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
|
Sendt: 16-10-2014 kl. 20:35 |
Hej Hans Så har jeg prøvet i vildskab. Jeg kan ikke få noget til at virke. Har det betydning at netop feltet "Våbentype" er en kombinationsboks ? Når jeg har oprettet en knap, og indsat og rettet lidt til i din rutine, under hændelsesprocedure for knappen - kan jeg høre at den arbejder på HDD, når der trykkes på knappen. Men der er ikke kommet noget ind i tabellen. Håber at du har flere gode ideer - der strækker sig lidt videre end en blok og en kuglepen, som løsning :-) Mvh Carsten
|
|
hkh
Sølv bruger
Medlem: 15-08-2012
Status: Offline
Point: 320
|
Sendt: 16-10-2014 kl. 21:56 |
Ja det kan det godt have. Hvis Våbentype henter værdien fra en tabel, skal det være tabellens id der søges på. Hvis det er en værdiliste feks "Pistol";"Riffel" skal der søges på teksten. Du burde kunne bruge Våbentype.value hvis du henter værdier fra en tabel, eller kolonnenr hvis du har flere kolonner. Du kunne evt prøve at oploade din kode.
Hvis du vil bruge kolonnenr skal det være me!Våbentype.Column(x), hvor x er et tal der representerer kolonnenr, 1. kolonne er nul, så hvis tabellen har id(long, autonummer), våbentype(tekst) skal du søge på me!Våbentype.Column(1)
|
Hans
|
|
CarstenH
Bronze bruger
Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
|
Sendt: 16-10-2014 kl. 22:09 |
Tak Hans Jeg prøver dit forslag i morgen. Mvh Carsten
|
|
hkh
Sølv bruger
Medlem: 15-08-2012
Status: Offline
Point: 320
|
Sendt: 21-10-2014 kl. 00:23 |
Hej Carsten
Når du deklarerer dine variabler kan det være en fordel at benytte Store bogstaver ved hvert ord.
Hvis du har en variabel der hedder stævnedato, kan følgende med fordel benyttes.
Dim StævneDato as Date
Når du indtaster din kode og kun benytter små bogstaver vil Access tilpasse så stævnedato bliver til StævneDato, det giver den fordel, at man kan se om der er slåfejl i variabelnavnet. Jeg har brugt meget tid, på at lede efter fejl, fordi en variabel var stavet forkert. En forkert stavning resulterer i en tom streng(""). Nu var StævneDato ikke det bedste eksempel, da der er danske tegn, hvilket frarådes, men som eksempel virker det.
|
Hans
|
|