webForumDet fria alternativet

Förstår inte hur jag skapar och använder arrayer

ASPur ASP

19 svar · 723 visningar · startad av plelkes

plelkesMedlem sedan mars 2002823 inlägg
#1

Hej,

jag använder mig av "Teach Yourself ASP in 21 days"
Där hittade jag nedanstående kodexet, som är tänkt att visa en kalender Blir tyvärr ett långt inlägg, men forumets önskemål är ju att fullständig kod skall visas.

<%@ Language = VBSCRIPT %>
<% Option Explicit %>

<HTML>
<BODY>

<%
   
   Function GetMonthName(iMonth)
     Select Case iMonth
        Case 1:
          GetMonthName = "January"
        Case 2:
          GetMonthName = "February"
        Case 3:
          GetMonthName = "March"
        Case 4:
          GetMonthName = "April"
        Case 5:
          GetMonthName = "May"
        Case 6:
          GetMonthName = "June"
        Case 7:
          GetMonthName = "July"
        Case 8:
          GetMonthName = "August"
        Case 9:
          GetMonthName = "September"
        Case 10:
          GetMonthName = "October"
        Case 11:
          GetMonthName = "November"
        Case 12:
          GetMonthName = "December"
        Case Else:
          GetMonthName = "**INVALID MONTH**"
     End Select
   End Function
   Dim dbCurrentDate
   dbCurrentDate = "1/1/2000"
 Dim aCalendarDays(42)
   Dim iFirstWeekday
   iFirstWeekday = DatePart("w",DateSerial(Year(dbCurrentDate), Month(dbCurrentDate), 1))
'Now, we want to loop from 1 to the number of days in the
   'current month, populating the array aCalendarDays
   Dim iDaysInMonth
   iDaysInMonth = DatePart("d",DateSerial(Year(dbCurrentDate), Month(dbCurrentDate)+1, 1-1))
   Dim iLoop
   For iLoop = 1 to iDaysInMonth
      aCalendarDays(iLoop + iFirstWeekday - 1) = iLoop
   Next
   Dim iColumns, iRows
   iColumns = 7
   iRows = 6 - Int((42 - (iFirstWeekDay + iDaysInMonth)) / 7)

   'Now, create the table
%>

   <TABLE ALIGN=CENTER BORDER=1 CELLSPACING=1 WIDTH=75% HEIGHT=75%>
     <TH COLSPAN=7>
        <FONT SIZE=+2>
<%
   'Display the month and year
   Response.Write GetMonthName(Month(dbCurrentDate))
   Response.Write ", " & Year(dbCurrentDate)
%>
        </FONT>
     </TH>
<%
   'Now, loop through 1 through iRows, then 1 through iColumns
   Dim iRowsLoop, iColumnsLoop
   For iRowsLoop = 1 to iRows
     'Create a new row
     Response.Write "<TR>"
     For iColumnsLoop = 1 to iColumns
       'Create a new column
       'If there is a day there, display it, else black out the cell
       If aCalendarDays((iRowsLoop-1)*7 + iColumnsLoop) > 0 then
         'Display the date
         Response.Write "<TD VALIGN=TOP ALIGN=RIGHT WIDTH=""14%"">"
         Response.Write aCalendarDays((iRowsLoop-1)*7 + iColumnsLoop)
         Response.Write "</TD>"
       Else
         'Black out the cell
         Response.Write "<TD BGCOLOR=BLACK>&nbsp;</TD>"
       End If
     Next

     'Close the row
     Response.Write "</TR>"
   Next
%>

   </TABLE>
</BODY>
</HTML>

Uppenbarligen

Now that we have our populated array, we need to display the array in calendar form. We will create a table of 7 columns, one for each day of the week.

rör det sig bl.a. här om array och tabell.

Jag har följande problem.Jag trodde att en 2 dim array börjar med (0,0) som första position

Men som det visas här Så börjar i denna kod på position (1,1)
Skall det vara så?

MacceMedlem sedan apr. 2001425 inlägg
#2

börjar man tilldela värden på plats 1,1 så används ju inte 0,0

solbulleMedlem sedan mars 20015 287 inlägg
#3

Är det överhuvudtaget en tvådimensionel array det är frågan om?

plelkesMedlem sedan mars 2002823 inlägg
#4

Men när jag försökte

 For iRowsLoop = 0 to iRows
iColumnsLoop = 0 to iColumns

Så fungerade det ej
Inte heller funkade det

For iRowsLoop = 0 to iRows-1
iColumnsLoop = 0 to iColumns-1

Solbulle: vad rör det sig om i så fall?

solbulleMedlem sedan mars 20015 287 inlägg
#5

Jag ska egentligen vara tyst, eftersom jag inte har full koll på vad jag muttrar om...
En endimensionell array kanske?

Allvarligt, den arrays du visar har väl bara ett plan eller vad det nu heter?

plelkesMedlem sedan mars 2002823 inlägg
#6

Tyvärr har även jag dålig, om inte obefintlig koll på arrays.
Men jag tycker att kalendern liknar till det Vide visar ....
Därför antog jag att det rör sig om en 2dim array

@ndersMedlem sedan juni 200032 969 inlägg
#7

Det är i koden en endimensionell array.

Looparna som används i koden är bara för att presentera html-tabellen korrekt. Data finns i den endimensionella arrayen aCalendarDays.

Bara för att klargöra det. :)

Så egentligen är ingenting konstigt, de två looparna (columns och rows börjar på 1). Att "rutan" i kalender råkar ha "index" 1,1 är av den anledningen, och inget annat. :)

Förmodligen lyckades jag väl snurra till det för dig ännu mer nu, men det är inte min avsikt i alla fall.

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#8

Så egentligen är ingenting konstigt, de två looparna (columns och rows börjar på 1). Att "rutan" i kalender råkar ha "index" 1,1 är av den anledningen, och inget annat

  • Som ni ser börjar tabellen på en söndag. Hur skulle jag kunna få det hela börja på Måndag?

Förmodligen lyckades jag väl snurra till det för dig ännu mer nu

Inte har du snurrat till det för mig inte...

plelkesMedlem sedan mars 2002823 inlägg
#9

Glömde ställa 2 viktiga följdfrågor:

  1. varför lagras i exemplet data i en array?
  2. kan detta göras på annat sätt och i såfall hur?
  3. när, hur och varför används en 2dim array?
@ndersMedlem sedan juni 200032 969 inlägg
#10
  1. Jag vet faktiskt inte. Jag hade exemplifierat det lättare.
  2. Man kan använda veckodagsexemplet (trots att det är onödigt, eftersom det finns veckodagsfunktionalitet i vbscript).
<%
Dim MyDays(6)
MyDays(0) = "Sönnda!"
MyDays(1) = "Månnda!"
MyDays(2) = "Tissda!"
MyDays(3) = "Onssda!"
MyDays(4) = "Tossda!"
MyDays(5) = "Freda!!"
MyDays(6) = "Lörrda!"

Response.Write MyDays(WeekDay(Date, vbMonday))
%>

Ett annat, lite enklare sätt att fylla en endimensionell array, är att använda Array():

Dim MyDays
MyDays = Array("Sönnda!", "Månnda!", "Tissda!", "Onssda!", "Tossda!", "Freda!!", "Lörrda!")
  1. Tvådimensionella arrayer används ofta för att representera resultatdata från en databas / SQL-fråga, och då ofta genom att man skapar arrayen med recordset-objektets metod GetRows().

Mvh

MacceMedlem sedan apr. 2001425 inlägg
#11

För att kalendern ska börja på en måndag så byt ut raden

 aCalendarDays(iLoop + iFirstWeekday - 1) = iLoop

Till

 aCalendarDays(iLoop + iFirstWeekday - 2) = iLoop
plelkesMedlem sedan mars 2002823 inlägg
#12

Macce: tack för det - funkar cannon

@nders:

Jag hade exemplifierat det lättare

  • Hur då?

Ett annat, lite enklare sätt att fylla en endimensionell array, är att använda Array()

Jag har läst om det, men måste tillstå att jag inte är 100:a på användandet

Förrestän om vi ändå är inne på aCalenderDays()=iLoop , så tycker jag att bokens koder är lite mysko, förstår inte riktigt de:

 1: Dim dbCurrentDate
   2: dbCurrentDate = "1/1/2000"
   3: Dim aCalendarDays(42)
   4: Dim iFirstWeekday
   5: iFirstWeekday = DatePart("w",DateSerial(Year_
6: (dbCurrentDate), Month(dbCurrentDate), 1))
   7: Dim iDaysInMonth
   8: iDaysInMonth = DatePart("d",DateSerial(Year_
9: (dbCurrentDate), Month(dbCurrentDate)+1, 1-1))

  10:  Dim iLoop
  11:  For iLoop = 1 to iDaysInMonth
     12: aCalendarDays(iLoop + iFirstWeekday - 2) = iLoop

Rad 12: säger: aCalenderDays(1 + 7 -2) = iLoop, dvs aCalenderDays(6)=iLoop

  1. men med

    Response.Write iLoop
    

    får jag fram att iLoop egentligen är antalet dagar i aktuella månaden. Så vad säger de egentligen med den koden???

  2. Hur kan jag "printa ut" aCalenderDays(6)?

@ndersMedlem sedan juni 200032 969 inlägg
#13

Missförstod jag din fråga två? Mitt svar två är i alla fall en lättare exemplifiering av användandet av arrayer.

plelkesMedlem sedan mars 2002823 inlägg
#14

Nja @nders, kanske var jag lit otydlig i min följdfråga...

Om jag använder lösningen:[KOD]Dim MyDays
MyDays = Array("Måndag", "Tisdag", "Onsdag", ....."Söndag")
Kan jag fortfarande göra kalendern? Vilka ändringar behöver jag göra i så fall?
Kanske förslag som kan sparka mig i rätt riktning?

solbulleMedlem sedan mars 20015 287 inlägg
#15

plelkes skrev:

Förrestän om vi ändå är inne på aCalenderDays()=iLoop , så tycker jag att bokens koder är lite mysko, förstår inte riktigt de:

..........
Rad 12: säger: aCalenderDays(1 + 7 -2) = iLoop, dvs aCalenderDays(6)=iLoop

men med

Response.Write iLoop

får jag fram att iLoop egentligen är antalet dagar i aktuella månaden. Så vad säger de egentligen med den koden??? Hur kan jag "printa ut" aCalenderDays(6)?

Du missuppfattar lite där, denna kod:

   For iLoop = 1 to iDaysInMonth
      aCalendarDays(iLoop + iFirstWeekday - 1) = iLoop
   Next

Detta gör ju att arrayen aCalendarDays fylls med värden.
Loopen kommer ju att snurra lika många varv som iDaysInMonth innehåller.
Anta att iFirstWeekday är lika med 4
Varv 1 blir då aCalendarDays(4) = 1, varv två blir
aCalendarDays(5) = 2 osv tills hela arrayen är fylld.

solbulleMedlem sedan mars 20015 287 inlägg
#16

solbulle skrev:

plelkes skrev:

Förrestän om vi ändå är inne på aCalenderDays()=iLoop , så tycker jag att bokens koder är lite mysko, förstår inte riktigt de:

..........
Rad 12: säger: aCalenderDays(1 + 7 -2) = iLoop, dvs aCalenderDays(6)=iLoop

men med

Response.Write iLoop

får jag fram att iLoop egentligen är antalet dagar i aktuella månaden. Så vad säger de egentligen med den koden??? Hur kan jag "printa ut" aCalenderDays(6)?

Du missuppfattar lite där, denna kod:

   For iLoop = 1 to iDaysInMonth
      aCalendarDays(iLoop + iFirstWeekday - 1) = iLoop
   Next

Detta gör ju att arrayen aCalendarDays fylls med värden.
Loopen kommer ju att snurra lika många varv som iDaysInMonth innehåller.
Anta att iFirstWeekday är lika med 4
Varv 1 blir då aCalendarDays(4) = 1, varv två blir
aCalendarDays(5) = 2 osv tills hela arrayen är fylld.

Hur kan jag "printa ut" aCalenderDays(6)?

response.write aCalenderDays(6)

plelkesMedlem sedan mars 2002823 inlägg
#17

Solbullen:
Så långt att

Detta gör ju att arrayen aCalendarDays fylls med värden.

fattar jag, men jag fattar inte själva konstruktionen dvs varför just

iLoop + iFirstWeekday - 1)

fyller på arreyen??

solbulleMedlem sedan mars 20015 287 inlägg
#18

Din array har ju ett antal platser.
aCalendarDays(1)
aCalendarDays(2) osv

Loopen gör ju att värdet: ( iLoop + iFirstWeekday - 1) ändras för varje varv loopen gör (iLoop räknas ju upp ett snäpp)

Då blir det ju som så att först får då (med de förutsättningar jag skrev i inlägget ovan):

aCalendarDays(4) sitt värde, nästa varv får aCalendarDays(5) sitt värde osv.

iLoop är ju själva räknaren som räknar upp, startar på 1, därav antar jag (utan att ha lusläst koden) dras det sen bort -1 , alternativet borde ju kunna vara att börja räkna från 0 i stället.

iFirstWeekday är ju med för att den inte ska börja räkna på första dagen i veckan, utan första dagen i månaden.

plelkesMedlem sedan mars 2002823 inlägg
#19

Det är tydligen en konst att ställa rätta frågor. Konst som jag inte behärskar än...

Tack solbulle :bire i

iLoop är ju själva räknaren som räknar upp, startar på 1, därav antar jag (utan att ha lusläst koden) dras det sen bort -1 , alternativet borde ju kunna vara att börja räkna från 0 i stället.

iFirstWeekday är ju med för att den inte ska börja räkna på första dagen i veckan, utan första dagen i månaden.

har jag äntligen fått sva på mina undringar

EclipseMedlem sedan juli 20003 825 inlägg
#20
	0	1	2
0	23	Eclipse	Free
1	44	Sonya	Free
2	32	Elin	Bussy
3	88	Henke	Bussy

Här har du en array, ett fisknät.

Låtsas att detta är svaret på en fråga, "SELECT * FROM [users]"

Koden för det blir så här:

SQL = "SELECT * FROM [users]"
set mySQL = Conn.Execute(SQL)

IF NOT mySQL.EOF THEN myRow = mySQL.GetRows()

***
Nu är fisknätet skapat. På plats 0,0 är alltså 23 vilket är ID nummret på den första posten.

response.write myRow(0,0)

***

IF IsArray(myRow) THEN

FOR i = 0 TO Ubound(myArray,2)

response.write myRow(1,j) & " " & myRow(2,j) & "<BR>"

NEXT

END IF

***
Med detta manér kan du alltså överst på sidan:
1. öppna databasen
2. ställa frågan
3. lägga in den i en array
4. stänga databasen

Sen skriver du resten av sidan och om din array innerhåller något så skriver du ut det där det får plats.

142 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)