30. juli 2002 - 23:01Der er
16 kommentarer og 1 løsning
Array uden brug af Javascrpt.
Jeg har fået lavet denne kode. Men ville helst det var lavet uden brug af Javascript. En der kan lave det samme i ren script.
<script type="text/javascript"> listen = new Array(); <% do while not rs.eof if date() - rs(2) > 7 then tid = 7 else tid = date() - rs(2) end if if tid = 0 then tid = 1 if rs(0) <> "" and rs(1) <> "" and rs(2) <> "" then
%> listen[listen.length] = new Array(<%=Round(rs(1)/tid, 0)%>,<%=rs(0)%>,'<%=rs(2)%>',<%=rs(1)%>); <% end if rs.movenext loop %> function docompare(b,c){ return b[0] - c[0]; } function skriv(){ a = listen.sort(docompare).reverse(); str = "<table>"; for (i = 0; i < listen.length; i++){ str += "<tr><td>" + a[i][0] + "</td>"; str += "<td>" + a[i][1] + "</td>"; str += "<td>" + a[i][2] + "</td>"; str += "<td>" + a[i][3] + "</td></tr>"; } str += "</table>"; document.all.her.innerHTML = str; } </script> <body onload="skriv()">
som du ser her: if date() - rs(2) > 7 then tid = 7 else tid = date() - rs(2) end if
Der tjekkes om den er oprettet for mere end 7 dage siden. Hvis den ikke er så deles med antal dage som eksemlvis kan være 3.
Her deles der. <%=Round(rs(1)/tid, 0)%>
Det er lavet som en salgs hitliste. Og netop det at der deles med forskelige dage gør at det kan ændre på række følgen. Derfor skal der bruges en funktion hvor der efterfølgende igen sorteres.
du tager eksvis disse functioner og ligger i bunden af koden eller hvor de er lidt af vejen:
Sub QuickSort(vec,loBound,hiBound,SortField,SortDir) '==--------------------------------------------------------== '== Sort a multi dimensional array on SortField == '== == '== This procedure is adapted from the algorithm given in: == '== ~ Data Abstractions & Structures using C++ by ~ == '== ~ Mark Headington and David Riley, pg. 586 ~ == '== Quicksort is the fastest array sorting routine for == '== unordered arrays. Its big O is n log n == '== == '== Parameters: == '== vec - array to be sorted == '== SortField - The field to sort on (1st dimension value) == '== loBound and hiBound are simply the upper and lower == '== bounds of the array's "row" dimension. It's probably == '== easiest to use the LBound and UBound functions to == '== set these. == '== SortDir - ASC, ascending; DESC, Descending == '==--------------------------------------------------------== if not (hiBound - loBound = 0) then Dim pivot(),loSwap,hiSwap,temp,counter Redim pivot (Ubound(vec,2)) SortDir = UCase(SortDir)
'== Two items to sort if hiBound - loBound = 1 then if (SortDir = "ASC") then if FormatCompare(vec(loBound,SortField),vec(hiBound,SortField)) > FormatCompare(vec(hiBound,SortField),vec(loBound,SortField)) then Call SwapRows(vec,hiBound,loBound) else if FormatCompare(vec(loBound,SortField),vec(hiBound,SortField)) < FormatCompare(vec(hiBound,SortField),vec(loBound,SortField)) then Call SwapRows(vec,hiBound,loBound) end if End If
'== Three or more items to sort For counter = 0 to Ubound(vec,2) pivot(counter) = vec(int((loBound + hiBound) / 2),counter) vec(int((loBound + hiBound) / 2),counter) = vec(loBound,counter) vec(loBound,counter) = pivot(counter) Next
loSwap = loBound + 1 hiSwap = hiBound
do '== Find the right loSwap if (SortDir = "ASC") then while loSwap < hiSwap and FormatCompare(vec(loSwap,SortField),pivot(SortField)) <= FormatCompare(pivot(SortField),vec(loSwap,SortField)) loSwap = loSwap + 1 wend else while loSwap < hiSwap and FormatCompare(vec(loSwap,SortField),pivot(SortField)) >= FormatCompare(pivot(SortField),vec(loSwap,SortField)) loSwap = loSwap + 1 wend end if '== Find the right hiSwap if (SortDir = "ASC") then while FormatCompare(vec(hiSwap,SortField),pivot(SortField)) > FormatCompare(pivot(SortField),vec(hiSwap,SortField)) hiSwap = hiSwap - 1 wend else while FormatCompare(vec(hiSwap,SortField),pivot(SortField)) < FormatCompare(pivot(SortField),vec(hiSwap,SortField)) hiSwap = hiSwap - 1 wend end if '== Swap values if loSwap is less then hiSwap if loSwap < hiSwap then Call SwapRows(vec,loSwap,hiSwap) loop while loSwap < hiSwap
For counter = 0 to Ubound(vec,2) vec(loBound,counter) = vec(hiSwap,counter) vec(hiSwap,counter) = pivot(counter) Next
'== Recursively call function .. the beauty of Quicksort '== 2 or more items in first section if loBound < (hiSwap - 1) then Call QuickSort(vec,loBound,hiSwap-1,SortField,SortDir) '== 2 or more items in second section if hiSwap + 1 < hibound then Call QuickSort(vec,hiSwap+1,hiBound,SortField,SortDir) end if End Sub 'QuickSort
Sub SwapRows(ary,row1,row2) '==------------------------------------------== '== This proc swaps two rows of an array == '==------------------------------------------==
Dim x,tempvar For x = 0 to Ubound(ary,2) tempvar = ary(row1,x) ary(row1,x) = ary(row2,x) ary(row2,x) = tempvar Next End Sub 'SwapRows
function FormatCompare(sOne,sTwo) '==------------------------------------------== '== Checks sOne & sTwo, returns sOne as a == '== Numeric if both pass isNumeric, if not == '== returns sOne as a string. == '==------------------------------------------==
if (isNumeric(Trim(sOne)) AND isNumeric(Trim(sTwo))) then FormatCompare = CDbl(Trim(sOne)) else FormatCompare = Trim(sOne) end if end function
'Er taget med for test Sub PrintArray(vec,loRow,hiRow,markCol) '==------------------------------------------== '== Print out an array Highlight the column == '== whose number matches param markCol == '==------------------------------------------==
Dim ColNmbr,RowNmbr Response.Write "<table border=""1"" cellspacing=""0"">" For RowNmbr = loRow to hiRow Response.Write "<tr>" For ColNmbr = 0 to (Ubound(vec,2) - 1) If ColNmbr = markCol then Response.Write "<td bgcolor=""FFFFCC"">" Else Response.Write "<td>" End If Response.Write vec(RowNmbr,ColNmbr) & "</td>" Next Response.Write "</tr>" Next Response.Write "</table>" End Sub 'PrintArray
-----------------------------------
Din loop lavers vist sådan så:
i = 0 do while not rs.eof if date() - rs(2) > 7 then tid = 7 else tid = date() - rs(2) end if if tid = 0 then tid = 1 if rs(0) <> "" and rs(1) <> "" and rs(2) <> "" then
tempArray(i,0) = Round(rs(1)/tid, 0) tempArray(i,1) = rs(0) tempArray(i,2) = rs(2) tempArray(i,3) = rs(1) i = i+1 end if rs.movenext loop
ok .. hvordan laver jeg en udskriving hvor jeg kan styre inputs ?
Altså ved denne, komemr de jo i samem rækkefølge som det er langt ind.
Sub PrintArray(vec,loRow,hiRow,markCol) '==------------------------------------------== '== Print out an array Highlight the column == '== whose number matches param markCol == '==------------------------------------------==
Dim ColNmbr,RowNmbr Response.Write "<table border=""1"" cellspacing=""0"">" For RowNmbr = loRow to hiRow Response.Write "<tr>" For ColNmbr = 0 to (Ubound(vec,2) - 1) If ColNmbr = markCol then Response.Write "<td bgcolor=""FFFFCC"">" Else Response.Write "<td>" End If Response.Write vec(RowNmbr,ColNmbr) & "</td>" Next Response.Write "</tr>" Next Response.Write "</table>" End Sub 'PrintArray
Ja PrintArray udskriver bare arrayet du skal kalde QuickSort og angive hvilken kolonne du vil sortere på her den første 0 og og det skal være stigne eller faldene her faldene "DESC":
'Sorter arrayet faldene efter første række QuickSort tempArray,lbound(tempArray),ubound(tempArray),0,"DESC"
inkognito, grunden til jeg lavede arrayet i javascript, var at der er indbyggede sorteringsfunktioner. Jeg lavede et eksempel med en vb-array, og en sub som sorterede den, men din server timede ud. Det var faktisk præcis samme sub som eagleye foreslår.
Jeg prøver nogle forskellige løsninger. Grunden er sådan set at jeg skal ind og hente inforamtioner fra en anden database udfra ID nr. Det kunne jeg ikke lige oversjue at kombinere med Javascript.
Hm, jeg kan ikke se at det skulle blive nemmere af at det foregår i VB. Men det må du selvfølgelig selv om. Er spørgsmålet http://www.eksperten.dk/spm/235963 efterhånden ikke svaret?
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.