Meddelande

Minska
No announcement yet.

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

Minska
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

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

    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.

    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.

    Kod:
    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

  • #2
    Jag hade hellre skapat upp ett Recordset och gjort min sortering efter det...
    "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

    Kommentera


    • #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.

      Kommentera


      • #4
        http://www.webforum.nu/showthread.php?t=129476
        "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

        Kommentera


        • #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.

          Kommentera


          • #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.
            "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

            Kommentera


            • #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:


              Kod:
              <%
              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
              %>

              Kommentera


              • #8
                Din array är bara en dimension:[kod] 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[/kod]
                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å

                [kod]<%
                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
                %>[/kod]
                "det går inte att lära en gammal norrlänning byta namn på irc" - gammalt kinesiskt uttryck

                Kommentera


                • #9
                  Ja, jag kom på att arrayen var tom. 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.

                  Kommentera


                  • #10
                    Servern ät tillbaka och koden fungerar utmärkt. Tack igen!

                    Kommentera

                    Working...
                    X