Multidimensionale dynamische array starten indien leeg of aanvullen indien gevuld

Status
Niet open voor verdere reacties.

AvantiConLaCapra

Gebruiker
Lid geworden
11 sep 2016
Berichten
44
Waar ik niet uitkom is:

Hoe start ik een dynamische 2d array in een subroutine wanneer er nog geen gegevens in de array staan?

Normaal gesproken start je een array door hem te dimensioneren

Dim Array()

Vervolgens controleer je de inhoud op het aantal 'records' in de 2e dimensie

Aantal = ubound(Array,2)

En voeg je een 'record' toe:

redim preserve Array(25,Aantal+1)

Dit werkt wel indien er 'records' in de Array staan echter niet als hij leeg is.
Omdat ik eerst het aantal 'records' in de 2e dimensie van de Array wil ophalen om hem uit te breiden terwijl de Array nog niet gedimensioneerd is vermoed ik.... kip en het ei verhaal dus.

Wat is de juiste manier om een array te starten indien leeg en aan te vullen indien reeds gevuld?
 
Rare werkwijze volg je. een array kun je pas gebruiken als je er wat in stopt. Daarvoor kun je hem uiteraard best definieren en met Redim aanpassen, maar waarom zou je van iets wat er niet is de afmetingen al willen weten? Je weet toch dat de array nog niet bestaat? Maak hem pas aan als je hem gaat gebruiken.
 
Hahaha klopt, daarom kom ik er ook niet uit denk ik :d

De reden waarom ik deze wijze volg is omdat ik de routine die nu de records opslaat om wil bouwen naar het vullen van de array, en daar gaat het mis waarschijnlijk.

Ik heb een routine die de records bepaald, deze geeft de nodige informatie door aan een 2e routine die de records aanmaakt (welke dus vervangen zou worden door de array)
Nu zou ik een publieke array kunnen maken, alleen deze zal gegevens uit de eerste routine moeten ontvangen. Dit kan naar mijn weten niet.

Waar ik aan zit de denken is om de array in de eerste routine aan te maken echter creëer ik dan weer het probleem dat ik uit de array een aantal 'records' wil halen die ik op wil slaan in een tabel. Daardoor wordt de routine vrij fors....
Is dat wel de juiste weg die ik moet bewandelen of is er een beter alternatief?
 
Wat is de relatie tussen de eerste en tweede dimensie? Is de tweede dimensie het antwoord op de eerste dimensie?

Ik zie ook niet helemaal het probleem om data heen en weer te sturen tussen functies. Dat lijkt me het hele punt van een functie ;)
 
De eerste dimensie is het aantal kolommen en de 2e het aantal rijen. Ik beschouw de array als het ware als een tabel.

Ik ga er vanuit dat een publieke array wordt gedeclareerd in de subroutine dus:

public sub Array()

Zou ik die data mee willen geven dan zou ik die op moeten geven daar waar ik de dimensie van de array ook opgeef, dat komt niet goed natuurlijk. Vandaar dat ik betwijfel of die optie werkt (lees: ik niet weet hoe dat werkt :o)
 
Daar heb je Redim voor. of anders werk je met collections.

Je kunt ook dit doen:

Code:
dim a(5)
for i = 0 to ubound(a)-1
   dim b(5)
   a(i)=b
next i

en je hebt een 5x5 array in "a"

deze kun je aanspreken met: a(1)(3)="iets" bijvoorbeeld
 
De reden waarom ik deze wijze volg is omdat ik de routine die nu de records opslaat om wil bouwen naar het vullen van de array, en daar gaat het mis waarschijnlijk.
Ik heb een routine die de records bepaald, deze geeft de nodige informatie door aan een 2e routine die de records aanmaakt (welke dus vervangen zou worden door de array)
Wat is er mis met een virtuele recordset? Ik vind het maar omslachtig...
 
Wat daar mis mee is is dat het vullen van mijn tabelletje 5-6 seconden duurt waar ik op dat moment niet op kan wachten helaas. Ik zoek dus een snellere manier om deze gegevens te verwerken.
Aangezien het om zeer tijdelijke informatie gaat wilde ik dit in een array houden omdat die de gegevens in het geheugen houd en dus sneller kan rekenen.

Of is er een andere wijze om deze gegevens tijdelijk in het geheugen te houden? Ik sta overal voor open :cool:
 
Laatst bewerkt:
Wel eens met een virtuele recordset gewerkt? En denk je dat het vullen van een matrix sneller gaat?
Oh ja: graag niet meer nodeloos quooten :).
 
excuus, ik heb hem verwijdert

Code:
Public Sub ElementAfmetingenArray()
Set db = CurrentDb
Dim RS1 As Recordset
Set RS1 = db.OpenRecordset("tbl_element")
Dim ElementAfmetingArray() As Integer
Dim Bericht As String

RS1.MoveLast
RS1.MoveFirst

If Not RS1.EOF Then
For i = 1 To RS1.RecordCount
    ReDim Preserve ElementAfmetingArray(3, i)
    ElementAfmetingArray(1, i) = RS1!ElementLocatie
    ElementAfmetingArray(2, i) = RS1!elementbreedtestraanzicht
    ElementAfmetingArray(3, i) = RS1!elementlengtestraanzicht
    RS1.MoveNext
Next i
Else
End If

Bericht = "Nr: " & "Breedte: " & "Lengte: " & vbCrLf
For J = 1 To UBound(ElementAfmetingArray, 2)
Bericht = Bericht & Format(ElementAfmetingArray(1, J), "00") & ":  " & ElementAfmetingArray(2, J) & " - " & ElementAfmetingArray(3, J) & vbCrLf
Next J

MsgBox Bericht, vbInformation, "Afmetingen elementen"

'Recordset sluiten
RS1.Close
Set RS1 = Nothing
Set db = Nothing


End Sub

Als je dit met virtuele recordset bedoeld? (RS1)
Ik gebruik deze wijze wel om tabellen aan te spreken en om data in tabellen op te slaan maar ik heb daar altijd een fysieke tabel bij nodig.
Mijn hoop is dat een array soelaas bied maar zover ben ik nog niet...
 
Nee, dat is geen virtuele recordset; de data haal je immers uit een bestaande tabel. Virtueel is.... ach, daar heb je een woordenboek voor :)
Code:
Sub Avanti()
Dim rstADO As ADODB.Recordset
Dim fld As ADODB.Field
Dim Bericht As String

    Set rstADO = New ADODB.Recordset
    With rstADO
        .Fields.Append "el_Locatie", adInteger, , adFldKeyColumn
        .Fields.Append "el_breedtestraanzicht", adVarChar, 50, adFldMayBeNull
        .Fields.Append "el_breedtestraanzicht", adVarChar, 60, adFldMayBeNull
        .Fields.Append "el_lengtestraanzicht", adVarChar, 100, adFldMayBeNull
        .Fields.Append "Include", adInteger, , adFldMayBeNull
        .Fields.Append "Selected", adBoolean, , adFldMayBeNull
        .CursorType = adOpenKeyset
        .CursorLocation = adUseClient
        .LockType = adLockPessimistic
        .Open
    End With

Dim rstDAO As DAO.Recordset
Dim strSQL As String

    Set rstDAO = CurrentDb.OpenRecordset("SELECT * FROM tbl_element")
    Set rstDAO = dbs.OpenRecordset(strSQL, dbOpenDynaset)
    Do Until rstDAO.EOF
        rstADO.AddNew
        rstADO.Fields(0) = rstDAO!ElementLocatie
        rstADO.Fields(1) = rstDAO!elementbreedtestraanzicht
        rstADO.Fields(2) = rstDAO!elementbreedtestraanzicht
        rstADO.Fields(3) = rstDAO!elementlengtestraanzicht
        rstADO.Fields(4) = 1
        rstADO.Fields(5) = False
        rstADO.Update
        rstDAO.MoveNext
    Loop
    
    MsgBox "KLaar"
End Sub

Geen idee of dit gaat werken zo natuurlijk; ik ken je veldeigenschappen niet. Dus die moet je wellicht even aanpassen.
 
Ik was je net voor...
 
Thnx!

Ik ben je code aan het reproduceren in mijn omgeving, de eerste test lijkt goed, de 5-6 seconden zijn gereduceerd tot een fractie van een seconde maar ik moet hem nog verder aankleden :D
Ik moest nog wel een verwijzing naar ADO library aanzetten maar dat komt meer voor zei google :o
 
Je kan hem ook met Late Binding gebruiken als je dat liever doet. Ben je ook niet afhankelijk van een specifieke ADO versie.
 
Hmmm, ik heb hem nu voor 2/3 aangekleed en zit alweer op 3-4 seconden...
Het zit hem dus niet in het wegschrijven in de tabel maar in de complexiteit van de routine... :(

Weer terug naar het tekenbord dus.:confused:
 
Tja, ik weet uiteraard niet wat je precies aan het doen bent met die recordset.
 
Dat is ook lastig uit te leggen. Er worden met veel afhankelijkheden keuzes gemaakt en in een tabel opgeslagen. Het aantal records varieert ongeveer tussen de 40 en 400.
Op zich nog niets waar Access zich druk om maakt, ik had daarom ook die vertraging niet verwacht. Nu blijkt dat dit ook optreed wanneer ik geen tabel aanspreek moet ik het dus in de routine zelf zoeken.
Ik ga hem opsplitsen waarbij het vertragende werk eerder wordt uitgevoerd op een tijdstip dat de gebruiker er geen last van heeft. Ik ga dit later wel eens in z'n totaliteit herzien want het moet sneller kunnen :D

Dank wederom voor je hulp :thumb: ik heb in elk geval weer genoeg geleerd!
 
Laat je code eens zien, wat met dit soort aantallen is het een belachelijke verwerkingstijd.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan