none
Como recuperar a informação de email de um campo do tipo Pessoa e Grupo através de Microsoft.SharePoint.Client? RRS feed

  • Pergunta

  • Olá,
    Tenho uma lista sharepoint.
    Esta lista possui um campo do tipo pessoa e grupo que armazena alunos de turmas.
    Este campo permite várias seleções e somente aceita pessoas (grupos não são aceitos).
    E seu formato é nome com presença.

    Neste momento este campo possui 4 alunos (usuários de turmas).

    Estou lendo este campo da lista através de uma aplicação console com Microsoft.SharePoint.Client.
    Meu código esta da seguinte forma:

    ClientContext Cliente = new ClientContext(url);

    List ListaTurma = clientContext.Web.Lists.GetByTitle("Lista de Turmas");

    CamlQuery oQuery = new CamlQuery();
    oQuery.ViewXml = @"<View><Query><Where><Eq><FieldRef Name='Title' /><Value Type='Text'>NomeDaTurma</Value></Eq></Where></Query></View>";

    ListItemCollection todositens = ListaTurma.GetItems(oQuery);
    Cliente.Load(todositens);
    Cliente.ExecuteQuery();

    string emailAluno = string.Empty;
    foreach (ListItem oItem in todositens)
        {
               emailAluno = oListItem["Alunos"].ToString();
        }
     
    Da forma acima o valor retornado é Microsoft.SharePoint.Client.FieldUserValue[].

    Se dou um QuickWacth no campo consigo visualizar os seguintes valores:
    [0] LookupValue "nomeDoAluno 0000001"
    [1] LookupValue "nomeDoAluno 0000002"
    [2] LookupValue "nomeDoAluno 0000003"
    [3] LookupValue "nomeDoAluno 0000004"

    Ja consegui chegar até estes valores, mas não consigo uma forma para pegar o email.
    Alguém já passou por isso?

    Indo até a lista e modificando o campo de nome com presença para Email comercial consigo o mesmo resultado acima, mas agora com os emails.
    Uma solução seria a criação de um novo campo do tipo Pessoa e Grupo no formato Email Comercial.

    Não sei como posso fazer para que esta nova coluna receba estes valores. (Não posso utilizar workflows)

    Obrigado


    k2rto4-Pb - Analista SharePoint


    • Editado TI DEV terça-feira, 10 de julho de 2012 19:51
    terça-feira, 10 de julho de 2012 19:49

Respostas

  • Olá,
    Consegui resolver aqui o problema.
    Segue solução.

    Tendo a coluna do tipo pessoa e grupo faça:
    foreach (ListItem oItem in todositens)
        {
                   //Aqui fazemos um novo foreach para ler os itens da coluna pessoa e grupo
                   foreach (FieldUserValue Usuario in item["Alunos"] as FieldUserValue[])
                   {
                            Cliente = new ClientContext(url);

                            ListItem info = Cliente.Web.SiteUserInfoList.GetItemById(Usuario.LookupId);
                            Cliente.Load(info);
                            Cliente.ExecuteQuery();

                            Cliente = new ClientContext(url);

                            User obtemDadosDoUsuario = Cliente.Web.EnsureUser(info["Name"].ToString());
                            Cliente.Load(obtemDadosDoUsuario);
                            Cliente.ExecuteQuery();
          
                            //Neste momento tenho acesso a todas as propriedades do usuário  
                            //E assim pego o email que preciso
                            string oEmail = obtemDadosDoUsuario.Email;
                   }

        }

      
    Obrigado a todos.


    k2rto4-Pb - Analista SharePoint

    • Marcado como Resposta TI DEV sexta-feira, 13 de julho de 2012 15:05
    sexta-feira, 13 de julho de 2012 15:05

Todas as Respostas

  • Você pode fazer o seguinte.

    A classe Web tem a propriedade SiteUserInfoList que retorna uma lista com informações dos usuários.

    Você pode fazer uma CAML e buscar o email desse usuário.


    Atenciosamente, Rafael Fausto


    terça-feira, 10 de julho de 2012 20:14
  • Olá Rafael,

    Esta propriedade SiteUserInfoList  soment retorna informação dos usuários presentes no site, certo?
    Então para que eu possa obter informação dos usuários os mesmos devem estar cadastrados no site?

    Este SiteUserInfoList pega informação dos usuários dos grupos do sharepoint?
    Ou pega informações de todos os usuários que visitam o site?

    Obrigado


    k2rto4-Pb - Analista SharePoint

    terça-feira, 10 de julho de 2012 20:44
  • De todos os usuários que tem acesso ao site. Quando você adicionar permissão para o usuário, ou quando ele acessa pela primeira vez o site, os dados dele são cadastrados nessa lista.


    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br

    quarta-feira, 11 de julho de 2012 01:48
  • Veja outros exemplos...

    http://msdn.microsoft.com/en-us/library/ee538244.aspx - How to: Work with Users and Groups

    Adapte a sua necessidade e nao tem segredo! ;)


    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br

    quarta-feira, 11 de julho de 2012 12:55
  • Olá Thiago,

    Este link que voce passou agora parece ser o melhor para resolver este problema.
    Mas como podemos perceber é preciso utilizar os grupos da aplicação sharepoint.
    Isso é um problema.

    Pelo que vi ele pega as informações dos usuários através da coleção de usuários dos grupos.
    Nem todos os usuários que acessam a aplicação estam nos grupos.

    Isso complica as coisas.

    Obrigado Pelas Respostas.


    k2rto4-Pb - Analista SharePoint

    quarta-feira, 11 de julho de 2012 13:12
  • Então,

    Como disse no post anterior, a propriedade SiteUserInfoList resolve esse problema.  Não precisa pesquisar grupos, vai direto no usuário.


    Atenciosamente, Rafael Fausto

    quarta-feira, 11 de julho de 2012 13:43
  • Sim, como o Rafael e eu dissemos, você precisar adaptar ao seu cenário... nao precisa usar exatamente com o link que mandei.

    Mais ou menos assim:

    ClientContext clientContext = new ClientContext(txtURL.Text);
                    List listaUsuarios = clientContext.Web.SiteUserInfoList;
                    CamlQuery camlQuery = new CamlQuery();
                    camlQuery.ViewXml = string.Format(@"<View>
                                                        <Query>
                                                          <Where>
                                                            <Eq>
                                                              <FieldRef Name='Name'/>
                                                              <Value Type='Text'>{0}</Value>
                                                            </Eq>
                                                          </Where>
                                                        </Query>
                                                        <RowLimit>1</RowLimit>
                                                      </View>", txtLogin.Text);
    
                    ListItemCollection items = listaUsuarios.GetItems(camlQuery);
    
                    clientContext.Load(items);
                    clientContext.ExecuteQuery();
    
                    if (items.Count > 0)
                    {
                        items[0][cbFields.SelectedItem.ToString()] = txtValorNovo.Text;
                        items[0].Update();
                        clientContext.ExecuteQuery();
    
                    }

    No meu código (fiz uma aplicação tempos atrás para atualizar valores da lista SiteUserInfoList programaticamente, quando o cliente não tem User Profile Services na Farm), eu populei um ComboBox com os fields. Se quiser, o método (para popular o combobox com os fileds) está abaixo.

    private void btnGetFields_Click(object sender, EventArgs e)
            {
                try
                {
                    ClientContext clientContext = new ClientContext(txtURL.Text);
                    List listaUsuarios = clientContext.Web.SiteUserInfoList;
    
                    FieldCollection fields = listaUsuarios.Fields;
                    clientContext.Load(fields);
                    clientContext.ExecuteQuery();
    
                    cbFields.Items.Clear();
    
                    foreach (Field field in fields)
                    {
                                            cbFields.Items.Add(field.InternalName);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(string.Format("Erro: {0}", ex.Message));
                }            
            }

    Abraço!


    Se esta resposta foi útil para você, por favor, marque como Resposta! Muito Obrigado! :) Thiago Silva Especialista SharePoint http://thiagottss.com.br

    quarta-feira, 11 de julho de 2012 13:50
  • Olá,
    Consegui resolver aqui o problema.
    Segue solução.

    Tendo a coluna do tipo pessoa e grupo faça:
    foreach (ListItem oItem in todositens)
        {
                   //Aqui fazemos um novo foreach para ler os itens da coluna pessoa e grupo
                   foreach (FieldUserValue Usuario in item["Alunos"] as FieldUserValue[])
                   {
                            Cliente = new ClientContext(url);

                            ListItem info = Cliente.Web.SiteUserInfoList.GetItemById(Usuario.LookupId);
                            Cliente.Load(info);
                            Cliente.ExecuteQuery();

                            Cliente = new ClientContext(url);

                            User obtemDadosDoUsuario = Cliente.Web.EnsureUser(info["Name"].ToString());
                            Cliente.Load(obtemDadosDoUsuario);
                            Cliente.ExecuteQuery();
          
                            //Neste momento tenho acesso a todas as propriedades do usuário  
                            //E assim pego o email que preciso
                            string oEmail = obtemDadosDoUsuario.Email;
                   }

        }

      
    Obrigado a todos.


    k2rto4-Pb - Analista SharePoint

    • Marcado como Resposta TI DEV sexta-feira, 13 de julho de 2012 15:05
    sexta-feira, 13 de julho de 2012 15:05