Share via


Configuración de la búsqueda de SharePoint Server 2010 para tipos de contenido externo (parte 2 de 2)

**Resumen:**Servicios de conectividad empresarial (BCS) de Microsoft permite a los usuarios incluir fácilmente datos externos como resultados de las funciones de la Búsqueda de Microsoft SharePoint Server 2010 de SharePoint. Aprenda a configurar tipos de contenido externo para indizar la Búsqueda de SharePoint Server y opciones para configurar resultados de la Búsqueda de SharePoint Server.

Última modificación: lunes, 09 de marzo de 2015

Hace referencia a: Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

En este artículo
Introducción
Explicación del XML del modelo BDC
Modificar el tipo de contenido externo para admitir rastreos incrementales
¿Qué sucedió con IDEnumerator?
Usar el mismo tipo de contenido externo para las listas de externas
Recursos adicionales
Acerca del autor

Se aplica a:  Microsoft SharePoint Server 2010

Proporcionado por:  Bob McClellan

Contenido

  • Introducción

  • Explicación del XML del modelo BDC

  • Modificar el tipo de contenido externo para admitir rastreos incrementales

  • ¿Qué sucedió con IDEnumerator?

  • Usar el mismo tipo de contenido externo para las listas de externas

  • Recursos adicionales

  • Acerca del autor

Este artículo es el segundo de una serie de dos partes acerca de cómo configurar la Búsqueda de SharePoint Server para los tipos de contenido externo.

Introducción

Servicios de conectividad empresarial (BCS) de Microsoft permite conectar soluciones de SharePoint a orígenes de datos externos, así como definir tipos de contenido externo que se basan en datos externos. Los servicios de búsqueda de SharePoint 2010 pueden indizar los datos externos mediante el uso de tipos de contenido externo para mostrar resultados de búsqueda significativos. Los Servicios de conectividad empresarial, conocidos anteriormente como el Catálogo de datos profesionales, ofrecen mejoras adicionales que incluyen compatibilidad con Microsoft SharePoint Designer 2010.

En el artículo anterior de esta serie, Configuración de la Búsqueda de SharePoint Server 2010 para tipos de contenido externo (parte 1 de 2), describí cómo usar SharePoint Designer 2010 para definir tipos de contenido externo y cómo configurar un rastreo de Búsqueda de Microsoft SharePoint Server 2010 que incluya esos datos externos. Este método reduce los tiempos de rastreo para grandes cantidades de datos mediante el uso de rastreos incrementales. Esto se describe con SharePoint Designer, la Administración central de SharePoint y ejemplos de código XML.

Antes de comenzar, debe contar con lo siguiente:

  • Acceso a la Administración central de SharePoint 2010. Esto incluye el servicio de búsqueda y el servicio de conectividad a datos empresariales.

  • Acceso a SharePoint Designer.

  • Aplicación web de SharePoint 2010 que tiene una colección de sitios. Para obtener más información, vea el tema sobre la creación de una colección de sitios (SharePoint Server 2010). Tenga en cuenta que se puede usar Sharepoint - 80.

  • Acceso a Microsoft SQL Server. Tenga en cuenta que se puede usar la misma instancia de SQL Server que usa el equipo con SharePoint Server 2010.

  • Base de datos de ejemplo para Microsoft SQL Server (por ejemplo, aquí se usa AdventureWorks. Para instalar esta base de datos de ejemplo, vea AdventureWorks 2008 R2).

Explicación del XML del modelo BDC

En la sección anterior se realizó una modificación a la versión XML del modelo BDC. En esta sección se explicará la mayoría de los elementos de ese archivo XML. Pase a la sección siguiente sobre rastreos incrementales si no le interesan mucho estos detalles. Esta información no es necesaria para completar los ejemplos. Le será útil si está consultando un archivo XML real del modelo mientras lee esto.

El elemento de nivel superior es el Model. Tiene un atributo Name que se mostrará como el nombre del modelo al importarlo. LobSystems es un elemento secundario de Model. Puede contener uno o más elementos secundarios LobSystem. El elemento LobSystem tiene un atributo Name que se usa para determinar fácilmente el origen de datos externos. También tiene un atributo Type para el tipo de origen de datos. Para estos ejemplos, el Type es Base de datos.

La información de conexión real para ese origen de datos se define como elementos Property en el elemento LobSystemInstance, que es un elemento secundario de LobSystemInstances. LobSystemInstances es un elemento secundario de LobSystem. Los elementos Property son muy comunes en el modelo BDC. Muchos de los elementos permiten un elemento Properties que contiene uno o más elementos Property. Un elemento Property tiene un atributo Name que identifica la propiedad y un atributo Type que identifica el tipo .NET del valor de la propiedad. A continuación, el valor aparece en el cuerpo de dicho elemento Property. En la tabla 1 se muestran algunos de los nombres de propiedad de LobSystemInstance.

Tabla 1. Propiedades de LobSystemInstance

Nombre

Tipo

Valor de ejemplo

AuthenticationMode

System.String

PassThrough

DatabaseAccessProvider

System.String

SqlServer

RdbConnection Data Source

System.String

localhost

RdbConnection Initial Catalog

System.String

AdventureWorks

RdbConnection Integrated Security

System.String

SSPI

RdbConnection Pooling

System.String

Verdadero

ShowInSearchUI

System.String

<cualquiera>

Puede que haya observado que todas las propiedades que comienzan con RdbConnection son valores de cadena de conexión normal de una base de datos SQL. Cualquier valor que aparece en una cadena de conexión se puede definir en la lista de propiedades si se le antepone RdbConnection. La última propiedad de la lista, ShowInSearchUI, no tiene valor. A pesar de que se define como una cadena, tener la propiedad es todo lo que se necesita para que el modelo sepa que el elemento LobSystemInstance debe aparecer en la interfaz de usuario.

Otro elemento secundario de LobSystem es Entities. Aunque puede contener uno o más elementos secundarios Entity, por lo general, se ven modelos con una sola entidad. Entity equivale a un tipo de contenido externo único. Hay varios atributos para Entity. Esto incluye el Nombre y el DefaultDisplayName. En la tabla 2 se muestran las propiedades de un elemento Entity.

Tabla 2. Propiedades de Entity

Nombre

Tipo

Valor de ejemplo

Title

System.String

Nombre

DefaultAction

System.String

Ver perfil

La propiedad Title define el campo que se usará como título en los resultados de la búsqueda. La propiedad DefaultAction hace referencia a un elemento Action por su nombre. Se usará esa acción como vínculo de los resultados de la búsqueda. En estos ejemplos, la acción siempre se establece para abrir una dirección URL de una página de perfil.

Algunos elementos secundarios de Entity son AccessControlList, Identifiers, AssociationGroups, Actions y Methods.

El elemento AccessControlList puede contener uno o más elementos AccessControlEntry que tienen un atributo Principal que indica el nombre de usuario al que se le dará acceso. Los elementos secundarios son elementos Right que definen los derechos de acceso para la entidad de seguridad. Cada elemento Right tiene un atributo BdcRight que puede ser Edit, Execute, SetPermissions o SelectableInClients.

El elemento Identifiers contiene un elemento Identifier que tiene un atributo Name para el nombre de campo que es un identificador de la entidad y un atributo TypeName que contiene el tipo de datos de .NET del identificador.

El elemento AssociationGroups se usa para definir asociaciones entre tipos de contenido externo. El elemento Actions contiene un elemento Action, normalmente para abrir una página de perfil. Estos se pueden definir fácilmente mediante SharePoint Designer. Por lo tanto, en este artículo no hablaré mucho acerca de ellos.

El elemento Methods contiene uno o más elementos Method. Cada elemento Method tiene un atributo Name que identifica de forma exclusiva el método para esta entidad. También tiene un elemento AccessControlList que es idéntico al del elemento Entity. En la tabla 3 se muestran las propiedades de un elemento Method.

Tabla 3. Propiedades de Model

Nombre

Tipo

Valor de ejemplo

RdbCommandType

System.String

System.Data.CommandType ...

RdbCommandText

System.String

SELECT [ProductID], [ProductModelID] FROM [Producción].[Producto]

BackEndObjectType

System.String

SqlServerTable

BackEndObject

System.String

Producto

Schema

System.String

Producción

RdbCommandText es muy importante, ya que permite personalizar en gran medida la consulta SQL utilizada para los datos. Por ejemplo, si no se puede crear una vista en una base de datos determinada, todavía se puede configurar el texto para realizar combinaciones en el texto del comando siempre que coincidan con los parámetros de devolución. El BackEndObjectType puede ser SqlServerView si RdbCommandText hace referencia a una vista en lugar de a una tabla.

FilterDescriptors es un elemento secundario del elemento Method. Puede contener uno o varios elementos FilterDescriptor. SharePoint Designer admite la creación de filtros en su interfaz de usuario. Pero, por lo general, no son tan útiles para los métodos de búsqueda en los que se controla la consulta SQL. Hay un filtro, SynchronizationCookie, que se mostrará en la siguiente sección.

Parameters es un elemento secundario del elemento Method. Puede contener uno o más elementos secundarios Parameter. El elemento Parameter tiene un atributo Name que identifica de forma exclusiva el parámetro y el atributo Type que puede ser In, InOut o Return. Solo puede haber un único parámetro para cada Method que es un tipo Return. El número y tipos de parámetros se determinan mediante la operación que el método implementa. Se pueden definir muchas de estas operaciones mediante SharePoint Designer. Por lo tanto, resulta más fácil crear la operación ahí y después modificar según sea necesario. Dos de las operaciones que no pueden definirse mediante SharePoint Designer, ChangedIdEnumerator y DeletedIdEnumerator, se definirán en la siguiente sección.

El parámetro se define en realidad mediante el elemento secundario TypeDescriptor. Este elemento tiene atributos para Name, TypeName e IdentifierName. Algunos elementos tienen tipos sencillos y se definen mediante un solo elemento TypeDescriptor. Otros pueden ser muy complejos con elementos TypeDescriptors y TypeDescriptor anidados y propiedades adicionales. En la tabla 4 se muestran algunas de las propiedades del elemento TypeDescriptor.

Tabla 4. Propiedades de TypeDescriptor

Nombre

Tipo

Valor de ejemplo

Size

System.Int32

25

RequiredInForms

System.Boolean

true

Dígitos decimales

System.Int32

4

Generalmente, se pueden copiar y modificar los parámetros que se definen mediante SharePoint Designer.

El último elemento secundario importante del elemento Method es MethodInstances. Contiene un elemento MethodInstance que define el tipo de operación. El atributo Type puede ser Finder, SpecificFinder, AssociationNavigator, IdEnumerator y otros. El atributo ReturnParameterName debe hacer referencia al nombre del atributo que define el valor devuelto para la operación. El atributo Default normalmente será true porque solo se definirá un método para cada operación. Si, por ejemplo, hubiera más de un Finder, de manera predeterminada esto debería especificar cuál usar. El atributo Name identifica el MethodInstance y DefaultDisplayName que se usarán cuando se muestre el nombre de la operación. El elemento MethodInstance tiene algunas propiedades importantes tal como se muestra en la tabla 5.

Tabla 5. Propiedades de MethodInstance

Nombre

Tipo

Valor de ejemplo

RootFinder

System.String

<cualquiera>

AttachmentAccessor

System.String

<cualquiera>

LastModifiedTimeStampField

System.String

ModifiedDate

RootFinder marca el método Finder que el rastreador de búsqueda usará para enumerar todas las filas de nivel superior que deberían rastrearse. Debería haber solo un método Finder marcado como RootFinder. La propiedad AttachmentAccessor se describió en la sección anterior y la propiedad LastModifiedTimeStampField se describirá en la siguiente sección.

Para obtener más información acerca del modelo BDC, vea Recursos adicionales.

Modificar el tipo de contenido externo para admitir rastreos incrementales

Es bastante fácil ejecutar rastreos completos constantemente para los números de registros en estos ejemplos. Sin embargo, no funciona tan bien si se van a indizar un millón de registros. Una vez que el tipo de contenido externo y Búsqueda de SharePoint Server se han configurado para ese tipo de volumen, es mucho mejor ejecutar rastreos incrementales para buscar cambios y, a continuación, actualizar únicamente los que están en el índice de búsqueda. Búsqueda de SharePoint Server admite dos métodos para controlar rastreos incrementales en los tipos de contenido externo. Existen ventajas y desventajas en cada uno de ellos, pero primero es necesario comprender su funcionamiento.

Rastreos incrementales basados en la marca de tiempo

En este método se define un campo que contiene la marca de tiempo de última modificación para cada registro. Si esa marca de tiempo es más reciente que el último rastreo, se actualizarán los índices para ese registro. En este ejemplo, se modificará el tipo de contenido externo en función de en una vista, pero primero se debe agregar la fecha de última modificación a la vista en la base de datos AdventureWorks.

Para configurar la vista de producto y la vista de descripción a fin de agregar la fecha de modificación

  1. Inicie SQL Server Management Studio.

  2. En el cuadro de diálogo Conectar con el servidor, seleccione Motor de base de datos como el tipo de servidor.

  3. Escriba localhost en el cuadro Nombre del servidor.

  4. Haga clic en Conectar.

  5. Expanda el elemento Bases de datos en el grupo Explorador de objetos.

  6. Haga clic con el botón secundario en el elemento AdventureWorks y, a continuación, haga clic en Nueva consulta.

  7. Ejecute la instrucción ALTER VIEW tal como se muestra en el siguiente ejemplo.

    ALTER VIEW [Production].[vProductAndDescription] 
    WITH SCHEMABINDING 
    AS 
    SELECT 
    p.[ProductID] 
    ,p.[Name] 
    ,pm.[Name] AS [ProductModel] 
    ,pmx.[CultureID] 
    ,pd.[Description] 
    ,CASE WHEN p.ModifiedDate > pm.ModifiedDate THEN p.ModifiedDate ELSE pm.ModifiedDate END AS ModifiedDate
    FROM [Production].[Product] p 
    INNER JOIN [Production].[ProductModel] pm 
    ON p.[ProductModelID] = pm.[ProductModelID] 
    INNER JOIN [Production].[ProductModelProductDescriptionCulture] pmx 
    ON pm.[ProductModelID] = pmx.[ProductModelID] 
    INNER JOIN [Production].[ProductDescription] pd 
    ON pmx.[ProductDescriptionID] = pd.[ProductDescriptionID];
    

Se agrega un nuevo campo a la vista. En este ejemplo, ModifiedDate es la fecha de modificación más reciente de Product o ProductModel. Si también desea incluir ProductDescription en esa expresión, debe agregar otro caso para determinar cuál es la fecha más reciente.

Para agregar ModifiedDate a las operaciones de tipo de contenido externo

  1. En SharePoint Designer, haga clic en Tipos de contenido externo en el panel de navegación.

  2. En la lista, haga clic en Products para configurar ese tipo de contenido externo.

  3. En el grupo Operaciones de tipos de contenido externo, haga doble clic en la operación Leer elemento.

  4. Haga clic en Siguiente dos veces.

  5. En la página Parámetro de devolución, seleccione el campo ModifiedDate en el panel de elementos de origen de datos.

  6. Haga clic en Finalizar.

  7. En el grupo Operaciones de tipos de contenido externo, haga doble clic en la operación Leer lista.

  8. Haga clic en Siguiente dos veces.

  9. En la página Parámetro de devolución, seleccione el campo ModifiedDate en el panel de elementos de origen de datos.

  10. En el panel Propiedades, seleccione el cuadro situado junto al campo de marca de tiempo.

    Figura 18. Establecer el campo de marca de tiempo

    Configuración del campo de marca de tiempo

  11. Haga clic en Finalizar.

  12. Guarde el tipo de contenido externo.

Al seleccionar el cuadro del campo de Timestamp, se establece dicho campo para que el servicio de búsqueda lo use para determinar si el registro ha cambiado desde el último rastreo. Internamente, el XML tendrá ahora una propiedad LastModifiedTimeStampField que especifica el campo ModifiedDate. Si exportara el modelo para Products y buscara la propiedad, la encontraría en las propiedades MethodInstances del método Read List.

Ahora puede llevar a cabo los pasos habituales para crear el origen de contenido de AWProductSearch y ejecutar un rastreo completo. Como antes, puede que desee eliminar AWModelSearch para evitar que aparezcan resultados de ambos orígenes. Cuando el rastreo completo haya finalizado, inicie un rastreo incremental. Cuando el rastreo incremental haya finalizado, podrá ver si funcionó.

Para examinar los resultados del rastreo incremental

  1. En la configuración del servicio de búsqueda en SharePoint Designer, haga clic en Registro de rastreo en Rastreo en el panel de navegación.

  2. Haga clic en Historial de rastreo en la parte superior.

Debería ver que el rastreo completo tuvo algo así como 296 operaciones correctas y el rastreo incremental solo dos operaciones correctas. Como ningún registro ha cambiado, el rastreo incremental no tuvo que volver a indizar los registros.

Si desea comprobar la fecha de modificación, realice un cambio en uno o varios de los registros que incluya la actualización del campo ModifiedDate a la fecha y hora actuales y, a continuación, ejecute otro rastreo incremental. Las operaciones correctas son mayores que 2 (3 si se cambia un registro), pero no tan altas como 296. La consulta en el ejemplo siguiente muestra este tipo de cambio.

UPDATE Production.Product
SET Name='Classical Vest, M',ModifiedDate=GETDATE()
WHERE ProductID=865

Rastreos incrementales basados en el registro de cambios

En este método, Búsqueda de SharePoint Server almacena un token o cookie que se designa para realizar un seguimiento de los cambios desde el último rastreo. En este caso, la cookie será una sola marca de tiempo desde la última vez que se inició un rastreo. Si ha habido algún cambio desde entonces, solo se actualizarán las modificaciones en el índice. Este proceso requiere que se definan dos nuevas operaciones para el tipo de contenido externo: una para los registros modificados y otra para los registros eliminados. Estas deben crearse manualmente porque SharePoint Designer no tiene manera de crearlas. (Si examina el tipo de contenido externo en SharePoint Designer, se mostrarán en la lista Operaciones de tipos de contenido externo. Sin embargo, no podrá configurarlas). Como antes, debe exportar el modelo BDC a fin de configurar el código XML directamente.

Para exportar el modelo BDC a un archivo XML

  1. En SharePoint Designer, haga clic en Tipos de contenido externo en el panel de navegación.

  2. En la lista, haga clic en AWProducts junto a Products para seleccionar el tipo de contenido externo.

  3. En la cinta de opciones, haga clic en Exportar modelo del Catálogo de datos profesionales.

  4. En el cuadro de diálogo Exportar modelo del Catálogo de datos profesionales, escriba Products en el cuadro Nombre del modelo de Conectividad a datos profesionales.

  5. Haga clic en Aceptar.

  6. Cambie Guardar como tipo a Todos los archivos.

  7. Elija una carpeta de destino para el archivo.

  8. Cambie el cuadro Nombre de archivo a Products.xml.

  9. Haga clic en Guardar.

Para implementar estas dos operaciones, se necesitan dos consultas SQL. Una devuelve los registros modificados después de una marca de tiempo determinada y la otra devuelve los registros eliminados después de una marca de tiempo determinada. En la tabla de producto, se usará el campo DiscontinuedDate para indicar que un registro se eliminó de forma efectiva y ya no debe aparecer en los resultados de búsqueda. Si el campo DiscontinuedDate es null , sigue activo. El campo DiscontinuedDate de la tabla Producto debe agregarse a la vista exactamente de la misma forma que se agregó ModifiedDate anteriormente, aunque no se debe examinar el registro ProductModel. Por lo tanto, se trata de un campo agregado simple (p.DiscontinuedDate).

Estos son los nuevos métodos que se deben agregar al modelo BDC para el tipo de contenido externo Products en el elemento Methods. Ambos usan un tipo de filtro SynchronizationCookie para realizar un seguimiento de la última fecha y hora de ejecución. La consulta SQL debe devolver el conjunto apropiado de identificadores de registros eliminados o modificados y también debe actualizar la última fecha y hora de ejecución. El código SQL clave está resaltado en el XML de estas dos operaciones en el siguiente ejemplo.

<Method IsStatic="false" Name="GetChangedProductIds">
  <Properties>
    <Property Name="RdbCommandType" Type="System.Data.CommandType, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">Text</Property>
    <Property Name="RdbCommandText" Type="System.String">
if @LastRunDate != CAST('1900-1-1' as datetime)BEGINSELECT [ProductID] FROM [Production].[vProductAndDescription] WHERE [ModifiedDate] &gt; @LastRunDateENDSET @LastRunDate=CURRENT_TIMESTAMP
    </Property>
    <Property Name="BackEndObjectType" Type="System.String">SqlServerView</Property>
    <Property Name="BackEndObject" Type="System.String">vProductAndDescription</Property>
    <Property Name="Schema" Type="System.String">Production</Property>
  </Properties>
  <AccessControlList>
    <AccessControlEntry Principal="contoso\administrator">
      <Right BdcRight="Edit" />
      <Right BdcRight="Execute" />
      <Right BdcRight="SetPermissions" />
      <Right BdcRight="SelectableInClients" />
    </AccessControlEntry>
  </AccessControlList>
  <FilterDescriptors>
    <FilterDescriptor Name="LastRunDate" Type="InputOutput">
      <Properties>
        <Property Name="SynchronizationCookie" Type="System.String">ChangedItemCookie</Property>
      </Properties>
    </FilterDescriptor>
    <FilterDescriptor Name="FilterDescriptor" Type="Timestamp" />
  </FilterDescriptors>
  <Parameters>
    <Parameter Name="@LastRunDate" Direction="InOut">
      <TypeDescriptor Name="LastRunDateTypeDescriptor" TypeName="System.DateTime" AssociatedFilter="LastRunDate">
        <Interpretation>
          <NormalizeDateTime LobDateTimeMode="Local" />
        </Interpretation>
      </TypeDescriptor>
    </Parameter>
    <Parameter Direction="Return" Name="ChangedProductIds">
      <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="ChangedProductIds">
        <TypeDescriptors>
          <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="ChangedProductIdElement">
            <TypeDescriptors>
              <TypeDescriptor TypeName="System.Int32" ReadOnly="true" IdentifierName="ProductID" Name="ProductID">
                <Properties>
                  <Property Name="RequiredInForms" Type="System.Boolean">true</Property>
                </Properties>
              </TypeDescriptor>
            </TypeDescriptors>
          </TypeDescriptor>
        </TypeDescriptors>
      </TypeDescriptor>
    </Parameter>
  </Parameters>
  <MethodInstances>
    <MethodInstance Name="GetChangedPrimaryKeysInstance" Type="ChangedIdEnumerator" ReturnParameterName="ChangedProductIds"  />
  </MethodInstances>
</Method>
<Method IsStatic="false" Name="GetDeletedProductIds">
  <Properties>
    <Property Name="RdbCommandType" Type="System.Data.CommandType, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">Text</Property>
    <Property Name="RdbCommandText" Type="System.String">
SELECT [ProductID] FROM [Production].[vProductAndDescription]
WHERE [ModifiedDate] is null
    </Property>
    <Property Name="BackEndObjectType" Type="System.String">SqlServerView</Property>
    <Property Name="BackEndObject" Type="System.String">vProductAndDescription</Property>
    <Property Name="Schema" Type="System.String">Production</Property>
  </Properties>
  <AccessControlList>
    <AccessControlEntry Principal="contoso\administrator">
      <Right BdcRight="Edit" />
      <Right BdcRight="Execute" />
      <Right BdcRight="SetPermissions" />
      <Right BdcRight="SelectableInClients" />
    </AccessControlEntry>
  </AccessControlList>
  <FilterDescriptors>
    <FilterDescriptor Name="LastRunDate" Type="InputOutput">
      <Properties>
        <Property Name="SynchronizationCookie" Type="System.String">DeletedItemCookie</Property>
      </Properties>
    </FilterDescriptor>
    <FilterDescriptor Name="FilterDescriptor" Type="Timestamp" />
  </FilterDescriptors>
  <Parameters>
    <Parameter Name="@LastRunDate" Direction="InOut">
      <TypeDescriptor Name="LastRunDateTypeDescriptor" TypeName="System.DateTime" AssociatedFilter="LastRunDate">
        <Interpretation>
          <NormalizeDateTime LobDateTimeMode="Local" />
        </Interpretation>
      </TypeDescriptor>
    </Parameter>
    <Parameter Direction="Return" Name="DeletedProductIds">
      <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="DeletedProductIds">
        <TypeDescriptors>
          <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="DeletedProductIdElement">
            <TypeDescriptors>
              <TypeDescriptor TypeName="System.Int32" ReadOnly="true" IdentifierName="ProductID" Name="ProductID">
                <Properties>
                  <Property Name="RequiredInForms" Type="System.Boolean">true</Property>
                </Properties>
              </TypeDescriptor>
            </TypeDescriptors>
          </TypeDescriptor>
        </TypeDescriptors>
      </TypeDescriptor>
    </Parameter>
  </Parameters>
  <MethodInstances>
    <MethodInstance Name="GetDeletedPrimaryKeysInstance" Type="DeletedIdEnumerator" ReturnParameterName="DeletedProductIds"  />
  </MethodInstances>
</Method>

Aunque estos métodos parecen muy largos, son realmente bastante sencillos y similares. El filtro se define para pasar en la última fecha de ejecución, aunque realmente es una marca de tiempo que contiene la fecha y la hora. El parámetro de devolución se define como un conjunto de registros que contiene un ProductID. Los elementos MethodInstance definen estos métodos como las operaciones de registro eliminado y registro modificado.

El código SQL también es similar. Ambos comprueban si la marca de tiempo LastRunDate es válida. Si es así, devuelven todas las modificaciones a partir de esa fecha y hora. A continuación, la marca de tiempo se actualiza a la fecha y hora actuales, de modo que la cookie se almacenará con el nuevo valor. El método de registro modificado compara la ModificationDate con la última marca de tiempo y el método de registro eliminado compara la DiscontinuedDate.

Hay otro cambio que se debe realizar para implementar correctamente este método. El código SQL de la operación Read List se debe actualizar para garantizar que no se incluirán registros eliminados en un rastreo completo, tal como se muestra en el siguiente ejemplo.

<Property Name="RdbCommandText" Type="System.String">
SELECT [ProductID],[Name],[ProductModel],[CultureID],[Description]
FROM [Production].[vProductAndDescription]
WHERE [DiscontinuedDate] IS NULL
</Property>

Realice estos cambios en el modelo Products y es posible que también desee quitar la propiedad LastModifiedTimeStampField para comprobar que los nuevos métodos están realizando el trabajo. Importe el modelo modificado mediante la configuración del servicio de BDC en la Administración central de SharePoint.

Para importar un archivo XML a fin de actualizar un modelo BDC

  1. En la configuración del servicio de BDC en la Administración central de SharePoint, haga clic en la pestaña Editar.

  2. En la sección Ver de la cinta de opciones, seleccione Tipos de contenido externo en la lista desplegable.

  3. Haga clic en el menú desplegable de ProductDetail, haga clic en Eliminar y, a continuación, haga clic en Aceptar.

  4. Haga clic en Aceptar.

  5. En la sección Modelos de Conectividad a datos profesionales de la cinta de opciones, seleccione Importar.

  6. En el cuadro Archivo de modelo de Conectividad a datos profesionales, escriba el nombre del archivo XML o haga clic en Examinar para buscarlo.

  7. Haga clic en Importar. Es posible que vea una o dos advertencias, pero no debería haber ningún error.

  8. Haga clic en Aceptar.

Para probarlo, ahora vuelva a crear el origen de contenido de Búsqueda de SharePoint Server y, a continuación, realice cambios en los registros, inicie el rastreo incremental y busque para ver los resultados.

Si la base de datos debe eliminar registros, en lugar de marcarlos como eliminados, debe usar otro método para realizar un seguimiento de los elementos eliminados. La forma más fácil es crear una nueva tabla de identificadores eliminados y agregar un desencadenador a la tabla original que agrega registros a la nueva tabla cuando se eliminan. La tabla de registros eliminados puede almacenar identificadores y una marca de tiempo. Si los rastreos incrementales se ejecutan en un programa, también puede programar un trabajo SQL para eliminar registros antiguos de la tabla.

Comparar el método basado en la marca de tiempo y el método basado en el registro de cambios

El método basado en la marca de tiempo es mucho más fácil de implementar. Sin embargo, el método basado en el registro de cambios es mucho más eficaz. El método basado en la marca de tiempo requiere que el servicio de búsqueda almacene marcas de tiempo para todos los registros y después los compare todos cada vez que realiza un rastreo incremental. El método basado en el registro de cambios requiere que el servicio de búsqueda almacene una única marca de tiempo. Además, cuando el servicio de búsqueda solicita los cambios, procesa únicamente los registros que han cambiado. Si tiene muchos registros, el método basado en el registro de cambios ahorrará tiempo y almacenamiento. Si tiene muy pocos registros, los rastreos incrementales no son realmente necesarios. Si no está seguro de qué método usar, puede intentar primero el método basado en la marca de tiempo. Si resulta demasiado lento o si ocupa demasiado almacenamiento en disco, intente cambiar al método basado en el registro de cambios. Sin embargo, si no tiene control sobre la base de datos, es posible que tenga que usar el método que funcione con el esquema existente.

¿Qué sucedió con IDEnumerator?

Si ha usado Búsqueda de SharePoint Server con datos externos desde que se introdujo el Catálogo de datos profesionales en SharePoint 2007, debería haber usado IDEnumerator en lugar de la operación Read List. El método IDEnumerator aún funciona para búsquedas. Sin embargo, no es compatible directamente con SharePoint Designer. Uno de los usos de IDEnumerator era admitir listas externas muy grandes que de otra manera se limitarían por la configuración del sitio. Los rastreadores de Búsqueda de SharePoint Server no están limitados por la configuración de límites. Por lo tanto, no necesita usar técnicas de segmenting. Si ya tiene un tipo de contenido externo con IDEnumerator definido, puede usarlo para Búsqueda de SharePoint Server. En el caso de las nuevas definiciones de tipo de contenido externo, es más rápido usar la operación Read List en SharePoint Designer.

Usar el mismo tipo de contenido externo para las listas de externas

El uso de tipos de contenido externo para las listas externas no está en realidad dentro del ámbito de este artículo. Sin embargo, es posible que sienta la tentación de usar los mismos tipos de contenido externo para ambos. Solo recuerde que muchas de las personalizaciones de Búsqueda de SharePoint Serverpodrían afectar también a la apariencia de la lista externa. Además, puede tener que tratar fácilmente con límites de peticiones que podrían interferir con la eficacia de los rastreos de Búsqueda de SharePoint Server. En general, probablemente sea mejor usar distintos tipos de contenido externo para este propósito a menos que los datos sean muy sencillos y haya menos de mil registros.

Recursos adicionales

Para obtener más información, vea los siguientes recursos:

Acerca del autor

Bob McClellan ha estado desarrollando aplicaciones, sobre todo para los sistemas de bases de datos, durante casi treinta años. Recientemente trabajó en PowerTools for Open XML, que son una serie de comandos de Windows PowerShell para manipular documentos Open XML. Bob tiene una amplia experiencia en programación en una gran variedad de lenguajes de programación, sistemas de bases de datos y entornos de desarrollo.