All posts by David Zeidman

Adding an Education Record to a Non-Constituent Individual

I have been struggling to find a way to a an education record to a non-constituent individual relationship. There is a Blackbaud knowledgebase article here that outlines how you add an education relationship but it takes a lot for granted. Here is the gist of it:

Dim oEdu As CEducation2
Set oEdu = New CEducation2
oEdu.Init REApplication.SessionContext
With oEdu
   .Fields(EDUCATION2_fld_RECORD_ID) = 678   'Selects the record to add the Education record to
   .Fields(EDUCATION2_fld_SCHOOL_ID) = "Berry College"
   .Save
End With

However where does the 678 come from? For a constituent this is simple. It would be the constituent system id found under the Records_fld_Id field.

However what would it be for a non-constituent individual relationship. After all they can also have education relationship records.

I tried the field Individual2_fld_Id but the error I got back told me that I could not add an education to an organization record! Not very helpful.

In the end, with a bit of trial and error I worked out that you need to put the field Individual2_fld_Relation_id.

This is the id for the corresponding entry in the Records table which consists of both constituents and non-constituents.

Hope this helps somebody.

Importacular

We have always had a product that imports data into The Raiser’s Edge. We would regularly customise it for non-profits so that it would adhere to their business rules and bring in their data in a format that they wanted it to. Then came along the somewhat more well known import tool for the Raiser’s Edge (do I really have to mention names?) and our quiet workhorse was, not quite put down, but put to rest.

In recent years however we have had some requests to bring it back. The reason stems mainly from our Audit Trail and Validatrix clients who regularly use the other well known product but would also like to save all the changes that are made in Audit Trail and prevent data from entering Raiser’s Edge making use of their Validatrix business rules.

We also had a number of third party suppliers of data ask us the best way to get data into RE and could we help them.

So a plan was formed to resurrect our long forgotten import tool, integrate Audit Trail and Validatrix and update it with the best bits from IDLookup and The Mergician. We also did what only we do best. We integrated it directly with other third party data sources.  And so was born Importacular!

We built, for want of a better word, a plug-in architecture so that adding new third party data sources does not mean a release of the new version of the application. Instead we could add new data sources remotely to the application with the end user deciding to activate them and install the client assemblies. Once you were used to the main application, selecting a new data source component would be a breeze. It would follow the same pattern as all the other data sources that you had used previously.

We are really excited about the future for Importacular and being able to help non-profits of all sizes to get their data into Raiser’s Edge without pulling their hair out over Excel and CSV files.

Working with Phones/Email without addresses in Raiser’s Edge 7.94

Prior to the release of The Raiser’s Edge version 7.94 I was working with all of our products to ensure compatibility with this latest version. If you have not heard (and if you have not heard where have you been hiding), this release of RE removes phones and emails from physical addresses.

When the concept of emails was new, it was possible that you would have an email address tied to your telephone provider or an email address specific to your place of work.  Your phone would either be at home or at work. Having these connnected to your physical address made sense. However it quickly became aparent that with the arrival of mobile phones and of email addresses that were accessible no matter where you were located, phones and emails (and for that matter all types of communication links) should be tied directly to the constituent record and not to a physical address. This is what has happened with the release of RE7.94.

This is a big shift and in terms of developing applications, we have had to allow for both possibilities so that our programs are compatible with users still on 7.93 and below and those that have made the leap over to 7.94.

The good news is that the old way of doing things still works in 7.94. You can still access phones via the CConstitAddress.Phones collection for an address. However you will probably want to access them how they are intended… Free from addresses.

This is done using the new interface IBBPhonesParent. This is implemented by CRecord, CIndividual2 and COrganization2. The collection of phones is a CConstitPhones object which contains the usual methods. You can iterate the collection to give you one CConstitPhone object but here is the problem.

For reasons that I don’t fully understand (I was told due to binary compatibility reasons) there are no properties or methods on the CConstitPhone object. Instead you have to convert this object to an IBBDataObject in order to access the Fields property. This is a real pain but to save myself some trouble I put together two extension methods for the CConstitPhone object which does this for me. (Unfortunately extension properties do not exist so that is why I cannot simply create an exact corresponding Fields properties. Those working with C# will be familiar with this as there is not a Fields property but rather  get_Fields and set_Fields methods)

<System.Runtime.CompilerServices.Extension()> _
Public Function Fields(ByVal phone As CConstitPhone, fieldConstant As ECONSTITPHONEFIELDS) As Object
   Dim dataobject As IBBDataObject = CType(phone, IBBDataObject)
   Return dataobject.Fields(fieldConstant)
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Sub Fields(ByVal phone As CConstitPhone, fieldConstant As ECONSTITPHONEFIELDS, value As Object)
    Dim dataobject As IBBDataObject = CType(phone, IBBDataObject)
    dataobject.Fields(fieldConstant) = value
End Sub

With these extension method you can simply access the Fields methods on a CConstitPhone object in almost the same way as you would with other objects.

So here is an example of creating a new phone on a constituent record using the above extension code.

Dim constit As CRecord = GetConstituent()
Dim phonesParent As IBBPhonesParent
Dim phones As CConstitPhones
Dim phone As CConstitPhone

phonesParent = CType(constit, IBBPhonesParent)
phones = phonesParent.Phones
phone = phones.Add()
phone.Fields(ECONSTITPHONEFIELDS.CONSTIT_PHONES_fld_PHONETYPE, "Home")
phone.Fields(ECONSTITPHONEFIELDS.CONSTIT_PHONES_fld_NUM, "123-4567")
phone.Fields(ECONSTITPHONEFIELDS.CONSTIT_PHONES_fld_IS_PRIMARY, True)

constit.Save()
constit.CloseDown()
constit = Nothing

What would I like to see from The Raiser’s Edge NXT API?

Everybody always says how rubbish the RE7 API is. I would have to disagree with them thoroughly. There are some serious drawbacks such as not being able to access it directly via the cloud but in terms of coverage it is probably one of the best APIs I have come across. Not only does it cover the data model (which is enormous in itself), it also covers very many areas of the GUI too. Sure there are issues with stability and with lack of documentation but thankfully I have managed to overcome both of these and have been very happy with the API.

So what are my expectations for The Raiser’s Edge NXT API? I don’t have any inside knowledge about this other than what I know is technically possible and what is feasible to do within a reasonable timeframe. I cannot foresee the possibility of asking the API for a constituent form in order to enter data into as you can with RE7. The API will be a REST based data model so that I can ask for a constituent and I will be returned a JSON (or possibly XML) based object to work with. Now if this were RE7 that constituent object would consist of layer upon layer of nested arrays of data. That is how the current CRecord object is but in the REST model this is unwieldy. It may be like that. But hopefully I will also be able to request, for example,  all notes for a given constituent or all attributes. Equally I would like to be able to simply update one note or one attribute rather than the whole object.

One area which is severely lacking in RE7 is the ability to search for data in an easy manner. My workaround has always been to create a SQL query and interrogate the database directly. This is unlikely to be possible with RE NXT. However there are mechanisms for doing this via REST. With other systems (including the CRM system that we use internally) we make use of OData.  This protocol gives me access to individual properties within a REST webservice. For example if I wanted to find a constituent with the last name of Zeidman I would do something like this:

http://www.BlackbaudsRENXTServer.com/Constituents?$filter=LastName eq ‘Zeidman’

Of course you would have to URLEncode it so that it would look something more like this:

http://www.BlackbaudsRENXTServer.com/Constituents?$filter%3DLastName+eq+%27Zeidman%27

OData is extremely powerful as I am able to search child objects too and not just the root. This is extremely difficult to do with RE7 as it requires complex SQL to do so. OData is not just for searching but also for pulling out individual properties too rather than whole objects. This is especially useful of the payload is large (as the constituent object is).

One area that is very power with the RE7 API is the ability to determine an instance of RE7’s meta data which varies between organizations. For example we can ask the API what attributes are available to us to use or what are the entries in the notepad type code table. As a third party developer this is essential. If I am writing software for one organisation I could simply hard code the use of one attribute as I know it is going to be there. However unless I can offer the end user the ability to map fields from a third party application back to RE, the application that I am developing can never be sufficiently generic.

Blackbaud’s model of bringing RE NXT online gradually in phases based on roles is a good one. It means that organizations can retain their third party integrations and customizations (assuming the previous restrictions within the hosting environment are lifted). I can envisage the API as being simply a phase in the rollout of NXT and I for one am very excited about that!

EDIT: Read more about RE NXT in general here: http://npengage.com/nonprofit-technology/2-new-solutions-with-4-big-things-great-news-for-the-nonprofit-sector/

Global Merge More Accurately with The Mergician

We have just released an update to our successful global merge utility The Mergician. We have always had a way of searching for records in The Raiser’s Edge using complex and flexible criteria. IDLookup was one of the first plug-ins that we ever wrote and since it was first developed it has grown to contain some of the most powerful look up criteria around. A year or two ago we created IDLookup Dedupe, making use of IDLookup to search your database for duplicates. Well now we have gone one step further and brought all of this flexible, customization and downright lovely criteria lookup into The Mergician giving everybody the power to choose exactly how they dedupe their data.

There are 20 fields to choose from, many of which you can decide whether or not to search by the whole word or a specific number of characters. You can search using soundex (where names like Johnson and Jonson would be matched), you can search using first name and address line equivalents so that names like Bill match on William and Bvd match on Boulevard. If you are feeling very adventurous you can change the collation so that accented names would match with or without the accents e.g. Édouard would match Edouard.

Not only can you set up one criteria set, but you can set up multiples. You can decide that you want to narrow down the matches made from one to the next or you can decide that you want to select the criteria set with the fewest matches.

The Mergician still supports The Raiser’s Edge own dedupe algorithm so you can continue to create your merge report using that. You can also use our simple email matching tool too or you can use a third party agency to do the matching for you. However using our latest matching engine will give you real flexibility to match based on your own data without having to rely on mysterious algorithms or scoring charts.

Find out more about The Mergician or download the trial version today.

What Blackbaud needs to to do to convince the world of its enterprise software

I was in discussion with Ivan Wainwright recently about Blackbaud CRM and its competitors in the enterprise sized non-profit sector. It would seem that despite being around for a long time Blackbaud CRM has not made as much ground as those of us watching thought it would do. At least that is the case in the UK. It appears to have achieved more in the US.

The obvious competition comes from Salesforce.com and from Microsoft Dynamics. (There are plenty of smaller applications that suit many non-profits but this article is only considering the largest).
This is not a comparative blog. I am not going to analyse the differences down to the last detail. There are others that are much better qualified than I. At the time of writing I am too wedded to Blackbaud to be sufficiently objective. However there are some very good reasons why the competitors will be chosen over Blackbaud CRM.

Both Salesforce and Dynamics have very large for-profit user bases. This means that if there is a problem with the product due to a missing feature it will likely be developed by a third party in response. These users stem mainly from the commercial world meaning that there is less of a non-profit focus and the products evolve less in that direction. That being said there are more and more companies that skin Salesforce and Dynamics for non-profits giving them the missing functionality. Are they any good? In my mind the jury is still out.

These smaller companies that adapt, implement and add extra layers onto Salesforce and Dynamics lack the years and years of non-profit experience that Blackbaud have accumulated. They also lack the sheer volume of clients and client experience. This is where Blackbaud shines. BBCRM is not a skin. It doesn’t paper over the cracks of a for-profit sales system. It was built from the ground up with fundraising at its core.

So why hasn’t BBCRM conquered all? Well despite its obvious experience in the sector, one area Blackbaud has invested less time in is integration. While they naturally integrate or concentrate on integrating their own range of applications, they are beginning to realise that not all organisations want everything Blackbaud. This is even more so with enterprise level organisations. Larger organisations are much less likely to be pure non-profits. Many have commercial arms selling products that feed back into funding their causes. They have helplines, medical record systems, advanced communications tools. They have their alternative systems and don’t necessarily want to change them. They do, however, want to integrate them.

This is where those that implement Salesforce and Dynamics often excel. These platforms have been doing this for a while and are very accustomed to this requirement. The commercial sector is so broad that the source of data being fed into these systems is much more varied and the numbers of users far larger. This is why there is not only a MailChimp integration for Salesforce and Dynamics, there are dozens of other email marketing integrations too. Not to mention integrations with accounting packages, online shopping facilities, websites and blogs, ticketing sites and a whole host of other generic and specialist systems  that fundraisers might want to use.

For Blackbaud to sell its CRM product, their prospects not only have to be convinced that BBCRM can integrate with other applications (which without a doubt it can), but that Blackbaud will be their partner in reaching that goal, by facilitating, encouraging and incentivising others to create these integrations.

We are told that they want us, as customers, to be ‘loyal not trapped’, which is a great mantra. Now they need to embrace integration to show that they are serious about their new motto.

Without this extra dimension to their prospecting and sales process they will surely miss out on the number of sales that BBCRM could achieve.

Overcoming the password update policy for custom Raiser’s Edge applications

A recent question on the Blackbaud forums got me thinking about this problem. The issue is this. If an organisation has a password policy in RE in place that ensures that users have to update their password every X days, what happens to a custom application that runs every day in order to perform some maintenance / export / import etc.? It is also required to update its password. This is somewhat problematic because most scheduled tasks are just meant to be run and more or less forgotten about.

The obvious solution is to turn off this functionality. However you are only able to do this for the whole organisation which is problematic.  Another solution is to use Windows authentication to log into RE. That way it is Windows that decides the password policy. This is also not always possible.

Here is a third, programmatic way of doing this. You need to make use of the “other” API. I have mentioned this previously in Checking Security. You need to make use of the  Blackbaud.PIA.RE7.SecData7 assembly. This gives you access to the security objects that are not present in BBREAPI.

You set up a database table with three columns; a primary key id, a password and an expiration date. You then fill the password column with a list of passwords that could be used.

On starting the application you select from the table the password with the most recent expiration date (which may be in the future). You use this to log into RE using the usual code. Once that is done you determine whether or not you need to change the password. If the expiration date is in the past then you should change the password using the code below. The new password should be the next password in the table that has a blank expiration date and lowest id.

Dim user As New CUser
user.Init(SessionContext)
user.Load(SessionContext.CurrentUserID)
user.Fields(Blackbaud.PIA.RE7.BBInterfaces.EUSERFields.USER_fld_PASSWORD)

You then set a new expiration date on this password. This expiration date should be a good few days before the actual date you are required to change the password that way the existing password will still be good.

If there are no passwords left in the table you can remove all the expiration dates and start from the first value in the table i.e the password with the lowest id. I assume that RE allows you to use the same password as at some point in the past if not the most recent values.

One variation to this is to just create a random passwords and not have a list of passwords. That way you would only have a table with one row and an expiration date.

Any improvements? let me know in the comments.

Performance Management using Audit Trail – slides available

For those of you who were at BBCon 2013 (and for those of you who were not) Mohammed Dasser and I presented a session on performance management using the Audit Trail. The slides are available here: http://www.slideshare.net/blackbaud/performance-management-using-audit-trail?from_search=1

If you have any questions about what Mohammed has done then I would love to be able to answer them but to be honest he overwhelmed me with the sophisticated use of Audit Trail and you would be better of asking him! That being said feel free to post your comments about the session or ask directly and I will try and get an answer.

Blackbaud Conference Sessions to Watch out for #bbcon

It seems like a time honoured tradition of existing speakers telling others which sessions at the Blackbaud Conference  (BBCon) they should look out for. There is Heller Consulting’s, Joe Matic’s ( take his advice with caution – he is, after all, a robot) and, um, others. (Feel free to add them to the comments.)

I have now attended five conferences in the US and three in the UK. What do I look for in a good session? Well quite often the speaker is key. If they are not engaging then however interesting the topic , it will be lost on the audience. That being said some topics just shouldn’t be missed. (You can always moan about the speaker afterwards!)

So in no particular order (other than my two are going first as this is my blog and I am allowed to throw impartiality out the window), here is my choice of great speakers and sessions to look out for.

 

Performance Management using Audit Trail – David Zeidman and Mohammed Dasser

Have you ever wondered how you could use Audit Trail to measure your organization’s performance entering accurate data? You may wonder what records are being entered the most or how many different people are entering data onto a specific area. David will give a little background to Audit Trail and Mohammed will show you how University of Central Florida have created various metrics to report on performance. This is not going to be a sale pitch for Audit Trail (come to the Zeidman Development booth for that) .

Raiser’s Edge Geek Forum 2: The Revenge – Ed Hohlbein, Melissa Graves, Kirk Schmidt, Bill Connors and David Zeidman

There are very many different ways of using The Raiser’s Edge. If you went to the session last year you would have seen 5 Raiser’s Edge experts from three different countries, discussing / arguing about best practises. If you have a burning question about how some aspect of The Raiser’s Edge should best be done then don’t expect one straight answer! The panel will debate different solutions based on your questions.

Real-Time Integration Between The Raiser’s Edge and the Cloud – Jonathan Puddle

Now more than ever the digital and technology world is moving to the cloud. There are many definitions of “cloud” but any technology that doesn’t connect through traditional solutions (same network, etc) requires new solutions. I have done some work with Jonathan in the past and know that some of the things that Catch The Fire have done with their various systems are quite remarkable and well worth hearing about.

Social Media Police: Nonprofit Edition – Allyson Kapin, Maddie Grant, Melanie Mathos

I have seen Melanie speak about nonprofit social media on numerous occasions and in previous BBCons she has spoken with Chad Norman in a session that went on to become a book – 101 Social Media Tactics for Nonprofits. It does not sound like this session is going to follow the same format but nevertheless it certainly sounds like this is one to watch. Social Media changes rapidly and keeping on top of the latest changes is a must. (Then you can implement them with the book!)

Infinity Platform Features and the Software Development Kit – Ben Lambert

I am a big sucker for the Infinity platform and Ben always does it good justice. It is a great environment to work with and with each version release there are always some really interesting things added. I will be watching this one closely to see what new tricks Ben has up his sleeve.

How Would you Enter THIS Gift? – Bill Connors

I have known Bill for many years. He could talk about anything and make it interesting and dynamic. However this time he is talking about gifts! And who doesn’t like a gift? Well if that gift is sent in by a known donor, from an offshore company, signed off by his spouse and as a tribute to their gardener’s special birthday, would you know how to enter it into RE and in such a way as making it reportable too?

The Raiser’s Edge Roadmap – Tom Maszk and Emily Dalton

This is an annual favourite. Tom and Emily are going to be revealing the latest greatest additions to The Raiser’s Edge. We are told that many of those that made the cut were user requests so this is sure to be a crowd pleaser. I just hope that they have beefed up the security to take care of those people who were less than pleased about their own suggestions (Yes, when will The Mergician, Validatrix and Audit Trail be added as standard RE functionality!!?)

 

Well those are my top picks. Sorry if I overlooked anybody but I am sure you will appear on somebody else’s list. Look forward to seeing you all there!