Avatar billede steen_hansen Forsker
18. juli 2016 - 20:21 Der er 21 kommentarer og
1 løsning

Kriterier overholdt = grøn farve, ikke overholdt = rød farve

Jeg har to forespørgsler, som tæller enheder sammen og udskriver dem under hinanden:

<%

    SQL  = "SELECT Count(status) AS Number1 FROM units WHERE ..........."
    Set RSCountTotal1 = Conn.Execute(SQL)

    SQL  = "SELECT Count(status) AS Number2 FROM units WHERE ..........."
    Set RSCountTotal2 = Conn.Execute(SQL)

%>

<body>

<div><%=RSCountTotal1("Number1")%></div>
<div><%=RSCountTotal2("Number2")%></div>

</body>

Der må kun være én i difference til hver side. Dvs dette er ok:

99
99
giver en difference på 0 = OK

46
47
giver en difference på -1 på den øverste værdi = OK

33
32
giver en difference på +1 på den øverste værdi = OK

64
66
giver en værdi på mere end én (-2) på den øverste værdi = Ikke OK

Dvs hvis differencen er -1 eller 0 eller +1, er det ok

Jeg vil gerne tydeliggøre bedre hvornår det er ok, og hvornår det ikke er.

Hvis differencen overholder kriterierne, skal begge værdier være grønne. For at understrege det tydeligere, vil jeg have udskrevet differencen set i forhold til hinanden:

GRØN:
5 / -1
6 / +1

14
14

6 / +1
5 / -1

Hvis der ikke er nogen difference, behøver der ikke stå

14 / 0
14 / 0

men blot

14
14

Hvis værdierne ikke overholder kriterierne, skal begge værdier være røde. Forskellen anskueliggøres.

RØD:
14 / +2
12 / -2

12 / -2
14 / +2


Hvis diff < 2 (1 eller 0 eller -1) så er det ok (GRØN)
Hvis diff > 1 (2 eller -2, eller endnu større) så er det ikke ok (RØD)

Det burde være a walk in the park. Men det driller. Håber det er til at forstå, og håber en af Jer kan hjælpe.
Avatar billede arne_v Ekspert
18. juli 2016 - 20:29 #1
Du maa vel skulle have noget a la:

c1 = RSCountTotal1("Number1")
c2 = RSCountTotal2("Number2")
d1 = c1 - c2
d2 = c2 - c1
if abs(d1) > 1 then
    col = "red"
else
  col = "green"
end if
if d1 = 0 then
    s1 = ""
else
    s1 = cstr(d1)
end if
if d2 = 0 then
    s2 = ""
else
    s2 = cstr(d2)
end if
Avatar billede arne_v Ekspert
18. juli 2016 - 20:30 #2
Lidt lang kode, men logikken er til at foelge. Og normalt betaler man ikke per linie. :-)
Avatar billede steen_hansen Forsker
18. juli 2016 - 20:34 #3
<div><span class="< % If diff < -2 Or diff < 2 Then %>grøn_farve<% Else %>rød_farve<% End If %>"><%=RSCountTotal1("Number1")%><% If diff <> 0 Then %> / <%=[DIFF]%><% End If %></span></div>

<div><span class="< % If diff < -2 Or diff < 2 Then %>grøn_farve<% Else %>rød_farve<% End If %>"><%=RSCountTotal2("Number2")%><% If diff <> 0 Then %> / <%=[DIFF]%><% End If %></span></div>

Det kunne nok laves lidt smartere med CASE SELECT el.lign. Men det er idéen.
Avatar billede steen_hansen Forsker
18. juli 2016 - 20:37 #4
Du var hurtig, Arne :) Jeg kigger det lige igennem
Avatar billede steen_hansen Forsker
18. juli 2016 - 21:17 #5
Jeg får en fejl ved denne linie (jeg har omskrevet den lidt)

    vValue1 = RSCountTotal1("Number1")
    vValue2 = RSCountTotal2("Number2")

'    vSum1 = vValue1 - vValue2 <-Ved denne linie
'    vSum2 = vValue2 - vValue1 <- Sikkert også ved denne linie

Microsoft VBScript runtime error '800a000d'

Type mismatch
Avatar billede arne_v Ekspert
18. juli 2016 - 21:33 #6
Har du checket at RSCountTotal1("Number1") og RSCountTotal2("Number2")indeholder det de skal?

Maaske:

vValue1 = CInt(RSCountTotal1("Number1"))
vValue2 = CInt(RSCountTotal2("Number2"))

hvis de af en eller anden grund ikke er kommet ud som integer.
Avatar billede steen_hansen Forsker
18. juli 2016 - 21:43 #7
Det hjalp :)

Det sidste går jeg lige igennem .......
Avatar billede steen_hansen Forsker
18. juli 2016 - 22:10 #8
Den er lige i øjet, Arne :)

En sidste ting: Der er jo et - (minus), hvis det ene tal er negativt.

For at få tingene til at stå ens og lige over/under hinanden, vil jeg gerne have et + (plus) foran det positive tal. Hvordan gør jeg det?
Avatar billede arne_v Ekspert
18. juli 2016 - 22:23 #9
if d1 = 0 then
    s1 = ""
elseif d1 < 0 then
    s1 = cstr(d1)
else
  s1 = "+" & cstr(d1)
end if

vil jeg tro.
Avatar billede arne_v Ekspert
18. juli 2016 - 22:24 #10
Igen: ikke super elegant eller kompakt kode, men simpel let laeselig kode som goer det den skal.
Avatar billede steen_hansen Forsker
18. juli 2016 - 22:40 #11
Det er fint nok, bare det fungerer.

Nu kommer der et + tegn ind foran det positive tal. Men jeg får et + ind foran det negative tal også:

2 / +-1
3 / +1

Det ser således ud nu:

    If vSum1 = 0 Then
        Diff1 = " 0"
    ElseIf vValue1 < 0 Then
        Diff1 = Cstr(vSum1)
    Else
        Diff1 = "+" & Cstr(vSum1)
    End If
    If vSum2 = 0 Then
        Diff2 = " 0"
    ElseIf vValue2 < 0 Then
        Diff2 = Cstr(vSum2)
    Else
        Diff2 = "+" & Cstr(vSum2)
    End If
Avatar billede arne_v Ekspert
18. juli 2016 - 22:42 #12
If vSum1 = 0 Then
        Diff1 = " 0"
    ElseIf vValue1 < 0 Then  '  <----------------- test vValue1 men skal nok vaere vSum1
        Diff1 = Cstr(vSum1)
    Else
        Diff1 = "+" & Cstr(vSum1)
    End If
Avatar billede steen_hansen Forsker
18. juli 2016 - 22:52 #13
Sorry, Jeg må have været væk et øjeblik :p

Arne, du er fantastisk, intet mindre :) 1000 tak for hjælpen :)
Avatar billede steen_hansen Forsker
18. juli 2016 - 23:16 #14
En fed feature kunne være:

2 / -5 (0 skal rykkes ned)
7 / +5 (2 skal rykkes op)

eller

7 / +5 (2 skal rykkes ned)
2 / +5 (0 skal rykkes op)

Resultatet ser foreløbig således ud:

    vSum1 = vValue1 - vValue2
    vSum2 = vValue2 - vValue1

    If ABS(vSum1) > 1 Then
        vStyle = "ColorRed"
    Else
        vStyle = "ColorGreen"
    End If

    If vSum1 = 0 Then
        Diff1 = " 0"
    ElseIf vSum1 < 0 Then
        Diff1 = Cstr(vSum1)
    Else
        Diff1 = "+" & Cstr(vSum1)
    End If
    If vSum2 = 0 Then
        Diff2 = " 0"
    ElseIf vSum2 < 0 Then
        Diff2 = Cstr(vSum2)
    Else
        Diff2 = "+" & Cstr(vSum2)
    End If

Så kan man se hvor meget der skal rykkes op eller ned for at få balance i tingene.

Skal jeg oprette et nyt spørgsmål?
Avatar billede steen_hansen Forsker
19. juli 2016 - 01:27 #15
Det er fint, som det er, Arne. Vi lader den ligge :)
Avatar billede arne_v Ekspert
19. juli 2016 - 02:09 #16
Jeg kan ikke gennemskue hvordan de op og ned skal udregnes, saa det ville under alle omstaendigheder kraeve en mere detaljeret forklaring.
Avatar billede steen_hansen Forsker
19. juli 2016 - 02:43 #17
Eksempel:

7 / +5 (2)
2 / -5 (0)

Der skal tages 2 fra toppen og lægges ned i bunden, før kriteriet på

5 / +1
4 / -1

er mødt.
7-2=5
2+2=4

Hvis forholdet er 5/4, og ikke længere 7/2, så ændres farven fra rød til grøn. Og så er kriteriet i orden.
Avatar billede arne_v Ekspert
19. juli 2016 - 02:52 #18
delta = abs(vsum1) \ 2

giver vaerdien der skal flyttes

saa skal den bare vises med fortegn og kun hvis den er forskellig fra 0 etc.
Avatar billede steen_hansen Forsker
19. juli 2016 - 02:52 #19
Det er unødvendigt, Arne. Det er fint som det er. Der er ingen grundt til at lave dette. Det kan også blive for meget igen  :o)
Avatar billede steen_hansen Forsker
19. juli 2016 - 02:57 #20
Ah, sorry. Jeg havde ikke opdateret siden. Prøver
Avatar billede steen_hansen Forsker
19. juli 2016 - 02:59 #21
Den skal vises, hvis værdien er lavere end -1 eller større end 1
Avatar billede steen_hansen Forsker
19. juli 2016 - 04:30 #22
Det lykkedes, det er testet igen og igen, og det virker :)

    If Diff1 < -1 Or Diff1 > 1 Then
        delta1 = ABS(vSum1) \ 2
    Else
        delta1 = "0"
    End If

    If Diff2 < -1 Or Diff2 > 1 Then
        delta2 = ABS(vSum2) \ 2
    Else
        delta2 = "0"
    End If

3 / -3 (0)
5 / +3 (1)

Dvs nu vises der, at der skal tages én fra den nederste og lægges op i den øverste.

Jeg har testet med langt større differencer og regnet på hvor meget der skal lægges op eller ned, og det virker hver gang!

Endnu en gang tak, Arne! Det er jo fantastisk :)
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

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