Ancestrologie - Développement > Développement
Corrections et améliorations des procedures stockées
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
[#] Page suivante
[*] Page précédente
Utiliser la version classique