webForumDet fria alternativet

Räkna volym och energi för varje enskild datum

ASP

68 svar · 937 visningar · startad av plelkes · sida 2 av 4

Frågan, av plelkes

Just nu ser koden ut <% pat = Request.Form("rapport") Set vbalans = Server.CreateObject("ADODB.Connection") vbalans.Provider = "Microsoft.Jet.OLEDB.4.0" MdbFilePath = Server.MapPath("\vatskebalans\db\vbalans.mdb") vbalans.ConnectionString = "Data Source='" & MdbFilePath & "'" vbalans.open strSQL = "SELECT f.FluidNamn, f.FluidID, v.Dag, v.PatID, v.Volym, v.Energi," & " p.ftEnamn, p.

Läs frågan i sin helhet →
Medlem sedan apr. 2004778 inlägg
#21

Korrigering.
Ser att du missat i din utskrift.

                        Response.Write "<TR><TD> </TD>"
			Response.Write "<TD> </TD>"
			Response.Write "<TD><B><U>Volym givet idag:</U></B></TD>"
			Response.Write "<TD>" & v & "</TD></TR>"
			Response.Write "<TR><TD> </TD>"
			Response.Write "<TD> </TD>"
			Response.Write "<TD><B><U>Givet energi</U></B></TD>"
			Response.Write "<TD>" & e & "</TD></TR>"

Ska det vara. Du hade inte TD cellerna rätt.

Medlem sedan mars 2002823 inlägg
#22

Rikard, jag försökte skriva pseudokod,men misslyckats!

Men det stämmer fortfarande inte helt med din kod...
prova själv och kryssa i tex Elvansson..
då ser du

  1. "tabellen" ser konstigt ut
  2. för sista posten skrivs inte summeringen ut
  3. datumen kommer i oordning

Koden ser ut som följer:

<%@ Language=VBScript LCID=1053%>
<HTML>
<title>Rapport</title>
<BODY>
 <%
pat = Request.Form("rapport")
Set vbalans = Server.CreateObject("ADODB.Connection")
vbalans.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("\vatskebalans\db\vbalans.mdb")
vbalans.ConnectionString = "Data Source='" & MdbFilePath & "'"
vbalans.open
strSQL = "SELECT f.FluidNamn, f.FluidID, v.Dag, v.PatID, v.Volym, v.Energi," &_
         " p.ftEnamn, p.ftFnamn FROM (tblVetskebalans v INNER JOIN tblFluids f"&_
          " ON v.FluidID = f.FluidID) INNER JOIN tblPersonuppgifter p ON v.PatID = p.PatID" &_
          " WHERE p.PatID = "& pat &""
		  Set rs1 = vbalans.Execute (strSQL)
'formatera till svensk personnummer
Function SvPnr(txt)
      personnummer =Left(txt,6) & " - " & Right(txt,4)
  SvPnr = personnummer
End Function
Function FirstVersal(txt)
      versal = UCase(Left(txt,1)) & LCase(Right(txt, Len(txt)-1))
  FirstVersal = versal
End Function
    Response.Write SvPnr(rs1("PatID")) & "<BR>"
    Response.Write "<B>" & FirstVersal(rs1("ftEnamn")) & ", " & FirstVersal(rs1("ftFnamn")) & "</B><P><P><P>"
%>
<TABLE border=1>
  <TR>
    <TD><B>Datum</B></TD>
    <TD><B>Vätska</B></TD>
    <TD><B>Volym</B></TD>
    <TD><B>Energi</B></TD>
   </TR>
<%
dat = "" 
v = 0
e = 0
Response.Write "<table>"
Do While Not rs1.EOF
	If dat <> CDate(rs1("Dag")) then
		if not dat = "" then
			Response.Write "<TR><TD>&nbsp; </TD>"
			Response.Write "<TD>&nbsp;</TD>"
			Response.Write "<TD><B><U>Volym givet idag:</U></B></TD>"
			Response.Write "<TD>" & v & "</TD></TR>"
			Response.Write "<TR><TD>&nbsp;</TD>"
			Response.Write "<TD>&nbsp;</TD>"
			Response.Write "<TD><B><U>Givet energi</U></B></TD>"
			Response.Write "<TD>" & e & "</TD></TR>"
		end if
		v = cint(rs1("Volym"))
		e = cint(rs1("Energi"))
		dat = CDate(rs1("Dag")) 
		Response.Write "<TR><TD>" & CDate(rs1("Dag"))& "</TD>"
		Response.Write "<TD>" & rs1("FluidNamn") & "</TD>"
		Response.Write "<TD>" & rs1("Volym") & "</TD>"
		Response.Write "<TD>" & rs1("Energi") & "</TD></TR>"
	Else
		v = v + cint(rs1("Volym"))
		e = e + cint(rs1("Energi"))
		Response.Write "<TR><TD>&nbsp;</TD>"
		Response.Write "<TD>" & rs1("FluidNamn") & "</TD>"
		Response.Write "<TD>" & rs1("Volym") & "</TD>"
		Response.Write "<TD>" & rs1("Energi") & "</TD></TR>"
	End If
rs1.MoveNext
Loop

vbalans.Close
Set vbalans = Nothing
%>
<BR><BR><BR>
</TABLE>

</body>
</html>
Medlem sedan apr. 2004778 inlägg
#23

1. Om du hade gjort som jag sa och kollat sourcen hade du sett att det även låg en <table> för mycket. Jag visste ju inte hur din kod såg ut när jag gav mitt förslag. Läs alltid koden och kolla så att den passar i ditt sammanhang.
Lösning: ta bort raden
Response.Write "<table>"
som finns direkt efter första e= 0

2. Efter Loop lägg till

if not dat = "" then
  Response.Write "<TR><TD>  </TD>"
  Response.Write "<TD> </TD>"
  Response.Write "<TD><B><U>Volym givet idag:</U></B></TD>"
  Response.Write "<TD>" & v & "</TD></TR>"
  Response.Write "<TR><TD> </TD>"
  Response.Write "<TD> </TD>"
  Response.Write "<TD><B><U>Givet energi</U></B></TD>"
  Response.Write "<TD>" & e & "</TD></TR>"
end if

3. Om du ska ha rätt datumordning måste du sortera din SQL-fråga efter datum. Lägg till
ORDER BY v.dag
sist i din SQL-fråga.

Medlem sedan mars 2002823 inlägg
#24

Men du har redan

if not dat = "" then
  Response.Write "<TR><TD>  </TD>"
  Response.Write "<TD> </TD>"
  Response.Write "<TD><B><U>Volym givet idag:</U></B></TD>"
  Response.Write "<TD>" & v & "</TD></TR>"
  Response.Write "<TR><TD> </TD>"
  Response.Write "<TD> </TD>"
  Response.Write "<TD><B><U>Givet energi</U></B></TD>"
  Response.Write "<TD>" & e & "</TD></TR>"
end if

högre upp i hirarkin

  1. varför skall det stådär uppe innan ens "dagens vätskor "skrivs ut?
  2. varför skriva samma kod efter loopen?
Medlem sedan mars 2002823 inlägg
#25

PDahlen skrev:

Om du ska ha rätt datumordning måste du sortera din SQL-fråga efter datum. Lägg till
ORDER BY v.dag
sist i din SQL-fråga

fungerade tyvärr inte

Medlem sedan apr. 2004778 inlägg
#26

Hur ser din SQL-fråga ut nu då?

Medlem sedan mars 2002823 inlägg
#27
strSQL = "SELECT f.FluidNamn, f.FluidID, v.Dag, v.PatID, v.Volym, v.Energi," &_
         " p.ftEnamn, p.ftFnamn FROM (tblVetskebalans v INNER JOIN tblFluids f"&_
          " ON v.FluidID = f.FluidID) INNER JOIN tblPersonuppgifter p ON v.PatID = p.PatID" &_
          " WHERE p.PatID = "& pat &" ORDER BY v.dag"
Medlem sedan apr. 2004778 inlägg
#28

Är v.Dag verkligen ett datum, annars funkar inte sorteringen?
Jag kollade din sida igen och datumen är sorterade men det blir ändå någon konstig sortering.

Medlem sedan mars 2002823 inlägg
#29

Är v.Dag verkligen ett datum

Menar du vilken fält det är? i så fall är det av typen text... annars fick jag ej till vissa tidigare villkor

Medlem sedan apr. 2004778 inlägg
#30

Ok, där har du problemet. Eftersom fältet inte är datum så sorteras det inte på rätt sätt. Det sorteras som en sträng istället för ett datum.

Släng in en fråga i SQL-forumet om det går att konvertera text-fältet till datum i ORDER BY.
Så kan vi lämna den här tråden nu. ;)

Medlem sedan mars 2002823 inlägg
#31

Men du Patrik, jag är fortfarande stum av beundran för din kod.
Och för att vara ärlig så förstår jag inte hur/varför koden funkar.
Kan du berätta hur du har tänkt?

Medlem sedan apr. 2004778 inlägg
#32

Inget speciellt egentligen när man tänker programmatiskt. Jag har tänkt logiskt helt enkelt. ;)

Det vanligaste misstaget är nog att man tror att det är mer komplicerat än vad det är.
Det första man kan göra är att rita upp ett flödesdiagram. Särskilt om det är större saker man ska göra.

Så här skulle pseudokoden sett ut:

1. Hämta data sorterat efter datum
2. Skapa dagvariabler för volym, energi och "dagen innan"
3. Loopa recordset
4. Kolla om den aktuella dagen är samma som "dagen innan"
5. Om vi är på samma dag gå till 6 om inte gå till 9
6. Addera aktuella värden till volym och energi
7. Skriv ut aktuell data
8. Gå till 3
9. Skriv ut volym och energi eftersom dessa tillhör "dagen innan"
10. Nollställ volym och energi och sätt "dagen innan" till aktuell dag
11. Addera aktuell volym och energi
12. Skriv ut aktuell data
13. Om fler dagar i recordset gå till 3
14. Inga fler dagar så skriv ut volym och energi och avsluta.

När det gäller problemen du fick med utskriften så var det HTML-fel. Om du ska skriva ut komplicerade tabeller så gör en vanlig HTML-tabell först med den struktur du vill ha innan du stoppar in den i ASP-koden. När man sätter response.write runt HTML-koden så är det svårare att felsöka.

Medlem sedan mars 2002823 inlägg
#33

Det jag har problem med att förstå är ffa kodens

if not dat = "" then
  Response.Write "<TR><TD>  </TD>"
  Response.Write "<TD> </TD>"
  Response.Write "<TD><B><U>Volym givet idag:</U></B></TD>"
  Response.Write "<TD>" & v & "</TD></TR>"
  Response.Write "<TR><TD> </TD>"
  Response.Write "<TD> </TD>"
  Response.Write "<TD><B><U>Givet energi</U></B></TD>"
  Response.Write "<TD>" & e & "</TD></TR>"
end if

placering.
Varför just där?
Om jag fattar rättbetyder väl koden:
om datum inte är tom så skriv ut e & v?

Medlem sedan apr. 2004778 inlägg
#34

Anledningen att jag lägger den där är för att när du kommer in i loopen första gången så är dat="". Om du inte har IF-satsen så kommer det göras en utskrift och då är v och e fortfarande 0.
Prova att ta bort
if not dat = "" then
end if
och bara ha själva utskriften så ser du att du får en rad innan alla riktiga värden.

Medlem sedan apr. 2004778 inlägg
#35

Tillägg:
Och anledningen till att den ligger just där är för att det är där du hamnar om aktuell dag INTE är samma som dagen innan. Och om vi har gått till nästa dag så vill vi skriva ut volym och energi för "dagen innan" innan vi börjar räkna volym och energi för aktuell dag.

Medlem sedan mars 2002823 inlägg
#36

Nu fattar jag om möjligt ännu mindre...
Visst är det så att innan jag går vidare till dag 2 i rs1 så vill jag skriva ut dag1´s v & e - så långt är jag med...

dat = ""

betyder väl att recsettet är tomt? dvs dagen innan vi börjar?
Hur får du då det till ( för du lyckas ju uppenbarligen) att )

if not dat =""

betyder "dagen innan"??
Och

If dat <> CDate(rs1("Dag")) then
        Else
End If

är inte det samma sak som )

if not dat =""
Medlem sedan apr. 2004778 inlägg
#37

Detta är själva kollen för att se om vi är på samma dag.

If dat <> CDate(rs1("Dag")) then
        Else
End If

När du kommer in i loopen första gången så är dat = "" och rs1("Dag") är ett datum. Det innebär att koden tolkar det som att vi har kommit till en ny dag. Eftersom en ny dag innebär att volym och energi ska skrivas ut så måste vi göra en extra koll. Eftersom vi vet att dat = "" när loopen påbörjas använder vi

if not dat ="" then

Vad den extra if-satsen gör är att om dat = "", som betyder att vi är inne på första dagen, skriver vi inget. Eftersom vi är på första dagen så finns ju ingen "dagen innan", med andra ord inga värden att skriva ut.

Det går även att sätta dat = rs1("Dag") innan man går in i loopen istället för den extra if-satsen. Det ger samma resultat.

Medlem sedan mars 2002823 inlägg
#38

Tack Patrik - du är en pärla :bire
MEN bara för att kolla att jag har fattat rätt:

  1. kolla om samma dag
  2. Om första dagen:tilldela,skriv ut
  3. Nästa post i recordsettet
  4. Om samma dag: summera, skriv ut allt utom datumet
  5. Loopa tills recordsettet slut
  6. Kolla nästa dag
  7. Om ny dag – kolla om det finns en dag innan
  8. Om ja –skriv ut summa v och summa e
  9. Om nej – gör inget
  10. Upprepa från pkt 2 och frammåt

Gör detta tills alla poster i kolumn rs1(”Dag”) är kollade
11) när vi har kommit till sista posten i rs1(”Dag”): skriv ut summan av v & e

Stämmer?

Medlem sedan apr. 2004778 inlägg
#39

Nej, fel på 2. Om första dagen skriv INTE ut.
Fel på 9. Om inte ny dag, summera. Punkt 4.
Fel på 10. Upprepa från punkt 1 i din lista.

Du har gjort det väldigt rörigt och har ingen logisk sekvens längre. Kolla min lista igen istället.

Medlem sedan mars 2002823 inlägg
#40

Nja, jag tror att vi har missuppfattat varandra:
Med 2 menar jag:
skriv ut Vätska,Volym,energi
Med 9 :
om inte en ny dag så skriv inte ut summan

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