Ancestrologie - Développement > Développement

Corrections et améliorations des procedures stockées

<< < (2/7) > >>

DDdeBerdeux:
Dans http://www.ybruant.magic.fr/phpBB2a/viewtopic.php?p=30983#30983 je signale que le double affichage des unions dans la fiche individus doit être dû à la procédure PROC_TROUVE_UNION, qui renvoie un enregistrement par evènement "MARR" de l'union. Dans cette utilisation, l'année du mariage n'est utile que pour ordonner les conjoints dans un ordre chronologique. Je propose que l'ordre ne soit pas défini par l'année du mariage, mais par la date du premier évènement familial, ce qui assure un seul enregistrement retourné par union. Si cette procédure n'est pas utilisée ailleurs où les modifications pourraient gêner (mes essais n'ont pas révélés de problèmes), la nouvelle version pourrait être:


--- Code: ---

DECLARE VARIABLE DATE_UNION DATE;

BEGIN

    FOR

    SELECT  i.CLE_FICHE,

            i.NOM,

            i.PRENOM,

            i.DATE_NAISSANCE,

            i.ANNEE_NAISSANCE,

            i.DATE_DECES,

            i.ANNEE_DECES,

            i.SEXE,

            i.CLE_PERE,

            i.CLE_MERE,

            i.NUM_SOSA ,

            u.union_type,

            u.union_clef ,

            MIN(ef.EV_FAM_DATE_YEAR),

            MIN(ef.EV_FAM_DATE)

      FROM  t_union u

            INNER JOIN individu i

               ON  (u.union_mari = :I_CLEF and i.cle_fiche = u.union_femme) OR

                   (u.union_femme = :I_CLEF and i.cle_fiche = u.union_mari)

            LEFT join evenements_fam ef

               on (ef.ev_fam_kle_famille = u.union_clef)

      GROUP BY  i.CLE_FICHE,

            i.NOM,

            i.PRENOM,

            i.DATE_NAISSANCE,

            i.ANNEE_NAISSANCE,

            i.DATE_DECES,

            i.ANNEE_DECES,

            i.SEXE,

            i.CLE_PERE,

            i.CLE_MERE,

            i.NUM_SOSA ,

            u.union_type,

            u.union_clef

      ORDER BY MIN(ef.EV_FAM_DATE_YEAR),MIN(ef.EV_FAM_DATE)

    INTO :CLE_FICHE,

         :NOM,

         :PRENOM,

         :DATE_NAISSANCE,

         :ANNEE_NAISSANCE,

         :DATE_DECES,

         :ANNEE_DECES,

         :SEXE,

         :CLE_PERE,

         :CLE_MERE,

         :NUM_SOSA,

         :TYPE_UNION,

         :UNION_CLEF,

         :ANNEE_MARIAGE,

         :DATE_UNION

    DO

       SUSPEND;

END
--- Fin du code ---


en attendant de trouver mieux (ordre chronologique défini par le premier évènement familial ou la première naissance d'un enfant du couple).

Les conjoints apparaissent dans l'ordre chronologique, le premier en tête. S'il n'y a pas d'évènement familial enregistré, le conjoint apparaît en dernier.

André

PS: réédition le 23/09/2005 pour prendre en compte la date exacte si elle existe au lieu de l'année seule, dans la définition de l'ordre chronologique.

DDdeBerdeux:
Dans l'onglet "Actes" de la fiche individu, les actes pour évènements familiaux apparaissent dans la fiche du mari, mais pas dans celle de la femme. Pour corriger celà, 3 procédures stockées sont à modifier pour que la jointure avec la table T_UNION fonctionne avec les 2 conjoints.

La procédure PROC_ACTES_A_TROUVER_FAMILLES
--- Code: ---BEGIN

  FOR

        select  Fam.ev_fam_clef,

                Fam.ev_fam_type,

                Ref.ref_eve_lib_long,

                Fam.ev_fam_date_writen,

                Fam.ev_fam_cp,

                Fam.ev_fam_ville,

                Fam.ev_fam_acte,

                'F'

        FROM    ref_evenements Ref,

                evenements_fam Fam,

                T_UNION Marriage,

                individu indi

        WHERE   indi.CLE_FICHE = :I_INDI AND

                Marriage.UNION_CLEF = Fam.EV_FAM_KLE_FAMILLE AND

                (Marriage.UNION_MARI = indi.CLE_FICHE OR

                 Marriage.UNION_FEMME = indi.CLE_FICHE) AND

                Fam.ev_fam_type = Ref.ref_eve_lib_court and

                Ref.ref_eve_visible = 1 AND

                (Fam.ev_fam_acte = 0 OR Fam.ev_fam_acte is null)

    INTO

      :EVE_CLEF,

      :EVE_TYPE,

      :EVE_LIB_LONG,

      :EVE_DATE_WRITEN,

      :EVE_CP,

      :EVE_VILLE,

      :EVE_ACTE,

      :EVE_TABLE

  DO

  BEGIN

    SUSPEND;

  END

END
--- Fin du code ---
La procédure PROC_ACTES_DEJA_TROUVES
--- Code: ---BEGIN

  FOR

        select  Media.MP_MEDIA,

                Fam.ev_fam_clef,

                Fam.ev_fam_type,

                Ref.ref_eve_lib_long,

                Fam.ev_fam_date_writen,

                Fam.ev_fam_cp,

                Fam.ev_fam_ville,

                Fam.ev_fam_acte,

                'F'

        FROM    ref_evenements Ref,

                evenements_fam Fam

                LEFT JOIN MEDIA_POINTEURS Media

                    ON (Media.MP_POINTE_SUR = fam.ev_fam_clef AND

                        Media.MP_TABLE =  'F' AND Media.MP_TYPE_IMAGE='A'),

                T_UNION Marriage,

                individu indi

        WHERE   indi.CLE_FICHE = :I_INDI AND

                Marriage.UNION_CLEF = Fam.EV_FAM_KLE_FAMILLE AND

                (Marriage.UNION_MARI = indi.CLE_FICHE OR

                 Marriage.UNION_FEMME = indi.CLE_FICHE) AND

                Fam.ev_fam_type = Ref.ref_eve_lib_court AND

                Ref.ref_eve_visible = 1 AND

                Fam.ev_fam_acte = 1

        UNION

        select  Media.MP_MEDIA,

                eve.ev_ind_clef,

                eve.ev_ind_type,

                ref_eve_lib_long,

                eve.ev_ind_date_writen,

                eve.ev_ind_cp,

                eve.ev_ind_ville,

                eve.ev_ind_acte,

                'I'

        from    evenements_ind eve

                LEFT JOIN MEDIA_POINTEURS Media

                    ON (Media.MP_POINTE_SUR = eve.ev_ind_clef AND

                        Media.MP_TABLE = 'I' AND Media.MP_TYPE_IMAGE='A'),

                ref_evenements ref

        where   eve.ev_ind_kle_fiche = :I_INDI AND

                eve.ev_ind_type = ref_eve_lib_court AND

                ref_eve_visible = 1  AND

                eve.ev_ind_acte = 1

    INTO

      :EVE_IMAGE,

      :EVE_CLEF,

      :EVE_TYPE,

      :EVE_LIB_LONG,

      :EVE_DATE_WRITEN,

      :EVE_CP,

      :EVE_VILLE,

      :EVE_ACTE,

      :EVE_TABLE

       /*   if (:EVE_IMAGE > 0) then EVE_IMAGE = 1;*/

  DO

  BEGIN

    SUSPEND;

  END

END
--- Fin du code ---
La procédure PROC_ACTES_RAZ doit être rectifiée pour remettre à 0 le champ EV_FAM_ACTE quelque soit le conjoint:
--- Code: ---declare variable I_CLEF INTEGER;

BEGIN

    DELETE FROM media_pointeurs

       WHERE MP_CLE_INDIVIDU = :INDI AND

             MP_TYPE_IMAGE = 'A';

    UPDATE  multimedia

    SET     MULTI_NUM_ACTE = NULL,

            MULTI_TYPE_ACTE = NULL

    WHERE   MULTI_INDIVIDU = :INDI;

    UPDATE EVENEMENTS_IND

         SET EV_IND_ACTE = 0

    WHERE EV_IND_KLE_FICHE = :INDI;

    FOR

     SELECT EV_FAM_CLEF

        FROM    evenements_fam Fam,

                T_UNION Marriage,

                individu indi

        WHERE   indi.CLE_FICHE = :INDI AND

                Marriage.UNION_CLEF = Fam.EV_FAM_KLE_FAMILLE AND

                (Marriage.UNION_MARI = indi.CLE_FICHE OR

                 Marriage.UNION_FEMME = indi.CLE_FICHE) AND

                Fam.ev_fam_acte > 0

        INTO :I_CLEF

    DO BEGIN

       UPDATE evenements_fam SET EV_FAM_ACTE = 0

       WHERE EV_FAM_CLEF = :I_CLEF;

    END

  SUSPEND;

END
--- Fin du code ---


Il reste une anomalie. Si un média est lié à l'acte, une icône apparaît en début de ligne de l'acte trouvé, mais le média n'est visible dans l'onglet "Médias", que dans la fiche du conjoint depuis lequel on a créé le lien acte familial-média. La solution reste à trouver.

Autre anomalie, le point vert ne s'affiche pas sur l'onglet (sauf si des médias sont liés à l'individu depuis l'onglet "Medias").

André



Réédition du 22/05 pour modifications à la procédure PROC_ACTES_DEJA_TROUVES, ajout de  AND Media.MP_TYPE_IMAGE='A' dans la jointure avec la table MEDIA_POINTEUR pour corriger une erreur qui pouvait faire apparaître l'icône "image jointe" en début de ligne alors qu'aucune image n'est jointe, ou la ligne de l'acte trouvé en double.

DDdeBerdeux:
N'ayant pas eu de réponse à mon message http://www.ancestrologie.org/forum/index.php?topic=4704.0 sur le forum anomalies, j'ai continué à chercher comment rendre plus utilisables les médias dans Ancestrologie. Je pense avoir trouvé une solution qui demande la création de 6 triggers dans des tables de la base. Ils améliorent les points suivants:

Bon enregistrement des medias depuis les sources des évènements individuels et familiaux;

Visibilité des médias enregistrés par les sources et par les actes depuis l'onglet Médias de la fiche pour les femmes comme pour les hommes;

Suppression du rattachement des médias liés par les sources ou l'acte d'un évènement, lors de la suppression de cet évènement (individuel ou familial).

Il reste des problèmes qui ne peuvent être règlés que par le code du programme ancestrologie.exe,

non récupération des liens des médias avec les actes ou les sources, perte des "mémos" des médias lors d'un transfert par gedcom (si la norme le permet),

pas d'apparition du point vert sur l'onglet Médias s'il n'y a que des médias liés par les actes ou les sources...

J'ai intégré toutes les modifications vues dans ce fil dans une base vide (avec quelques autres). Si quelques uns sont intéressés pour l'essayer (et en attendant que ces modifications ou d'autres soient intégrées dans une version officielle), ils peuvent me passer leurs coordonnées par MP; je leur enverrai le lien pour la télécharger ainsi que la liste des modifications.



Voici le code permettant de créer les 6 nouveaux triggers:


--- Code: ---SET TERM ^ ;





CREATE TRIGGER "TAI_EVENEMENTS_FAM" FOR "EVENEMENTS_FAM"

ACTIVE AFTER INSERT POSITION 0

as

/* Création par André pour fonctionnement média (01/10/05)

   Le doublement de l'enregistrement dans MEDIA_POINTEURS

   pour le conjoint ne fonctionne pas si l'enregistrement

   de l'évènement familial dans SOURCES_RECORD n'existe pas.

   Ne sera plus nécessaire le jour où le programme créera

   l'enregistrement dans SOURCES_RECORD avant celui dans

   MEDIA_POINTEURS*/

DECLARE VARIABLE COMPTE INTEGER;

BEGIN

  SELECT COUNT(ID)

    FROM SOURCES_RECORD

    WHERE TYPE_TABLE = 'F' AND

          DATA_ID = NEW.EV_FAM_CLEF

    INTO :COMPTE;

  IF (COMPTE = 0) then

    BEGIN

      INSERT INTO SOURCES_RECORD (ID,

                                  DATA_ID,

                                  CHANGE_DATE,

                                  KLE_DOSSIER,

                                  TYPE_TABLE)

                          VALUES (GEN_ID(SOURCES_RECORD_ID_GEN, 1),

                                  NEW.EV_FAM_CLEF,

                                  'NOW',

                                  NEW.EV_FAM_KLE_DOSSIER,

                                  'F');

    END

END

 ^



CREATE TRIGGER "TBD_EVENEMENTS_FAM" FOR "EVENEMENTS_FAM"

ACTIVE BEFORE DELETE POSITION 0

as

/* Création par André pour fonctionnement média (01/10/05)

   Suppression des enregistrements dans SOURCES_RECORD et

   dans MEDIA_POINTEURS si l'enregistrement disparaît.

   24/10/05 ajout maj table T_ASSOCIATIONS  */

BEGIN

  DELETE FROM SOURCES_RECORD

    WHERE DATA_ID = OLD.EV_FAM_CLEF AND

          TYPE_TABLE = 'F' ;

  DELETE FROM MEDIA_POINTEURS

    WHERE MP_POINTE_SUR = OLD.EV_FAM_CLEF AND

          MP_TYPE_IMAGE = 'A' AND

          MP_TABLE = 'F' ;

  DELETE FROM T_ASSOCIATIONS

    WHERE ASSOC_EVENEMENT = OLD.EV_FAM_CLEF AND

          ASSOC_TABLE = 'U' ;

END

 ^



CREATE TRIGGER "TBD_EVENEMENTS_IND" FOR "EVENEMENTS_IND"

ACTIVE BEFORE DELETE POSITION 0

as

/* Création par André pour fonctionnement média (01/10/05)

   Suppression des enregistrements dans SOURCES_RECORD et

   dans MEDIA_POINTEURS si l'enregistrement disparaît.

   24/10/05 ajout maj table T_ASSOCIATIONS */

BEGIN

  DELETE FROM SOURCES_RECORD

    WHERE DATA_ID = OLD.EV_IND_CLEF AND

          TYPE_TABLE = 'I' ;

  DELETE FROM MEDIA_POINTEURS

    WHERE MP_POINTE_SUR = OLD.EV_IND_CLEF AND

          MP_TYPE_IMAGE = 'A' AND

          MP_TABLE = 'I' ;

  DELETE FROM T_ASSOCIATIONS

    WHERE ASSOC_EVENEMENT = OLD.EV_IND_CLEF AND

          ASSOC_TABLE = 'I' ;

END

 ^



CREATE TRIGGER "TAI_MEDIA_POINTEURS" FOR "MEDIA_POINTEURS"

ACTIVE AFTER INSERT POSITION 0

as

/* Création par André pour fonctionnement média(01/10/05)

   Double l'enregistrement pour le conjoint

   s'il est lié à un évènement familial */

DECLARE VARIABLE TTABLE char(1);

DECLARE VARIABLE DID INTEGER;

DECLARE VARIABLE MARI INTEGER;

DECLARE VARIABLE FEMME INTEGER;

DECLARE VARIABLE CONJOINT INTEGER;

DECLARE VARIABLE COMPTE INTEGER;

BEGIN

 TTABLE='I';

 IF (NEW.MP_TYPE_IMAGE = 'F') THEN  /* Déclaration par les sources */

   BEGIN                            /* Nécessite l'existence dans  */

     SELECT TYPE_TABLE,             /* SOURCES_RECORD              */

            DATA_ID

     FROM SOURCES_RECORD

     WHERE SOURCES_RECORD.ID = NEW.MP_POINTE_SUR

     INTO :TTABLE,

          :DID ;

   END

 ELSE

   IF ((NEW.MP_TYPE_IMAGE = 'A') AND (NEW.MP_TABLE = 'F')) THEN

     BEGIN

       TTABLE = 'F';

       DID = NEW.MP_POINTE_SUR;

     END

 IF (TTABLE = 'F') THEN

   BEGIN

     DELETE FROM MEDIA_POINTEURS  /* Supprime les doublons qui pourraient être

     créés par les 2 conjoints lors de la récupération d'un gedcom, on ne

     garde que les derniers*/

       WHERE MP_CLEF <> NEW.MP_CLEF AND

             MP_MEDIA = NEW.MP_MEDIA AND

             MP_CLE_INDIVIDU = NEW.MP_CLE_INDIVIDU AND

             MP_POINTE_SUR = NEW.MP_POINTE_SUR AND

             MP_TABLE = NEW.MP_TABLE AND

             MP_IDENTITE = NEW.MP_IDENTITE AND

             MP_KLE_DOSSIER = NEW.MP_KLE_DOSSIER AND

             MP_TYPE_IMAGE = NEW.MP_TYPE_IMAGE ;

     SELECT COUNT(MP_CLEF)

     FROM MEDIA_POINTEURS

     WHERE MP_MEDIA = NEW.MP_MEDIA AND

           MP_POINTE_SUR = NEW.MP_POINTE_SUR AND

           MP_TABLE = NEW.MP_TABLE AND

           MP_KLE_DOSSIER = NEW.MP_KLE_DOSSIER AND

           MP_TYPE_IMAGE = NEW.MP_TYPE_IMAGE

     INTO  :COMPTE;

     IF (COMPTE > 1) THEN EXIT; /* enregistrement déjà créé pour conjoint*/

     SELECT U.UNION_MARI,

            U.UNION_FEMME

     FROM EVENEMENTS_FAM EV, T_UNION U

     WHERE EV.EV_FAM_CLEF = :DID

           AND U.UNION_CLEF = EV.EV_FAM_KLE_FAMILLE

     INTO :MARI,

          :FEMME;

     IF (NEW.MP_CLE_INDIVIDU = MARI)

       THEN CONJOINT = FEMME;

       ELSE IF (NEW.MP_CLE_INDIVIDU = FEMME)

              THEN CONJOINT = MARI;

              ELSE EXIT;  /* Union "orpheline" */

     INSERT INTO MEDIA_POINTEURS (MP_CLEF,

                                  MP_MEDIA,

                                  MP_CLE_INDIVIDU,

                                  MP_POINTE_SUR,

                                  MP_TABLE,

                                  MP_IDENTITE,

                                  MP_KLE_DOSSIER,

                                  MP_TYPE_IMAGE)

                           VALUES(GEN_ID(BIBLIO_POINTEURS_ID_GEN, 1),

                                  NEW.MP_MEDIA,

                                  :CONJOINT,

                                  NEW.MP_POINTE_SUR,

                                  NEW.MP_TABLE,

                                  0,

                                  NEW.MP_KLE_DOSSIER,

                                  NEW.MP_TYPE_IMAGE);

   END

END

 ^



CREATE TRIGGER "TAD_MEDIA_POINTEURS" FOR "MEDIA_POINTEURS"

ACTIVE AFTER DELETE POSITION 0

as

/* Création par André pour fonctionnement média (01/10/05)

   Suppression de l'enregistrement pour le conjoint

   s'il est lié à un évènement familial */

DECLARE VARIABLE TTABLE char(1);

BEGIN

 TTABLE='I';

 IF (OLD.MP_TYPE_IMAGE = 'F') THEN

     SELECT TYPE_TABLE

     FROM SOURCES_RECORD

     WHERE SOURCES_RECORD.ID = OLD.MP_POINTE_SUR

     INTO :TTABLE;

 ELSE

   IF ((OLD.MP_TYPE_IMAGE = 'A') AND (OLD.MP_TABLE = 'F')) THEN

       TTABLE = 'F';

 IF (TTABLE = 'F') THEN

     DELETE FROM MEDIA_POINTEURS

       WHERE MP_MEDIA = OLD.MP_MEDIA AND

             MP_POINTE_SUR = OLD.MP_POINTE_SUR AND

             MP_TABLE = OLD.MP_TABLE AND

             MP_KLE_DOSSIER = OLD.MP_KLE_DOSSIER AND

             MP_TYPE_IMAGE = OLD.MP_TYPE_IMAGE ;

END

 ^



CREATE TRIGGER "TBD_SOURCES_RECORD" FOR "SOURCES_RECORD"

ACTIVE BEFORE DELETE POSITION 0

as

/* Création par André pour fonctionnement média (01/10/05)

   Suppression des enregistrements de MEDIA_POINTEURS

   liés à cet enregistrement */

BEGIN

  DELETE FROM MEDIA_POINTEURS

    WHERE MP_TYPE_IMAGE = 'F' AND

          MP_POINTE_SUR = OLD.ID ;

END

 ^



COMMIT WORK ^

SET TERM ;^


--- Fin du code ---


A+

André



Réédition le 24/10/2005 pour modifier TBD_EVENEMENTS_IND et TBD_EVENEMENTS_FAM, afin que la suppression d'un évènement mette à jour la table des associations T_ASSOCIATIONS, supprimant ainsi des incoérences de la base.

Gvx:

--- Citation de: "DDdeberdeux" ---Si quelques uns sont intéressés pour l'essayer (et en attendant que ces modifications ou d'autres soient intégrées dans une version officielle), ils peuvent me passer leurs coordonnées par MP; je leur enverrai le lien pour la télécharger ainsi que la liste des modifications.
--- Fin de citation ---




Je viens de faire la demande a André pour pouvoir tester sa base.

Aprés les premiers essais, la base fonctionne sans problème, y compris avec dllarbtre :wink:



Merci a André d'avoir ajouté ma proposition consernant les individus orphelins :wink:



Un trés beau travail de la part d'André.



Je pense que PCM devrai en tenir compte pour les prochaines versions d'ancestrologie.

Ancestrologie:

--- Citer ---Je pense que PCM devrai en tenir compte pour les prochaines versions d'ancestrologie
--- Fin de citation ---




des que les arbres seront finis, je regarderais ca

Ancestrologie:
Faites bien les tets et si c est ok, je ferai une MAJ rapidement des ces procs

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Une erreur s'est produite lors du remerciement
Remerciement...
Utiliser la version classique