Dansk Access Forum
  Hjælp Hjælp  Søg i forum   Opret ny bruger Opret ny bruger  Log ind Log ind


Emne lukketBeregning i Database

 Besvar Besvar
Forfatter
CarstenH Se dropdown
Bronze bruger
Bronze bruger


Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
Direkte link til dette indlæg 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
Til top



Til top
hkh Se dropdown
Sølv bruger
Sølv bruger


Medlem: 15-08-2012
Status: Offline
Point: 320
Direkte link til dette indlæg Sendt: 14-10-2014 kl. 10:32
Citat: CarstenH 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
Til top
CarstenH Se dropdown
Bronze bruger
Bronze bruger


Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
Direkte link til dette indlæg 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
Til top
hkh Se dropdown
Sølv bruger
Sølv bruger


Medlem: 15-08-2012
Status: Offline
Point: 320
Direkte link til dette indlæg 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
Til top
hkh Se dropdown
Sølv bruger
Sølv bruger


Medlem: 15-08-2012
Status: Offline
Point: 320
Direkte link til dette indlæg 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
Til top
CarstenH Se dropdown
Bronze bruger
Bronze bruger


Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
Direkte link til dette indlæg 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
Til top
hkh Se dropdown
Sølv bruger
Sølv bruger


Medlem: 15-08-2012
Status: Offline
Point: 320
Direkte link til dette indlæg 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
Til top
CarstenH Se dropdown
Bronze bruger
Bronze bruger


Medlem: 14-10-2014
Land: Danmark
Status: Offline
Point: 5
Direkte link til dette indlæg Sendt: 16-10-2014 kl. 22:09
Tak Hans
 
Jeg prøver dit forslag i morgen.
 
Mvh
 
Carsten
Til top
hkh Se dropdown
Sølv bruger
Sølv bruger


Medlem: 15-08-2012
Status: Offline
Point: 320
Direkte link til dette indlæg 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
Til top
 Besvar Besvar

Skift forum Forum tilladelser Se dropdown

© 2013 - 2024 Dansk Access Forum - en del af Excel-regneark.dk