Shared Events – Sort Witnesses by Consanguinity plus Name #sharedevent

Problem

The order in which witnesses of an event (sharers other than the Principal(s) are listed on screen and in reports is set by the order they were entered. Users have no control over it.

A Workaround

The WitnessOrder field in WitnessTable controls the order of output in the display of witnesses and in narrative reports but RootsMagic 7 provides no control for it.

This script modifies the WitnessOrder values so that they are sorted:

  1. Primary: Consanguinity of witness to reference person used by the RootsMagic SET RELATIONSHIPS function
  2. Secondary: Alphabetical order of the primary name of each person, including those not in a tree.

Clearing the relationships prior to execution results in a purely alphabetical sort.

It sets negative values in WitnessOrder so inspection of the WitnessTable readily reveals those set by the script.

WitnessOrderByRelationship+Name.JPG
Example of the WitnessTable modified by the script with negative values under WitnessOrder.

WitnessOrderByRelationship+Name.sql

Relationships #relationships

This page is intended to collect some scripts in support of calculating and displaying relationships between people in a RootsMagic database.

Kinship List

This first script produces a table similar to the RootsMagic Kinship List report but it does so markedly faster for a large database. RootsMagic 7.0.11.0 took almost five minutes (290s) to calculate and display a 1900 page report for 75,000 people in a 160,000 population. SQLiteSpy 1.9.10 executed this script in 2 seconds! That’s a 145:1 improvement in speed. Moreover, an SQLite manager can sort on the columns and filter the results (features vary depending on the product) and the SQLite Views created by the script can be exploited in further ad hoc queries the user may write.

KinshipList.PNG
Screenshot of results from KinshipList.sql in SQLiteSpy sorted on the RIN column.

The script does not calculate relationships so the comparison with the RootsMagic Kinship List report is not apples to apples. Rather, it lists the relationships calculated by the RootsMagic “Set Relationships” function which added a further 50s execution time which, if included, degrades the speed advantage to a mere 5.5:1. However, it is often the case that the Kinship List is set to recompute relationships to the same person as was already done by Set Relationships. And the query can remain open in the SQLite Manager while working on the database in RootsMagic.

The columns Relate1 and Relate2 represent the distance to the common ancestor from the reference person and their relative and are calculated by RootsMagic. The script uses these to generate the Relationship phrase. They may also be used in SQLite Expert Personal as filters on the results set, e.g., limiting the people listed to those having a total distance between them of less than, say, 10. A custom query in any SQLite manager could likewise limit results.
KinshipList.sql rev 2016-07-29 sample query calculates consanguinity degree of relationship
The part of the script that generates the Views should function with any SQLite Manager. The final query that displays results with the names of people requires one with a RMNOCASE collation.

Click image for Wikipedia page on Consanguinity.
Click image for Wikipedia page on Consanguinity.

To-Do List – filter by locale

Posted to Facebook by Art Dembinski 11 May 2016:
I have a long list of “To Do”s of various kinds that I will probably not live long enough to accomplish. I travel a fair amount, and usually with very little advance notice. The locations for doing these are scattered all over the USA and Canada. I would like to be able to quickly focus on a locale and then jump to any “To Do”s that refer to that area, no matter which part of the family tree this refers to. Does RM have a way “To Do” this?

This page is a To-Do about this wish…

Query – All Names in Tree

Trees

Two related problems
1) Finding all names in a selected person’s tree
2) Count Trees

1) Finding all names in selected person’s tree
Does anyone have any idea how to emulate the function that is in the RM Mark Group of “Everyone in the highlighted person’s tree”? RM does this very efficiently/quickly.I break the relationship between parents and then use it to create groups of maternal and paternal lines. It works ok, but would be a lot more efficient if I could automate it using SQL.

Tree-HourglassMembers.sql This produces a subset of the full tree; not the solution… (Tom, May 8)

2) Count Trees
I sometimes forget about this function, but it is very useful in finding orphans

Hopefully I did this right. Thanks in advance
marc

Discussions & comments from Wikispaces site


MLeroux84

A solution – not perfect but workable

MLeroux84
19 September 2016 20:31:55

I finally got back to this, and can get a solution by combining the ancestor/descendent scripts with a bit of procedural logic. And adding in the missing link – the spouses of descendants. It seems to work, although it could use a lot of optimization I’m sure – it runs fairly quickly on my computer.

I tested this on my database. First, I broke the connection between my father and mother. That left me with two “trees”, my French side with 7126 entries, the Irish side with 1091 (from RM/Tools/Count Trees).

Next I created 3 tables:
tTree – contains the RIN of all individuals in the tree (final result)
tAncWork – list of RIN to traverse backwards to get the ancestors of
tDecWork – List of RIN of descendants from a list of ancestors

I populate tAncWork with my seed RIN – in my case “1″ – myself

Then I modified the Ancestor and Descendent scripts
Ancestor reads tAncWork for a list of RINs rather than a single RIN parameter and stores the result back in to tAncWork. After doing this it adds new RINS to tTree

Descendant script reads from tTree (not the most efficient way, but it was easiest) rather than a single RIN parameter and stores the result to tDecWork. The results are moved back to tAncWork and tTree. Spouse (from the familyTable) are added to tAncWork

Then the procedural part. I check tAncWork to see if there are any entries. If there are, then there are spouses that have not been counted and I run the scripts again. As expected, the new entries in tAncWork comes down quickly, and after 4 iterations I have no entries left.

That gives me one tree. Then it’s a simple matter to find the lowest Id in the remaining entries and repeat.

To generalize this, or replicate the “Count Trees” function I would have to add a “treeId” column to tTrees and populate it with the seedId for each “tree”. In my case I’m happy with the results as they are.

I don’t think it’s possible to use loops inside sqlLite but pretty simple in a procedural script. In my case I wrapped it into a VB.net app.

Thanks for the great starting point. This saves me a great deal of time – although if I think about the time invested I could probably have done this in a manual fashion for the next 80 years and still come out ahead. But it is a creative exercise that needed solving.

The table create scripts:

— Drop and recreate temp tables

drop table if exists [tTree] ;
CREATE temp TABLE [tTree] (
[RIN] BIGINT);
drop table if exists [tAncWork] ;
CREATE temp TABLE [tAncWork] (
[RIN] BIGINT);
drop table if exists [tDecWork] ;
CREATE temp TABLE [tDecWork] (
[RIN] BIGINT);

— Seed with the starting RIN

insert into tAncWork (RIN) values (1) ;

The Get Ancestors portion

— Get ancesters of list of individuals in file tAncWork
— Results stored back into tAncWork and also moved to tTree

— Based on the original script by Tom Holden ve3meo


WITH RECURSIVE
parent_of(ChildID, ParentID) AS
(SELECT PersonID, FatherID AS ParentID FROM PersonTable
LEFT JOIN ChildTable ON PersonID=ChildTable.ChildID
LEFT JOIN FamilyTable USING(FamilyID)
UNION
SELECT PersonID, MotherID AS ParentID FROM PersonTable
LEFT JOIN ChildTable ON PersonID=ChildTable.ChildID
LEFT JOIN FamilyTable USING(FamilyID)
),
ancestor_of_person(AncestorID) AS
(SELECT ParentID FROM parent_of
WHERE ChildID in (select RIN from tAncWork)
UNION
SELECT ParentID FROM parent_of
INNER JOIN ancestor_of_person ON ChildID = AncestorID)

insert into tAncWork SELECT DISTINCT AncestorID FROM ancestor_of_person, PersonTable
WHERE ancestor_of_person.AncestorID=PersonTable.PersonID AND ancestor_of_person.AncestorID > 0
;
insert into tTree
select DISTINCT RIN from tAncWork where RIN not in (select RIN from tTree) and RIN > 0
;

The get Descendants portion. This needs to run for every iteration of the get ancestors – I just split them to make it easier to debug
— get descendents of everyone in ancester table
— uses tTree as source
— puts results in tDecWork, then moves to tTree and tAncWork
— tTree contains the final result

— Based on the original script by Tom Holden ve3meo

WITH RECURSIVE
child_of(ParentID, ChildID) AS
(SELECT PersonID, ChildTable.ChildID FROM PersonTable
LEFT JOIN FamilyTable ON PersonID=FatherID
LEFT JOIN ChildTable USING(FamilyID)
WHERE
RelFather=0
UNION
SELECT PersonID, ChildTable.ChildID FROM PersonTable
LEFT JOIN FamilyTable ON PersonID=MotherID
LEFT JOIN ChildTable USING(FamilyID)
WHERE
RelMother=0
),
descendant_of_person(DescendantID) AS
(SELECT ChildID FROM child_of

WHERE ParentID in (select RIN from tTree)
UNION –ALL
SELECT ChildID FROM child_of
INNER JOIN descendant_of_person ON ParentID = DescendantID)
insert into tDecWork SELECT distinct DescendantID FROM descendant_of_person, PersonTable
WHERE descendant_of_person.DescendantID=PersonTable.PersonID AND descendant_of_person.DescendantID > 0 ;

— Move results to tAncWork

delete from tAncWork ;
insert into tAncWork
select distinct RIN from tDecWork where RIN not in (select RIN from tTree) AND RIN > 0
;

— Move results to tTree

insert into tTree
select distinct RIN from tAncWork where RIN not in (select RIN from tTree) and RIN > 0
;

— Add their spouses to tAncWork to prapare for next itiration

insert into tAncWork
select distinct motherId from familyTable
where fatherId in (select RIN from tTree)
and motherId > 0
and motherId not in (select RIN from tTree)
UNION
select distinct fatherId from familyTable
where motherId in (select RIN from tTree)
and fatherId > 0
and fatherId not in (select RIN from tTree);

— Finally, clean out decWork

delete from tDecWork ;


ve3meo

Inline comment: “1) Finding all names in a selected person’s tree‍”

ve3meo
04 September 2018 01:25:23

ve3meo May 8, 2016

Good question for which I have no ready answer. It was difficult to do lineage before SQLite gained recursive query functionality. Doing recursions in SQLite does not come naturally to me. Your goal requires not only ancestors and descendants but also collateral lines. While it does not require kinship results which should make it easier, I confess I do not have a strategy in mind.
MLeroux84 May 8, 2016

Thanks. recursive SQL is not that easy for me either. I was thinking that it would not be that difficult, since it executes so quickly from the RM application. I haven’t seen it take very long to do “Count Trees” – well under a second for 4K names, so I was hoping that this was something obvious that I missed.


ve3meo

Inline comment: “2) Count trees”

ve3meo
04 September 2018 01:26:30

ve3meo May 8, 2016

This one mystifies me, too. It seems that it needs to be a recursion of “Finding all persons in a given person’s tree” iterating through all those remaining persons after subtracting those trees that have been counted.
MLeroux84 May 8, 2016

I wouldn’t think that it was iterating through remaining names, just because of the challenge of recursing through each name. Given the performance I’m seeing (albeit on a machine with reasonable performance) It would seem more likely that there is a way of identifying a node of each tree, then counting from there.

That said, since I haven’t been able to solve the first part of the problem it is all pure speculation


ve3meo

Inline comment: “produces a ‍subset‍ of the full tree”

ve3meo
04 September 2018 01:27:36

ve3meo May 8, 2016

This script includes all the ancestors of the starting person and their descendants but the full tree includes all the descendants of all the ancestors of all the descendants of all the ancestors of…
MLeroux84 May 8, 2016

Thanks, Tom. I played with this a bit today. I’m hampered by my lack of knowledge/experience with recursive queries. I get a bit further (but not very much) than you did by including spouses in the ancestor query. I’m thinking that each iteration needs to include siblings and spouses as seeds for the next iteration, but have not been able to find a way that seems to work.
I’ll keep plugging at it – it has gone from something “I’d like to do” to “It’s really bugging me now”

Inline comments


ve3meo

Comment: Good question for which I have no rea…

ve3meo
08 May 2016 17:31:19

Good question for which I have no ready answer. It was difficult to do lineage before SQLite gained recursive query functionality. Doing recursions in SQLite does not come naturally to me. Your goal requires not only ancestors and descendants but also collateral lines. While it does not require kinship results which should make it easier, I confess I do not have a strategy in mind.


MLeroux84

MLeroux84
09 May 2016 02:01:42

Thanks. recursive SQL is not that easy for me either. I was thinking that it would not be that difficult, since it executes so quickly from the RM application. I haven’t seen it take very long to do “Count Trees” – well under a second for 4K names, so I was hoping that this was something obvious that I missed.


ve3meo

Comment: This one mystifies me, too. It seems …

ve3meo
08 May 2016 17:31:20

This one mystifies me, too. It seems that it needs to be a recursion of “Finding all persons in a given person’s tree” iterating through all those remaining persons after subtracting those trees that have been counted.


MLeroux84

MLeroux84
09 May 2016 02:07:11

I wouldn’t think that it was iterating through remaining names, just because of the challenge of recursing through each name. Given the performance I’m seeing (albeit on a machine with reasonable performance) It would seem more likely that there is a way of identifying a node of each tree, then counting from there.

That said, since I haven’t been able to solve the first part of the problem it is all pure speculation


ve3meo

Comment: This script includes all the ancestor…

ve3meo
09 May 2016 03:58:26

This script includes all the ancestors of the starting person and their descendants but the full tree includes all the descendants of all the ancestors of all the descendants of all the ancestors of…


MLeroux84

MLeroux84
09 May 2016 23:11:22

Thanks, Tom. I played with this a bit today. I’m hampered by my lack of knowledge/experience with recursive queries. I get a bit further (but not very much) than you did by including spouses in the ancestor query. I’m thinking that each iteration needs to include siblings and spouses as seeds for the next iteration, but have not been able to find a way that seems to work.
I’ll keep plugging at it – it has gone from something “I’d like to do” to “It’s really bugging me now”

Events – Move Description to Note #events #notes

This script moves the entire contents of event descriptions of a selected fact type to the Note for that event. If there is already content in the Note, the Description value is appended as a new paragraph.

To select a Fact Type, you must use a SQLite manager that supports SQLite run-time variables, such as SQLite Expert Personal (SQLiteSpy does not). When the query is run, a box will pop out prompting for the entry of the Fact Type’s abbreviation. This is the label as seen in the Edit Person screen. By entering the wildcard character (%), all Fact Types having the Description enabled will be processed.

EventDescriptionToNote-Move.sql
— adapted from Events – Move Short Note to Description

Source Templates – Merge Duplicates #sourcetemplates #sources #merge

2022-03-24 test with #RM8 successful.

RootsMagic has no Merge Source Templates function and it really needs one. When you copy multiple times from one database to another and there are citations involved that use the same custom source template, each time that source template is brought over it is treated as a new source template and the associated source is, too. So now you have multiple identical source templates with no tool to merge them. And you have multiple identical master sources which cannot be merged by AutoMerge because they use different source template records. You can merge them manually but that is painfully tedious given that the identical properties of the source templates should make it possible to automate it.

This script automatically merges custom source templates that have matching (case and space character insensitive 2016-04-22):

  • footnote sentence templates
  • field definitions

Variances in name, the sentence templates for Short Footnote and Bibliography and other fields are ignored which means that source templates that are not quite exact duplicates in all respects will be merged. Unfortunately, it is still sensitive to differences in Hints and Long Hints which are not critical to the merging of source templates.

The first source template (lowest TemplateID) in a set of duplicates will be the last one standing. All sources that once used the duplicates will now use it.

The script does leave a trail of two custom tables that could be cleared out with the addition of DROP TABLE statements added at the end or run separately, identical to the two already in the script.

SourceTemplates-MergeDuplicates.sql Rev 2013-08-07 to correct bug.
Rev 2016-04-22 to make tolerant of differences in case and spacing.

-- SourceTemplates-MergeDuplicates.sql
/*
2013-07-30 Tom Holden ve3meo
2013-08-07 corrected error in Update SourceTable which obtained only the first TemplateID from xLookupSourceTemplateTable
2016-04-22 now tolerates differences in case and space characters in Footnote and FieldDefs
 
Merges custom source templates that have identical
Footnote sentence templates and field definitions.
Ignores differences in Short Footnotes, Bibliography and other fields.
Makes the lowest TemplateID of a set of duplicates the master.
 
It is still sensitive to differences in hints in what would be otherwise identical field definitions that could be merged.
- needs parsing to clear that out.
*/
 
--Create a table of the master custom source templates having duplicate(s)
DROP TABLE IF EXISTS xDupSourceTemplateTable
;
 
CREATE TABLE IF NOT EXISTS xDupSourceTemplateTable
AS
SELECT
   TemplateID
  , Name
  , Description
  , Favorite
  , Category
  , FootnoteCore
  , ShortFootnote
  , Bibliography
  , FieldDefsCore
FROM
(
SELECT COUNT()-1 AS Dupes,
   TemplateID
  , Name
  , Description
  , Favorite
  , Category
  , REPLACE(LOWER(Footnote),' ','') AS FootnoteCore
  , ShortFootnote
  , Bibliography
  , REPLACE(LOWER(FieldDefs),' ','') AS FieldDefsCore
FROM
(SELECT * FROM SourceTemplateTable WHERE TemplateID > 999 ORDER BY TemplateID DESC)
GROUP BY FootnoteCore, FieldDefsCore
)
WHERE Dupes > 0
;
 
-- Create table of matching custom source templates
DROP TABLE IF EXISTS xLookupSourceTemplateIDTable;
CREATE TABLE IF NOT EXISTS xLookupSourceTemplateIDTable
AS
SELECT xD.TemplateID AS MasterID, ST.TemplateID FROM xDupSourceTemplateTable xD
INNER JOIN SourceTemplateTable ST
WHERE xD.FootnoteCore LIKE REPLACE(LOWER(ST.Footnote),' ','')
AND xD.FieldDefsCore LIKE REPLACE(LOWER(ST.FieldDefs),' ','')
AND ST.TemplateID > 999
;
 
-- Revise SourceTable to point to master TemplateID
--EXPLAIN QUERY PLAN
UPDATE SourceTable
SET TemplateID = (SELECT MasterID FROM xLookupSourceTemplateIDTable xL WHERE SourceTable.TemplateID=xL.TemplateID)
WHERE TemplateID IN (SELECT TemplateID FROM xLookupSourceTemplateIDTable)
;
 
-- Delete now unused duplicate Templates
DELETE FROM SourceTemplateTable
WHERE TemplateID IN
(
SELECT TemplateID FROM xLookupSourceTemplateIDTable WHERE TemplateID != MasterID
)
;

Discussions & comments from Wikispaces site


Ksquared333

RMNOCase Error

Ksquared333
02 December 2017 23:08:24

OK. I know I’m being stupid, but I don’t remember how to use RMNOCASE_fake-SQLiteSpy.dll when I’m running SourceTemplates-MergeDuplicates.sql . Where do I load the driver? Also, where do I donate?
Thanks,
Kim Derrick


ve3meo

ve3meo
03 December 2017 02:47:36

This page should answer your question: RMNOCASE+-+faking+it+in+SQLiteSpy

Reports – Point Form Narratives Setup #reports

Rev 2016-04-05: Version 2
Tired of verbose and repetitious sentences in narrative reports and the effort involved in customising and tweaking them so that grammar and prepositions and pronouns were correct, I got the idea some years ago that what I might prefer is a hybrid of the tabular format of the Individual Summary and Family Group Sheet with event/fact notes embedded rather than at the end. Jerry Bryan demonstrated such a concept with his Oct 12, 2015 RootsMagic Forums posting, “Preparing an RM Descendant Narrative Report for a Family Reunion for This Year“. While he did so using largely manual procedures, this SQLite script makes it easy to try out a similar format and then restore your prior format.

SettingsNormalPoint Form
Normal – “Keep facts in same paragraph”Point Form – space character starts fact, 0 Carriage Returns

Note that for all examples of Point Form, the RootsMagic report settings option for paragraphing is set to “Keep facts in same paragraph”.

Although the Point Form is not strictly point form because the facts run together in the same paragraph, it is actually better for fast reading than is the Normal report because there are fact names that catch the eye, the ‘sentences’ are terse and consistent and it is the most efficient in use of space and paper.

DescNarrJohnWoods-Normal0DescNarrJohnWoods-Normal0.pngDescNarrJohnWoods-PointForm0DescNarrJohnWoods-PointForm0.png
Normal – “New paragraph after every fact”Point Form – 2 Carriage Returns start fact

Both of these waste trees!

DescNarrJohnWoods-Normal1DescNarrJohnWoods-Normal1.pngDescNarrJohnWoods-PointForm2DescNarrJohnWoods-PointForm2.png
Normal – “New paragraph after facts with notes”Point Form – 1 Carriage Return starts fact

This Point Form layout is the most attractive of the three or, at least, comes closest to the concept of a hybrid of the Individual Summary and Narrative report.

DescNarrJohnWoods-Normal2DescNarrJohnWoods-Normal2.pngDescNarrJohnWoods-PointForm1DescNarrJohnWoods-PointForm1.png

Features:

  • Backs up key tables or parts thereof to ‘x’ versions which are used by the complementary script to restore back to the previous format.
  • User control* over fact/event sentence heading format: one of plain, bold, italics, underlined.
  • User control* over fact/event sentence lead-in carriage returns.
  • Changes default sentences to point form without [person] variables.
  • Default sentences begin with the fact type name as a heading. This is the name defined in Lists>Fact Type List; the user can edit user-defined fact types in RootsMagic.
  • Alternate Names are labelled by their type, if assigned in the Edit Person screen.
  • Shared events show the role names of the sharers.
  • Adds _Heading event to provide the initial [person] sentence as the first ‘fact’ so each person’s section will start with the person’s name and not be stated as ‘factless’. Version 2 does not do this; instead it uses a Jerry Bryan trick of putting a line feed/carriage return after the [Person] variable for the Birth sentence template, normally the person’s first event. This does require a Birth event as the first event to be output to the narrative report.
  • Adds two trailing CR/LF to the Note field of the last family event (by SortDate) of each couple to force the spouse’s subsection of a person’s report section to start a new paragraph. (V2)

*The script works best with a SQLite manager that supports run-time variables such as SQLite Expert Personal to provide control over the format of fact headings and fact paragraphing. Those that do not support them, such as SQLiteSpy, default to bold and no <CR>s. In either case, a RMNOCASE collation extension is needed. To add the RNMOCASE collation extension, see either:

Version 2
Reports-PointFormNarrativeSetup2.sql
Reports-RestoreAfterPointForm2.sql
Version 1
Reports-PointFormNarrativeSetup.sql
Reports-RestoreAfterPointForm.sql

Use:

  1. Open your database (safer to use a copy) with your SQLite manager.
  2. Load the RMNOCASE extension.
  3. Load the SQLite script Reports-PointFormNarrativeSetup.sql.
  4. Execute the script.
  5. SQLite will throw an error if the database has been previously modified by this script without subsequently running Reports-RestoreAfterPointForm.sql. Load and run the latter and return to step 3.
  6. If prompted for a value for $FactNameFormat_ibun, type in one of the letters: italics, bold, underline, no and OK. Any value other than i, u, n is the same as b.
  7. If prompted for a value for $ParagraphCR_0_1_2, type in one of the numbers 0,1,2 to define the number of Carriage Returns prepended to the sentence. Any value other than 1 or 2 is the same as 0 – a leading space character.
  8. On successful completion the results window will display a status message so reporting.
  9. Open RootsMagic and generate narrative reports. Use the Report Settings Option “Keep fact sentences in same paragraph” to start, especially if you have chosen to have lead-in carriage returns.
  10. You can leave the report preview open and rerun the scripts to switch back to original and to different point form formats. After each execution of a script, you can quickly see its effects from report view with Alt-t to return to Report Settings and <Enter> to regenerate the report with the changes.
  11. You may want to try some other scripts that affect reports after having set up your database for point-form reports:

Maps – Geo-Pedigree, plotting your ancestors’ birth places #googlemaps #geocoding

A RootsMagic Facebook group discussion about pedigree charts colour coded by state or country of birth triggered this idea of plotting ancestors birth places on a map and joining them according to pedigree. This would be a more graphic and informative representation than the standard box chart. This script aids in generating such a map through a web-based front end for Google and other maps.

geo-pedigree.PNG
Example of a geo-pedigree map created through GPSVisualizer.com from the text created by the geo-pedigree script.

The online map is interactive; the screenshot above is not. Clicking a point or line pops out a box with more information. Points or lines can be suppressed or highlighted. A line can be zoomed to its extent with one click. Directional tickmarks indicate the line of descent. The current script plots the five generation pedigree of the root person used by the RootsMagic Set Relationships tool. The waypoint marker for each person’s birthplace follows the person’s color code in RootsMagic; in the example above, the root person was uncolored, paternal ancestors red and maternal lines green. The pedigree lines (or tracks in GPS mapping parlance) follow the colour of the parent. Both tracks and waypoints fade with the number of generations from the root person. The GPS Visualizer input form has numerous controls giving the user choice of the underlying map source and various features in addition to choosing the GPS file to upload. The script queries the RM database to get the needed needed data for each person (geocoded places of birth are essential for it to be meaningful) and writes results in the GPS text format accepted by GPS Visualizer.

I was thinking about other possible improvements to the higgledy-piggledy script I had developed while learning how to use GPSV and what additional information might be included when I discovered that this was not a new idea. There is a very good extension to FamilySearch Family Tree that produces from that database a more powerful geo-pedigree map than I can possibly devise. Perhaps a better use of my time would be to ensure that my ancestors births are accurately recorded in FSFT so that I can rely on the geo-pedigree maps drawn from that data by RootsMapper.com.

RootsMapper.PNG
Screenshot of an interactive pedigree map by RootsMapper.com from data in FamilySearch Family Tree

—TO BE CONTINUED—-

FTM import – restore Event description from Place Details #ftm2014 #ftm2012 #placedetails #events

RootsMagic 7 direct import from Family Tree Maker (not GEDCOM) as of March 2016 imports event descriptions into two different places, depending on the fact type: to the RM event description or to the Place Detail for that event. Some users disagree with that decision and want the FTM event descriptions to remain event descriptions in RM after import. The script provided here can be used on a fresh import to move the content from each event’s Place Detail to the event’s Description field.

The RootsMagician described the import process here:

In FTM, there are fields for date, place, and description. There is not a field for place details.

When RM imports an FTM file, it will place whatever the user entered as a description into the RM description field *IF* that fact type defaults to allowing a description. So, for example, an occupation, residence, etc type fact, RM will import the description into the description field for that fact.

However, FTM lets users enter descriptions for facts like birth, marriage, etc. where it doesn’t make much sense to have a description. So FTM users used that field like RM users used Place Details… the name of the hospital, the street address, etc.

So when RM imports an FTM fact that doesn’t normally allow a description (say birth), it will import that description into the place detail field *IF* the fact actually has a place. If the fact doesn’t have a place then RM will import the description into the description field.

Further discussion in that thread led to this collaboration in which FTM emigre Mike Le Voi packaged a script developed by Tom Holden with instructions for a first-time SQLite user on applying it.

Move RM Place Detail data to Description.pdf Instructions (MLV)
FTMimport-MoveEventPlaceDetail2Description.sql SQLite script (TH)
FTM Import Testing.ftm A FTM database for testing the import process and script (MLV)

N.B. On reusing the revised database, it is probable that it will fail RootsMagic’s File > Database Tools > Test Database Integrity check so simply run the next tool Rebuild Indexes.