Avatar billede stener Nybegynder
25. august 2006 - 14:30 Der er 21 kommentarer og
6 løsninger

Finde værdier i array

Har et 2 dimisionelt array der bliver dannet ud fra et recordset.

col 1    col 2
1        10
1        12
1        14
1        16
1        9
2        10
2        12
1        13


Tal i col 1 kan være fra 1 og op efter.

Jeg skal ind i arrayet og ligge alle tal i col2 sammen hvor col1  = 1 også bagefter hvor col1 = 2 og bagefter hvor col1 = 3 hvis altså 3 findes i col1. osv osv

Bagefter eller samtidig skal de sammenregnede tal skrives ud.

Hvordan gør jeg det?
Avatar billede montago Praktikant
25. august 2006 - 16:39 #1
function sumi(id, byVar arrayname)
summa = 0
for i=0 to ubound( arrayname )
  if( arrayname(i,0) = id) then
  summa = summa + arrayname(i,1) 
  end if
next
sumi = summa
end Function

dim arr(3,2)
arr(0,0) = 1 : arr(0,1) = 3
arr(1,0) = 2 : arr(1,1) = 2
arr(2,0) = 1 : arr(2,1) = 4

maxtal = 2 ' col1s' højeste værdi
for a=0 to maxtal
  response.write a & " - " & sumi(a,arr)
next
Avatar billede montago Praktikant
25. august 2006 - 16:44 #2
rettelse:

function sumi(id, byVal arrayname)
    summa = 0
    for i=0 to ubound( arrayname )
      if( arrayname(i,0) = id) then
        summa = summa + arrayname(i,1)
      end if
    next
    sumi = summa
end Function

dim arr(3,2)
arr(0,0) = 1 : arr(0,1) = 3
arr(1,0) = 2 : arr(1,1) = 2
arr(2,0) = 1 : arr(2,1) = 4

maxtal = 2 ' col1s' højeste værdi
for a=0 to maxtal
  response.write a & " - " & sumi(a,arr) & "<br>"
next
Avatar billede montago Praktikant
25. august 2006 - 16:45 #3
men hvis værdierne kommer fra recordset fra database ? kan du jo ligeså godt bruge SQL

"Select col1,sum(col2) from tabel group by col1 order by col1"
Avatar billede stener Nybegynder
25. august 2006 - 17:13 #4
Jeg trækker dataene ud fra en datbase men problemet er at jeg kører 3 forsellige sql sætninger med nogle forskellige parametre.

Alle data jeg får ud af de 3 sætniger skal gemmes samlet da alle tal med 1 skal ligges sammen og alle tal med 2 skal ligges sammen.

Tallet er dynamisk og kan variere fra 1 og op. Jeg får følgende ud af mine sql sætninger når jeg ligger dataene i en array.

col 1    col 2
1        10
1        10
2        12
2        12
2        14
5        18
5        18
9        25
9        25
1        14
1        14

Alle steder i col1 hvor tallene er ens skal col2 ligges sammen.

så ved
tal 1 er summen 48
tal 2 er 38

osv

Jeg skal kunne skrive summene ud så jeg kan skrive

Ved tal 1 er summen = 48
Ved tal 2 er summen = 38

Hvis du kan løse det får du 400 point
Avatar billede stener Nybegynder
25. august 2006 - 17:15 #5
Det er tallet i col1 der kan være fra 1 og op
Avatar billede montago Praktikant
25. august 2006 - 17:20 #6
Hvis data kommer fra den samme database, kan jeg løse det direkte i SQL'en

og ellers modificere jeg lige det script jeg lavede
Avatar billede montago Praktikant
25. august 2006 - 17:25 #7
NB. Dette ER løsningen... men jeg vil hellere hjælpe dig med din SQL...

function sumi(id, byVal arrayname)
    summa = 0
    for i=0 to ubound( arrayname )
      if( arrayname(i,0) = id) then
        summa = summa + arrayname(i,1)
      end if
    next
    sumi = summa
end Function

maxtal = 500 ' col1s' højeste værdi du nogensinde kommer ud for
'arr kan udskiftes med det array du allerede har lavet
for a=0 to maxtal
    if( sumi(a,arr) > 0 )then
      response.write "Ved tal "&a&" er summen = " & sumi(a,arr) & "<br>"
    end if
next
Avatar billede montago Praktikant
25. august 2006 - 17:26 #8
output af ovenstående med et test array :

Ved tal 1 er summen = 3
Ved tal 2 er summen = 11
Ved tal 8 er summen = 6
Ved tal 9 er summen = 1
Avatar billede stener Nybegynder
25. august 2006 - 18:15 #9
Min array hedder myArray2

function sumi(id, byVal myArray2)
    summa = 0
    for i=0 to ubound(myArray2)
      if( myArray2(i,0) = id) then
        summa = summa + myArray2(i,1)
      end if
    next
    sumi = summa
end Function

maxtal = 500 ' col1s' højeste værdi du nogensinde kommer ud for
'arr kan udskiftes med det array du allerede har lavet
for a=0 to maxtal
    if( sumi(a,arr) > 0 )then
      response.write "Ved tal "&a&" er summen = " & sumi(a,arr) & "<br>"
    end if
next

Får følgende fejl Type mismatch: 'UBound'

Vi kan også godt prøve med sql'en

Har en sql sætning der bliver kørt x antal gange med forskellige prametre alt efter hvad brugeren vælger:

Hvis den bliver kørt 4 gange ser den således ud (forkortet version da den henter fra mange tabeller):

sql=select * from table 1 where S_G_Id = 117 and S_Year = 2006 And S_Month BETWEEN 1 AND 12

sql=select * from table 1 where S_G_Id = 117 and S_Year = 2007 And S_Month BETWEEN 1 AND 12

sql=select * from table 1 where S_G_Id = 117 and S_Year = 2008 And S_Month BETWEEN 1 AND 12

sql=select * from table 1 where S_G_Id = 117 and S_Year = 2009 And S_Month BETWEEN 1 AND 4
Avatar billede montago Praktikant
25. august 2006 - 18:28 #10
Løsning 1:
------------------------------------------------
Function sumi(id, byVal arr)
    summa = 0
    for i=0 to ubound(arr)
      if( arr(i,0) = id) then
        summa = summa + arr(i,1)
      end if
    next
    sumi = summa
end Function

maxtal = 500

for a=0 to maxtal
    if( sumi(a,myArray2) > 0 )then
      response.write "Ved tal "&a&" er summen = " & sumi(a,myArray2) & "<br>"
    end if
next
------------------------------------------------

Jeg skal vide hvad kolonne navnene er på dine tabeller...

men eller kan du modde følgende:

<%
sql_1 = select * from table 1 where S_G_Id = 117 and S_Year = 2006 And S_Month BETWEEN 1 AND 12
sql_2 = select * from table 1 where S_G_Id = 117 and S_Year = 2007 And S_Month BETWEEN 1 AND 12
sql_3 = select * from table 1 where S_G_Id = 117 and S_Year = 2008 And S_Month BETWEEN 1 AND 12
sql_4 = select * from table 1 where S_G_Id = 117 and S_Year = 2009 And S_Month BETWEEN 1 AND 4

DAS_MEGA_SQL = "Select col1, sum(col2) from (("
DAS_MEGA_SQL = DAS_MEGA_SQL & sql_1 & ") union all ("
DAS_MEGA_SQL = DAS_MEGA_SQL & sql_2 & ") union all ("
DAS_MEGA_SQL = DAS_MEGA_SQL & sql_3 & ") union all ("
DAS_MEGA_SQL = DAS_MEGA_SQL & sql_4 & ")) group by col1 order by col1 asc"
%>
Avatar billede stener Nybegynder
25. august 2006 - 18:46 #11
Min sql sætning er så mega stor tror det er nemmere at lave det med den array hvis vi kan få det til at virke :)
Avatar billede montago Praktikant
25. august 2006 - 19:05 #12
har du prøvet at indsætte min funktion og dens kald, korrekt ??

du skal/må kun ændre navne osv i selve kaldet - dvs sumi(x,???) hvor x er tallet brugt i FOR løkken...
Avatar billede montago Praktikant
25. august 2006 - 19:08 #13
Funktion

din sql opbygning og eksekvering
dit array opbygges

FOR-løkke
Avatar billede stener Nybegynder
25. august 2006 - 19:46 #14
Har prøvet at sætte det ind som du skriver men får stadig den fejl

Type mismatch: 'ubound'

Kan det have noget at sige at det er et 2 dimisionelt array?
Avatar billede stener Nybegynder
25. august 2006 - 19:48 #15
Kan skrive værdierne ud med følgende:

Response.Write "<table border='0'>"
For i = 0 to UBound(myArray2,2)
Response.Write "<tr><td>" & i & "</td>"
Response.Write "<td>" & myArray2(0,i) & "</td>"
Response.Write "<td>" & myArray2(1,i) & "</td>"
Next
Response.Write "</table>"
Avatar billede montago Praktikant
25. august 2006 - 19:50 #16
nope - har jo selv prøvet med mit array
vis mig hvordan du opbygger dit array....
og hvordan du bruger det sammen med min kode...
Avatar billede montago Praktikant
25. august 2006 - 19:53 #17
oki... så skift med...

Function sumi(id, byVal arr)
    summa = 0
    for i=0 to UBound(arr,2) '<--- ændret
      if( arr(i,0) = id) then
        summa = summa + arr(i,1)
      end if
    next
    sumi = summa
end Function
Avatar billede stener Nybegynder
25. august 2006 - 20:11 #18
d = det antal records der bliver i arrayet

Dim myArray2
Redim myArray2(1,d)

Kører den her sql sætning x antal gange og ligger værdierne ind i arrayet.

SQL = "SELECT Reports.R_Year, Statistic.S_G_Id, Statistic.S_G_Soldunits, Statistic.S_G_Price, Statistic.S_Month, Games.G_Gamename, Distributor.D_Company, Reports.R_Invoicenumber, Valuta.V_Valutaname, Valuta.V_Id FROM Valuta INNER JOIN ((Distributor INNER JOIN Reports ON Distributor.D_Id = Reports.R_D_Id) INNER JOIN (Games INNER JOIN Statistic ON Games.G_Id = Statistic.S_G_Id) ON Reports.R_Id = Statistic.S_R_Id) ON Valuta.V_Id = Reports.R_Valuta WHERE (((Reports.R_Year)=" & FirstYear & ") AND ((Statistic.S_G_Id)=" & Request.form("Selected_Game") & ") AND ((Statistic.S_Month) Between " & Month1 & " And " & Month2 & ")) order by Valuta.V_Id asc"

Rs.Open Sql,conn,1,2
If not rs.eof Then
While not rs.eof
SQL2 = "Select * from Valuta where V_Id = " & Rs("V_Id")
Rs2.Open Sql2,conn,1,2
myArray2(0,a) = Rs("V_Id")
myArray2(1,a) = Rs("S_G_Price")
a = a + 1
Rs.Movenext
Rs2.Close
wend 
End if

Skriver værdierne ud med følgende

Response.Write "<table border='0'>"
For i = 0 to UBound(myArray2,2)
Response.Write "<tr><td>" & i & "</td>"
Response.Write "<td>" & myArray2(0,i) & "</td>"
Response.Write "<td>" & myArray2(1,i) & "</td>"
Next
Response.Write "</table>"
Avatar billede montago Praktikant
25. august 2006 - 20:39 #19
Nåååår det er fordi dit array er "omvendt" :p

prøv her:

<%
Function sumi(id, byVal arr)
    summa = 0
    for i=0 to ubound(arr)
      if( arr(i,0) = id) then
        summa = summa + arr(i,1)
      end if
    next
    sumi = summa
end Function


Dim myArray2
Redim myArray2(d,1)

SQL = "SELECT Reports.R_Year, Statistic.S_G_Id, Statistic.S_G_Soldunits, Statistic.S_G_Price, Statistic.S_Month, Games.G_Gamename, Distributor.D_Company, Reports.R_Invoicenumber, Valuta.V_Valutaname, Valuta.V_Id FROM Valuta INNER JOIN ((Distributor INNER JOIN Reports ON Distributor.D_Id = Reports.R_D_Id) INNER JOIN (Games INNER JOIN Statistic ON Games.G_Id = Statistic.S_G_Id) ON Reports.R_Id = Statistic.S_R_Id) ON Valuta.V_Id = Reports.R_Valuta WHERE (((Reports.R_Year)=" & FirstYear & ") AND ((Statistic.S_G_Id)=" & Request.form("Selected_Game") & ") AND ((Statistic.S_Month) Between " & Month1 & " And " & Month2 & ")) order by Valuta.V_Id asc"

Rs.Open Sql,conn,1,2
If not rs.eof Then
While not rs.eof
SQL2 = "Select * from Valuta where V_Id = " & Rs("V_Id")
Rs2.Open Sql2,conn,1,2
myArray2(a,0) = Rs("V_Id")
myArray2(a,1) = Rs("S_G_Price")
a = a + 1
Rs.Movenext
Rs2.Close
wend
End if


maxtal = 500

for a=0 to maxtal
    if( sumi(a,myArray2) > 0 )then
      response.write "Ved tal " & a & " er summen = " & sumi(a,myArray2) & "<br>" 
    end if
next

%>
Avatar billede stener Nybegynder
25. august 2006 - 21:11 #20
Ved udtræk med:

Response.Write "<table border='0'>"
For i = 0 to UBound(myArray2,2)
Response.Write "<tr><td>" & i & "</td>"
Response.Write "<td>" & myArray2(0,i) & "</td>"
Response.Write "<td>" & myArray2(1,i) & "</td>"
Next
Response.Write "</table>"

Får jeg følgende:

0 1 10
1 1 10
2 1 10
3 1 10
4 1 100
5 1 10
6 2 12
7 3 10
8 4 10
9 4 10
10 5 10
11 5 10
12 5 10
13 7 10
14 8 12
15 9 10
16 7 10
17 4 10
18 8 10
19 1 10


Så den skulle helst returnere:

sum 1 = 160
sum 2 = 12
sum 3 = 10
sum 4 = 30
sum 5 = 30
sum 7 = 20
sum 8 = 22
sum 9 = 10

funktionene retunere

Ved tal 1 er summen = 1
Ved tal 10 er summen = 10
Avatar billede stener Nybegynder
25. august 2006 - 21:12 #21
Den skal altså tage alle de steder hvor række 1 er = 1 og ligge samen og bagefter hvor række 1 = 2 og ligge sammen osv
Avatar billede stener Nybegynder
25. august 2006 - 21:12 #22
sorry hvor række 2 = 1 og række 2 = 2 osv
Avatar billede montago Praktikant
25. august 2006 - 22:13 #23
har du prøvet min 25/08-2006 20:39:31 post ?
Avatar billede stener Nybegynder
25. august 2006 - 22:25 #24
ja giver samme resultat

Ved tal 1 er summen = 1
Ved tal 10 er summen = 10
Avatar billede montago Praktikant
25. august 2006 - 22:53 #25
som jeg siger... så er det fordi dit array er 'langt'... og min funktion 'bredt'

for at få det til at virke skal du bytte om på x og y i array(x,y)

i endten funktionen eller når du skriver arrayet...
Avatar billede montago Praktikant
25. august 2006 - 23:03 #26
argh..

udskift din "udskriver"

Response.Write "<table border='0'>"
For j = 0 to 500
    tmp = 0
    found = false
    For i = 0 to UBound(myArray2,2)
        if myArray2(0,i) = j Then
            found = true
            tmp = tmp + myArray2(1,i)
        end if
    Next
    if found then
        i = i + 1
        Response.Write "<tr><td>" & i & "</td>"
        Response.Write "<td>" & j & "</td>"
        Response.Write "<td>" & tmp & "</td>"
    end if
Next
Response.Write "</table>"
Avatar billede stener Nybegynder
25. august 2006 - 23:41 #27
Præcis :) Mange tak for hjælpen..
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