24. juni 2011 - 12:53Der 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
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
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?
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
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
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
Synes godt om
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
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
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..
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.
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 :-)
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 ?
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
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
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.
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.