---
title: "Avancerad uträkning"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/159616-avancerad-uträkning"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "MickeA.com"
published: "2007-04-24T17:44:11.000Z"
updated: "2007-05-23T11:56:33.000Z"
replies: 22
views: 1398
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/159616-avancerad-uträkning"
---

# Avancerad uträkning

_Sida 1 av 2._

## #1 — MickeA.com, 2007-04-24T17:44Z

Tjena
Jag hämtar data från SQL Server och ska sedan göra ett antal uträkningar för att presentera resulten på en hemsida.
Problemet är att vi idag upptäckte att det inte stämmer fullt ut.

Mina kolumner i databasen:

```
nBRake, decimal(12,2)
nBonus, decimal(12,2)
nNettorake, decimal(12,2)
```

Min SQLfråga ser ut såhär:

```
sql =	"SELECT " &_
	"id AS id_test, cID, LEFT(pDate, 6) AS pMonth, pPeriod, SUM(nBRake) AS sumBRake, SUM(nBonus) AS sumBonus, SUM(nNettorake) AS nNetto, SUM(nRakeback) AS sumRakeback, nCurrency " &_
	"FROM payout " &_
	"WHERE cID IN " &_
	"(" &_
	"SELECT id " &_
	"FROM customers " &_
	"WHERE nReferer = " & nCustId &_
	") " &_
	"AND pSite = '" & rsSites ("sSajt") & "' " &_
	"GROUP BY pPeriod, cID, pDate, nCurrency, id"
```

Senare körs följande kod för att få till alla resultat "rätt":

```
result = ""
					If Len(rsMonths("nNetto") & "") > 0 Then
						nNetto = cdBL(rsMonths("nNetto"))
						result = (percent_amount/100) * nNetto
						result = Round(result, 2)
					Else
						If Len(rsMonths("sumBRake") & "") > 0 Then
							bruttorake	= cdBL(rsMonths("sumBRake"))
							sumBonus	= cdBL(rsMonths("sumBonus"))
							result = bruttorake - sumBonus * (percent_amount/100)
						Else
							bruttorake	= cdBL(rsMonths("sumBRake"))
							result = bruttorake * (percent_amount/100)
						End If
						
						result = Round(result, 2)
					End If
```

Problemet är att kolumnen nNettorake kan innehålla ett decimaltal, bara 0 (noll) eller inget alls (""). Med fältet nBonus kan det se likadant ut, dvs. ett decimaltal, 0 eller "" (inget...).
Uträkningen ska ske enl. följande:

```
- Om nNettorake INTE är noll eller "" ska det räknas [i]nNettorake * procent_amount / 100[/i] (kan vara tex. 2.5% eller 5%.
- Om nNettorake ÄR noll eller "" OCH nBonus INTE är noll eller "" ska det vara [i]sumBRake - sumBonus * procent_amount / 100.[/i]
- Om nNettorake ÄR noll eller "" OCH nBonus ÄR noll eller "" ska det vara [i]sumBRake * percent_amount / 100.
```

Det är på det sistnämnda nått blir fel, för hur jag än gör så faller ifsatsen tillbaks på varken if eller else, utan *result* blir exakt samma som *sumBRake*

Har ni några förslag på vad jag gör fel?

Tack!

Permalänk: https://www.webforum.nu/p/159616

## #2 — Peter S, 2007-04-24T19:52Z

Testa

```
if isnumeric(nNettorake) and cdbl(nNettorake) <> 0 then
 'nNettorake * procent_amount / 100
else
 if not isnumeric(nBonus) or cdbl(nBonus) <> 0 then
  'sumBRake - sumBonus * procent_amount / 100
 else
  'sumBRake * percent_amount / 100
 end if
end if
```

Permalänk: https://www.webforum.nu/p/1969732

## #3 — MickeA.com, 2007-04-24T20:20Z

Nu följde jag ditt exempel och får samma felmess som jag fått många gånger tidigare:

```
Körningsfel i Microsoft VBScript (0x800A005E)
Ogiltig användning av Null: 'Cdbl'
/*********.se/_newpage/cust_referred.asp, line 263
```

Koden ser ut såhär:

```
result = ""
sumBonus	= rsMonths("sumBonus")
sumBRake	= rsMonths("sumBRake")
nNettorake	= rsMonths("nNetto")

[red]If Isnumeric(nNettorake) And Cdbl(nNettorake) <> 0 Then[/red]
	result = nNettorake * procent_amount / 100
Else
	If Isnumeric(nBonus) Or Cdbl(nBonus) <> 0 Then
		result = sumBRake - sumBonus * procent_amount / 100
	Else
		result = sumBRake * percent_amount / 100
	End If
End If
```

Rad 263 är rödmarkerad ovan.

Permalänk: https://www.webforum.nu/p/1969742

## #4 — colione, 2007-04-24T20:38Z

```
If Isnumeric(nNettorake) then
 if Cdbl(nNettorake) <> 0 Then
   ...
 end if
end if
```

Permalänk: https://www.webforum.nu/p/1969748

## #5 — MickeA.com, 2007-04-25T15:30Z

Nu funkar det nästan, men har en fråga.
Kolumner som är av typen "decimal(12,2)" i SQL Server, hur tolkar ASP kommatecken som decimaler.
Tror nämligen att det kan ställa tilll det, för på vissa ställen verkar jag ha punktdecimal.
Hur tolkas det och vilken av dessa är egentligen rätt?

Permalänk: https://www.webforum.nu/p/1969935

## #6 — emission, 2007-04-25T16:56Z

Huruvida det är punkt eller komma är bara intressant om värdet representeras som en sträng, och det gör det ju inte med decimal(12,2). 

När ASP konverterar strängvärden till decimalvärden (cdbl) så görs det baserat på regioninställningarna i systemet.

Permalänk: https://www.webforum.nu/p/1969952

## #7 — MickeA.com, 2007-04-25T17:04Z

aha, tack, bra att veta.
Nu verkar jag ha fått till det,. det visas rätt överallt.

Saken är bara den att det här med uträkningar i ASP inte verkar lira som det ska.
De här sätten funkar inte:

```
resultat = x - y * z / 100
resultat = (x - y) * (z / 100)

z = z / 100
resultat = (x - y) * z
```

Så jag testade följande och då funkar det kanon, frågan är ju bara varför?

```
resultat = x - y
z = z / 100
resultat = resultat * z
```

Får inget fel på "dom som inte funkar", utan den struntar bara i att ta bort y från x samt att den struntar i att dela z med 100.

Skumt?

Permalänk: https://www.webforum.nu/p/1969953

## #8 — MickeA.com, 2007-05-23T09:03Z

Tjena
Nu har jag dykt på problem igen med det här scriptet.
Även fast det i förekommer ett tal i *nNettoRake* så struntar scriptet i att basera uträkningen på detta, utan den tar iaf. *brutto - bonus*, vilket strular till sig på vissa ställen.

Så här ser scriptet ut:

```
result		= 0
sumBonus	= rsMonths("sumBonus")
sumBRake	= rsMonths("sumBRake")
nNettorake	= rsMonths("nNetto")
proc_amount	= percent_amount / 100
If Isnumeric(nNettorake) Then
	If Cdbl(nNettorake) <> 0 Then
		result = cdbl(nNettorake) * proc_amount
	End If
Else
	If Isnumeric(sumBonus) Or Cdbl(sumBonus) <> 0 Then
		result = cdbl(sumBRake) - cdbl(sumBonus)
		result = result * proc_amount
	Else
		result = cdbl(sumBRake) * proc_amount
	End If
End If
result = Round(result, 2)
```

Det som ska ske är alltså att uträkningen i första hand ska ske med *nNettorake*.

Några förslag?
Måste få ihop det här, tack!

Permalänk: https://www.webforum.nu/p/1980202

## #9 — @nders, 2007-05-23T09:13Z

Exakt vad innehåller nNettorake när det inte funkar då?

Permalänk: https://www.webforum.nu/p/1980206

## #10 — MickeA.com, 2007-05-23T09:26Z

> **@nders skrev:**
>
> Exakt vad innehåller nNettorake när det inte funkar då?

Det är lite lurigt.
Ibland innehåller det 0 (tal), ibland "" (helt tom sträng) och ibland ett decimaltal.
När nNettorake inte är 0 och ett tal så är det oftast ett tal med fyra decimaler.
Datatypen är *decimal(12, 2)* och DBMS SQL-Server 2000.

Det min uträkning ska göra är att \_om\_:
\- *nNettorake* inte är tom, räkna *nNettorake \* procentsats / 100*
\- Om *nNettorake* är tom, räkna *sumBRake - sumBonus \* procentsats / 100*
\- Om *nNettorake* är tom, sumBonus är tom, *räkna sumBRake \* procentsats / 100*

Det som spökar nu är alltså att den räknar *sumBRake - sumBonus \* procentsats / 100* trots att *nNettorake* innehåller *747,86*.

Det konstiga är att den räknar bara fel såhär ibland, så det bör vara nått fel på själva posten, eller nått.

Permalänk: https://www.webforum.nu/p/1980211

## #11 — @nders, 2007-05-23T09:33Z

Har du samma regional settings på sql server som webbserver? Om du får ett decimaltal med punkt och din webbserver vill ha decimaltal med komma så får du helt enkelt byta ut till rätt decimaltecken.

Permalänk: https://www.webforum.nu/p/1980216

## #12 — MickeA.com, 2007-05-23T09:40Z

aha, undra om det kan vara så då?
Det konstiga är ju just att all statistik (som det här rör) reggas med decimalpunkt, eftersom det inte går att köra sqlfrågan med kommadecimal.

Webbhotellet är Surftown (Servrarna i Danmark..?!) och enl. dom ska det vara Dansk (Svensk) LCID när det gäller tid osv. så det bör väl vara samma med tal, eller..?

Vad vill SQL Server ha förresten?
Kollade lite snabbt precis i databasen och det är kommadecimal på de ställen jag ser.

Permalänk: https://www.webforum.nu/p/1980219

## #13 — MickeA.com, 2007-05-23T09:48Z

Nu har jag nog fått till det.
Lade till *If Not IsNull(nNettorake) Then nNettorake	= Replace(nNettorake, ".", ",") End If* precis under *nNettorake = rsMonths("nNetto")* och då blev det rätt på raden jag hängt upp mig på.
Kör vidare såhär ett tag och återkommer om det strular nått mer.

Tack!

Permalänk: https://www.webforum.nu/p/1980224

## #14 — @nders, 2007-05-23T09:49Z

> Vad vill SQL Server ha förresten?

I SQL-frågor: alltid punkt.

> Kollade lite snabbt precis i databasen och det är kommadecimal på de ställen jag ser.

Vad kollade du med? Programmet du kollar med byter säkert decimaltecken till det som passar i given miljö.

Jag brukar, när jag råkar på dessa problem göra så här:
1) Kolla med en division i asp vilket decimaltecken som gäller, typ ta tecken två i resultatet av 1/2. 
2) Byt ut punkt och komma till detta tecken med replace. 
3) Typkonvertera till double efter isnumeric-kontroll.

Permalänk: https://www.webforum.nu/p/1980225

## #15 — MickeA.com, 2007-05-23T10:11Z

Aha, okej, alltså att man helt enkelt skriver ut *Response.Write(Mid(1/2, 2))*.
Ska kolla på dina övriga punkter lite mer, tack!

Permalänk: https://www.webforum.nu/p/1980229

## #16 — @nders, 2007-05-23T10:15Z

Även om din hårdkodade replace hjälper dig nu, så funkar den inte nödvändigtvis överallt. Om du flyttar på din applikation till en annan server kan saker och ting sluta att fungera, därför brukar jag göra en funktion som kontrollerar vilket decimaltecken som gäller, och sedan ersätter till det. Vi har ett tiotal webb- och SQL-servrar som är lite olika installerade, som våra applikationer körs på, så för oss funkar det inte att hårdkoda någonting som har med regional settings att göra.

Permalänk: https://www.webforum.nu/p/1980232

## #17 — MickeA.com, 2007-05-23T10:23Z

Aha, såpass... Då kanske det är vettigt att jag följer dina råd, då vi är pågång att sätta upp en dedikerad server med samma site både i tyskland och polen.

;)

Permalänk: https://www.webforum.nu/p/1980234

## #18 — The_Hulk, 2007-05-23T10:55Z

Hade precis problem med konvertering av sträng till decimaltal. i den ena applikationen fungerade det med punkt och i den andre med komma.En lösning var att tvinga applikationen att byta standard.

Jag körde också med replace innan men efter ett tag så slutade det fungera för mig. Tror jag bytta utvecklingsserver så jag fick olika inställningar.

Denna koden är i och för sig för C# .Net men man kan säkert lätt anpassa den för asp.

```
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
```

Kanske inte den bästa lösningen men det fungerade bra för mig.

Permalänk: https://www.webforum.nu/p/1980241

## #19 — @nders, 2007-05-23T11:00Z

Man kan använda sig av *setlocale("en-us")* i ASP, men man är ju fortfarande beroende av att SQL-servrar och annat levererar med rätt decimaltecken.

Då får man dock andra problem, till exempel att man måste hantera datum på ett totalt idiotiskt format.

Permalänk: https://www.webforum.nu/p/1980243

## #20 — MickeA.com, 2007-05-23T11:26Z

Nu har jag följt din 3-stegslista ovan, @nders:

```
result		= 0
sumBonus	= rsMonths("sumBonus")
sumBRake	= rsMonths("sumBRake")
nNettorake	= rsMonths("nNetto")
[red]use_as_dec	= Mid(1 / 2, 2, 1)

If Not IsNull(sumBonus) Then 
	sumBonus	= Replace(sumBonus, ".", use_as_dec)
	sumBonus	= Replace(sumBonus, ",", use_as_dec)					
End If
If Not IsNull(sumBRake) Then 
	sumBRake	= Replace(sumBRake, ".", use_as_dec)
	sumBRake	= Replace(sumBRake, ",", use_as_dec)					
End If
If Not IsNull(nNettorake) Then 
	nNettorake	= Replace(nNettorake, ".", use_as_dec)
	nNettorake	= Replace(nNettorake, ",", use_as_dec)					
End If
[/red]
proc_amount = percent_amount / 100
If Isnumeric(nNettorake) Then
	[red]nNettorake = CDbl(nNettorake)[/red]
	result = CDbl(nNettorake) * proc_amount
Else
	If IsNumeric(sumBonus) Then
		[red]sumBonus = CDbl(sumBonus)[/red]
		result = CDbl(sumBRake) - sumBonus
		result = result * proc_amount
	Else
		[red]sumBRake	= CDbl(sumBRake)[/red]
		result		= sumBRake * proc_amount
	End If
End If
result = Round(result, 2)
```

Det rödfärgade är ditlagt nu.
Jag får inga felmess så allt verkar funka.
Har jag gjort rätt nu, kommer samma sida funka på en server där man har något annat tecken som decimal?

Permalänk: https://www.webforum.nu/p/1980246

---

Tråden på webben: https://www.webforum.nu/amne/asp/159616-avancerad-uträkning  
Nästa sida: https://www.webforum.nu/amne/asp/159616-avancerad-uträkning/page2.md
