SELECT dbo.WorkflowAssociation.Id AS AssociationID, dbo.Workflow.InternalState, dbo.Workflow.Status1, dbo.Workflow.Created AS Started, dbo.Workflow.TemplateId, dbo.Lists.tp_Title AS ListTitle, dbo.AllUserData.nvarchar1 as ItemTitle,
dbo.Webs.Title AS WebTitle, dbo.Webs.FullUrl AS WebUrl, dbo.Workflow.SiteId, dbo.Workflow.WebId, dbo.Workflow.ListId, dbo.Workflow.ItemId,
dbo.Workflow.ItemGUID, dbo.AllUserData.tp_GUID
FROM dbo.AllUserData RIGHT OUTER JOIN
dbo.Workflow ON dbo.AllUserData.tp_GUID = dbo.Workflow.ItemGUID LEFT OUTER JOIN
dbo.Sites RIGHT OUTER JOIN
dbo.WorkflowAssociation ON dbo.Sites.Id = dbo.WorkflowAssociation.SiteId LEFT OUTER JOIN
dbo.Webs ON dbo.WorkflowAssociation.WebId = dbo.Webs.Id LEFT OUTER JOIN
dbo.Lists ON dbo.WorkflowAssociation.ListId = dbo.Lists.tp_ID ON dbo.Workflow.TemplateId = dbo.WorkflowAssociation.Id
WHERE (dbo.Workflow.Status1 = 1 OR
dbo.Workflow.Status1 = 3 OR
dbo.Workflow.Status1 = 6 OR
dbo.Workflow.Status1 = 7) AND (dbo.Workflow.ItemId > 0)
ORDER BY Started
Na CodePlexu jsem objevil nový nástroj pro prohlížení systémových logů SharePointu, jmenuje se ULS Deobfuscator (http://ulsdeobfuscator.codeplex.com/), který stačí stáhnout bez nutnosti instalace.
Umí samozřejmě filtrovat (i regex), řadit, obarvovat a spoustu dalších drobností – všechno lepší než notepad u zákazníka
Pokud SharePoint na nějakém webu zobrazuje místo obsahu webparty následující hlášku:
Unable to display this Web Part. To troubleshoot the problem, open this Web page in a Microsoft SharePoint Foundation-compatible HTML editor such as Microsoft SharePoint Designer. If the problem persists, contact your Web server administrator
[more]
a v ULS logu je výjimka:
Error while executing web part: System.StackOverflowException: Operation caused a stack overflow. at Microsoft.Xslt.NativeMethod.CheckForSufficientStack() at SyncToNavigator(XPathNavigator , XPathNavigator ) at (XmlQueryRuntime , IList`1 , Double , XPathNavigator ) at (XmlQueryRuntime , XPathNavigator ) at Root(XmlQueryRuntime ) at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer, Boolean closeWriter) at System.Xml.Xsl.XmlILCommand.Execute(IXPathNavigable contextDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter results) at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results) at Microsoft.SharePoint.WebPartPages.DataFormWebPart.ExecuteTransform(XslCompiledTransform xslCompiledTransform, XsltArgumentList xmlArguments, Boolean bDeferExecuteTransform) at Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
Zpracování XSLT trvalo déle než nakonfigurovaná maximální doba, defaultně je pouze 1 sekunda, což na SharePoint s velkým množstvím dat není mnoho
PowerShellem je potřebu upravit timeout (počet sekund) maximální délky zpracování XSLT transformací:
SharePoint má standardně zapnutý limit počtu alertů na jednoho uživatele, tedy kolik si jich maximálně může sám aktivovat – defaultně je toto číslo nastaveno na 500. Počet se sice zdá na jednu stranu rozumný a skoro uživatelsky nemožné, aby si někdo tolik upozornění aktivoval, ale v praxi je u některých agend málo. Příkladem mohou být například interní objednávky, kdy každá interní objednávka má definovaného řešitele pomocí kategorie (kategorii “IT” řeší IT oddělení, správu vozů administrativa, opravy strojů oddělení správy majetku, atd.), to ale znamená, že nechceme notifikovat všechny lidi, kteří mohou objednávky spravovat, tedy řešitele, ale jenom ty, kterých se daná kategorie objednávky týká – k tomu svádí vytvořit programově event receivery po vytvoření objednávky a pro dané uživatele vytvářet programově alerty na změnu položky… Ale tedy u je kámen úrazu, kdy i poměrně malá společnost je schopna vygenerovat více než 500 objednávek na jednoho uživatele, nehledě na to, že limit 500 alertů na uživatele je přes celou webovou aplikaci, kde může být více podobných agend. Vytváření alertů na jednotlivé položky tedy není z dlouhodobého pohledu dobrá cesta, ale pokud už takový nástroj/doplněk máte, nejjednodušší cestou je zvýšení limitu.
[more]
Zvýšení limitu počtu alertů na uživatele nelze provést v UI, lze pouze příkazovou řádkou:
Do nadpisu jsem původně chtěl vložit ještě trefný suffix “pro prodloužení psychického zdraví vývojáře”, protože tento doplněk ve spoustě případů skutečně šetří nervy při deploy změn a testování – kdo nikdy nevyvíjel nic pro SharePoint, nemůže pochopit Zatím ale nemám pořádně vyzkoušeno, zdá se to ale slibné.
Dostupné přímo z VS:
Lze aktivovat i mód automatického deploye po uložení:
VS doplněk je dostupný buď přímo ze správy Extensions Visual Studia nebo ke stažení zde:
V SharePointu 2007 byla v objektu SPApplicationPool vlastnost Password, od verze 2010 je však již označená jako deprecated, heslo se však zpětně dá zjistit příkazem z command line:
cmd.exe /c $env:windir\system32\inetsrv\appcmd.exe list apppool „apppoolname“ /text:ProcessModel.Password
Stále tedy platí, nezadávejte nikdy a nikde 2x stejné heslo, nikdy nevíte, kdy a kdo ho je schopen přečíst.
SharePoint 2013 v kolekcích webů vytvořených nebo migrovaných v compatibility módu 2010, automaticky skrývá všechny features z WSP farm řešení pro verzi 2013. Pokud tedy provádíte upgrade, připojíte starou kolekci webů 2010, nainstalujete nové farm balíčky pro podporu SP2013 a chcete ponechat kolekci ve vzhledu 2010, alespoň do dokončení nutných úprav, feature z nových balíčků neuvidíte. Aby bylo možné aktivovat nové feature na starém UI, je potřeba provést retract balíčku ze všech webových aplikací a znovu provést deploy s atributem CompatibilityLevel:
SharePoint verze 2010 a novější obsahuje v definici sloupce volbu Vynutit jedinečné hodnoty – tato volba zajistí, že pokud máte například seznam dodavatelských společností a chcete vynutit jejich unikátnost pomocí sloupce IČ, můžete jednoduchým zatržením volby funkci aktivovat. Funkce má však několik much a pro tento způsob kontroly se zrovna nehodí, problémy jsou minimálně dva:
Co pokud chci jenom kontrolu s možností uložení? Později budu chtít například ukládat i pobočky společností se stejným IČ?
Co když uživatel v jednom případě vyplní formát jako 28708636 a druhý jako 287 08 636?
[more]
V tomto případě je už nutné sáhnout po kustomizaci pomocí javascriptu a vytvořit malý script, který sjednotí formát, ořeže nepovolené znaky a ve finále i zkontroluje duplicitu IČ s možností uložení.
Pro příklad jsem použil volně dostupnou javascript knihovnu SPServices na http://spservices.codeplex.com/, která obsahuje spoustu užitečných funkcí pro každodenní použití, za zmínku určitě stojí kaskádové seznamy, zobrazení souvisejících informací z lookupu, našeptávač (autocomplete), filtr dropdownu, vyplnění defaultních hodnot atd., více přímo v dokumentaci http://spservices.codeplex.com/documentation
Prerequisity jsou rovněž popsány v dokumentaci, je potřeba jQuery a SPServices scripty nahrát do knihovny SharePoint a přidat reference do masterpage, případně do samotné stránky formuláře, více v detailní dokumentaci na CodePlexu.
Pak už jen vložit následující script na stránku formuláře, kde chcete provádět kontrolu:
$("input[title='IČ']").bind('keypress', function (event) {
var regex = new RegExp("^[a-zA-Z0-9]+$");
var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
if (!regex.test(key)) {
event.preventDefault();
return false;
}
});
$("input[title='IČ']").bind("change", function () {
var input = $(this),
text = input.val().replace(/[^a-zA-Z0-9-_\s]/g, "");
if (/_|\s/.test(text)) {
text = text.replace(/_|\s/g, "");
}
input.val(text);
});
$().SPServices.SPRequireUnique({
columnStaticName: "ICSpolecnosti",
duplicateAction: 0,
ignoreCase: true,
initMsg: "IČ musí být unikátní.",
initMsgCSSClass: "ms-vb",
errMsg: "Společnost se zadaným IČ již existuje!",
errMsgCSSClass: "ms-formvalidation",
showDupes: false,
completefunc: null
});
Výsledek:
Script lze samozřejmě jednoduše upravit tak, aby mimo zobrazení upozornění, byl uživatel při uložení záznamu také vyzván dialogem k potvrzení, že je si vědom duplicity a zda opravdu chce nový záznam s tímto IČ opravdu založit.