Gary Sherman
October 31, 2011

Last we left off, we turned a pseudo relation into an exclusive relation.

Specifically, we created a participant2user relation, which allowed us to traverse from an activity to the user who participated in the activity with a path like: focus_obj2act_entry:fact2participant(role_code=1):participant2user:login_name

Real World Usage

As promised, lets give this some real world usage. Specifically, lets use this to notify someone when a case (or other workflow object) is yanked from them.

A few years ago, I showed how to implement yank notifications by email. In that post, I gave some details about the challenges behind using a business rule to do this:

The problem with implementing this as a business rule is that there is no data that holds onto the previous owner.

Clarify’s solution to this is to have the Classic Client always send an integrated Notifier

Gary Sherman
August 23, 2010

The Dovetail SDK (fcSDK) includes Data Restriction Technology.Data Restriction allows you to segregate your Clarify/Dovetail database so that different sets of users can use the same forms (and customizations), yet see different sets of data from the database. This can include any items such as cases, sites, contacts, parts, etc.


For example, suppose you have two different groups that support different product lines. You might set up Data Restriction so that the users in group 1 can only see group 1’s sites, contacts, solutions, cases, and parts. Likewise, group 2 would only see their data. The user’s do not even know that they are not seeing all of the data from the database.

Data Restriction based on Geography


A common data restriction setup is to segregate data via geography. For example, users in Europe may only see data (cases,

Gary Sherman
August 18, 2010

A not-so-uncommon request I’ve heard over the years is the need to be able to close a solution. You can close a case, close an action item, close an opportunity – but you can’t close a solution in the out-of-the-box product. But this is a pretty easy customization – so lets walk through it.

Why close a solution?


Knowledge can become outdated. But we may want to retain that knowledge, especially when we’ve linked these solutions to cases or change requests. By closing it, we can mark it as no longer relevant, and closing will also remove it from a user’s wipbin and all queues.

Status and Condition


Most workflow objects have a status and a condition. We can use a similar mechanism here. We’ll use the Open and Closed Conditions (same as for a case). I create

Gary Sherman
September 21, 2009

I recently received a request asking how to migrate some data (specifically, cases) from Clarify into Zendesk. Seems the company is in the process of turning off Clarify and rolling out Zendesk.


clarrify to zendesk

It’s all about the APIs


We provide a full set of APIs for Clarify within our Dovetail SDK, and Zendesk also provides a set of APIs. So we just need to put them together.



I’ve been using PowerShell more and more lately, so I decided to use that as my environment. And because Powershell gives me full access to the .NET framework, I can use classes such as System.Net.WebClient, which makes it easy for me to call the Zendesk REST APIs.

Login to Clarify


In a previous post, I showed how to

Gary Sherman
September 11, 2009

powershell[4][1]I was recently working on porting some existing ClearBasic batch (cbbatch) scripts to PowerShell.

I’ve blogged in the past about using our SDK with Powershell.

For this particular project, I had multiple scripts to port, and I was looking to extract some common functions and utilities, so that they could be used between multiple scripts.


When using the Dovetail SDK, one of the first tasks is to load up the configuration information and connect to the database.

That would normally look something like:

$connectionString = “Data Source=localhost;Initial Catalog=dovetail;uid=user;pwd=pass"
$databaseType = “MSSQL”;    

[system.reflection.assembly]::LoadWithPartialName("fcsdk") > $null;
[system.reflection.assembly]::LoadWithPartialName("FChoice.Toolkits.Clarify") > $null;

$config = new-object -typename System.Collections.Specialized.NameValueCollection;
$config.Add("fchoice.disableloginfromfcapp", "false");

Gary Sherman
September 10, 2008

We’re considering a change to Dovetail EmailAgent, and wanted to float it by our users to see if anyone had any concerns or objections.

Currently, when EmailAgent adds more information to a case, it actually performs a Log Note action. Clarify has a "Email In" activity, but we don’t currently use that. This is odd.

EmailAgent also creates attachments for any files that were attached to the email.

One of the issues is that there is no relationship between the notes (notes_log) and the attachments (doc_inst), so it can be difficult to determine exactly which attachments were for which email.

Why Log Notes?

History, mostly.

We don’t have an "Email In" API in ClearBasic – which is the language that our original email processing engine was written in (it was then called SuperEmailClerk). So, the "Log

Gary Sherman
June 25, 2008

deleteIn the Dovetail SDK, there is a DeleteById method on the ClarifyGeneric object. This is useful when you know the objid of the record you want to delete. Perhaps the objid is posted to a web page, or you’ve pulled it out of a relation column from a different record.

DeleteById is available via the .NET interface. It is not available on an fcGeneric object via the COM interface.

How can we DeleteById in COM?

Simply use the AddForUpdate method, then do the Delete.


var objid = 268435459;

var modem = FCSession.CreateGeneric(‘modem’);

Kevin Miller
April 22, 2008

Quickly after creating a Twitter Integration with Dovetail I ran into rate limiting issues using Twitter’s API. Twitter currently only allows 70 requests per hour. Here is their guidance…

If you are developing an application that requires more frequent requests to the Twitter API, please contact us and we’ll see what we can do.  We maintain a white list of known-good screen names who have high-volume API needs.  We also suggest researching Jabber/XMPP if your application needs to deliver a near-realtime experience (for example, a bot that replies to direct messages).

I emailed Twitter support asking nicely for higher volume API usage but still haven’t gotten a response. Then I realized that if we want to release this Dovetail/Twitter integration to our customers we it need to work within the rate limiting guidelines, so I listened to Twitter’s

Gary Sherman
December 19, 2007

We publish our knowledgebase articles online: http://www.dovetailsoftware.com/resources/knowledgeBase.aspx. We use the Dovetail SDK to query the solutions in our Clarify/Dovetail database and build the HTML pages.

In addition, we have a page that lists the latest 20 articles: http://support.dovetailsoftware.com/selfservice/solutions/recent

This is nice, but it means that one would have to visit the web page to see any new articles.

I would like to be notified when new articles are added. Between email spam and Microsoft Outlook, my faith in (and enjoyment of) email is dwindling on a daily basis. But my love of RSS feeds and Google Reader continues to grow. So, how can I get new KB articles pushed to me by RSS?

One way would be to go back to our dev team and have them add an RSS feed for that page. Could be done. Not too

Gary Sherman
December 10, 2007

Many customers use hierarchical (multi-level) drop-down lists in their Clarify/Dovetail implementations. So, when one level of a select list changes, the down-level lists change as well. Clarify allows up 5 levels for a list.

As an example, in baseline Clarify, there’s a list titled CR_DESC that is a three level list for CPU, Operating System, and Memory. When I change the CPU from PC to Sun, the operating system and memory lists need to change as well.

Default values show:


Changing the CPU to "SUN" changes the O/S and Memory lists:


In a client/server app, this is pretty easy to do, as the onchange event of one list can simply update the down-level lists, either by making a

International: +1 (512) 610-5400
Toll Free: 1 (800) 684-2055