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.
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
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
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
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?
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.
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.
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.
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.
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.
Ä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.
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.
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.
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?
269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e