2010-05-20 28 views
5

Oye, tengo un formulario para administradores donde insertan un nombre de usuario ("dominio \ nombre") y el código obtiene y establece cierta información.CAML de SharePoint consulta el campo "Creado por" con nombre de usuario

Es un proyecto enorme y algunas de las listas contienen el nombre de usuario como una cadena ("dominio \ nombre"), pero algunas listas solo cuentan con la columna "Creado por", que se crea automáticamente.

Quiero saber cuál es la forma más rápida de consultar estas listas usando la cadena de nombre de usuario. He intentado utilizar la misma consulta como el que yo uso para el primer tipo de listas y es obvio que no funcionó -

<Where><Eq><FieldRef Name='UserName'/><Value Type='Text'>domain\\username</Value></Eq></Where> 

Gracias.

Respuesta

16

Hay dos campos diferentes "Creado por", uno para todos los artículos y uno específicamente para bibliotecas de documentos ("Documento creado por"). El nombre interno para el campo "Creado por" es "Autor", por lo que <FieldRef Name='Author'/> sería el mejor comienzo. El segundo campo, que es el autor del archivo real en una biblioteca de documentos, tiene un nombre interno de "Created_x0020_By". A juzgar por su escenario, tengo la sensación de que solo necesitará el primero, pero lo último es bueno saberlo de todos modos, porque los datos almacenados en ellos son diferentes.

"Creado por" es un campo de usuario, por lo que la versión de cadena de sus datos es ID;#Full Name. Mientras tanto, "Documento creado por" es un campo de texto para una sola línea de texto, y sus datos se almacenan como el nombre de usuario real (con dominio, si corresponde). Así que su consulta anterior funcionaría en el caso de una biblioteca de documentos y buscando en <FieldRef Name='Created_x0020_By'/>. Sin embargo, si desea buscar en el campo "Creado por", tendrá que ser un poco más complicado, pero debería poder lograrlo al hacer referencia a la ID de SharePoint del usuario. El siguiente es un ejemplo de una consulta de campo de usuario diferente que estoy usando, para comparar.

<Eq><FieldRef Name='AssignedTo' /><Value Type='Integer'><UserID Type='Integer' /></Value></Eq> 

Esto filtró específicamente al usuario actual. Para usarlo para sus propósitos, reemplace 'AssignedTo' con 'Author' y <UserID Type='Integer' /> con el ID del usuario en cuestión.

+0

Thanks. Tengo el primer escenario, que es tratar de consultar una lista simple por la columna Autor, que tiene solo un nombre de usuario. Logré crear un objeto SPUser e intenté tu consulta con "Author" y user.ID, pero recibo una excepción que dice "La conversión falló al convertir al valor nvarchar 'SomeFirstname SomeLastname' al tipo de datos int.", Donde "SomeFirstname SomeLastname" es un nombre de la lista que no es el nombre de usuario. Agradecería su ayuda :) – yellowblood

+2

nvm, lo arregló. Al consultar la columna "Autor" por ID, debe agregar un atributo "LookupId = 'True'" a la etiqueta "FieldRef". ¡Trabajando, muchas gracias! – yellowblood

7

recomendaría lo siguiente:

  1. Obtener el SharePoint-usuario invocando el método EnsureUser, es decir:

    SPUser myUser = SPContext.Current.Web.EnsureUser(@"DOMAIN\USERNAME"); 
    
  2. Consulta la lista utilizando el ID de la SharePoint-usuario :

    SPQuery spQuery = new SPQuery(); 
    StringBuilder queryString = new StringBuilder(String.Empty); 
    queryString.Append(@"<Where>"); 
    queryString.Append(@" <Eq>"); 
    queryString.Append(@"  <FieldRef ID=""{1df5e554-ec7e-46a6-901d-d85a3881cb18}"" LookupId=""True"" />"); //Author Field 
    queryString.Append(@"  <Value Type=""Lookup"">" + myUser.ID + @"</Value>"); 
    queryString.Append(@" </Eq>"); 
    queryString.Append(@"</Where>"); 
    spQuery.Query = queryString.ToString(); 
    
  3. fuego la consulta en la lista

    myList.GetItems(spQuery); 
    
Cuestiones relacionadas