Tuesday, May 22, 2007

Questão Permente - DataQuery

Uma das questões mais permentes são as DataQuerys aos sites de sharepoint 2007, usando as DataQueryWebParts as vezes não se consegue obter resultados devido a uma certa dificuldade em implementar a devida Query/Resultados no site.



Então, para alguns casos, pode ser mais eficiente criar um novo controlo/webpart para esta situação. O código é facilmente implementando e segue-se um exemplo:

SPWeb thisweb = SPControl.GetContextWeb(Context);
SPSiteDataQuery sitequery = new SPSiteDataQuery();

sitequery.Webs = "<Webs Scope=\"Recursive\" />";
sitequery.Query = "<Where><And><Eq><FieldRef Name=\"ContentType\" /><Value Type=\"Choice\">Artigo</Value></Eq><Eq><FieldRef Name=\"Destaque\" /><Value Type=\"Boolean\">1</Value></Eq></And></Where>";
sitequery.ViewFields = "<FieldRef Name=\"Title\" /><FieldRef Name=\"Sinopse\" /><FieldRef Name=\"Imagem_x0020_Pequena\" /><FieldRef Name=\"LinkFilename\" />";
sitequery.Lists = "<Lists BaseType=\"1\" />";
System.Data.DataTable results = thisweb.GetSiteData(sitequery);

Ora vamos lá analizar o codigo, começamos por defenir um SPWeb que será a web

corrente que será obtida atravez do SPControl.GetContextWeb(Context). Depois, define-se um objecto do tipo SPSiteDataQuery. Este objecto tem varias propriedades, as que usamos são "Webs", "Query", "ViewFields" e "Lists".

Na propriedade "Webs" definimos o "Scope" da pesquisa, ou a zona onde ele vai pesquisar, neste caso usamos "<webs scope="Recursive"<" que basicamente vai tornar a pesquisa recuriva, ou seja, vai procurar e todos os sub-sites/sub-webs do Site actual.

Outras opções são o URL do Site a pesquisar e outra é "SiteCollection" para procurar em todo o Portal. Note-se que todos os parametros são definidos em XML.



Na propriedade Query, definimos a Query a ser utilizada, notar que esta query em definida em CAML como está presente no código acima. É onde são definidos os campos de selecção de pesquisa como por exemplo, para fazer uma query que retorne objecto de um determinado content-type seria uma query do genero "<where><eq><fieldref name="ContentType"><value type="Choice">Noticia</value></eq></where>".



A propriedade de "ViewFields" vai definir as colunas a serem retornadas, por exemplo, para a query que definimos no parametro anterior, queremos retornar apenas o valor de um campo de CAML que será "Titulo", seria definida assim "<fieldref name="Titulo">". Seria apenas necessário definir esta propriedade e só seria apresentado resultados da coluna "Titulo" do Content-Type "Noticia".



A Propriedade "Lists" permite incluir listas especificas nos resultados apartir do GUID como por exemplo:


<lists>
<list id="7A9FDBE6-0841-430a-8D9A-53355801B5D5">
<list id="3D18F506-FCA1-451e-B645-2D720DC84FD8">
</lists>



Ou então definir apenas o BaseType como na query exemplo em cima em que os Base-Type são:

0 - Generic List

1 - Document Library

3 - Discussion Forum

4 - Vote or Survey

5 - Issues List

Após estes parâmetros estarem definidos, basta usar o objecto de SPWeb que está definido, que será o objecto "thisweb" e chamar o método .GetSiteData(SPSiteDataQuery) que irá retornar um objecto do tipo DataTable.

Após execução do método, a DataTable conterá os resultados obtidos na DataQuery e basta dar-lhes o tratamento adequado necessário para a funcionalidade a implomentar.

Cumprimentos.

No comments: