2012-07-09 10 views
8

Estoy tratando de actualizar un campo de metadatos administrados de SharePoint (MMD) usando el servicio web Lists.UpdateListItems pero no está funcionando.No se puede actualizar el campo de metadatos administrados de SharePoint 2010 con Lists.UpdateListItems llamada al servicio web

Aquí está mi solicitud SOAP

<?xml version="1.0" ?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
    <UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"> 
    <listName>My Test List</listName> 
    <updates> 
     <Batch ListVersion="0" PreCalc="TRUE" OnError="Continue"> 
     <Method Cmd="Update" ID="1"> 
      <Field Name="ID">3</Field> 
      <Field Name="Document_x0020_Title">foo</Field> 
      <Field Name="Fiscal_x0020_Year1">13;#FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8</Field> 
     </Method> 
     </Batch> 
    </updates> 
    </UpdateListItems> 
</S:Body></S:Envelope> 

Esta solicitud se actualizará con éxito el "Título del documento" (un campo de texto), pero el campo de MMD, "año fiscal", se mantuvo sin cambios y no hay error devuelto desde el servicio web.

Tenga en cuenta que el valor de la MMD está en el formato "WssId; #TermValue | TermGuid" y el término ya se ha creado para el sitio.

Por favor ayuda.

Respuesta

9

Lo encontré.

Debo usar un nombre de campo diferente. La etiqueta para el campo es "Año fiscal", pero el nombre de campo que funcionó es en realidad "d3c0ddc947ab4b8c90b6a0fe2d4caf09" en lugar de "Fiscal_x0020_Year1". Así que mi solicitud SOAP se vería

<Method Cmd="Update" ID="1"> 
     <Field Name="ID">3</Field> 
     <Field Name="Document_x0020_Title">foo</Field> 
     <Field Name="d3c0ddc947ab4b8c90b6a0fe2d4caf09">13;#FY 2006|7e8205da-57a1-45a3-8147-469b795ad6e8</Field> 
    </Method> 

Para obtener este nombre de campo que utilizo el método de servicio Web Lists.GetListContentType para devolver información de campos y buscar FieldType "Nota". Aquí está un ejemplo de lo SharePoint volvió

<Field Type="Note" DisplayName="Fiscal Year_0" 
StaticName="d3c0ddc947ab4b8c90b6a0fe2d4caf09" Name="d3c0ddc947ab4b8c90b6a0fe2d4caf09" 
ID="{1afa458b-d50a-4139-ad8d-f1172774de34}" ShowInViewForms="FALSE" Required="FALSE" 
CanToggleHidden="TRUE" SourceID="{77871b4e-f3ba-42dc-8940-ab33fb431099}" Hidden="TRUE" 
Version="1" Customization="" ColName="ntext8" RowOrdinal="0"/> 

También me resulta útil utilizar el método Lists.GetListContentTypes para obtener el tipo de contenido utilización id en Lists.GetListContentType llamada al método.

---- actualización - me encontré con que no tiene que utilizar el formato de "WssId; #TermValue | TermGuid". Simplemente puede usar "TermValue | TermGuid". Por lo tanto, en el ejemplo anterior, el valor sería "FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8".

Esto es muy útil porque puede reutilizar el mismo valor en diferentes sitios a diferencia del valor anterior, donde solo puede usarlo en un sitio. Para valores múltiples, solo necesita delimitarlo con un ";" en lugar de ";#". Por ejemplo "FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8; FY 2007 | 823205da-57a1-45a3-8147-469b795ade13".

+0

Y cuando configura el campo, puede omitir la pieza de Widid por completo. Me gusta "FY 2006 | 7e8205da-57a1-45a3-8147-469b795ad6e8" –

0

Gracias por mencionar el bit sobre StaticName. Eso puso fin a mi sufrimiento.

Parecería que para campos simples, no vinculados a MMS, como Título, se permite una sintaxis de actualización más lenta. Por ejemplo, por sí solo, la siguiente actualización se procesa sin error.

<Field Name="Title">Some Title</Field> 

Sin embargo, las reglas no son las mismas para los campos vinculados a MMS.
Siguiendo el enfoque anterior, me mudé a mis campos MMS. Ese tipo de campo puede ser actualizado con valores arbitrarios si se identifica por su nombre amigable y la entrada de un número entero, por ejemplo .:

<Field Name="Activity">20</Field> 

El "20" solo se traduce en cierto plazo.
Probé muchos números y todos regresaron con el mismo término.

Alternativamente, si me acerco a la forma documentada de actualizar el valor, mientras sigo identificando el campo con "Actividad", el servicio devuelve un error 0x80020005.

<Field Name="Activity">HTA|fe951639-7c90-41ee-9888-6ae0e6523120</Field> 

Así que no hagas eso.
Solo cuando las lunas están completamente alineadas encuentro éxito. El StaticName es la clave.

<Field Name="j06a8d8240f84aec987f6a28effa3ae1">HTA|fe951639-7c90-41ee-9888-6ae0e6523120</Field> 

Otra manera de encontrar el StaticName es buscar el tipo de campo = "Nota" para cada campo de MMS en la respuesta a una solicitud GetList. Esta operación toma 1 entrada menos que GetListContentType. Solo necesita el nombre de la lista y no un contentTypeID.

Rock on.

Cuestiones relacionadas