Avatar billede zed_one Praktikant
12. juli 2011 - 11:38 Der er 6 kommentarer

Manglende værdier i output

Vil på forhånd undskylde for eventuel dårlig programmeringsløsning - det er år og dag siden jeg sidst har leget (ordentligt) med ASP/VBscript.

Nedenstående kode, sammenregner mængden af hæfter vi har produceret, indenfor en given måned, men af en eller anden grund, er der visse af månederne som giver blanke resultater?

Overvejer om det mon er værdierne i databasen der kan lave halløj i den?


Outputtet jeg får:
Juli - 2011
Antal forskellige: 343
Samlet antal 4-sidet: 90
Samlet antal 8-sidet: 5550
Samlet antal: 5640

Juni - 2011
Antal forskellige: 1126
Samlet antal 4-sidet: 400
Samlet antal 8-sidet:
Samlet antal:

Maj - 2011
Antal forskellige: 1262
Samlet antal 4-sidet: 520
Samlet antal 8-sidet:
Samlet antal:

April - 2011
Antal forskellige: 1233
Samlet antal 4-sidet: 1360
Samlet antal 8-sidet:
Samlet antal:

Marts - 2011
Antal forskellige: 1061
Samlet antal 4-sidet: 540
Samlet antal 8-sidet: 17890
Samlet antal: 18430


Min kode:
<%
    Dim AntalMaaneder, Omgange, Maaned
    Dim AntalForskelligeHaefter, SamletAntalHaefter, SamletAntalHaefter4S, SamletAntalHaefter8S
   
    AntalMaaneder = 5
    Omgange = 0
    Maaned = Month(Now())
    Aar = Year(Now())
   
    Do while Omgange < AntalMaaneder
   
        AntalForskelligeHaefter = 0
        SamletAntalHaefter4S = 0
        SamletAntalHaefter8S = 0
        SamletAntalHaefter = 0
   
        Set Conn = Server.CreateObject("ADODB.Connection")
        Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("../db/EDC_DB.mdb")
        Set RS = CreateObject("ADODB.RecordSet")
        strsql = "SELECT * FROM detaljer WHERE RecievedMonth='" & Maaned & "' AND RecievedYear='" & Aar & "' ORDER by ID DESC"
        RS.Open strsql, Conn, 1, 3
   
        Do While NOT RS.EOF
   
            AntalForskelligeHaefter = AntalForskelligeHaefter + 1
   
            If rs("Pages") = 4 then
                SamletAntalHaefter4S = SamletAntalHaefter4S + rs("Amount")
                SamletAntalHaefter = SamletAntalHaefter + rs("Amount")
            Else
                SamletAntalHaefter8S = SamletAntalHaefter8S + rs("Amount")
                SamletAntalHaefter = SamletAntalHaefter + rs("Amount")
            End if
               
            RS.MoveNext
   
        Loop
   
        RS.Close
        Set RS = Nothing
        Conn.Close
        Set Conn = Nothing
       
        Response.Write "<b>" & MaanedNavn(Maaned) & " - " & Aar & "</b><br>"
        Response.Write "Antal forskellige: " & AntalForskelligeHaefter & "<br>"
        Response.Write "Samlet antal 4-sidet: " & SamletAntalHaefter4S & "<br>"
        Response.Write "Samlet antal 8-sidet: " & SamletAntalHaefter8S & "<br>"
        Response.Write "Samlet antal: " & SamletAntalHaefter & "<br><br>"
       
        Omgange = Omgange + 1
       
        Maaned = Maaned - 1
       
        If Maaned < 1 then
            Maaned = 12
            Aar = Aar - 1
        end if
       
    Loop
   
    Function Maanednavn(Maaned)
        Select Case Maaned
            Case 1
                Maanednavn = "Januar"
            Case 2
                Maanednavn = "Februar"
            Case 3
                Maanednavn = "Marts"
            Case 4
                Maanednavn = "April"
            Case 5
                Maanednavn = "Maj"
            Case 6
                Maanednavn = "Juni"
            Case 7
                Maanednavn = "Juli"
            Case 8
                Maanednavn = "August"
            Case 9
                Maanednavn = "September"
            Case 10
                Maanednavn = "Oktober"
            Case 11
                Maanednavn = "November"
            Case 12
                Maanednavn = "December"
            Case Else
                Maanednavn = "Ukendt Maaned (Fejl?)"
        End Select
    End Function
   
%>
Avatar billede softspot Forsker
12. juli 2011 - 11:51 #1
Umiddelbart kunne det skyldes at Amount er NULL for nogle rækker i det resultat du udtrækker. Du kunne måske løse det ved at kode din indre løkke således:

        Do While NOT RS.EOF
   
            amount = rs("Amount")
            if isnull(amount) then
                amount = 0

            AntalForskelligeHaefter = AntalForskelligeHaefter + 1
   
            If rs("Pages") = 4 then
                SamletAntalHaefter4S = SamletAntalHaefter4S + amount
                SamletAntalHaefter = SamletAntalHaefter + amount
            Else
                SamletAntalHaefter8S = SamletAntalHaefter8S + amount
                SamletAntalHaefter = SamletAntalHaefter + amount
            End if
               
            RS.MoveNext
   
        Loop
Avatar billede zed_one Praktikant
12. juli 2011 - 12:11 #2
Hej Softspot

Tak for svaret - prøvede det af, men det gav desværre samme resultat.

Hvis jeg derimod indsatte en elseif istedet for min else altså "Elseif rs("Pages") = 8 then", så gir det et output. Så der må næsten være noget uanvendelig data i databasen, som jeg hellere må få checket ordentligt op på, for at sikre at min statistik giver anstændige resultater. Der burde dog ikke blive skrevet andet end 4, 8 og ingenting i mine database-entries, men må få kigget på de xml-filer der bliver indlæst deri, til hver ordre.
Avatar billede softspot Forsker
12. juli 2011 - 12:26 #3
Det er med stor sandsynlighed en null-værdi eller en anden ugyldig (ikke numerisk) værdi, der gør at der bliver udskrevet et tomt resultat.

Jeg tror du har ret i, at der er data i databasen, som ikke lever helt op til kravene om enten af være 4- eller 8-siders hæfter. Din elseif løser så problemet, men du kunne også prøve at ændre disse linjer:

            amount = rs("Amount")
            if isnull(amount) then
                amount = 0

Til

            amount = rs("Amount")
            if not isnumeric(amount) or isempty(amount) or isnull(amount) then
                amount = 0
Avatar billede zed_one Praktikant
12. juli 2011 - 13:02 #4
Prøver det lige af :) har lavet en udlæsning nu, hvor hvis det ikke er "4" eller "8" der dukker op, at der så udskrives seperat hvad der står - og det gir enkelte blanke fejludlæsninger.
Avatar billede zed_one Praktikant
12. juli 2011 - 13:04 #5
Ja det løste det også :)
Avatar billede zed_one Praktikant
13. juli 2011 - 11:39 #6
Smid gerne lige et svar, så du kan få point.

Til info endte det med at se sådan ud:
http://mail.green-graphic.dk/ShowStatistics.asp

Min udskrevne html, er vist ikke helt efter standarderne, så Firefox viser siden bedst.

Koden:
<html>

<head>
<LINK REL=StyleSheet HREF="styles.css" TYPE="text/css">
</head>

<body bgcolor="WHITE">

<table border=0  align=center>
<tr><td colspan="3"><div align=center><h1>Statistik</h1></div></td></tr>
<tr><td colspan="3" valign=bottom><div align=left valign=bottom>
<%
    Dim AntalMaaneder, Omgange, Maaned
    Dim AntalHaefterDag(31), MaxAntalHaefter, MinAntalHafter, MaanedSidsteDag, DageUdenWeekender
    Dim AntalForskelligeHaefter, SamletAntalHaefter, SamletAntalHaefter4S, SamletAntalHaefter8S, Amount
   
    AntalMaaneder = 5
    Omgange = 0
    Maaned = Month(Now())
    Aar = Year(Now())
    TidsforbrugPrHaefte = 0.161
   
    Do while Omgange < AntalMaaneder
   
        'Nulstil variabler
        AntalForskelligeHaefter = 0
        SamletAntalHaefter4S = 0
        SamletAntalHaefter8S = 0
        SamletAntalHaefter = 0
        Amount = 0
        MaanedSidsteDag = 0
        DageUdenWeekender = 0
        MaxAntalHaefter = 0
        MinAntalHaefter = 0
   
        'connection
        Set Conn = Server.CreateObject("ADODB.Connection")
        Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("../db/EDC_DB.mdb")
        Set RS = CreateObject("ADODB.RecordSet")
        strsql = "SELECT * FROM detaljer WHERE RecievedMonth='" & Maaned & "' AND RecievedYear='" & Aar & "' ORDER by ID DESC"
        RS.Open strsql, Conn, 1, 3
       
        Do While NOT RS.EOF
   
            Amount = rs("Amount")
            if not isnumeric(amount) or isempty(amount) or isnull(amount) then Amount = 0
           
            'optæl antal forskellige hæfter
            AntalForskelligeHaefter = AntalForskelligeHaefter + 1
           
            'optæl antal samlede hæfter
            If rs("Pages") = 4 then
                SamletAntalHaefter4S = SamletAntalHaefter4S + Amount
                SamletAntalHaefter = SamletAntalHaefter + Amount
            Else
                SamletAntalHaefter8S = SamletAntalHaefter8S + Amount
                SamletAntalHaefter = SamletAntalHaefter + Amount
            End if
           
            If Cint(rs("RecievedDay")) > MaanedSidsteDag then MaanedSidsteDag = Cint(rs("RecievedDay"))
           
            AntalHaefterDag((Cint(rs("RecievedDay"))-1)) = (AntalHaefterDag((rs("RecievedDay")-1)) + Cint(Amount))
           
            RS.MoveNext
   
        Loop
   
        RS.Close
        Set RS = Nothing
        Conn.Close
        Set Conn = Nothing
       
        'Udregn dage uden weekender i en måned
        For loekke = 1 to MaanedSidsteDag
            Dag = DatePart("w", DateSerial(Aar, Maaned, loekke))
            If Left(WeekdayName(dag),1) <> "l" AND Left(WeekdayName(dag),1) <> "s" then DageUdenWeekender = DageUdenWeekender + 1
        Next
       
        'Udregn Max og Min antal hæfter på en dag
        MinAntalHaefter = AntalHaefterDag(0)
        For loekke = 1 to MaanedSidsteDag
            Dag = DatePart("w", DateSerial(Aar, Maaned, loekke))
            If AntalHaefterDag(Loekke-1) > MaxAntalHaefter then
                MaxAntalHaefter = AntalHaefterDag(Loekke-1)
                IF Loekke = 1 then
                    If Left(WeekdayName(dag),1) = "m" then MaxAntalHaefter = MaxAntalHaefter
                Elseif Loekke = 2 then
                    If Left(WeekdayName(dag),1) = "m" then MaxAntalHaefter = MaxAntalHaefter + AntalHaefterDag(Loekke-2)
                else
                    If Left(WeekdayName(dag),1) = "m" then MaxAntalHaefter = MaxAntalHaefter + AntalHaefterDag(Loekke-2) + AntalHaefterDag(Loekke-3)
                end if
            End if
            If AntalHaefterDag(Loekke-1) < MinAntalHaefter then MinAntalHaefter = AntalHaefterDag(Loekke-1)
        Next
       
        'Vis tekst-statistik
        Response.write "<tr><td valign=bottom>"
        Response.write "<table border=0 width=250>"
        Response.Write "<tr><td colspan=2><b>" & MaanedNavn(Maaned) & " - " & Aar & "</b></td></tr>"
        Response.Write "<tr><td>Antal forskellige:</td><td align=right>" & AntalForskelligeHaefter & "</td></tr>"
        Response.Write "<tr><td>Samlet antal 4-sidet:</td><td align=right>" & SamletAntalHaefter4S & "</td></tr>"
        Response.Write "<tr><td>Samlet antal 8-sidet:</td><td align=right>" & SamletAntalHaefter8S & "</td></tr>"
        Response.Write "<tr><td valign=Top>Samlet antal:</td><td align=right>" & SamletAntalHaefter & "</td></tr>"
        Response.Write "<tr><td valign=Top>Tidsforbrug pr. dag:</td><td align=right>" & FormatNumber((((SamletAntalHaefter*TidsforbrugPrHaefte)/DageUdenWeekender)/60),2) & " timer</td></tr>"
        'Response.Write "<tr><td valign=Top>Min tidsforbrug pr. dag:</td><td align=right>" & FormatNumber((MinAntalHaefter*TidsforbrugPrHaefte)/60,2) & " timer</td></tr>"
        Response.Write "<tr><td valign=Top>Max tidsforbrug pr. dag:</td><td align=right>" & FormatNumber((MaxAntalHaefter*TidsforbrugPrHaefte)/60,2) & " timer</td></tr>"
        'Response.write "<tr><td valign=Top>Max antal haefter:</td><td align=right>" & MaxAntalHaefter & "</td></tr>"
        Response.write "<tr><td colspan=2></td></tr></table>"
        Response.write "</td><td width=40></td>"
        Response.write "<td valign=bottom><table border=0><tr>"
       
        Response.Write "</tr><tr>"
       
        'Vis graf
        For loekke = 1 to MaanedSidsteDag
            Response.write "<td valign=bottom align=center width=5px>" &  AntalHaefterDag(Loekke-1) &"<br><img src=img/streg.gif width=5 height=" & (AntalHaefterDag(Loekke-1)/10) & "></td>"
        Next
       
        Response.Write "</tr><tr>"
       
        'Vis tal-dag
        For loekke = 1 to MaanedSidsteDag
            Response.write "<td valign=bottom align=center width=5px>" & loekke & ".</td>"
        Next

        Response.Write "</tr><tr>"
       
        'Vis dagsnavn
        For loekke = 1 to MaanedSidsteDag
            Dag = DatePart("w", DateSerial(Aar, Maaned, loekke))
            Response.write "<td valign=bottom align=center width=5px>" & Left(WeekdayName(Dag),1) & "</td>"
        Next
               
        response.write "</tr></table>"
        response.write "</td></tr>"
        response.write "<tr height=20><td height=20 colspan=3><div align=center><hr></div></td></tr>"
               
        Erase AntalHaefterDag
       
        Omgange = Omgange + 1
       
        Maaned = Maaned - 1
       
        If Maaned < 1 then
            Maaned = 12
            Aar = Aar - 1
        end if
       
    Loop
   
    Function Maanednavn(Maaned)
        Select Case Maaned
            Case 1
                Maanednavn = "Januar"
            Case 2
                Maanednavn = "Februar"
            Case 3
                Maanednavn = "Marts"
            Case 4
                Maanednavn = "April"
            Case 5
                Maanednavn = "Maj"
            Case 6
                Maanednavn = "Juni"
            Case 7
                Maanednavn = "Juli"
            Case 8
                Maanednavn = "August"
            Case 9
                Maanednavn = "September"
            Case 10
                Maanednavn = "Oktober"
            Case 11
                Maanednavn = "November"
            Case 12
                Maanednavn = "December"
            Case Else
                Maanednavn = "Ukendt Maaned (Fejl?)"
        End Select
    End Function
   
%></div></td></tr>
<tr height=80><td colspan="7" valign=top><div align=center></div></td></tr>
</table>

</body>

</html>
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
Kategori
Kurser inden for grundlæggende programmering

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