Step 5 (Optional): Define IDEnumerator Methods and Enable Business Data Search

To enable Business Data Search, you must define a SpecificFinder and a special type of MethodInstance method called IDEnumerator in your metadata. Because you already defined a SpecificFinder method for the Product entity in Step 2, you only need to define an IDEnumerator method in this step. An IDEnumerator method returns a searchable list of IDs (unique key) for an entity. This list enables indexing of the entities whose IDs the IDEnumerator method returns.

Note Note:

If you require incremental crawl, then you must also make sure that one of the return fields in the IDEnumerator for the entity represents the time the entity instance (or row in database terminology) was last updated in the LOB application. You should then set the __BdcLastModifiedTimestamp property of the entity with the name of the TypeDescriptor in the return value of the IDEnumerator that represents the last modified date.

Entities have zero or one IDEnumerator. The definition for an IDEnumerator is exactly like a Finder method, except that it has zero filters and returns only the ID field or the ID and LastModifiedDate fields.

The following example shows you how to define an IDEnumerator to index and search for products in the AdventureWorks2000 database.

Note Note:

This example uses a Microsoft SQL Server 2000 database, which supports streaming of data. To improve performance for Web services and other non-streaming back-end applications, you should use the LastIdSeen filter in your IDEnumerator method as follows:

SELECT TOP 100 Id FROM Customers WHERE Id>=@LastIdSeen
ORDER BY Id
Prerequisites

Step 2: Define Entities, Methods, and Filters

or

Step 3 (Optional): Define Actions

or

Step 4 (Optional): Define Associations

To define an IDEnumerator to enable indexing and search

  1. Open the AdventureWorks2000.XML file from Step 2, 3, or 4.

  2. Add the following XML for the IDEnumerator method in the Product Entity XML, after the GetProducts method definition:

    Xml
            <Method Name="ProductIDEnumerator">
              <!-- Method for enabling business data search. The method 
              returns a list of IDs. Business Data Catalog will use the 
              SpecificFinder method on each of these IDs when indexing 
              the prodocuts.-->
              <Properties>
                <Property Name="RdbCommandText" Type="System.String">SELECT ProductID FROM Product WHERE ProductID &gt; 1200 AND ProductID &lt; 1300</Property>
                <Property Name="RdbCommandType" Type="System.String">Text</Property>
              </Properties>
              <Parameters>
                <Parameter Name="ProductIDs" Direction="Return">
                  <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="Products">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="Product">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Int32" IdentifierName="ProductID" Name="ProductID">
                            <LocalizedDisplayNames>
                              <LocalizedDisplayName LCID="1033">ID</LocalizedDisplayName>
                            </LocalizedDisplayNames>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="ProductIDEnumeratorInstance"  Type="IdEnumerator" ReturnParameterName="ProductIDs" />
              </MethodInstances>
            </Method>
  3. Save the XML file.

  4. Before you add the application definition again, you must delete the AdventureWorksSample application you created in Step 1 from the Business Data Catalog. To delete AdventureWorksSample, follow these steps:

    1. Open SharePoint 3.0 Central Administration.

    2. In the left navigation pane, click the name of your Shared Services Provider (SSP).

    3. In the Business Data Catalog section, click View Applications to view the registered applications.

    4. Click AdventureWorksSample to open the View Application: AdventureWorksSample page.

    5. Finally, click Delete Application in the Application Settings section.

  5. Add the application definition to the Business Data Catalog. For details, see How to: Add an Application Definition to the Business Data Catalog.

  6. Add a content source.

  7. Map crawled properties.

  8. Create a search scope.

After you complete this walkthrough, content from the AdventureWorks2000 sample database is available for search queries. Next, you must customize the search user interface, or create custom search applications to execute queries against the business data content.

For information about performing these next steps, see:

Walkthrough: Add a Tab and Custom Search Page with Enterprise Search Web Parts to the Search Center

Walkthrough: Creating an ASP.NET Web Part for the AdventureWorks Business Data Application Sample

Next Steps

Step 6 (Optional): Specify Access Permissions

See Also

Other Resources

Business Data Catalog: Metadata Model
AdventureWorks SQL Server 2000 Sample

Tags :


Community Content

JeffLin
__BdcLastModifiedTimeStamp typo
As opposed to __BdcLastModifiedTimeStamp, you should use __BdcLastModifiedTimestamp
 with a non-capital "s" in stamp to enable BDC incremental crawl.
Tags :

Tom Beerley
LastModifiedDate must also be returned by the SpecificFinder in order to enable incremental crawl

To enable incremental crawl on a BDC data source, it is not sufficient to define the __BdcLastModifiedTimestamp property and to have the IdEnumerator method return the LastModifiedDate. You must also ensure that the SpecificFinder method returns the LastModifiedDate. This is used during the initial full crawl to store the timestamp for each row, which will later be compared to the timestamp returned by the IdEnumerator when the incremental crawl is performed. If the SpecificFinder does not return the LastModifiedDate, you will find that the SpecificFinder is called once for each and every item returned by the IdEnumerator, even on incremental crawls. But if the SpecificFinder does return the LastModifiedDate, then the SpecificFinder will only be called for those IDs whose LastModifiedDate indicates that the item has changed since the last time the item was indexed.

The absence of the LastModifiedDate in the SpecificFinder will result in errors like this in the SharePoint trace log (once for each item):
System.ArgumentException: Could not find field with name 'MODIFIED_DT' Parameter name: fieldName ---> System.ArgumentException: Column with Name 'MODIFIED_DT' does not exist.

Tags :

Page view tracker