We found this issue several years ago. Hyperion called it "expected behavior." They don't feel it is a problem and is how they built it to work. I don't know if they have ever addressed it since it is working how they expect it to work.
Use the EsbOtlGetNextSharedMember(hOutline, hMember, hShared) VB call. I found a bug in this function in that it doesn't seem to work when resolving aliases to return hMember but works against base names. Very odd.
Its now 2007. Has anyone discovered a way to get the ancestors of a shared member? It seems that EsbOtlGetNextSharedMember does indeed return a distinct handle for the shared member. However, when that handle is passed to EsbOtlQueryMembers(hOutline, hshared, Predicate, Counts) what ultimately comes back is the anscestors of the original member, not the shared member. I also haven't seen any report-writer syntax to generate the list of ancestors for a shared member either.
<p>Would something like this work?</p><p> </p><p>EsbOtlFindMember</p><p>Pass hMember to EsbOtlGetNextSharedMember</p><p> </p><p>While Loop</p><p>Pass hShared to EsbOtlGetParent</p><p>Pass hParent to EsbOtlGetMemberInfo (to get the szMembername)</p><p>hShared = hHandle</p><p>Loop</p><p> </p><p>Loop will continue until EsbOtlGetParent <> 0.</p>