Använder denna ful-kod för få ut inskrivna timmar men finns det något sätt att räkna ihop timmarna utan att skriva ut dubletterna? Så här skrivs det ut nu:
Övrigt 80
Övrigt 26
Mil 40
Mil 21
<%
Dim ob50,ob100
strTimmar=0
SQL="SELECT arbetsplats, kneg_id,start_datum,id, totalt_tim_ob_50, totalt_tim_ob_100 FROM arbetsrapporter WHERE arbets_status=1 AND arbetsplats='"& SafeSQL(Request.QueryString("arbetsplats")) &"' ORDER BY start_datum"
Set Rs = Connect.Execute(SQL)
If not Rs.EOF Then
Do Until Rs.EOF
Set Rs2 = Connect.Execute("SELECT * FROM typ_av_jobb")
Do Until Rs2.EOF
Set Rs3 = Connect.Execute("SELECT SUM( utford_tid ) as totalt FROM utfort_arbete WHERE arbetsrapport_id ='"& Rs("id") &"' AND typ_av_jobb_id='"& Rs2("id") &"'")
If Rs3("totalt")<>"" Then
strTimmar=strTimmar+Rs3("totalt")
%>
<tr>
<td><%=Rs2("namn")%></td>
<td><%=Rs3("totalt")%></td>
<td><%=Rs2("a-pris")%></td>
<td><%=strSumman%></td>
</tr>
<tr>
<td colspan="4" bgcolor="#666666" height="1"></td>
</tr>
<%
End If
strSumman=0
Rs3.Close : Set Rs3=nothing
Rs2.MoveNext
Loop
Rs2.Close : Set Rs2=nothing
Rs.MoveNext
Loop
End If
Rs.Close : Set Rs=nothing
%>
Denna fråga bör, med reservation för stavfel och tankefel, hämta all data du vill ha ut med en fråga. Den innehåller dock nog ett par saker du inte har sett förut, förklaring nedan.
" <- Ignorera. Det cittatecknet finns bara där för att lura forumet att färgkoda SQL'en.
SQL = "SELECT "&_
" r.arbetsplats, r.kneg_id, r.start_datum, r.id AS r_id, r.totalt_tim_ob_50, r.totalt_tim_ob_100 "&_
" t.id AS t_id, t.namn, t.`a-pris`, "&_
" SUM( a.utford_tid ) as totalt "&_
"FROM arbetsrapporter r, typ_av_jobb t "&_
"LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"&_
"WHERE "&_
" a.arbets_status=1 AND "&_
" a.arbetsplats='"& SafeSQL(Request.QueryString("arbetsplats")) & "' "&_
"GROUP BY r.id, t.id "&_
"ORDER BY r.start_datum, t.namn "
Först av allt det första cittattecknet. Det finns där enbart för att lura forumets kod att färglägga SQL-koden. Det ska alltså inte kopieras in i din kod
För att göra SQL-koden mer läsbar har jag delat upp den över flera rader. För att slippa slå ihop allt till en rad har jag använt ett trick i ASP där man har en sträng på varje rad och använder & för att sammanfoga raderna. _ på slutet av en rad gör att raderna sammanfogas.
"FROM arbetsrapporter r, typ_av_jobb t "&_
"LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"
...är alltså samma sak som...
"FROM arbetsrapporter r, typ_av_jobb t "&"LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"
...som i sin tur är samma sak som
"FROM arbetsrapporter r, typ_av_jobb t LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"
...efter sammanfogning av strängarna
Notera två saker.
_ måste stå allra sist på raden, du kan inte ha mellanslag eller annat efter _-tecknet.
I exemplet ovan har jag ett mellanslag efter typ_av_jobb t. Skulle du inte ha det mellanslaget där så skulle den biten av strängen slås ihop till ...typ_av_jobb tLEFT... vilket skulle ge syntaxfel iochmed att det inte finns något som heter tLEFT.
Jag använder joins i koden. Jag tänker inte beskriva i detalj hur dessa fungerar, men de knyter ihop innehållet i två eller flera tabeller och undviker konstruktioner som ...arbetsrapport_id ='"& Rs("id") &"' ...
Jag skapar alias för tabellnamnen som typ arbetsrapporter r vilket gör att man kan komma åt värden från den tabellen genom att skriva t ex r.id. Detta är behändigt för att skapa ordning och dessutom nödvändigt när du har fler kolumner med samma namn, som id, för att skilja dessa åt.
När du hämtar ut dessa två id-värden måste du även skapa alias för själva kolumn-namnen, t ex r.id AS r_id. Du måste uppenbarligen skriva Rs3("r_id") resp. Rs3("t_id") för att plocka ut dessa värden.
Kolumnen a-pris kan tolkas som "a minus pris" och ge ett syntaxfel. Det löser man genom att sätta namnet inom `` (grav accent). De grava accenterna fungerar som ett slags citattecken för tabell- samt kolumn-namn. Bör ej blandas ihop med '' (enkelcitat).
För att beräkna summan på önskat sätt använder jag SUM() tillsammans med GROUP BY r.id, t.id. GROUP BY grupperar resultatet efter kombinationer av rapporter och arbetstyp. För varje kombination beräknas summan av arbetstimmar.
Allra sist sorteras resultatet efter startdatum, och sedan namn.
Det var nog allt. Om något är oklart eller om koden inte funkar, fråga...
Justja en sak till... Ang. tabellen typ_av_jobb... Hur mycket data finns där? Eventuellt kan det vara en idé att lagra informationen i den som en kolumn i arbetsrapporter.
256 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e