Auteur Sujet: Retrouver les individus "en dehors" de l'arbre  (Lu 2699 fois)

plus minus reset

0 Membres et 1 Invité sur ce sujet

Hors ligne Gwen82

  • Grand Amateur
  • ***
  • Messages: 29
Retrouver les individus "en dehors" de l'arbre
« le: 04 Février 2009 à 10:11:08 »
Bonjour,

Je voudrais pouvoir faire une requête SQL dans le but de retrouver tous les parents des conjoint(e) des descendants de mes ancêtres.
Ouf, je ne sais pas si vraiment très clair dis comme ça ;-)

En fait pour ma généalogie descendante, j'aimerais identifier ce que je considère comme extérieur à mon arbre généalogique, c'est-à-dire les parents des conjoints descendant de mes ancêtres.

Du point de vu de la requête cela revient à identifier les individus dont le fils/fille est le conjoint(e) de l'un des descendants de mes ancêtres.
Ce qui reviendrait (si je ne me trompe pas) à rechercher les individus pour lesquelles ni le mari ni la femme ont un ancêtre SOSA.
Comment peut-on réaliser cette opération avec le BOA ?

Peut-être une piste intéressante : http://www.ancestrologie.org/forum/index.php?topic=653.0;highlight=t%EAte
Je pense qu'une partie de la procédure LR_TETE_DE_GENEALOGIE, pourrait être utiliser dans ce but, malheureusement je n'arrive pas à la faire fonctionner (donc pour les modif ça doit attendre un peu)
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE "LR_TETE_DE_GENEALOGIE"
AS
BEGIN EXIT; END ^


ALTER PROCEDURE "LR_TETE_DE_GENEALOGIE"
(
  I_KLE_DOSSIER INTEGER,
  I_MODE INTEGER
)
RETURNS
(
  O_CLE_FICHE INTEGER,
  O_NOM VARCHAR(40),
  O_PRENOM VARCHAR(60),
  O_DATE_NAISSANCE VARCHAR(100),
  O_DATE_DECES VARCHAR(100)
)
AS

begin
   /*---------------------------------------------------------------------------
   Copyright Laurent Robbe. Tout droits réservés.
   Créé le : 25/05/2003
   à : 11:54:11
   Modifiée le :
   à : :
   par :
   Description : Renvoie la liste des individus d'un dossier qui sont les ancêtres d'autres individus.
                 Les conjoints des enfants ne sont pas pris en compte, mais leurs ancêtres éventuels le sont.
   Usage       : I_MODE = 1 : Si un couple est tête de généalogie, seul le mari est pris en compte
                 I_MODE = 2 : Si un couple est tête de généalogie, seul la femme est prise en compte
                 I_MODE = 0 : Si un couple est tête de généalogie, le mari et la femme sont pris en compte

   ---------------------------------------------------------------------------*/

  if (I_MODE = 1) then begin 
    for select cle_fiche, nom, prenom, date_naissance, date_deces
    from individu a
    where a.kle_dossier=:i_kle_dossier
    and a.cle_pere is null and a.cle_mere is null
    and not exists (
      select * from t_union b
      where (b.kle_dossier=a.kle_dossier)
      and (
           (b.union_mari = a.cle_fiche
            and exists (
              select * from individu c
              where c.kle_dossier = a.kle_dossier
              and c.cle_fiche = b.union_femme
              and (c.cle_pere is not null or c.cle_mere is not null)
            )
           ) or
           (b.union_femme = a.cle_fiche
            and exists (
              select * from individu d
              where d.kle_dossier = a.kle_dossier
              and d.cle_fiche = b.union_mari)
           )
          )
    )
    into o_cle_fiche, o_nom, o_prenom, o_date_naissance, o_date_deces
    do
      suspend;
  end


  if (I_MODE = 2) then begin 
    for select cle_fiche, nom, prenom, date_naissance, date_deces
    from individu a
    where a.kle_dossier=:i_kle_dossier
    and a.cle_pere is null and a.cle_mere is null
    and not exists (
      select * from t_union b
      where (b.kle_dossier=a.kle_dossier)
      and (
           (b.union_femme = a.cle_fiche
            and exists (
              select * from individu c
              where c.kle_dossier = a.kle_dossier
              and c.cle_fiche = b.union_mari
              and (c.cle_pere is not null or c.cle_mere is not null)
            )
           ) or
           (b.union_mari = a.cle_fiche
            and exists (
              select * from individu d
              where d.kle_dossier = a.kle_dossier
              and d.cle_fiche = b.union_femme)
           )
          )
    )
    into o_cle_fiche, o_nom, o_prenom, o_date_naissance, o_date_deces
    do
      suspend;
  end

  if (I_MODE = 0) then begin 
    for select cle_fiche, nom, prenom, date_naissance, date_deces
    from individu a
    where a.kle_dossier=:i_kle_dossier
    and a.cle_pere is null and a.cle_mere is null
    and not exists (
      select * from t_union b
      where (b.kle_dossier=a.kle_dossier)
      and (
           (b.union_mari = a.cle_fiche
            and exists (
              select * from individu c
              where c.kle_dossier = a.kle_dossier
              and c.cle_fiche = b.union_femme
              and (c.cle_pere is not null or c.cle_mere is not null)
            )
           ) or
           (b.union_femme = a.cle_fiche
            and exists (
              select * from individu d
              where d.kle_dossier = a.kle_dossier
              and d.cle_fiche = b.union_mari
              and (d.cle_pere is not null or d.cle_mere is not null))
           )
          )
    )
    into o_cle_fiche, o_nom, o_prenom, o_date_naissance, o_date_deces
    do
      suspend;
  end

end
 ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;



Dont la partie qui me semble intéressante pour ce que je recherche (cf. mode 0):
    for select cle_fiche, nom, prenom, date_naissance, date_deces
    from individu a
    where a.kle_dossier=:i_kle_dossier
    and a.cle_pere is null and a.cle_mere is null
    and not exists (
      select * from t_union b
      where (b.kle_dossier=a.kle_dossier)
      and (
           (b.union_mari = a.cle_fiche
            and exists (
              select * from individu c
              where c.kle_dossier = a.kle_dossier
              and c.cle_fiche = b.union_femme
              and (c.cle_pere is not null or c.cle_mere is not null)
            )
           ) or
           (b.union_femme = a.cle_fiche
            and exists (
              select * from individu d
              where d.kle_dossier = a.kle_dossier
              and d.cle_fiche = b.union_mari
              and (d.cle_pere is not null or d.cle_mere is not null))
           )
          )
    )
Cette requête devrait me renvoyer "la liste des individus du dossier qui sont les ancêtres d'autres individus".
Mais je n'arrive pas à la faire fonctionner !
Ensuite il faudrait encore la modifiée pour qu'elle exclue tous les individus qui ont au moins un ancêtre SOSA.

Merci d'avance à ceux qui pourront m'apporter leur aide,
Gwen
« Modifié: 04 Février 2009 à 11:54:06 par Gwen82 »
mon Ancestrologie : version 1007 / base 5.116 (anciennement : version 790 / base 5.057)
mon PC: Intel 2400 MHz, 1 Go RAM, DD 30 Go, WinXP Home + SP3