[ASP] Recursieve functie werkt niet goed

Pagina: 1
Acties:

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 22:51
Situatieschets:
Een afdelingshoofd mag de gegevens inzien van alle medewerkers op zijn/haar eigen afdeling en de daaronder liggende afdeligen.

De tabel Afdeling is vereenvoudigd als volgt opgebouwd:
int AfdelingID
int ParentID

Ik heb in ASP de volgende recursieve funtie geschreven, die van een gegeven input alle onderliggende afdelingen in een tabel als output tereuggeeft.

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FUNCTION GetAfdelingen (AfdelingID)
    AfdelingID = CInt(AfdelingID)
    dim Tabel(), nRecords, objAFDELINGEN
    REDIM PRESERVE Tabel(0)
    nRecords = 0
    SQL = "SELECT DISTINCT AfdelingID FROM Afdeling"
    SQL = SQL & " WHERE ParentID = " & AfdelingID & " ORDER BY AfdelingID"
    set objAFDELINGEN = DBConn.Execute(SQL)
    DO UNTIL objAFDELINGEN.EOF = TRUE
        REDIM PRESERVE Tabel(nRecords + 1)
        nRecords = nRecords + 1
        Tabel(nRecords-1) = objAFDELINGEN("AfdelingID")
        dim i, deeltabel
        deeltabel = GetAfdelingen (objAFDELINGEN("AfdelingID"))
        i = UBOUND (deeltabel)
        REDIM PRESERVE Tabel(nRecords + i)
        nRecords = nRecords + i
        WHILE (i > 0)
            Tabel(nRecords - i + 1) = deeltabel (i - 1)
            i = i - 1
        WEND 
        objAFDELINGEN.MoveNext
    LOOP
    objAFDELINGEN.Close
    set objAFDELINGEN = nothing
    GetAfdelingen = Tabel
END FUNCTION


Deze functie werkt echter niet goed. In de laatste regel

ASP:
1
GetAfdelingen = Tabel


wordt Getafdelingen gelijk gemaakt aan de items van de tabel Tabel. Wanneer ik de items van Tabel opvraag, krijg ik keurig de afdelingID van de onderliggende afdelingen terug. Wanneer ik ditzelfde doe voor GetAfdelingen, dan krijg ik ofwel een error ofwel er staat niks in de desbetreffende cel van de array. Blijkbaar worden de waarden van Tabel niet goed naar GetAfdelingen gekopieerd. Weet iemand wat ik fout doe?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

Zou *eventueel* *misschien* kunnen zijn omdat je objAFDELINGEN aflsuit en op nothing zet voor dat je deze aan GetAfdelingen toewijst. Misschien moet je deze helemaal niet sluiten.

oogjes open, snaveltjes dicht


  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 22:51
Don Facundo schreef op 29 oktober 2002 @ 11:10:
Zou *eventueel* *misschien* kunnen zijn omdat je objAFDELINGEN aflsuit en op nothing zet voor dat je deze aan GetAfdelingen toewijst. Misschien moet je deze helemaal niet sluiten.
objAFDELINGEN wordt niet aan GetAfdelingen toegewezen. De recordset objAFDELINGEN bevat alle onderliggende afdelingen van de inputwaarde AfdelingID. Via een lus wordt de recursie toegepast en worden de onderliggende afdelingen van het huidige item in de recordset opgevraagd.

Uiteindelijk worden alle onderliggende afdelingen van de inputwaarde AfdelingID in een tabel geplaatst en wordt de tabel toegewezen aan GetAfdelingen. De toewijzing van Tabel aan GetAfdelingen wordt niet goed vastgelegd in het geheugen.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

juist, en waar krijgt Tabel zijn waardes uit...?

controleer het anders even, ik weet het niet zeker, maar hier in het verleden ook wel eens problemen mee gehad, daarom zeg ik het even.

oogjes open, snaveltjes dicht


  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 22:51
Don Facundo schreef op 29 oktober 2002 @ 11:33:
juist, en waar krijgt Tabel zijn waardes uit...?

controleer het anders even, ik weet het niet zeker, maar hier in het verleden ook wel eens problemen mee gehad, daarom zeg ik het even.
Dit heb ik al geprobeerd, heeft geen effect ... :'(

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

Ik zit even verder te kijken, maar probeer je eigenlijk te bereiken? Wil je een tree opbouwen? Een lijst met alle afdelingen? geef dan die Tabel mee aan die functie, mist ASP ByReference ondersteunt. (Was het VB niet default ByRef?)

oogjes open, snaveltjes dicht


  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 22:51
Don Facundo schreef op 29 oktober 2002 @ 11:43:
Ik zit even verder te kijken, maar probeer je eigenlijk te bereiken? Wil je een tree opbouwen? Een lijst met alle afdelingen? geef dan die Tabel mee aan die functie, mist ASP ByReference ondersteunt. (Was het VB niet default ByRef?)
Ik wil inderdaad een lijst van afdelingen terugkrijgen. Bijvoorbeeld:

Afdeling A staat boven afdeling B, C en D
Afdeling C staar boven afdeling E en F

Het afdelingshoofd van afdeling A mag alles zien van afdeling A, B, C, D, E en F
Het afdelingshoofd van afdeling C mag alles zien van afdeling C en E (niet van A!)
Het afdelingshoofd van afdeling B en D mogen alleen de gegevens van hun eigen afdeling zien.

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 22:51
Even een schopje: :)

In de volgende regel wordt GetAfdelingen gekoppeld aan Tabel:

ASP:
1
GetAfdelingen=Tabel


Middels een UBOUND kan ik zowel van Tabel als van GetAfdelingen het aantal recors in de desbetreffende array opvragen. Voor beide geldt dat dit aantal klopt met de werkelijkheid.

Stel dat UBOUND(GetAfdelingen) = UBOUND(Tabel) = 4.

De volgende code toont de elementen in de array Tabel:
ASP:
1
2
3
4
5
6
7
8
9
10
11
dim x, y
x = UBOUND(Tabel)
y = UBOUND(GetAfdelingen)
IF (x <> y) THEN
     Response.Write "Error."
ELSE
     WHILE (x > 0)
          Response.Write(Tabel(x-1) & " = " & GetAfdelingen(x-1))
          x = x - 1
     WEND
END IF


In dit stuk gaat het dus verkeerd. Ik krijg wel te zien dat GetAfdelingen een aantal cellen bevat, maar ik kan niet de inhoud van GetAfdelingen(x-1) opvragen. Foutmelding = Type mismatch. In Tabel(x-1) staat wel de juiste inhoud. Wat doe ik fout?

Het sluiten of openhouden van de recordset objAFDELINGEN heeft geen invloed op het resultaat.

  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 22:51
't Is uiteindelijk gelukt. :) :) Voor degene die met hetzelfde probleem zitten, zal ik mijn oplossing ff geven:

Schijnbaar kan ASP niet goed overweg met functies waarin een array wordt teruggeven. Ik heb de functie daarom herschreven, zodat een string wordt doorgegeven:

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FUNCTION GetAfdelingen (AfdelingID)
    GetAfdelingen = ""
    dim objAFDELINGEN
    SQL = "SELECT AfdelingID FROM Afdeling"
    SQL = SQL & " WHERE ParentID = " & AfdelingID 
    SQL = SQL & " ORDER BY AfdelingID"
    set objAFDELINGEN = DBConn.Execute(SQL)
    DO UNTIL objAFDELINGEN.EOF = TRUE
        GetAfdelingen = GetAfdelingen & objAFDELINGEN("AfdelingID") & " , "
        GetAfdelingen = GetAfdelingen & GetAfdelingen(objAFDELINGEN("AfdelingID"))
        objAFDELINGEN.MoveNext
    LOOP
    objAFDELINGEN.Close
    set objAFDELINGEN = nothing
END FUNCTION


De functie is zoals jullie kunnen zien een heel stuk uitgedund. :) Middels de SPLIT-functie kan ik de output-string alsnog omzetten naar een array.
Pagina: 1