sábado, 26 de junho de 2010

Tour SP - Consultando listas utilizando filtros

Como primeiro post do nosso tour pelo SharePoint, vou apresentar uma maneira prática de obter itens de uma lista no SP aplicando uma query na consulta.
O cenário é o seguinte, temos uma lista que funciona como um glossário, onde os principais termos e siglas de uma organização são armazenados. Essa lista de nome "Glossário" possui dois campos, "Título" e "Descrição". A idéia é criar um método de busca nessa lista para que passado um termo específico, sejam carregados todos os itens relacionados da lista em uma grid.
Segue o código:
private void makeSearch(String term)
{
    using (SPSite site = new SPSite("http://meuSite:1234/"))
{
        SPWeb web = site.OpenWeb();

        SPList listCol = web.Lists["Glossário"];

        SPQuery query = new SPQuery();
query.Query = "<OrderBy><FieldRef Name='Title' /></OrderBy>" +
                "<Where><Contains><FieldRef Name='Title' />" +
                "<Value Type=\"Text\">" + term + "</Value></Contains></Where>";
        SPListItemCollection itemsCol = listCol.GetItems(query);

            
        DataTable t = this.MakeTable(new String[] { "Título", "Descrição" },
new Type[] { typeof(string), typeof(string) });

        foreach (SPListItem item in itemsCol)
{
            string titulo = item["Título"].ToString();
            string descrição = item["Descrição"].ToString();

t.Rows.Add(new object[] { titulo, descrição });
}

gvSearch.DataSource = t;
gvSearch.DataBind();
}
}

private DataTable makeTable(String[] titles, Type[] types) 
{
DataTable table = new DataTable();

DataColumn[] dataColumns = new DataColumn[titles.Length];

for (int i = 0; i < titles.Length; i++)
{
dataColumns[i] = new DataColumn(titles[i], types[i]);
}

table.Columns.AddRange(dataColumns);

return table;
}



Aqui é instacianda a referência para o portal no qual está nossa lista

using (SPSite site = new SPSite("http://meuSite:1234/"))

Instanciamos o site que possui a lista

SPWeb web = site.OpenWeb();

Uma maneira bastante prática de se obter uma referência para uma lista é passando seu nome como index na coleção de listas do site

SPList listCol = web.Lists["Glossário"];

Este é o ponto chave do exemplo,

Primeiro instaciamos um objeto do tipo SPQuery no qual possui as propriedades necessárias para execução do nosso filtro.

Na propriedade Query nós setamos o filtro, que é construído de acordo com uma CAML(Collaborative Application Markup Language) que possui uma sintaxe própria que pode ser melhor estudada no site do msdn. No nosso filtro nós estamos ordenando a listagem pelo título (tag <OrderBy>) e filtrando (tag <Where>) por todos itens que contiverem o termo passado (tag <Contains>).

Após definido nosso objeto de consulta “query”, ele é utilizado pelo metodo GetItems() e  o rertorno é dado de acordo com o seu filtro.
SPQuery query = new SPQuery();
query.Query = "<OrderBy><FieldRef Name='Título' /></OrderBy>" +
              "<Where><Contains><FieldRef Name='Título' />" +
"<Value Type=\"Text\">" + term + "</Value></Contains></Where>";
SPListItemCollection itemsCol = listCol.GetItems(query);


Bem, executada a consulta, o que nos resta é preencher a grid com os valores.Criei um método para criar uma tabela (makeTable()) e após adicionar as linhas com os itens da lista, carrego a tabela na grid.Percebam que da mesma forma que selecionamos a lista indexando-a pelo nome na coleção de listas do site,nós também o fazemos com o item de uma lista para obter um campo específico, no nosso caso o Título e a Descrição.Após a montagem da tabela, ela é setada no grid e nossa tarefa está completa.
 
DataTable t = this.MakeTable(new String[] { "Título", "Descrição" },
new Type[] { typeof(string), typeof(string) });

foreach (SPListItem item in itemsCol)
{
    string titulo = item["Título"].ToString();
    string descrição = item["Descrição"].ToString();

t.Rows.Add(new object[] { titulo, descrição });
}

gvSearch.DataSource = t;
gvSearch.DataBind();



A utilização da classe SPQuery é bastante útil para manipulação de itens de uma lista, mas não se limita apenas a uma, podendo executar consultas a items de mais de uma lista.

Bem, esse foi o primeiro post do nosso tour pelo SharePoint, ainda temos muitos temas para abordar e em breve estarei postando por aqui. Bons estudos a todos, um forte abraço!

Nenhum comentário:

Postar um comentário