kanske är fel ut men något liknande detta kanske?
sQuery = "SELECT isnull( COUNT(ID), 0) as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"
11 svar · 884 visningar · startad av phred
Hej postar detta under denna kategori och hoppas det blir rätt.
sQuery = "SELECT COUNT(ID) as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"
......
While oReader.Read()
strXML = strXML & "<set name='" & oReader.GetInt32(1) & "' value='" & oReader.GetInt32(0) & "' />"
End While
Denna skriver då ut antal poster som har timm 14 tex.
Men problemet är att jag måste skriva ut alla timmar oavsett om dem inte har något värde.
Om det nu finns två poster i databasen som har timme 14 och 18 så kommer jag få ut två rader med värdet 14 och 18.
då skriver den alltså ut något sånt här: 4st kl 14 och 15st kl 18.
men jag skulle vilja skriva ut 0st kl 01, 0st kl 02 osv fram till 14 kommer.
Jag har försökt fått in nån For loop men det skiter sig bara :D
Ja hoppas nån fattar :)
kanske är fel ut men något liknande detta kanske?
sQuery = "SELECT isnull( COUNT(ID), 0) as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"
Tack för svaret.
Dock gav det inget resultat, det jag vill göra är att skriva ut alla timmar på ett dygn ex:
strXML = strXML & "<set name='" 01 "' value='" & 0 & "' />"
strXML = strXML & "<set name='" 02 "' value='" & 0 & "' />"
strXML = strXML & "<set name='" 03 "' value='" & 0 & "' />"
osv.
Ända tills det finns ett klockslag(timme) som har ett värde högre än 0 då ska det komma in följande
strXML = strXML & "<set name='" & oReader.GetInt32(1) & "' value='" & oReader.GetInt32(0) & "' />"
Tack för hjälpen.
EDIT*
Det kanske inte ens är rätt väg att gå med OdbcDataReader, While oReader.Read() ?
For i = 0 To 23
oReader.Read()
If oReader.GetInt32(1) = i Then
strXML = strXML & "<set name='" & i & "' value='" & oReader.GetInt32(0) & "' />"
oReader.Read()
Else
strXML = strXML & "<set name='" & i & "' value='0' />"
End If
Next
Detta är ett av alla mina tappra försök ;)
Jag sitter just nu och rispar mig på mjälten för det är det enda som får mig att må lite bra i detta..
Felmeddelandet jag får är: "Det finns inga data för raden/kolumnen."
Men hur ska jag hantera detta på bästa sätt ?
Tack!
/F
Det går väl att "skriva om" C# till vb också.
Jag kanske tänker fel, men om jag kör koden jag skrev tidigare så läser jag ju från oReader oavsett om den skriver ut något eller inte, då tar ju raderna "slut" innan jag kommit till rätt ställe i loopen ?
Rätta mig om jag har fel här.
Hjälp mig gärna också :D
Du måste flytta ut din första read utanför for-loopen. Sen så behöver du lägga in en kontroll om du har kommit till slutet av ditt resultat.
Nu vet jag inte hur man kontrollerar om det finns något data i en reader men pseudokodsmässigt
oReader.Read()
For i = 0 To 23
if not oReader.eof and oReader.GetInt32(1) = i Then
strXML = strXML & "<set name='" & i & "' value='" & oReader.GetInt32(0) & "' />"
oReader.Read()
Else
strXML = strXML & "<set name='" & i & "' value='0' />"
End If
Next
Du får alltså byta oReader.eof till något lämpligt
Tack LarsG (och ni andra)
Jag hade på känn att det var något liknande.
if oReader.HasRows and oReader.GetInt32(1) = i Then
fungerade finfint.
Jag var nog lite snabb att sätta tråden som löst. Det fungerade fint när jag testade, dock hade jag ett hårdkodat värde för vilket id den skulle hämta från databasen.
När jag sen byter till ett dynamiskt värde så fungerar det inte alls (jag får med mig ett värde). Då får jag bara "Det finns ingen data..." igen OM jag inte väljer den posten som jag använde när jag hårdkodade det hela.
sQuery = "SELECT COUNT(ID) as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"
oCommand = PCommand(sQuery, oConn)
oCommand.Parameters.Add("", intid) 'Detta fungerar bara med en enda post i databasen.
oReader = oCommand.ExecuteReader()
oReader.Read()
For i = 0 To 23
If oReader.HasRows And oReader.GetInt32(1) = i Then
If oReader.GetInt32(1) < 10 Then
strXML = strXML & "<set name='0" & i & ":00' value='" & oReader.GetInt32(0) & "' />"
Else
strXML = strXML & "<set name='" & i & ":00' value='" & oReader.GetInt32(0) & "' />"
End If
oReader.Read()
Else
If i < 10 Then
strXML = strXML & "<set name='0" & i & ":00' value='0' />"
Else
strXML = strXML & "<set name='" & i & ":00' value='0' />"
End If
End If
Next
Nu 'r det dags igen!
sQuery = "SELECT COUNT(EMAIL_ID)as CNT, datepart(hh, TimeStamp) FROM CLICK_STAT WHERE MAILING_ID=? and LINK_ID=0 GROUP BY datepart(hh, TimeStamp)"
oCommand = PCommand(sQuery, oConn)
oCommand.Parameters.Add("", intid)
oReader = oCommand.ExecuteReader
While oReader.Read
If oReader.GetInt32(1) < 10 Then
strXML = strXML & "<set name='0" & oReader.GetInt32(1) & ":00' value='" & oReader.GetInt32(0) & "' />"
Else
strXML = strXML & "<set name='" & oReader.GetInt32(1) & ":00' value='" & oReader.GetInt32(0) & "' />"
End If
End While
strXML = strXML & "</graph>"
oReader.Close()
Det här fungerar finfint.
MEN! mitt problem är alltså att jag vill skriva ut timmar som inte finns i datepart(hh, TimeStamp) mellan 00 och 23, i exemplet ovan så har jag värden i timme 02, 11, 15 och 18. Det skulle alltså betyda att jag vill i rätt ordning skriva ut:
01
värde från datbasen
03
04
05
06
07
08
09
10
värde från databasen
12
13
14
värde från databasen
osv...
Som ni ser så har jag återgått till denna while istället för min tidigare For i = 0 osv. Just för att få en "fresh start".
Jag kanske tänker helt fel, men snälla hjälp mig i rätt riktning i så fall :stud
/F