Te voy a dar mi modesta opinión. Tal como pones en la imagen, no diferencias entre hijos, nietos bisnietos, etc.
Por otro lado, personalmente creo que es mucho más sencillo hacerlo con VB. Por ejemplo, supongamos que tengo una tabla Padres, con los nombres de personas
También tengo una tabla Hijos, vacía, exactamente igual(excepto que el campo Idelemento no es clave) que sólo me sirve como origen del subformulario, y luego se "borra"
Si construyo un formulario independiente, con un subformulario tabular basado en la tabla Hijos, donde en un combinado elijo un "padre"
Voy a elegir a Alejandra. En el cuadro de texto de la derecha, también independiente me aparece
Si en el combinado del subformulario, donde ya no me aparece Alejandra, ya que no se puede ser padre e hijo a la vez, voy eligiendo nombres
Es decir, en relación me aparece que Anabela es el primer hijo y Antonio el segundo de Alejandra.
Voy a elegir a Antonio
Es decir, Annette es el primer nieto de 1 y primer hijo de 2, etc.
Voy a elegir a Aria(no Stark)
Carine es el primer bisnieto de 1, primer nieto del segundo hijo de 1, etc.
Si ahora, en un combinado(donde sólo me aparecen los que tengan alguna relación), elijo uno cualquiera
Y como sabes quien es el 1, 1-2, 1-2-2, etc., utilizando Dlookup sabes quien corresponde a quien. O en vez de ponerlo así, poniendo el idelemento, etc.
El código del formulario Principal es
Private Sub Form_Close()
DoCmd.RunSQL "delete * from hijos"
End Sub
Private Sub IdElemento_AfterUpdate()
If IsNull(DLookup("relacion", "padres", "idelemento=" & Me.IdElemento & "")) Then
Relacion = IdElemento
Else
Relacion = DLookup("relacion", "padres", "idelemento=" & Me.IdElemento & "")
End If
DoCmd.RunSQL "update padres set relacion='" & Me.Relacion & "' where idelemento=" & Me.IdElemento & ""
DoCmd.RunCommand acCmdSaveRecord
End Sub
El código del subformulario es
Private Sub Nombre_AfterUpdate()
IdElemento = Me.Parent!IdElemento El control Idelemento esta oculto
DoCmd.RunCommand acCmdSaveRecord
Relacion = Me.Parent!Relacion & "-" & Nz(DCount("*", "hijos", "idelemento=" & Me.IdElemento & ""))
DoCmd.RunSQL "update padres set relacion='" & Me.Relacion & "' where nombre like '" & Me.Nombre & "'"
End Sub
Private Sub Nombre_GotFocus()
Nombre.Requery
End Sub