Oprettet man. d. 07. november 2011 kl. 10:15:03

dennisbjorn
dennisbjorn (4.395 point. Point ude: 0)

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

Skrevet man. d. 07. november 2011 kl. 11:08:52| #1

therealyoda
therealyoda (24.771 point)
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

Skrevet man. d. 07. november 2011 kl. 11:24:40| #2

softspot
softspot (101.915 point)
www.softspot.dk
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

Skrevet man. d. 07. november 2011 kl. 11:35:41| #3

dennisbjorn
dennisbjorn (4.395 point)
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.

Skrevet man. d. 07. november 2011 kl. 12:15:33| #4

softspot
softspot (101.915 point)
www.softspot.dk
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

Skrevet man. d. 07. november 2011 kl. 12:32:04| #5

dennisbjorn
dennisbjorn (4.395 point)
Mange tak Softspot - det er helt perfekt.

Der ligger 200 point i et ny spørgsmål til dig.

Skrevet man. d. 07. november 2011 kl. 12:40:36| #6

softspot
softspot (101.915 point)
www.softspot.dk
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 :-)

Skrevet man. d. 07. november 2011 kl. 12:43:26| #7

dennisbjorn
dennisbjorn (4.395 point)
ok - det var jeg ikke klar over.

Men endnu engang tak :-)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

ASP: formular udtræk med mulighed for at rette

Oprettet den 21. maj 2012 kl. 15.09
quarkb giver 200 point for svar | Giv et svar »

Sorter biblioteker efter dato i ASP

Oprettet den 17. maj 2012 kl. 16.52
4ks giver 60 point for svar | Giv et svar »

Simpel login-funktion (web) - behov for flere logins/brugere

Oprettet den 15. maj 2012 kl. 09.54
madx giver 75 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger