One of the problems of offering a tool that can create custom business rules for almost any scenario is that it has to have a lot of functionality. As we developed Validatrix we realised that some of that functionality was missing so we added it on. The problem with that of course is that the more you add on the more complicated the application becomes.
We have attempted to remedy this by offering the Validatrix Query Converter which does a good job of converting queries into rules and is often a good starting point for expanding a rule further.
We realised that we had missed out on a piece of functionality that was preventing us from creating a rule with a specific scenario. It is possible to all sorts of logic within one rule. We can check if a field value is exactly the same as another, if it is not the same as if it is greater than or less than etc. Continue reading Just When You Thought Validatrix Could Not Get More Complicated…
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
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.
One of the benefits of using VBA or VB6 (probably one of the very few benefits) is the ability to easily debug code. Not that it is too difficult to debug using .NET but there are a couple of tricks that you need to know. When using VBA from within RE7 you need to do very little other than set a break point where it is needed. Using VB6 plug-ins you used to be able to just run the project and start the document (until, that is Internet Explorer stopped supporting the running of these component directly).
In .NET it is not as straight forward. Either you have to create a little application that starts the form that you are using for plug-ins or for “VBA” style macros and event based customisations you need to ensure all your files are in the RE7 plugin or custom directory and attach Visual Studio to the RE7.exe process. This is done using the Tools menu item “Attach to Process”. In the list you find RE7.exe and as long as you are loading the same version of the file in RE7 as you have open in Visual Studio you are able to debug.
One of the problems with this is that it becomes slightly difficult to debug events that happen on opening of RE7 i.e. in the application start events. It is possible that you can be quick and start the Attach to Process item and select RE7 before the application has reached the custom code but it is a pain.
What is more it seemed to me that there must be a way of automating this process so that it would be much quicker. Well I got out my automation handbook and started to program (I don’t actually have an automation handbook). I put together the following macro which does the trick. I then assigned the shortcut CTRL-ALT P (you could assign whatever you like but this is one that I assigned previously to open up the attach to process window).
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(2) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("T-SQL")
dbgeng(1) = trans.Engines.Item("Managed (v2.0, v1.1, v1.0)")
Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, My.Computer.Name).Item("RE7.exe")
Catch ex As System.Exception
I have been developing some updates for The Mergician. There are some nice additions coming soon including clean up of duplicate attributes and appeals following the merge. However one item that has been added is the request to select a record as the primary constituent if it has a NetCommunity Login associated with it. Continue reading Checking Constituents for a NetCommunity Login
When I wrote an article a while back about the setting up a non-production database, I thought that I had the registry and how Blackbaud use it well understood. Of course that was before Vista, Windows 7 and elevated admin rights.
Continue reading Some New (to me) Raiser’s Edge registry settings
A few days ago I put a question on both Blackbus and the official Blackbaud forums asking if anybody had written a plug-in in C#. I have written a number of customisations in C# (VB.NET is my most common programming language – although I do enjoy using C#) but I had never written a plug-in before. It has always been a web service of application of some kind. I managed to work out how to do it and thought that I would share my solution here. Continue reading A Raiser’s Edge C# Plugin
Most people who regularly read this blog will hopefully (for their sake) never have to encounter this issue that has plagued me ever since I upgraded to Visual Studio 2005 (and then later Visual Studio 2008) and Vista (and then later Windows 7). Working with setup and deployment project is supposed to make life easier but I have had nothing but trouble with them.
Continue reading Visual Studio Setup and Deployment issue on Windows 7 and Vista Solved
As I mentioned in a previous post I have been working on some sample demonstration material for The Blackbaud Conferences in London and Washington DC. I got a timeout error previously on saving data in a custom form. I was able to fix it entirely by fluke without knowing how I did it. However now I have got it again and it has been driving me crazy.
I am currently working on a project where I need to copy a gift record from one constituent to another. There are 213 fields on the regular gift object i.e. CGift. That is without looking at any of the other areas of the gift such as attributes, notepads, etc. It would take a lot of typeing to copy between each field so to do this I use the meta data that is supplied with each object. Continue reading Using meta data to copy records
In an earlier post I looked at the way in which it is possible to open up a Crystal Report from VB or VBA code in The Raiser’s Edge. That was with version 8.5 of Crystal Reports. I tried to do the same thing recently with a report created in Crystal Reports 11 and the code broke. I rewrote the code using a newer object and technique.
Continue reading Opening a Crystal Report from code (revisited)