webForumDet fria alternativet

Typblandningsfel i uträkning

ASP

16 svar · 747 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tjena
Jag har fyra kolumner i en MS SQL databas av typen "decimal(12, 2)".
Jag ska hämta dessa fyra värden och göra en uträkning.

Problemet är att dessa kolumner inte alltid är ifyllda, ibland innehåller dom "0" och ibland är dom helt tomma.

Detta kan inte jag på något sätt styra, då det är utbetalningsstatistik som matats in automatiskt från Excelark.
Mina kolumner:

--------------
brutto
bonus
netto
procent
--------------

Uträkningen som ska ske:

result = (procent / 100) * (netto)

Ibland kan det hända att kolumnen netto innehåller "0" eller inget alls.

Då ska istället följande uträkning ske:

result = (procent / 100) * (brutto - bonus)

Så, jag undrar hur jag ska ställa upp allt, för hur jag än gör, så får jag antingen Typblandningsfel eller Ogiltig användning av Round(), strängen är NULL.

Jag antar att jag måste säkerställa att alla variablar är tal innan jag gör min uträkning, men får fel hur jag än gör.

Tacksam för alla tips och idéer!

Medlem sedan dec. 200012 464 inlägg
#2
select (procent/100) * 
 case when netto = 0 or netto is null then brutto - bonus else netto end 
    as result
  from t
Medlem sedan feb. 20034 441 inlägg
#3

Hmm, okej.
Hur ska jag få in ovanstående kod i min fråga?

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"

De fält den här uträkningen ska baseras på, är:

"brutto" = sumBRake
"bonus"  = sumBonus
"netto"  = nNetto

Den här kolumnen "procent", hämtas från ett annat ställe längre ner i koden.

Hur ska jag göra?

Medlem sedan dec. 20025 483 inlägg
#4
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," &_
	"(procent/100) * case when netto = 0 or netto is null then brutto - bonus else netto end as result " &_
	"FROM payout " &_
	"WHERE cID IN " &_
	"(" &_
	"SELECT id " &_
	"FROM customers " &_
	"WHERE nReferer = " & nCustId &_
	") " &_
	"AND pSite = '" & rsSites ("sSajt") & "' " &_
	"GROUP BY pPeriod, cID, pDate, nCurrency, id"

Var håller procent hus?

Medlem sedan feb. 20034 441 inlägg
#5

Peter S skrev:

Var håller procent hus?

Tack för ditt svar, ska testa det där imorrn.
procent hämtas från en annan tabell senare och baseras på en del olika saker, därför kan jag inte hämta det i den här frågan.

Medlem sedan dec. 20025 483 inlägg
#6

Är det en egen variabel i VBScript blir det till att konkatenera in den i strängen ovan.

Medlem sedan feb. 20034 441 inlägg
#7

Just det, procent måste ju finns med i frågan för att det ska funka.
procent hämtas från ántingen tabell A eller B.
Detta beror på om någon procentsats angetts på anv.basis eller inte.

Såhär ser koden som hämtar procentsatsen ut:

sSql =	"SELECT " &_
	"t1.percent_id, t1.percent_site, t1.percent_customer, t1.percent_amount, " &_
	"t2.id, t2.sSitename " &_
	"FROM aws_percent t1 INNER JOIN avasites t2 " &_
	"ON t1.percent_site = t2.id " &_
	"WHERE t2.sSitename = '" & rsSites("sSajt") & "' " &_
	"AND t1.percent_customer = " & nCustId & ""

Set get_percent = conn.Execute(sSql)
If Not get_percent.EOF Then
	percent_amount = csNG(get_percent("percent_amount"))
Else
	If rsSites("sSajt") = "Battlefield" Or rsSites("sSajt") = "PurpleLounge" Then
		percent_amount = 5
	Else
		percent_amount = 2.5
	End If						
End If
Set get_percent = Nothing

Det här är nämlingen ett jobb jag tagit över från en annan och koden är en ren katastrof, så jag vill helst inte rota om för mycket saker, för då kanske något annat slutar funka.

Några förslag?

Medlem sedan dec. 20025 483 inlägg
#8

Så här kanske:

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," &_
	"(" & percent_amount & "/100) * case when nNetto = 0 or nNetto is null then SUM(nBRake) - SUM(nBonus) else nNetto end as result " &_
	"FROM payout " &_
	"WHERE cID IN " &_
	"(" &_
	"SELECT id " &_
	"FROM customers " &_
	"WHERE nReferer = " & nCustId &_
	") " &_
	"AND pSite = '" & rsSites ("sSajt") & "' " &_
	"GROUP BY pPeriod, cID, pDate, nCurrency, id"
Medlem sedan feb. 20034 441 inlägg
#9

Okej, hmm, men jag kan väl inte göra så, eftersom "nCustId" blir ett nytt varje gång loopen börjar om?
Procentsatsen blir en ny varje varv.

Medlem sedan dec. 20025 483 inlägg
#10

Så procensatsen skall inte ändras efter varje iteration i loopen?

Medlem sedan feb. 20034 441 inlägg
#11

Jo, för varje rad som skrivs ut, _kan_ det hända att procentsatsen ändras.
Så procentsatsen måste tas ut varje varv med hjälp av min kod ovan.

Därför skulle jag hellre försöka lösa det som jag tänkte från början, att man med ifsatser eller liknande gör den här uträkningen.

Medlem sedan dec. 20025 483 inlägg
#12
if isnull(rs("nNetto")) or rs("nNetto") = 0 then
  result = percent_amount/100 * (rs("sumBRake") - rs("sumBonus"))
else
  result = percent_amount/100 * rs("nNetto")
end if
Medlem sedan feb. 20034 441 inlägg
#13

Hmm, nu får jag samma fel jag hade när jag skrev den här tråden.

if isnull(rsMonths("nNetto")) or rsMonths("nNetto") = 0 then
     [b]result = percent_amount/100 * (rsMonths("sumBRake") - rsMonths("sumBonus"))[/b]
else
     result = percent_amount/100 * rsMonths("nNetto")
end if

Koden ger Inkompatibla typer
/rakeback.se/_newpage/cust_referred.asp, line 261

Den fetstilta raden är 261.

Medlem sedan dec. 20025 483 inlägg
#14

Kan något av fälten vara NULL?

Testa att casta dem med cdbl() eller clng().

Medlem sedan feb. 20034 441 inlägg
#15

Jo, det är precis här jag stått och stampat hela tiden.
Kör jag med csNG(), cLgn() funkar det tills något värde är NULL då blir det "Otillåten användning av...".
Gör jag en kontroll med tex. isNull eller isEmpty så får jag Inkompatibla typer.

Medlem sedan dec. 20025 483 inlägg
#16

Konkatenera med den tomma strängen och kolla om längden > 0:

if len(rsMonths("sumBRake") & "") > 0 then
  'innehållet ok, casta med clng() och utför subtraktion
Medlem sedan feb. 20034 441 inlägg
#17

Nu tror jag att jag fått till det:

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

Har slutat få massa felmess nu iaf, så vi provar såhär tillsvidare, tack!

277 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
134 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)