Avatar billede hnto Nybegynder
24. juni 2011 - 12:53 Der er 25 kommentarer og
1 løsning

oprunding HASTER

tabel1 indeholder et felt der hedder [list price pr unit]
her vil jeg gerne i et nyt felt i en query indsætte en formel der gør følgende:

hvis prisen er mellem 100 - 500 skal den runde op til hele kr.
hvis prisen er mellem 501 - 5000 skal den rundes op til hele 5 kr
hvis prisen er mellem 5001 - 10000 skal den runde op til hele 10kr
hvis prisen er større end 10000 skal den runde op til hele 100 kr

hvad er expression på denne formel.....
Avatar billede hugopedersen Nybegynder
24. juni 2011 - 13:05 #1
Hvis du mener hvordan det skal laves, så er en åbenlys metode at lave en funktion du kalder med dit feltnavn som parameter og så laver en select case i funktionen og lader den returnere dit resultat
Avatar billede The_Buzz Novice
24. juni 2011 - 13:08 #2
hnto (6.913 point. Point ude: 900)
http://www.eksperten.dk/list/aabnespoergsmaal/hnto

Point systemet her på Eksperten er lavet for, at man belønner folk der kommer med svar til ens spørgsmål, du har MANGE point ude, og det ser ikke ud til at du belønner dine hjælpere - det resulterer så i at du ikke får ret mange svar - måske du skal lukke dine åbne spørgsmål?
Avatar billede hnto Nybegynder
24. juni 2011 - 13:16 #3
the buzz,
det er så gjort nu...
Avatar billede hnto Nybegynder
24. juni 2011 - 13:17 #4
hugo pedersen:
jeg er meget modtagelig for en færdig løsning :-)
Avatar billede hugopedersen Nybegynder
24. juni 2011 - 13:24 #5
Prøv lige at sætte den her ind i et modul og sæt den ind i din query MyAfrund([list price pr unit])

PS: feltnavne med mellemrum er noget en grim mand har skabt en dag han var i meget dårligt humør!

Public Function MyAfrund(aValue As Double) As Double
  Dim Result As Double
 
  Select Case aValue
    Case 100 To 500
'      skal den rundes op til hele 1 kr
      Result = ((aValue \ 1) * 1) + 1
    Case 501 To 5000
      Result = ((aValue \ 5) * 5) + 5
'      skal den rundes op til hele 5 kr
    Case 5001 To 10000
      Result = ((aValue \ 10) * 10) + 10
'    skal den runde op til hele 10kr
    Case Is > 10000
      Result = ((aValue \ 100) * 100) + 100
'    skal den runde op til hele 100 kr
    Case Else
      Result = aValue
  End Select
  MyAfrund = Result
 
End Function
Avatar billede hugopedersen Nybegynder
24. juni 2011 - 13:27 #6
Hvis du har værdier mellem 500 og 501, 5000 og 5001 og så videre, så vil der kunne ske svipsere.
Avatar billede hugopedersen Nybegynder
24. juni 2011 - 13:29 #7
Så nedenstående er faktisk bedre

Public Function MyAfrund(aValue As Double) As Double
  Dim Result As Double
 
  Select Case aValue
    Case Is > 100
'      skal den rundes op til hele 1 kr
      Result = ((aValue \ 1) * 1) + 1
    Case Is > 500
'      skal den rundes op til hele 5 kr
      Result = ((aValue \ 5) * 5) + 5
    Case Is > 5000
'    skal den runde op til hele 10kr
      Result = ((aValue \ 10) * 10) + 10
    Case Is > 10000
'    skal den runde op til hele 100 kr
      Result = ((aValue \ 100) * 100) + 100
    Case Else
      Result = aValue
  End Select
  MyAfrund = Result
 
End Function
Avatar billede dr-data Nybegynder
24. juni 2011 - 19:13 #8
Husk rækkefølgen for cases..

Public Function MyAfrund(aValue As Double) As Double
  Dim Result As Double
 
  Select Case aValue
    Case Is > 10000
'    skal den runde op til hele 100 kr
      Result = ((aValue \ 100) * 100) + 100
    Case Is > 5000
'    skal den runde op til hele 10kr
      Result = ((aValue \ 10) * 10) + 10
    Case Is > 500
'      skal den rundes op til hele 5 kr
      Result = ((aValue \ 5) * 5) + 5
    Case Is > 100
'      skal den rundes op til hele 1 kr
      Result = ((aValue \ 1) * 1) + 1
    Case Else
      Result = aValue
  End Select
  MyAfrund = Result
 
End Function
Avatar billede Slettet bruger
24. juni 2011 - 21:09 #9
Et andet spørgsmål er hvad der ligges i oprunding - Hvis tallet i forvejen er 'lige' (et multiplum af det der oprudes til) - skal det så tælles et 'skridt' ekstra op. Det ved bedst spørgeren - vi må se om hnto også interesserer sig for emnet!

Function pUpround(value)
    Dim f
    f = -(value > 100) - 4 * (value > 500) - 5 * (value > 5000) - 90 * (value > 10000)
    If value > 100 Then
        pUpround = (value \ f) * f
        If pUpround <> value Then pUpround = pUpround + f
    Else
        pUpround = value: End If
End Function


Function upRVal()
    Debug.Print "val", "Myafrund()", "pUpround()"
    For Each upRVal In Array(100, 100.1, 101, 500, 501, 505, 5000, 5010, 10000, 10001, 10100)
        Debug.Print upRVal, MyAfrund(CDbl(upRVal)), pUpround(upRVal): Next
End Function

val          Myafrund()    pUpround()
100          100          100
100,1        101          101
101          102          101
500          501          500
501          505          505
505          510          505
5000          5005          5000
5010          5020          5010
10000        10010        10000
10001        10100        10100
10100        10200        10100
Avatar billede hugopedersen Nybegynder
25. juni 2011 - 00:27 #10
dr-data-> jeg er ikke sikker på at du har testet den koder

Den vil efter min bedste overbevisning give forkerte resultater


brugerekspert-> den vinkel har jeg ikke spekuleret på. Men du har ret i at man bør lave et check. Men det må kunne gøre ved at sige noget i stil med
If Int(aValue) = aValue then
  Result = aValue
  Exit (kan ikke lige huske om det er som i Delphi)
End If
Avatar billede dr-data Nybegynder
25. juni 2011 - 01:52 #11
hugopedersen-> Du har ret, jeg har ikke testet den

Men et beløb på 20000 vil altid være større end 100, 500, 5000 og 10000, det er nødvendigt at placere cases således at den rammer 10000 først og derefter stopper, og at den ikke finder og rammer 100.

Samme ville gælde for beløbet 2500, der vil være større end 500 og 100, her regner jeg med at den kun skal oprunde til nærmeste hele 5 kroner, og ikke nærmeste 5+1 kroner (ved case-gennemløb)

Jeg har ikke mødt nogen "cases", i noget sprog, hvor det ikke har været gældende..
Avatar billede hnto Nybegynder
27. juni 2011 - 10:55 #12
hej alle,
jeg kan se logikken i Hugo's Script og ligeledes logikken i det dr-data skriver.

hvrodan er det lige jeg skaber en reference til et modul inde fra et felt i en forespørgsel. ?

Normal bruger jeg moduler hvis jeg skal opdatere et felt i en tabel med værdier beregent i modulet. dynamisk beregning som er det den laver i en query har jeg ikke erfaring med at lave som reference fra en query.
Avatar billede hnto Nybegynder
27. juni 2011 - 10:57 #13
jeg skal nok lige få den testet (koden) senere i dag, men fik den lige løst konkret via excelformler for at komme videre i forløbet da det var en haster :-)

her er excelkoden til andres info, men jeg er mere Access orienteret, og ser derfr helst at det ligger heri :-)

=IF(AND(A2>100;A2<500);ROUND(A2;0);IF(AND(A2>500;A2<5000);CEILING(A2;5);IF(AND(A2>5000;A2<10000);CEILING(A2;10);IF(A2>10000;CEILING(A2;100);"error!"))))
Avatar billede hnto Nybegynder
29. juni 2011 - 14:12 #14
skal nu til at teste denne kode:
Public Function MyAfrund(aValue As Double) As Double
  Dim Result As Double
 
  Select Case aValue
    Case Is > 10000
'    skal den runde op til hele 100 kr
      Result = ((aValue \ 100) * 100) + 100
    Case Is > 5000
'    skal den runde op til hele 10kr
      Result = ((aValue \ 10) * 10) + 10
    Case Is > 500
'      skal den rundes op til hele 5 kr
      Result = ((aValue \ 5) * 5) + 5
    Case Is > 100
'      skal den rundes op til hele 1 kr
      Result = ((aValue \ 1) * 1) + 1
    Case Else
      Result = aValue
  End Select
  MyAfrund = Result
 
End Function

men jeg sjkal vel placere resultatet i en ny kolonne, og derfor skal jeg vel egentlig have startet scriptet med at åbne tabellen og sætte aValue = feltnavnet på den gamle pris, samt Result = resultatet i det nye prisfelt. eller ?
Avatar billede hugopedersen Nybegynder
29. juni 2011 - 14:29 #15
I din query skriver du bare NytFelt:MyAfrund([GammeltFelt])
Så får du en ekstra kolonne der hedder NytFelt og som indeholder den afrundede værdi af GammeltFelt
Avatar billede hnto Nybegynder
29. juni 2011 - 14:32 #16
hvordan ved den at dette er en reference til et modul ?
ligger dette i public function delen ?

jeg har lavet en form hvor jeg har indsat følgende, men det staller på maks record locks der hvor jeg vil lave rs.edit.

Private Sub Command0_Click()
  Dim rs As DAO.Recordset
    Dim db As Database
    Set db = CurrentDb
    Set rs = db.OpenRecordset("ArticlePrices", dbOpenDynaset)
    Dim Result As Double
  aValue = listprice
   
    rs.MoveFirst
  Do
    Select Case aValue
    Case Is >= 10000
'    skal den runde op til hele 100 kr
      Result = ((aValue \ 100) * 100) + 100
    Case Is >= 5000
'    skal den runde op til hele 10kr
      Result = ((aValue \ 10) * 10) + 10
    Case Is >= 500
'      skal den rundes op til hele 5 kr
      Result = ((aValue \ 5) * 5) + 5
    Case Is >= 100
'      skal den rundes op til hele 1 kr
      Result = ((aValue \ 1) * 1) + 1
    Case Else
      Result = aValue
  End Select
      rs.Edit
      rs!calclistprice = Result
      rs.Update
      rs.MoveNext
     
    Loop Until rs.EOF
    rs.Close
    Set rs = Nothing
   

End Sub
Avatar billede hugopedersen Nybegynder
29. juni 2011 - 14:54 #17
Smid funktionen i et eller andet modul (hvilket er principielt ligegyldigt) Når den er defineret som public, så kan den ses over hele applikationen.
Sæt udregningen ind i den query du vil bruge som recordsource til din form eller rapport - det er 100 nemmere end det du er ude i med den knap.
Avatar billede hnto Nybegynder
29. juni 2011 - 14:56 #18
jeg prøver :-)
Avatar billede hnto Nybegynder
29. juni 2011 - 15:11 #19
den skriver "undefined function MyAfrund in expression" når jeg vil åbne queryen
Avatar billede hnto Nybegynder
29. juni 2011 - 15:15 #20
aValue skal vel også omdøbes til det konkrete feltnavn der skal kalkuleres ikke...
Avatar billede hnto Nybegynder
29. juni 2011 - 15:18 #21
ny acceptere queryen det, men den afrunder ikke en meter :-)
Avatar billede hnto Nybegynder
29. juni 2011 - 15:19 #22
det var mig der havde lavet en fejl....

du fortjener point, men kunne du ikke lige gøre så skriptet også opdaterer decimaler som det blev nævnt i tråden tidligere...
Avatar billede hnto Nybegynder
29. juni 2011 - 15:23 #23
har løst det  :-)
Avatar billede hnto Nybegynder
29. juni 2011 - 15:33 #24
Hugo:
når du har svaret på denne og fået dine velfortjente point er der en ny opgave :-)

http://www.eksperten.dk/spm/942032
Avatar billede hnto Nybegynder
04. juli 2011 - 10:25 #25
hugo pedersen du skal svare for at jeg kan give dig point :-)

der er dog en lille bitte "bug" i scriptet da den retter alle priser op med +1 krone.

feks hvis en pris var 131.65 retter den ikke denne til 132 men til 133. hvordan fikses dette ?
Avatar billede hnto Nybegynder
25. august 2011 - 10:06 #26
kan vi ikke få et svar hugo ?
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
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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