Avatar billede dennisbjorn Juniormester
07. november 2011 - 10:15 Der er 6 kommentarer og
1 løsning

Gruppering i array

Jeg henter et text felt (Spareparts) fra en SQL-db og splitter indholdet i et array.
Der returneres 25 linier med to felter:
varenummer = ThisSP(0)
Antal = ThisSP(1)

Hvordan kan jeg gruppere resultatet, således at jeg får summen af antal per varenummer.
Det havde selvfølgelig været nemmere, hvis  dataene var gemt i hver sin linie i databasen, men det er altså ikke tilfældet.




StrSQL="SELECT TOP 25 ID, Spareparts FROM WarrantyClaims "

RS.Open StrSQL,Conn,3,3
If Not RS.EOF Then
While Not RS.EOF
 
  ' split spareparts feltet
    SP=RS.Fields("Spareparts")
    If (SP<>"") Then
      SP=SP&";-:-;-:-"
      SPlist=SPlit(SP,";")
      For F=lBound(splist) to uBound(splist)
        ThisSP=Split(splist(F),":")
        If ThisSP(0)<>"-" Then
         
          response.Write(ThisSP(0))%>&nbsp;<%response.Write(ThisSP(1))%><br><%
           
        End If
      Next
    End If         

       
RS.MoveNext
Wend 
End If
RS.Close
Avatar billede The Real Yoda Juniormester
07. november 2011 - 11:08 #1
Mig bekendt er der ikke som sådan array funktioner i ASP ..
så din eneste udvej er et loop

total=0
for F = lBound(splist) to uBound(splist) step 2
  total = total + cdbl(splist(F+1))
next
Avatar billede softspot Forsker
07. november 2011 - 11:24 #2
Du kunne evt. benytte et dictionary-objekt til at holde alle de unikke varenumre og så blot opsummere hvert varenr for hver iteration.

Skal varenumre summeres og grupperes på tværs af alle de 25 rækker der udtrækkes fra databasen?

Jeg forestiller mig din kode kunne se således ud, hvis summeringen skal ske på tværs af hele udtrækket:

StrSQL="SELECT TOP 25 ID, Spareparts FROM WarrantyClaims"
set dic = Server.CreateObject("Scripting.Dictionary")
RS.Open StrSQL,Conn,3,3
Do While Not RS.EOF
 
  ' split spareparts feltet
    SP=RS.Fields("Spareparts")
    If (SP<>"") Then
      SP=SP&";-:-;-:-"
      SPlist=SPlit(SP,";")
      For F=lBound(splist) to uBound(splist)
        ThisSP=Split(splist(F),":")
        If ThisSP(0)<>"-" Then
          if dic.Exists(ThisSP(0)) then
            dic(ThisSP(0)) = clng(dic(ThisSP(0))) + clng(ThisSP(1))
          else
            call dic.Add(ThisSP(0), clng(ThisSP(1)))
          end if
        End If
      Next
    End If         

       
    RS.MoveNext
Loop 
RS.Close

for each vnr in dic.keys
  response.write vnr & " = " & dic(vnr) & "<br>"
next
Avatar billede dennisbjorn Juniormester
07. november 2011 - 11:35 #3
Hej Softspot,

Dit script virker perfekt!

Et ekstra spørgsmål; kan man også sortere resultatet (faldende) på det summerede antal..?

Du må gerne smide et svar - og jeg giver 200 p. ekstra hvis du kan løse det med sorteringen.
Avatar billede softspot Forsker
07. november 2011 - 12:15 #4
Du kan lige få koden med en bubble-sort. Hvis der er mange data bør du nok overveje om en anden sorteringsalgoritme er på sin plads. Der går lidt CPU-kraft på at konvertere dictionary-data til et array, da det ikke er oplagt at sortere på et dictionary (kan sikkert lade sig gøre, men jeg har ikke lige eksperimenteret med dette).

StrSQL="SELECT TOP 25 ID, Spareparts FROM WarrantyClaims"
set dic = Server.CreateObject("Scripting.Dictionary")
RS.Open StrSQL,Conn,3,3
Do While Not RS.EOF
 
  ' split spareparts feltet
    SP=RS.Fields("Spareparts")
    If (SP<>"") Then
      SP=SP&";-:-;-:-"
      SPlist=SPlit(SP,";")
      For F=lBound(splist) to uBound(splist)
        ThisSP=Split(splist(F),":")
        If ThisSP(0)<>"-" Then
          if dic.Exists(ThisSP(0)) then
            dic(ThisSP(0)) = clng(dic(ThisSP(0))) + clng(ThisSP(1))
          else
            call dic.Add(ThisSP(0), clng(ThisSP(1)))
          end if
        End If
      Next
    End If         

       
    RS.MoveNext
Loop 
RS.Close

' dictionary to array
arr = array()
redim arr(dic.Count - 1)

i = 0
for each k in dic.keys
  arr(i) = array(k, dic(k))
  i = i + 1
next

response.write "data som array:<br>"
for each itm in arr
  response.write itm(0) & " = " & itm(1) & "<br>"
next

' bubblesort array på værdien i faldende orden...
for outer = 0 to ubound(arr) - 1
  for i = 0 to ubound(arr) - outer - 1
    if arr(i)(1) < arr(i + 1)(1) then
      tmp = arr(i)
      arr(i) = arr(i + 1)
      arr(i + 1) = tmp
    end if 
  next
next

response.write "data som sorteret array:<br>"
for each itm in arr
  response.write itm(0) & " = " & itm(1) & "<br>"
next

Hvis du ønsker at ændre sorteringsrækkefølgen ændrer du blot linjen:

    if arr(i)(1) < arr(i + 1)(1) then

til

    if arr(i)(1) > arr(i + 1)(1) then

Vil du sortere på varenummer ændrer du det blot til:

    if arr(i)(1) < arr(i + 1)(1) then

til

    if arr(i)(0) < arr(i + 1)(0) then
Avatar billede dennisbjorn Juniormester
07. november 2011 - 12:32 #5
Mange tak Softspot - det er helt perfekt.

Der ligger 200 point i et ny spørgsmål til dig.
Avatar billede softspot Forsker
07. november 2011 - 12:40 #6
Tak for point.

De andre point må du hellere tage tilbage, da det ikke er tilladt at uddele mere end 200 point pr. spørgsmål - 200 er også helt fint for de svar du har fået i denne tråd :-)
Avatar billede dennisbjorn Juniormester
07. november 2011 - 12:43 #7
ok - det var jeg ikke klar over.

Men endnu engang tak :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester