Técnica para Gerar CAML Programaticamente

Eu gostaria compartilhar com vocês uma técnica para gerar CAML programaticamente que tem me salvado várias vezes. O CAML é chato de entender e mais chato ainda de tentar gerar, seja na mão ou programaticamente.

Essa técnica foi desenvolvida por mim durante a criação do Iteris.Framework e tem se mostrado muito útil desde então. Ela é extremamente simples e permite adicionar ou remover campos à vontade, em qualquer momento, em qualquer posição.

Tudo começa com um StringBuilder que será usado para gerar o CAML e uma variável de contador de campos:

StringBuilder clausulaWhere = new
StringBuilder();
Int32 contadorCampo = 0;

E então começa a brincadeira. Ela pode ser, por exemplo, um conjunto de possibilidades de ID de, neste exemplo, Tipo de Documento (um conjunto de ORs, ou, no T-SQL, o famoso operador IN ()):

// Monta a cláusula CAML <Where> intercalando os <Or>s.
foreach (SPListItem tipoDocumento in tiposDocumento) {
clausulaWhere.Append(“<Eq>”);
clausulaWhere.Append(“<FieldRef Name=”TipoDocumento” LookupId=”TRUE”/>”);
clausulaWhere.Append(“<Value Type=”Lookup”>”);
clausulaWhere.Append(tipoDocumento.ID.ToString());
c
lausulaWhere.Append(“</Value>”);
clausulaWhere.Append(“</Eq>”);
if (++contadorCampo > 1) {
clausulaWhere.Insert(0, “<Or>”);

clausulaWhere.Append(“</Or>”);

}

}

Depois nós podemos querer filtrar apenas os que são documentos (sem as pastas) desses tipos de documentos…

// Filtra somente documentos (sem pastas).
clausulaWhere.Append(“<Eq><FieldRef Name=”FSObjType”/><Value Type=”Text”>0</Value></Eq>”);
if (++contadorCampo > 1) {
clausulaWhere.Insert(0, “<And>”);
clausulaWhere.Append(“</And>”);
}

Podemos também exigir que os documentos encontrados sejam de uma unidade e/ou de uma área específica, caso o usuário tenha informado a área…

// Adiciona os filtros de Unidade e Área
if (ddlArea.SelectedIndex > 0) {
clausulaWhere.Append(“<Eq>”);
clausula
Where.Append(“<FieldRef Name=”Unidade” LookupId=”TRUE”/>”);
clausulaWhere.Append(“<Value Type=”Lookup”>”);
clausulaWhere.Append(ddlArea.SelectedValue);
clausulaWhere.Append(“</Value>”);
clausulaWhere.Append(“</Eq>”);
if (++contadorCampo > 1) {
clausu
laWhere.Insert(0, “<And>”);
clausulaWhere.Append(“</And>”);
}
}

clausulaWhere.Append(“<Eq>”);
clausulaWhere.Append(“<FieldRef Name=”Area” LookupId=”TRUE”/>”);
clausulaWhere.Append(“<Value Type=”Lookup”>”);
clausulaWhere.Append(item[“Area”].ToString().Split(‘;’)[0]);
clausulaWhere.Append(“</Value>”);
clausulaWhere.Append(“</Eq>”);
if (++contadorCampo > 1) {
clausulaWhere.Insert(0, “<And>”);
clausulaWhere.Append(“</And>”);
}

Finalmente, inserimos tudo dentro das tags <Where> para que possamos executar a query…

if (clausulaWhere.Length > 0) {
clausulaWhere.Insert(0, “<Where>”);
clausulaWhere.Append(“</Where>”);
}

query.Query = clausulaWhere.ToString();
query.ViewFields = “<FieldRef Name=”ID” />”;
query.Folder = web.GetFolder(item.Url).ParentFolder;
items = lista.GetItems(query);

Voilà!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s