CAML vo WSS a tvorba dotazu na vyhladanie dokumentov
Podme si ukazat jedno zlepsienie pri praci s WSS 3.0 oproti starsim verziam.
Predstavte si, ze potrebujete vyhladavat obsah portalu cez viacero stranok, alebo podla vlastnych kriterii. Vo WSS 2.0 to bol vcelku problem...
Teraz pribudol novy objekt SPSiteDataQuery, ktory je presne urceny k "cross-site or cross-list search".
Dalsim objektom je SPQuery, ale ten pracuje len nad konktretnym listom, co vacsinou je nedostacujuce.
Podme si naprogramovat jednoduchu webpartu, ktora najde vsetky napr. ".docx" dokumenty na stranke a zobrazi ich v gride.
1. Zostavme si CAML dotaz. K tomuto pouzijme free nastroje, ktore to urobia za nas (napr. U2U CAML Query Builder, Stramit SharePoint Caml Viewer)
2. Vytvorime vlastny webpartu
[Guid("bac182c8-94e0-45f1-afea-8bcea1fee58b")]
public class Caml : System.Web.UI.WebControls.WebParts.WebPart
{
protected GridView gvResult;
/// Tu budeme toplnat dalsie override metody
}
3. prepisme OnLoad metodu, kde prevedieme vlastne vyhladanie a naplnenie objektu DataTable
protected override void OnLoad(EventArgs e)
{
EnsureChildControls();
DataTable dt = null;
SPWeb web = SPControl.GetContextWeb(Context);
SPSiteDataQuery q = new SPSiteDataQuery();
//Vratene polia dotazu
q.ViewFields = "<FieldRef Name=\"Title\"/><FieldRef Name=\"Modified\"/>" +
"<FieldRef Name=\"FileLeafRef\"/><FieldRef Name=\"DocIcon\"/>" +
"<ListProperty Name=\"Title\" /><FieldRef Name=\"Editor\"/>" +
"<FieldRef Name=\"FileRef\"/>";
//nastavenie vyhladavania dokumentovej kniznice
q.Lists = "<Lists ServerTemplate=\"101\"/>";
//Samotny dotaz, kde vyhladavame DocIcon rovna docx
q.Query = "<Where><Eq><FieldRef Name=\"DocIcon\" />"+
"<Value Type=\"Computed\">docx</Value></Eq></Where>";
//pokial potrebujeme vyhladavat rekurzivne zmenime scope vyhladavania
//q.Webs = "<webs scope="SiteCollection">";
//q.Webs = "<webs scope="Recursive">";
//DataTable vysledku + bind gridu
dt = web.GetSiteData(q);
if (dt != null)
{
gvResult.DataSource = dt;
gvResult.DataBind();
}
web = null;
}
4. Render Gridu s vysledkom
protected override void CreateChildControls()
{
gvResult = new GridView();
gvResult.AutoGenerateColumns = true;
gvResult.Width = Unit.Percentage(100);
this.Controls.Add(gvResult);
}
protected override void Render(HtmlTextWriter writer)
{
gvResult.RenderControl(writer);
}
5. Vysledok naseho snazenia. Samozrejme parsovanie a graficku upravu uz ponecham na fantazii programatorov

6. kompletny zdojovy kod je v attachments