forum Ancestrologie
Ancestrologie - Plugins et Outils => BOA => Discussion démarrée par: BLefebvre le 13 Octobre 2007 à 14:12:36
-
Etant nul en SQL, j'appelle à l'aide.
Suite à l'import d'un gedcom, je me retrouve avec des personnes ayant un évènement décès comportant une notes contenant le texte
à l'age de nn ans
où nn varie évidemment suivant l'age du décès. Toutes ces personnes ont une date de naissance et une date de décès, ce qui fait que cette notes est inutile.
Je voudrais supprimer toutes ces notes, et uniquement celles-là. Comment faire, si tant est que celà est possible.
Merci d'avance.
-
Bonjour,
Faire la modification directement en supprimant les notes des enregistrements où on trouve les mots recherchés, est possible, mais sûrement risquée. Il peut en effet y avoir d'autres commentaires dans ces notes, qu'il serait intéressant de garder. Une première requête devrait permettre de visualiser les individus concernés et s'il ne sont pas trop nombreux de corriger manuellement les événements décès correspondants:
select e.ev_ind_kle_fiche as CLE_FICHE
,i.nom
,i.prenom
,e.ev_ind_comment
from evenements_ind e
inner join individu i on i.cle_fiche=e.ev_ind_kle_fiche
and i.kle_dossier=3
where e.ev_ind_type='DEAT'
and e.ev_ind_comment containing 'à l''âge de'
Remplacer le 3 par ton n° de dossier.
Dans cet exemple, on sélectionne les individus par leurs événements décès si le champ ev_ind_comment contient la chaîne de caractères comprise entre les simples cotes (apostrophes). Remarque que si l'apostrophe fait partie de la chaîne recherchée, elle est doublée (2 apostrophes à se suivre).
Je précise ceci parce que si le texte "à l'âge de" n'est pas d'origine automatique, il y a très probablement des variations dans l'écriture de ce texte (les a avec ou sans accent par exemple) qui obligera à faire plusieurs recherches en remplaçant ce texte, à moins de modifier la fin de la requête pour ajouter les variantes:where e.ev_ind_type='DEAT'
and (e.ev_ind_comment containing 'à l''âge de'
or e.ev_ind_comment containing 'a l''âge de'
or e.ev_ind_comment containing 'à l''age de'
or e.ev_ind_comment containing 'a l''age de')
Si tu connais le n° de l'import, il est également possible de restreindre la sélection aux individus de cet import.
Connaissant le NIP d'un individu de cet import, tu peux obtenir le n° de l'import parselect i.id_import_gedcom
from individu i
where i.cle_fiche=NIP
ou en listant la table T_IMPORT_GEDCOMselect *
from t_import_gedcom
A la première requête ajoutes alorsand i.id_import_gedcom=le n° relevé
.
Si tu trouves une sélection dont tu es sûr qu'il n'y a aucun inconvénient à supprimer toutes les notes de l'événement décès, on pourra alors l'utiliser pour faire cette suppression automatiquement
A+
André
-
J'ai passé la première requête et la variante orthographique. J'ai le même résultat : 2801 lignes (c'était vraiment un gros gedcom). Il n'y a pas de scories avec des données autres que l'âge. On peut donc y aller gaiement pour la suppression (après sauvegarde évidemment).
-
Dans ce cas:
update evenements_ind
set ev_ind_comment=null
where ev_ind_clef in
(select e.ev_ind_clef
from evenements_ind e
inner join individu i on i.cle_fiche=e.ev_ind_kle_fiche
and i.kle_dossier=3
where e.ev_ind_type='DEAT'
and (e.ev_ind_comment containing 'à l''âge de'
or e.ev_ind_comment containing 'a l''âge de'
or e.ev_ind_comment containing 'à l''age de'
or e.ev_ind_comment containing 'a l''age de'))
devrait marcher en remplaçant 3 par ton n° de dossier.
A+
André
-
Ca marche. Un grand merci.
Je crois que je vais investir dans un bouquin du style SQL pour les nuls. Ca me fera grand bien.
-
J'ai maintenant le même problème, mais dans l'onglet INFOS de la fiche individuelle.
J'ai bien essayé de le faire moi même, mais je me suis perdu dans les tables et les colonnes. Alors, si tu peux encore m'aider, merci d'avance.
-
Bonsoir,
Déjà pour vérifier que la sélection n'effacera pas d'autres Infos que celles des individus concernés:
select i.cle_fiche
,i.nom
,i.prenom
,i.date_naissance
,i.date_deces
,i.age_au_deces
,i.comment
from individu i
where i.kle_dossier=1
and (i.comment containing 'à l''âge de'
or i.comment containing 'a l''âge de'
or i.comment containing 'à l''age de'
or i.comment containing 'a l''age de')
S'il n'y a pas d'erreurs, vous pouvez alors vider les champs Infos par:
update individu i
set i.comment=null
where i.kle_dossier=1
and (i.comment containing 'à l''âge de'
or i.comment containing 'a l''âge de'
or i.comment containing 'à l''age de'
or i.comment containing 'a l''age de')
Au cas où la sélection est trop large il faut en sortir les individus de cle_fiche 123, 456 et 789 par exemple, ajoutez à la clause where la ligne suivante:
and i.cle_fiche not in (123,456,789)
Vous pouvez ajouter ou enlever (un seul suffit entre parenthèses) autant de ",clé" que vous le voulez. Mais s'il y en a trop, il serait plus intéressant d'affiner la sélection, en la complétant par le code importation par exemple, comme vu précédemment.
A+
André
-
Non seulement ça a très bien fonctionné, mais j'ai réussi à faire une troisième requête moi-même.
Merci beaucoup