Lessons Learnt on the BDC

Wednesday, 23 May 2007 00:51 by tariq

Here are few lessons learnt from playing with the BDC on a project

1. Even though the BDC can crawl associated entities in your database schema, the search results will not show related entity instances for the item you searched.

2. In case of mapping 'complex' db schemas specially ones that contain m:n relationships between entities, sometimes it might be advisable to show un-normalized relationships via stored procedures or views, but this approach provides the following roadblocks

    1. Un-normalized views/data will often have composite keys to uniquely identify a single row. You will have to define separate identifiers for each component of your composite key.
    2. More often than not when there isn't an associated entity to the parent entity the columns representing that entity in the un-normalized entity will be null, including part of the composite key. This is an issue with the BDC. If a key or part of a key is null, the BDC ignores that entity instance, so you would need to pad your null keys, (in SQL use ISNULL or COALESCE).
    3. If you are using a Stored-Proc to provide your un-normalized view then you would be defining your MinGeneratedKey and MaxGeneratedKey as Stored-Proc parameters, which will be used in the 'where' section of the query. Please note; remember those padded keys, you would need to pad them in your Where clause as well because when SQL executes the "Where" component of the query, the values returned will be null and outside your MinGeneratedKey and MaxGeneratedKey range. (Where component is executed before your Select, so padding your null keys in the Select portion of query is not enough)

3. Moving on to incremental crawls, the only reference to creating them in MSDN or the OSS SDK is a slightly confusing note on this page. To implement incremental crawls on the BDC you would need the following

1. You would need some column on your table/view/or Stored-Proc to indicate the last modified time of that entity instance. Adding a timestamp column to your tables is the easier approach since it requires no change to any application logic to update the last modified time. Point to note is that if you are combining tables to create an un-normalized view then you would need to calculate the greater timestamp in SQL from your combined entity instances. Also note, if you are using a timestamp column, you would need to cast it to DateTime in SQL for it to be of any use to the BDC.

2. In your IdEnumerator method you would need to declare a type descriptor for this column in your return parameter like so.

<Parameter Direction="Return" Name="entityReturnParam">
    <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="entityDataReader" IsCollection="true">
        <TypeDescriptors>
            <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="entityDataRecord">
                <TypeDescriptors>
                    <TypeDescriptor TypeName="System.Int32" IdentifierName="entityPK" Name="entityPK" />
                    <TypeDescriptor TypeName="System.DateTime" Name="timestamp" />
                </TypeDescriptors>
            </TypeDescriptor>
        </TypeDescriptors>
    </TypeDescriptor>
</Parameter>

3. You will need to declare a propperty on your entity that refers to the timestamp column defined above, but this propperty needs to be called __BDCLastModifiedTimestamp and should be of type string

<Entity EstimatedInstanceCount="0" Name="entityName">
    <Properties>
        <Property Name="Title" Type="System.String">entityName</Property>
       
<Property Name="__BdcLastModifiedTimestamp" Type="System.String">timestamp</Property>
    </Properties>

Categories:  
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Wireless USB

Wednesday, 16 May 2007 20:07 by tariq

Wirelss USB? Yes that right,

I am referring to this. Cool as it may sound, I am wondering if the over abundance of wirelss signals is good for the human body.

Dont get me wrong, I love my wifi, but then again to connect your average devices to your machine is it neccessary? The only worthwhile application I can think for this at the moment is a connection to a printer from a laptop. But thats nothing the latest printers with a an inbuilt print server cant solve.

Categories:  
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Basic Necessities

Monday, 7 May 2007 20:14 by tariq

The basic necessities a person needed was

Food, Shelter and Clothing.

That was the good old days, for me now its, Food, Shelter, Clothing, Laptop and Internet.

Categories:  
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Moving Search Scopes among Display Groups

Tuesday, 1 May 2007 03:30 by tariq

This is a bit of a kludge in SharePoint 2007.

In your site collection how do you move your search scope from one display group to another? Logically you would expect there to be an option in the context menu (i.e. Site Settings -> Search Scopes [Under Site Collection Administration]) of the search scope, or be able to change it in the subsequent page when clicking the search scope.

That isnt the way. Here is how you would have to do it.

1. On the Search Scopes Page click on the name of the display group that you want your search scope to be in.

2. You will be redirected to the "Edit Scope Display Group Page"

3. In the scopes section check the Search Scope you want to appear in that display group.

Thats it.

Side note: If you want your search scope to be the default in your site make sure you make it the Default Scope in the Edit Scope Dispaly Group Page. Additionally ensure that in Site Settings -> Search Settings 'Use custom scopes ...' is selected

Technorati tags: , , , ,
Categories:  
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed