VBA en recursie

Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
19.714
Dag allen,

Een thema dat ik weinig tegenkom, ook in handboeken, is 'recursie'.
Het is een handige techniek om met weinig code veel te doen.
Alleen Rebmog in dit forum zie ik ervan gebruik maken.

Ben je geïnteresseerd in de techniek en een aantal toepassingen, kijk dan hier:

https://www.snb-vba.eu/VBA_Recursion.html

Commentaar en aanvullende voorbeelden zijn welkom.
 
@Alpha,

Dank. Ik ga er induiken. (eerst nog even de Engelse webpagina maken).

Gegroet,
 
@snb,
Ik heb met behulp van dit forum ooit een tooltje gemaakt om een netwerkdiagram te kunnen tekenen en daarna kun je checken of er loops in zitten.
Zie de instructie op sheet: Networkdiagram
De routine CheckLoops2 start het check proces en daarvandaan wordt routine MaakPad2 aangeroepen, en die roept zichzelf aan net zolang dat alle mogelijke paden zijn doorlopen en geindentificeerd.
Als een blokje meer dan 1 keer voor komt in een pad, dan is er sprake van een loop.
Dit is een voorbeeld van recursie.
Je kunt hem testen.
 

Bijlagen

  • Netwerk_Loop_Checker.xlsb
    172,7 KB · Weergaven: 31
Ola Piet,

tool'tje' ? :d

Ik ga er mijn tanden in zetten.
Dank voor de suggestie !
 
hoi snb,
Laat maar weten als je vragen hebt.
Ik ben trouwens heel nieuwsgierig naar andere toepassingen van recursie.
 
Ander voorbeeld van recursie: omdat Access toe niet goed met XML bestanden kon omgaan heb ik jaren geleden een eigen routine geschreven om XML in te lezen. Hierbij werd de functie fReadNode recursief opgeroepen voor elke child node van een node.

vrGroeten
Noëlla
 
Ha Noella,

Kun je wat concreter zijn ?
 
Hoi,
hier volgt een stuk van de code. Een beetje info errond: de aanleveraar van de XML's was erin geslaagd in die tijd om de XML's op de meest ongestructureerde manier aan te leveren (nooit begrepen hoe die het deed, maar het was een overheidsinstelling, dus weinig aan te doen), dus besloten we om de gegevens in de XML's in Access tabellen op te slaan en vandaar zo goed mogelijk te verwerken. De kerncode was:
Code:
Public Function ReadXMLFile(lngTemplateID As Long, strFile As String, lngID As Long, lngReportID As Long) As Boolean
On Error GoTo Err_ReadXMLFile
    
    Dim docXML As New DOMDocument
    Dim nodeRoot, myNode
    Dim fOK As Boolean
    Dim intLevel As Integer, intNodesRead As Integer
    Dim strFileStream As String
    Dim lngHeaderID As Long
    Dim objRpt As New Reporting
    
    If Len(strFile) > 0 Then strFileStream = ReadAllTextFile(strFile)
    If Len(strFileStream) > 0 Then
        strFileStream = ReplaceOddSigns(strFileStream)
        docXML.LoadXML strFileStream
        Set nodeRoot = docXML.DocumentElement
        If nodeRoot.HasChildNodes Then
            lngHeaderID = objRpt.InsertReportingLine(lngTemplateID, 0, "Import XML file", "IMPF", 1, strFile, 0, lngReportID) 'fInsertHeader(lngBuildID, lngTemplateID, strFile)
            intLevel = 0
            For Each myNode In nodeRoot.ChildNodes
                intNodesRead = intNodesRead + fReadNodes(lngHeaderID, intLevel, lngID, myNode)
            Next myNode
            ReadXMLFile = True
        Else
            ReadXMLFile = False
        End If
    Else
        ReadXMLFile = False
    End If
    
    
Exit_ReadXMLFile:
    Set docXML = Nothing
    Exit Function
    
Err_ReadXMLFile:
    ReadXMLFile = False
    Debug.Print err.Number & ": " & err.Description & " in " & strFile
    Resume Exit_ReadXMLFile
    
End Function
Private Function fReadNodes(lngImportID As Long, intLvl As Integer, lngID As Long, objNode) As Integer
On Error GoTo Err_fReadNodes
    
    'tmpImportStructureXML
    Dim intCountNodes As Integer
    Dim cnn As ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim objChildNode
    
    Set cnn = CurrentProject.Connection
    rst.Open "tmpImportStructureXML", cnn, adOpenKeyset, adLockPessimistic
    With rst
        .AddNew
        !isxImport_ID = lngImportID
        !isxNodeLevel = intLvl
        !isxTransferID = lngID
        !isxParentNode = objNode.ParentNode.nodeName
        !isxNodeName = objNode.nodeName
        !isxNodeValue = objNode.NodeValue
        .Update
        .Close
    End With
    intCountNodes = intCountNodes + 1
    If objNode.HasChildNodes Then
        'Debug.Print objNode.nodeName
        For Each objChildNode In objNode.ChildNodes
            intCountNodes = intCountNodes + fReadNodes(lngImportID, intLvl + 1, lngID, objChildNode)
        Next objChildNode
    End If
    fReadNodes = intCountNodes
    
Exit_fReadNodes:
    Set cnn = Nothing
    Set rst = Nothing
    Exit Function
    
Err_fReadNodes:
    Debug.Print err.Number & ": " & err.Description
    fReadNodes = -1
    Resume Exit_fReadNodes
    
End Function
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan