Project

General

Profile

Exporting Raiser's Edge for CiviCRM » History » Version 22

Jon Goldberg, 08/13/2014 03:27 PM

1 1 Jon Goldberg
h1. Exporting Raiser's Edge for CiviCRM
2
3
You can export all of the data using the Raiser's Edge Export tool.  You'll see it on the left toolbar when you first enter Raiser's Edge.
4
5
From the tool, you will create a number of exports.  When you first create an export, you'll be asked a number of questions, including Export Type (Constituent, Gift, etc.), a checkbox to include inactive records (check this), and an export file type (select CSV).
6
7 2 Jon Goldberg
For the Export type, start with Constituent.  This is the "base table" - all records will be joined relative to it.
8 1 Jon Goldberg
9 3 Jon Goldberg
h2. Constituent Based Exports
10 1 Jon Goldberg
11 21 Jon Goldberg
h3. Contact Information
12 4 Jon Goldberg
13 21 Jon Goldberg
RE differentiates between constituents and non-constituents in their system.  If you create a new contact, they're a constituent - but then you might decide to add a spouse or employer record, which is NOT considered a constituent, and doesn't show up in most queries/exports/etc.
14 1 Jon Goldberg
15 21 Jon Goldberg
If extracting directly from SQL, @SELECT * FROM RECORDS@.
16
17
Note that only those records where IS_CONSTITUENT = -1 are constituents - but in Civi there's no distinction, so import them all.
18
19
Create a new export. (NOTE: This ONLY gets constituents).
20 1 Jon Goldberg
Tab 1. General:
21
- Include all records.
22
- Head of Household processing: Export both constituents separately.
23
- Check all of the "Include these Constitutents": Inactive, deceased, no valid address
24
25
Tab 2: Output.
26
First, expand the "Constituent Information" in the left pane, and add every field to the export.  Do the export (as a CSV).
27
28 6 Jon Goldberg
h3. Constituent Codes
29 3 Jon Goldberg
30 15 Jon Goldberg
In RE: Found at the bottom of the "Bio 2" tab.
31 19 Jon Goldberg
In SQL: CONSTITUENT_CODES maps to "GroupContact".  TABLEENTRIES stores the codes ("groups").  In my case, @SELECT *  FROM [CCR_July_snapshot].[dbo].[TABLEENTRIES] WHERE [CODETABLESID] = 43@ did the trick.  YMMV - see "deciphering stored procedures" below.
32
33 3 Jon Goldberg
Export as _one to many_, below.
34
These map to "groups" in Civi - can also be mapped to "tags" if you don't need to track the begin/end date on them.
35
36
No need to export these fields:
37
System Record ID
38
Import ID
39 1 Jon Goldberg
As of Civi 4.4.6, there's no way to import Group Begin/End dates via API, you need to do it via SQL.
40 6 Jon Goldberg
41
h3. Solicit Codes
42
43
Export as _one to many_, below.
44
These can map to groups - but also may map to privacy preferences or custom fields (e.g. Email Only, Do Not Solicit)
45
Export the "Solicit Code" only (along with the Constituent's System Record ID, of course).
46 3 Jon Goldberg
47 20 Jon Goldberg
h3. Addresses
48
49
SQL tables: ADDRESS, CONSTIT_ADDRESS
50
51
Addresses are a many-to-many relationship in RE.
52
53 22 Jon Goldberg
h3. Phones and E-mail
54
55
RE is a children of the 90's, so a) phones are tied to addresses, not contacts, and b) e-mails are a type of phone.
56
57
This SQL gets me a useful list of phones and e-mail for further processing in Kettle:
58
<pre>
59
SELECT DISTINCT
60
  CONSTITADDRESSID
61
, CONSTIT_ID
62
, PHONETYPEID
63
, CONSTIT_ADDRESS_PHONES."SEQUENCE"
64
, NUM
65
, DO_NOT_CALL
66
, TEXT_MSG
67
FROM CONSTIT_ADDRESS_PHONES
68
LEFT JOIN PHONES ON CONSTIT_ADDRESS_PHONES.PHONESID = PHONES.PHONESID
69
LEFT JOIN CONSTIT_ADDRESS ON CONSTITADDRESSID = CONSTIT_ADDRESS.ID
70
</pre>
71
72 9 Jon Goldberg
h3. Relationships
73
74
Relationships are different in Civi and RE in the following significant ways:
75
* Relationships don't have to have a relationship type.
76
* The A-B relationship doesn't have to have the same relationship type as B-A (e.g. if my relationship is "parent", the reciprocal relationship could be "son" or "daughter".
77
* Most importantly, related contacts need not have their own constituent record (though they can).  If they don't have their own constituent record, they nevertheless have a record, just not one that's available from within the normal queries/lookups.
78
79 10 Jon Goldberg
h3. Attributes
80
81
Attributes are the RE equivalent of custom fields.  However, unlike custom fields, they can also have a "date" value and a "comments" value.  While this can be replicated in Civi via multi-record custom field groups, ideally the data is evaluated attribute by attribute.
82
83 11 Jon Goldberg
Valuable information about the setup of the attributes is available in RE from *Config > Attributes*.
84 1 Jon Goldberg
85 11 Jon Goldberg
*note:*  I'm currently evaluating the use of CiviCRM 4.5+'s "EntityRef" functionality to facilitate chained selects of OptionValue lists.  If this is successful, that would facilitate creating a single multi-record custom field group (with the fields "Attribute", "Description", "Date", "Comments") that would work VERY similarly to how RE handles attributes.
86 10 Jon Goldberg
87 3 Jon Goldberg
h3. Other constituent tables:
88 5 Jon Goldberg
89 2 Jon Goldberg
Skip these tables:
90
* Spouse
91
* Gifts
92
* First Gift, Last gift, Largest Gift
93
* Actions
94 1 Jon Goldberg
* First Action, Last Action
95
* Summary Information
96
97 7 Jon Goldberg
h3. Tables that Civi doesn't have a direct counterpart for
98 5 Jon Goldberg
99 3 Jon Goldberg
* Aliases (stores Maiden Name and d/b/a - unsure how to import into Civi just yet)
100 7 Jon Goldberg
* Solicitor Goals - Can be found on an RE contact record on "Bio 1" tab by clicking "Details" next to "Is a Solicitor" checkbox.  Don't know how to use them.
101 2 Jon Goldberg
102
103
Open each CSV file in Excel or similar.  Sort each field by ascending AND descending to see if any data is stored in that field.  If every record has no data or the same data, delete it - it's not being tracked in the current system.  If you see only one or two records with a particular field, they're also probably fine to go, but check with the client first.
104
105 1 Jon Goldberg
106
Next, strip out all of the constituent information except for primary/foreign keys.  I like to keep in First/Middle/Last name just for human readability though.  So leave in those three fields, plus any field with the word "ID" in it.  This is your base constituent info, and will be in every other export you do.
107
108
Now comes the fun part!  Export each table, one at a time, by adding those fields to an export that already includes the base constituent info.
109
110
For one-to-many relationships, the system will ask you how many instances of the information to export.  I default to 12, then look over the data to see how many are actually used, then re-export with a higher or lower number.
111
112
I also remove records that don't contain the relevant data.  For instance, when exporting Solicit Codes, I sort by the first Solicit Code.  Then I scroll down past the folks that have Solicit Codes to those who have none, and delete the rows for folks who have none.
113
114
Note that for simplicity's sake, RE contains many views of the tables that, if you export them all, you'll have redundant data.  There's no need to export "First Gift", "Last Gift", or "Largest Gift" - simply export all gifts.  Likewise for "Preferred Address".
115
116
When exporting one-to-many tables that themselves contain one-to-many tables (e.g. Addresses contains Phones), do NOT select 12 of each!  That means you're exporting 144 phone numbers per record.  First determine the maximum number of addresses being tracked, re-export with that number, THEN export with phone numbers.  Also, it's reasonable to export with 5 phone numbers per address.
117
118
NOTE: Letters sent is incomplete, there's more than 12 letters to some folks!
119
120
GIFTS is related to constituent on the last column (Constituent System Record ID)
121 8 Jon Goldberg
122 13 Jon Goldberg
h3. Code Tables/Option Groups/Option Values
123
124 17 Jon Goldberg
If you're extracting data from the SQL back-end, you'll see that the RE equivalent to Civi option groups is "code tables".  There's two functions that handle lookups: dbo.GetTableEntryDescription and dbo.GetTableEntryDescSlim.  To determine where the data is being accessed by the function, see "Deciphering MS SQL", below.  Use the "lTableNumber" passed to those functions and you'll find your data in dbo.CODETABLES (comparable to civicrm_option_group), dbo.CODETABLEMAP and dbo.TABLEENTRIES (comparable to civicrm_option_value).
125
126
h2. Deciphering MS SQL
127
128
SQL Server Profiler is a tool that lets you spy on SQL statements passed to MS SQL, which is good for determining where certain data lives.  However, RE depends on functions and stored procedures, so sometimes the SQL won't tell you exactly where to look.
129
130
h3. Looking Up Functions
131
132
These are embedded in SQL and have a nomenclature like: dbo.GetTableEntryDescSlim. Find them in SQL Server Management Studio: database > Programmability > Functions > Scalar-valued Functions.
133
134
h3. Looking Up Stored Procedures
135
136 18 Jon Goldberg
If, in the profiler, taking a certain action shows a command like this:
137 17 Jon Goldberg
These have a syntax like:
138 1 Jon Goldberg
<pre>
139 18 Jon Goldberg
exec sp_execute 48,43,'Acknowledgee'
140 1 Jon Goldberg
</pre>
141
142 18 Jon Goldberg
You're dealing with a stored procedure.  You need to find the corresponding @exec sp_prepexec@ command (in this case, the one with a 48).  In this case, it looks like:
143
<pre>
144
declare @p1 int
145
set @p1=48
146
exec sp_prepexec @p1 output,N'@P1 int,@P2 varchar(255)',N'SELECT  Top 1 TABLEENTRIESID  FROM DBO.TABLEENTRIES WHERE CODETABLESID = @P1 AND LONGDESCRIPTION = @P2  ',43,'Acknowledgee'
147
select @p1
148
</pre>
149
150 17 Jon Goldberg
151 13 Jon Goldberg
152 14 Jon Goldberg
h3. Addressee/Postal Greeting/E-mail greeting
153
154
RE has a much wider variety of greeting formats out-of-the-box.  The "spouse ID" is stored on the record to enable quick lookups of addressee greetings that include the spouse.
155
156 8 Jon Goldberg
See also:
157
http://support.littlegreenlight.com/kb/migration/migrating-from-the-raisers-edge-to-lgl
158 14 Jon Goldberg
159
h3. Things I see that RE does better than Civi:
160
161
* Better greetings/salutations UI out of the box.  In Civi, you must in-line edit the greetings, then press "Edit" next to the greetings, and even then you only see the tokens you'll use.  RE lets you edit with no clicks, and parses the tokens for you.
162
* The equivalent of option values are stored with their id, not their value.  This isn't a big deal, but it DOES make data transformation easier in RE, and I suspect it makes their equivalent of pseudoconstant code easier to read.
Go to top