webForumDet fria alternativet

Sorterad dynamisk multi-dimensional array som får sina värden från xml-fil

ASP

9 svar · 690 visningar · startad av zino

Medlem sedan jan. 200247 inlägg
Frågan#1

Hej, har problem med att få in värdena på rätt sätt i den inledande arrayen för att därefter sortera dom i bokstavsordning. Jag får bara ut sista värdet av "file_name" och om jag flyttar "next", i den första For loopen, till sist (längst ned i koden) fungerar inte sorterinskoden, dock får jag ut all värden då.

Jag vet inte om jag använder fel typ av array eller om det "bara" är redim som är fel eller något annat. :OO

Har försökt med att använda redim preserve array(i) och sedan deklarera den (i den första For loopen, men får då inte till hur man lägger till detta i den multi-dimensionella arrayen.

Det jag försöker göra är att hämta in file_name (olika filnamn) med tillhörande information (tex. filens storlek, senast uppdaterad mm), lägga detta i en array och sedan sortera file_name i bokstavsordning.

Så småningom är tanken att man ska kunna sortera alla fyra "fälten" genom att klicka på respektive "fält", men en sak i taget kanske. ;)


If objLst.length > 0 Then
    Dim myArray()

    ' Loop through the list of files
    For i = 0 To (objLst.length - 1)
        ' Redim the array with the new number of items
        Redim PRESERVE myArray(3,0)
        
        ' Get the item names and set then in its place in the array
        myArray(0,0) = objLst.item(i).selectSingleNode("file_name").text
        myArray(1,0) = objLst.item(i).selectSingleNode("update_interval").text
        myArray(2,0) = objLst.item(i).selectSingleNode("update_responsible").text
        myArray(3,0) = objLst.item(i).selectSingleNode("last_saved").text
    next

    for y = 0 To Ubound(myArray, 2)
        for x = UBound(myArray, 2) - 1 To 0 Step -1
            for j = 0 to y
                if myArray(0,j) > myArray(0,j+1) then
                    temp = myArray(0,j+1)
                    myArray(0,j+1) = myArray(0,j)
                    myArray(0,j)=temp
                end if
            next
        next
    next

    for ix = 0 To UBound(myArray, 2)
%>

        <TR>
        <TD WIDTH="25%"><% = myArray(0,ix) %></TD>
        <TD WIDTH="12%"><% = myArray(1,ix) %> </TD>
        <TD WIDTH="25%"><% = myArray(2,ix) %></TD>
        <TD WIDTH="18%"><% = myArray(3,ix) %></TD>
        </TR>

<%
    next    
End If
Medlem sedan juni 20019 519 inlägg
#2

Jag hade hellre skapat upp ett Recordset och gjort min sortering efter det...

Medlem sedan jan. 200247 inlägg
#3

Hm, jag håller på och tittar på det. Det är alltså inga problem med att få in värdena som ligger i en xml-fil till ett Recordset?

Tack för tipset så länge. ;)

Medlem sedan juni 20019 519 inlägg
Medlem sedan jan. 200247 inlägg
#5

Tack för länk-tipset. Får dock inte den att fungera. Får följande felmeddelande:

ADODB.Fields error '800a0bb9'

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

Jag körde exakt samma kod som i länken för att bygga vidare på den, men den fastnade med originalkoden.
Ska väl säga att det var länge sedan jag höll på med recordset så jag har väl glömt något antar jag. :(

Medlem sedan juni 20019 519 inlägg
#6

Rätt Datatyp på fälten underlättar, om du försöker mata in en sträng i en INT så kommer det inte fungera.

Medlem sedan jan. 200247 inlägg
#7

Fastnat igen

Försöker att kombinera min dynamiska array med recordsetet. Jag får ett felmeddelande (Microsoft VBScript runtime error '800a000d' Type mismatch) för följande rad:

rs.Fields("a").Value = myArray(0,x)

Jag försöker få in värdena ifrån arrayen, men är inte säker på hur jag får in detta i recordsetet.
Vad är det jag missar? Är det fortfarande fel datatyp?

Här är koden jag testar med:


<%
Set objXML = Server.CreateObject("MSXML2.DOMDocument.4.0")
objXML.async = False
objXML.Load(server.mappath("updateschedule.xml"))

Set objLst = objXML.getElementsByTagName("contingency_plan_file")
' check if the contingency_plan_file have any nodes 
If objLst.length > 0 Then
    Dim myArray()

    ' Loop through the list of files
    For i = 0 To (objLst.length - 1)
        ' Redim the array with the new number of items (file names)
        Redim PRESERVE myArray(3,0)
        
        ' Get the item names and set then in its place in the array
        myArray(0,0) = objLst.item(i).selectSingleNode("file_name").text
        myArray(1,0) = objLst.item(i).selectSingleNode("update_interval").text
        myArray(2,0) = objLst.item(i).selectSingleNode("update_responsible").text
        myArray(3,0) = objLst.item(i).selectSingleNode("last_saved").text
    next    

Dim rs

set rs = Server.CreateObject("ADODB.RecordSet")
Const adVarChar = 200
rs.Fields.Append "a", adVarChar, 255
rs.Fields.Append "b", adVarChar, 255
rs.Fields.Append "c", adVarChar, 255
rs.Fields.Append "d", adVarChar, 255
rs.Open

for each x in myArray
	rs.AddNew
	rs.Fields("a").Value = myArray(0,x)
	rs.Fields("b").Value = myArray(1,x)
	rs.Fields("c").Value = myArray(2,x)
	rs.Fields("d").Value = myArray(3,x)
	rs.Update
next

rs.sort = "a ASC"

'Skriv ut...
do while not rs.EOF
	response.write rs("a") & " " & rs("b") & " " & rs("c")
	rs.MoveNext
loop

rs.Close
set rs = Nothing
%>
Medlem sedan juni 20019 519 inlägg
#8

Din array är bara en dimension:

        myArray(0,0) = objLst.item(i).selectSingleNode("file_name").text
        myArray(1,0) = objLst.item(i).selectSingleNode("update_interval").text
        myArray(2,0) = objLst.item(i).selectSingleNode("update_responsible").text
        myArray(3,0) = objLst.item(i).selectSingleNode("last_saved").text

Du har ju ingen dynamiskt värde i den myArray är rätt så tom, förstå inte varför du gör två loopar, räcker ju att du loopar igenom din xml fil en gång och ha ett recordset efter det som du gör sorteringen på

<%
Set objXML = Server.CreateObject("MSXML2.DOMDocument.4.0")
objXML.async = False
objXML.Load(server.mappath("updateschedule.xml"))

Set objLst = objXML.getElementsByTagName("contingency_plan_file")
' check if the contingency_plan_file have any nodes 
If objLst.length > 0 Then

	set rs = Server.CreateObject("ADODB.RecordSet")
	Const adVarChar = 200
	rs.Fields.Append "a", adVarChar, 255
	rs.Fields.Append "b", adVarChar, 255
	rs.Fields.Append "c", adVarChar, 255
	rs.Fields.Append "d", adVarChar, 255
	rs.Open

	' Loop through the list of files
	For i = 0 To (objLst.length - 1)
		' Redim the array with the new number of items (file names)
		Redim PRESERVE myArray(3,0)

		rs.AddNew
		rs.Fields("a").Value = objLst.item(i).selectSingleNode("file_name").text
		rs.Fields("b").Value = objLst.item(i).selectSingleNode("update_interval").text
		rs.Fields("c").Value = objLst.item(i).selectSingleNode("update_responsible").text
		rs.Fields("d").Value = objLst.item(i).selectSingleNode("last_saved").text
		rs.Update
	next

	rs.sort = "a ASC"

	'Skriv ut...
	do while not rs.EOF
		response.write rs("a") & " " & rs("b") & " " & rs("c")
		rs.MoveNext
	loop

	rs.Close
	set rs = Nothing
End If

Set objXml = Nothing
%>
Medlem sedan jan. 200247 inlägg
#9

Ja, jag kom på att arrayen var tom. :r Har för närvarande problem att nå min server, men jag har hunnit testa detta sista och det verkar lovande. Tack för hjälpen. Får se hur det går när kontakten med servern kommer tillbaka. ;)

Medlem sedan jan. 200247 inlägg
#10

Servern ät tillbaka och koden fungerar utmärkt. Tack igen! :D

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)