/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Rekursivt kald af en procedure
Fra : Niels Larsen


Dato : 10-02-03 20:27

Hej
Er der nogen der kan fortælle mig om jeg skal gøre noget specielt ved de
variable (recordset og lign.) jeg definere i en procedure jeg kalder
rekursivt. Eller bliver de defineret på ny ved hvert nyt kald?
Mvh Niels Larsen



 
 
Jakob Andersen (10-02-2003)
Kommentar
Fra : Jakob Andersen


Dato : 10-02-03 22:16

"Niels Larsen" <niels@larsen-edb.dk> wrote
> Er der nogen der kan fortælle mig om jeg skal
> gøre noget specielt ved de variable
> (recordset og lign.) jeg definere i en procedure
> jeg kalder rekursivt. Eller bliver de defineret
> på ny ved hvert nyt kald?

Hvis dine objekter er defineret lokalt i funktionen vil de blive hhv.
oprettet og lukket/"deallokeret" ved det enkelte funktionskalds start og
afslutbning

Men ofte er det noget snavs at bruge rekursive funktioner i VBScript/ASP når
der er databaser involveret, så hvis du vil forklare dig selv yderligere kan
det være du kan få noget mere optimalt kode.

--
Jakob Andersen




Arne (10-02-2003)
Kommentar
Fra : Arne


Dato : 10-02-03 23:43


> Men ofte er det noget snavs at bruge rekursive funktioner i VBScript/ASP
når
> der er databaser involveret, så hvis du vil forklare dig selv yderligere
kan
> det være du kan få noget mere optimalt kode.

Den må jeg lige have uddybet...!...Jeg laver ofte Forum`s osv. og der bruger
jeg netop rekursive kald........og det foregår selvf. i en database...!?.

Hvordan kan det lade sig gøre uden begge dele..??...(især databasen)

Du må gerne forklare hvorfor det er noget snavs, da jeg så har lavet snavset
arbejde nogle gange..*ss*


--
mvh.
Arne Rasmussen
www.rasweb.dk



Kim Bach Petersen (11-02-2003)
Kommentar
Fra : Kim Bach Petersen


Dato : 11-02-03 00:13

> Du må gerne forklare hvorfor det er noget snavs, da jeg så har lavet
snavset
> arbejde nogle gange..*ss*

Hvis man laver rekursionen i asp betyder det ét åbent recordsæt for hvert
niveau - det vil sige mange samtidigt åbne databaseforbindelser - og der
skal derfor ikke et ret stort hierarki til at spise mange systemressourcer.

Du er langt bedre stillet, hvis databasen kan lave arbejdet for dig (eller
hvis du bruger asp.net, der giver mulighed for at sortere dataset og derfor
kun behøver én hit-and-run-forbindelse).

Kim



Arne (11-02-2003)
Kommentar
Fra : Arne


Dato : 11-02-03 10:27

> Hvis man laver rekursionen i asp betyder det ét åbent recordsæt for hvert
> niveau - det vil sige mange samtidigt åbne databaseforbindelser - og der
> skal derfor ikke et ret stort hierarki til at spise mange
systemressourcer.
>
> Du er langt bedre stillet, hvis databasen kan lave arbejdet for dig (eller
> hvis du bruger asp.net, der giver mulighed for at sortere dataset og
derfor
> kun behøver én hit-and-run-forbindelse).

Hej Kim.

Ja, jeg ved godt at dot.net har helt klare forbedringer - men den er kun
lige kommet på banen. Der har været en år-række uden og der vil sikkert
blive udviklet i classic ASP i et par år endnu, så det er ikke altid svaret
at sige..."brug nyeste teknologi".

Hvordan gør man så det er DB`en der gør arbejdet og ikke et script der
gennemløber for poster der "hænger sammen"..?...med færrest muligt åbne
forbindelser..?

Mht. det at åbne en DB kontra brugen af ressourcer, så er både HW og SW vel
også på et niveau der kan servicere det.....og også med mange samtidige
brugere.

mvh.

- Arne.




Kim Bach Petersen (11-02-2003)
Kommentar
Fra : Kim Bach Petersen


Dato : 11-02-03 15:48

> Der har været en år-række uden og der vil
> sikkert blive udviklet i classic ASP i et par år endnu, så det er
> ikke altid svaret at sige..."brug nyeste teknologi".

Sådan var det nu heller ikke ment, kun som den parantetiske bemærkning, det
var.

> Hvordan gør man så det er DB`en der gør arbejdet og ikke et script der
> gennemløber for poster der "hænger sammen"..?...med færrest muligt
> åbne forbindelser..?

Det er ikke alle databaser understøtter rekursive kald. Jeg havde et godt
link, der beskrev hvordan man gør med MSSQL, men kan ikke lige finde det nu
:o| - leder lidt videre... Selv arbejder jeg nu udelukkende med MySQL og dér
har jeg ikke den mulighed.

> Mht. det at åbne en DB kontra brugen af ressourcer, så er både HW og
> SW vel også på et niveau der kan servicere det.....og også med mange
> samtidige brugere.

Forhåbentlig!

Anyway, for at gøre det mere konkret gravede jeg et Access-eksempel frem,
der bruger et array af recordsset til at holde styr på data fra hierarkiets
forskellige niveauer.

Kim

Sub RekurserMeddelelse(moder, niveau)
set rs(niveau)=Conn.Execute("SELECT Id, emne, dato, fra FROM tblMeddelelser
WHERE moderId=" & moder & " AND forum=" & forum & " ORDER BY dato ASC")
if rs(niveau).BOF or rs(niveau).EOF then
Exit Sub
else
do until rs(niveau).EOF%>
<tr>
<td width=20 class=meddelelsesemne>&nbsp;</td>
<td width=390 class=meddelelsesemne><a
href="meddelelsevis.asp?id=<%response.write rs(niveau)("Id")%>"
target="iramme" title="Læs meddelelsen">
<span style="text-indent: <%response.write indryk%>px"><%response.write
rs(niveau)("emne")%></span></td>
<td width=200 class=meddelelsesdato><%response.write
rs(niveau)("fra")%></td>
<td width=100 class=meddelelsesdato><%response.write
FormatDateTime(rs(niveau)("dato"),2)%></td>
<td width=15 class=meddelelsesdato><%MeddelelseLaest rs(niveau)("Id"),
rs(niveau)("dato")%></td>
<td width=15 class=meddelelsesdato><a
href="meddelelseny.asp?moder=<%response.write
rs(niveau)("Id")%>&forum=<%response.write forum%>"><img
src="/gsi/images/svar.gif" width=15 height=18 border=0 title="Besvar
meddelelse"></a></td>
</tr>
<%indryk = indryk + 20
RekurserMeddelelse rs(niveau)("Id"), niveau+1
indryk = indryk - 20
rs(niveau).movenext
loop
end if
Set rs(niveau) = Nothing
End Sub



Arne (11-02-2003)
Kommentar
Fra : Arne


Dato : 11-02-03 17:22



> Sub RekurserMeddelelse(moder, niveau)
> set rs(niveau)=Conn.Execute("SELECT Id, emne, dato, fra FROM
tblMeddelelser
> WHERE moderId=" & moder & " AND forum=" & forum & " ORDER BY dato ASC")
> if rs(niveau).BOF or rs(niveau).EOF then
> Exit Sub
> else
> do until rs(niveau).EOF%>
> <tr>
> <td width=20 class=meddelelsesemne>&nbsp;</td>
> <td width=390 class=meddelelsesemne><a
> href="meddelelsevis.asp?id=<%response.write rs(niveau)("Id")%>"
> target="iramme" title="Læs meddelelsen">
> <span style="text-indent: <%response.write indryk%>px"><%response.write
> rs(niveau)("emne")%></span></td>
> <td width=200 class=meddelelsesdato><%response.write
> rs(niveau)("fra")%></td>
> <td width=100 class=meddelelsesdato><%response.write
> FormatDateTime(rs(niveau)("dato"),2)%></td>
> <td width=15 class=meddelelsesdato><%MeddelelseLaest rs(niveau)("Id"),
> rs(niveau)("dato")%></td>
> <td width=15 class=meddelelsesdato><a
> href="meddelelseny.asp?moder=<%response.write
> rs(niveau)("Id")%>&forum=<%response.write forum%>"><img
> src="/gsi/images/svar.gif" width=15 height=18 border=0 title="Besvar
> meddelelse"></a></td>
> </tr>
> <%indryk = indryk + 20
> RekurserMeddelelse rs(niveau)("Id"), niveau+1
> indryk = indryk - 20
> rs(niveau).movenext
> loop
> end if
> Set rs(niveau) = Nothing
> End Sub


Det ser ganske smidigt ud og jeg vil også prøve det, men det er ikke db der
gør arbejdet.......men det er nok mere venligt mht.
db-conns........indrømmet, jeg er overbevist.......*ss*

Skal faktisk til at lave et forum på en side i denne uge og vil da prøve
denne og se hvordan det kommer til at køre sådan rent performance-mæssigt i
forhold til rekursive kald.....(og dermed gentagne "låsninger" af db)

mvh.

- Arne.



Jakob Andersen (11-02-2003)
Kommentar
Fra : Jakob Andersen


Dato : 11-02-03 16:26

"Arne" <via@hjemmeside.dk> wrote
> Hvordan gør man så det er DB`en der gør arbejdet og
> ikke et script der gennemløber for poster der
> "hænger sammen"..?...med færrest muligt åbne
> forbindelser..?

Du vedligeholder en træstrukur i databasen, du kan se et eksempel på en
implementation her:

<http://www.ibuyspyportal.com/sourceviewer/srcview.aspx?path=Discussion.src&
file=DesktopModules/Discussion.ascx>

(Se de stored procedures der er)

--
Jakob Andersen



M@rk (18-02-2003)
Kommentar
Fra : M@rk


Dato : 18-02-03 13:56

Mon, 10 Feb 2003 22:16:03 +0100, berigede "Jakob Andersen"
<jakob@effectus.dk> dk.edb.internet.webdesign.serverside.asp med:

>..... så hvis du vil forklare dig selv yderligere kan
>det være du kan få noget mere optimalt kode.

Det lader til, at jeg så har kastet mig ud i et projekt, som jeg nok bør
vente med )

Jeg har lavet en lille familiedatabase, hvor hver person ligger i en
record med information om, hvem far og mor er. Far og mor har så også en
record, hvori deres forældre står.

Er der nogen der kunne give et lille hint til, hvordan koden ser ud,
hvis man skal "gnave" sig ned i gennem sådan en database?


/Mark

--
M@rk, the unknown @ vosborg.dk - ICQ #6564215

"When the rythm-section ain't making it
- go for it your self" ~ Ben Webster

M@rk (19-02-2003)
Kommentar
Fra : M@rk


Dato : 19-02-03 10:03

Tue, 18 Feb 2003 13:56:05 +0100, berigede "M@rk"
<unknown@vosborg.invalid> dk.edb.internet.webdesign.serverside.asp med:

>Er der nogen der kunne give et lille hint til, hvordan koden ser ud,
>hvis man skal "gnave" sig ned i gennem sådan en database?

Jeg kan da godt yderligere eksemplifisere, hvis dette måtte være
ønskeligt

   id   1
   navn   peter
   far   ole
   mor   lone

   id   2
   navn   hans
   far   peter
   mor   solvej

   id   3
   navn   solvej
   far   marinus
   mor   lis

   id   4
   navn   marinus
   far   ukendt
   mor   ukendt

   id   5
   navn   lis
   far   ukendt
   mor   ukendt


Det jeg har forsøgt indtil videre, er endt i noget á la nedenstående -
som giver det første sæt forældre - men hvordan i alverden får jeg
gravet yderligere ned i databasen, så jeg kan lave et lille stamtræ?

Nedenstående kode er givetvis temmelig tåbeligt lavet, men man arbejder
jo ud fra det niveau man er kommet til ............ og jeg er altså ikke
kommet længere end dette

Function FindBarn(barn)
   strSQL = "Select * From genealogi where gen_navn='" & barn & "'"
   Set rs = Conn.Execute(strSQL)
   Do
      FindBarn = rs("gen_personid")
   rs.MoveNext
   Loop While Not rs.EOF
End Function

Function FindFar(barn)
   strSQL = "Select * From genealogi where gen_navn='" & barn & "'"
   Set rs = Conn.Execute(strSQL)
   Do
      if rs("gen_far") <> "" then fokusF = rs("gen_far")
    rs.MoveNext
   Loop While Not rs.EOF

   if fokusF <> "" then
      strSQLF = "Select * From genealogi where gen_navn='" &
fokusF & "'"
   Set rs = Conn.Execute(strSQLF)
   Do
      FindFar = rs("gen_personid")
      rs.MoveNext
   Loop While Not rs.EOF
   End If
End Function

Function FindMor(barn)
   strSQL = "Select * From genealogi where gen_navn='" & barn & "'"
   Set rs = Conn.Execute(strSQL)
   Do
      if rs("gen_mor") <> "" then fokusM = rs("gen_mor")
    rs.MoveNext
   Loop While Not rs.EOF

   if fokusM <> "" then
      strSQLM = "Select * From genealogi where gen_navn='" &
fokusM & "'"
      Set rs = Conn.Execute(strSQLM)
      Do
         FindMor = rs("gen_personid")
         rs.MoveNext
      Loop While Not rs.EOF
   End If
End Function

   fokuspunkt = "hans"
   liniestart = "<TABLE CELLSPACING=0 BORDER=1 CELLPADDING=2
width='80%'><tr>"
   entrystart = "<td align='center'>"
   entryslut = "</td>"
   linieslut = "</tr></table>"
   niveau = 1
   baseline = liniestart & entrystart & fokuspunkt & entryslut &
linieslut
   response.write baseline
   DataStr = ""

'   Do
      fokusF = ""
      fokusM = ""

      BarnsID = FindBarn(fokuspunkt)
      FarsID = FindFar(fokuspunkt)
      MorsID = FindMor(fokuspunkt)
      DataStr = DataStr & "(" & BarnsID & "," & FarsID & "," &
MorsID & ")"

      Response.write DataStr

'       entryline = liniestart & entrystart & Farsnavn &
entryslut & entrystart & Morsnavn & entryslut & linieslut
'       response.write entryline
   
   ' sålænge fokusF og fokusM <> ""

   ' fokuspunkt = fokusF


   ' loop while fokusF <> "" or fokusM <> ""


Jeg håber, at nogen kan give mig et lille fingerpeg til, hvordan jeg
kommer videre?


/Mark
- som er helt klar til, at zappe ovenstående løsning og starte forfra


--
M@rk, the unknown @ vosborg.dk - ICQ #6564215

"When the rythm-section ain't making it
- go for it your self" ~ Ben Webster

Kim Bach Petersen (19-02-2003)
Kommentar
Fra : Kim Bach Petersen


Dato : 19-02-03 14:45

>> Er der nogen der kunne give et lille hint til, hvordan koden ser ud,
>> hvis man skal "gnave" sig ned i gennem sådan en database?

Du skal bruge rekursion, og du kan kikke lidt på mit eksempel tidligere i
tråden.

Princippet er, at elementer refererer til hinanden, sådan man i dit tilfælde
kan se af en post, hvem far/mor er og rekursionen kan dermed finde
bedsteforældre etc.

Mit eksempel er lidt simplere, men princippet er det samme, fordi der er
meddelelser, som kan have "mødre" og "børn", som gerne skulle stilles op i
et hierarki (ligesom trådene hér).

I dit tilfælde ville hver person/post skulle referere til både mor og far.
(Man kunne overveje at indbygge en reference den anden vej også, nemlig til
eventuelle børn, selv om informationer så vil være gemt "dobbelt", men det
kan gøre visse forespørgsler hurtigere.)

tperson
personid
navn
farid (=fars personid)
morid (=mors personid)

Ved at søge på et navn kan vi fx finde en persons far ved hjælp af en
funktion. Rekursion betyder, at processen gentages, sådan at
_du_fra_selve_funktionen_ kalder samme funktion til at finde faderens far -
og så videre, indtil tabellen når stamtræets grænse.

Kik lidt på eksemplet og spørg lidt videre, hvis der er rent volapyk.

Kim



Søg
Reklame
Statistik
Spørgsmål : 177502
Tips : 31968
Nyheder : 719565
Indlæg : 6408534
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste