Solved

How to implement a recursive code

Posted on 2010-09-20
10
308 Views
Last Modified: 2012-06-27
Hi,

I have the follwing object say  

oReport

and each object has a parent which I can find from the info property like following

oReport.Info.Parent

now think like a folder structure in windows you store a word file in a folder which can reside into some other folder

so the word file is oReport and then the folder in which it is kept is

oReport.Info.Parent

now my goal is to traverse all the parents of an object like this untill the parent becomes null

oReport.Info.Parent
oReport.Info.Parent.Info.Parent.Info
oReport.Info.Parent.Info.Parent.Info.Parent.Info

I need to this for the following reason of the business logic. A report can be considered hidden if the following things are true

oReport.Info.Hidden=true or any of its parent is hidden so I need to loop through all the parents of the report recursivley untill the parent is null and find out if the report is hidden or one of its parents is hidden.

Hope I am clear enough
0
Comment
Question by:anshuma
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
  • 2
  • +1
10 Comments
 
LVL 75

Accepted Solution

by:
käµfm³d   👽 earned 250 total points
ID: 33720786
I can't see why you would want to keep searching once you found any hidden parent. I coded this according to that assumption.
Function HasHiddenAncestor(ByRef obj As Variant) As Boolean
    Dim result As Boolean

    If obj Is Nothing Then
        result = False
    Else If obj.Info.Hidden Then
        result = True
    Else
        result = HasHiddenAncestor(obj.Info.Parent)
    End If

    Return result
End Function

Open in new window

0
 
LVL 86

Assisted Solution

by:Mike Tomlinson
Mike Tomlinson earned 100 total points
ID: 33720916
A recursive solution isn't actually necessary either...a simple while loop would do!  =)
0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 33721028
Indeed. I guess my brain is starting to fry from staring at code all day  ;)
0
PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

 
LVL 81

Expert Comment

by:zorvek (Kevin Jones)
ID: 33721216
Recursive code is not necessary but is a great example of how to use objects. Here is how I would implement a recursive solution using classes. Note that I did not implement an Info class, just the Report class.

The Report class code:

Option Explicit

Public Parent As clsReport

Private mHidden As Boolean

Public Property Get Hidden() As Boolean
    If mHidden Then Hidden = True
    If Not Parent Is Nothing Then
        If Parent.Hidden Then Hidden = True
    End If
End Property

Public Property Let Hidden(ByVal NewValue As Boolean)
    mHidden = NewValue
End Property


A test routine:

Public Sub Test()

    Dim X As clsReport
   
    Set X = New clsReport
    Set X.Parent = New clsReport
    Set X.Parent.Parent = New clsReport
    Set X.Parent.Parent.Parent = New clsReport
    Set X.Parent.Parent.Parent.Parent = New clsReport
   
    Debug.Print X.Hidden
   
    X.Parent.Parent.Parent.Hidden = True

    Debug.Print X.Hidden

End Sub

Kevin
0
 

Author Comment

by:anshuma
ID: 33721380
Hi Kaufmed,

You are correct, as soon as it finds that one of the parent is hidden then the object should be classified as hidden

So you can implement it like this also.

Stop processing as soon as a hidden parent is found

thanks
-anshu
0
 

Author Comment

by:anshuma
ID: 33721391
Hi idle mind,

How would you implement it using a while loop ?

thanks
-anshu
0
 

Author Comment

by:anshuma
ID: 33721412
I am getting a compile error when I implement the recursive code

Function HasHiddenAncestor(ByRef objReport As IDSSReportDefinition) As Boolean
    Dim result As Boolean

    If objReport Is Nothing Then
        result = False
    Else If objReport.Info.Hidden then
        result = True
    Else
        result = HasHiddenAncestor(objReport.Info.Parent)
    End If

    Return result
End Function


the error is following and it happens at this line of the code

Else If objReport.Info.Hidden then


---------------------------
Microsoft Visual Basic
---------------------------
Compile error:

Must be first statement on the line
---------------------------
OK   Help  
---------------------------
0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 33721417
Something like:

        oReport.Info.Hidden = False ' Assume it's not hidden until proven otherwise
        Dim curReport As Report = oReport.Info.Parent
        While Not IsNothing(curReport)
            If curReport.Info.Hidden Then
                oReport.Info.Hidden = True ' Found one!  Set the flag on the original instance and exit the loop...
                Exit While
            End If
            curReport = curReport.Info.Parent
        End While
0
 
LVL 81

Assisted Solution

by:zorvek (Kevin Jones)
zorvek (Kevin Jones) earned 150 total points
ID: 33721878
The Return statement is not good.

Function HasHiddenAncestor(ByRef objReport As IDSSReportDefinition) As Boolean
    If objReport Is Nothing Then
        HasHiddenAncestor = False
    Else If objReport.Info.Hidden then
        HasHiddenAncestor = True
    Else
        HasHiddenAncestor = HasHiddenAncestor(objReport.Info.Parent)
    End If
End Function

Kevin
0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 33724890
Too much .NET for me I think!

Good call zorvek  :D
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you ever wanted to restrict the users input in a textbox to numbers, and while doing that make sure that they can't 'cheat' by pasting in non-numeric text? Of course you can do that with code you write yourself but it's tedious and error-prone …
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…
Suggested Courses
Course of the Month5 days, 1 hour left to enroll

635 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question