Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

Mazinův blog o SharePointu

Vypočítaná pole a InfoPath

Nedávno jsem se setkal s chybou při editaci listových formulářů pomocí InfoPathu. Projevovala se tak, že uložení změn formuláře končilo nicneříkající chybou “The SOAP message cannot be parsed”. Zkrátka fantazie ze světa troubleshootingu. Týkalo se to jen některých seznamů. Postupně jsem zjistil, že se problém projevuje u seznamů s velkým počtem položek.

Problém byl nakonec v tom, že když publikujete InfoPath formulář pro seznam s vypočítanými sloupci, dochází k přepočítání hodnot těchto sloupců. A to i v případě, že formulář sám s žádným takovým sloupcem nepracuje. A při tomto přepočítávání, pokud seznam obsahuje dost položek a dost vypočítaných sloupců, může dojít k timeoutu. Ten se pak projeví onou “výstižnou” chybovou hláškou.

Zmiňovaný troubleshooting mě přivedl k obecnější otázce: Jaké máme možnosti, když potřebujeme zobrazit v seznamovém formuláři další informace na základě uživatelem vyplněných údajů?

V podstatě připadají v úvahu následující možnosti (seřazeno podle náročnosti provedení - vím, že je to subjektivní veličina a můžete mít jiné pořadí):

  1. Vypočítané sloupce
  2. Úprava formuláře pomocí InfoPathu:
    1. calculated values
    2. textové pole a defaultní hodnota
    3. .NET kód ve formuláři
  3. JS ve formuláři
  4. Workflow spouštěné po vložení nebo aktualizaci položky
  5. Event receivery
  6. Job

Rozeberu si jednotlivé varianty a budu je srovnávat podle následujících kritérií:

  1. Potřebné nástroje a znalosti pro implementaci
  2. Možnosti a omezení výpočtů
  3. Live zobrazení vs. dostupnost až po uložení položky
  4. Persistence vypočítaných hodnot – výsledek je “jen” zobrazen, nebo se dá využít i v jiných procesech (např. ve workflow, jobech, …) aniž by se musel opětovně počítat.
  5. Použitelnost v on-premise vs SharePointu Online
Vypočítané sloupce

Nejjednodušší varianta. Vytvoří se nový sloupec odpovídajícího typu a zadá se výpočetní výraz. Jeho syntaxe a možnosti jsou podobné výpočtům v Excelu, což může být výhoda. Výpočet může používat ostatní sloupce dané položky. Výsledek je dostupný okamžitě při uložení položky. Tato varianta má nejvíce omezené možnosti výpočtů (kromě jiného se nedají použít např. lookup sloupce a “konstanty” jako aktuální datum, nebo aktuální uživatel). Výsledek je uložen v datech položky jako hodnota sloupce.

Funguje i v SharePointu Online a je jedno jakým způsobem položku vytvoříme nebo změníme (UI, PowerShell, programově, …).

Úprava formuláře pomocí InfoPathu

Zde můžeme použít 3 varianty:

    1. calculated values – speciální ovládací prvek, u kterého se nastaví výpočetní výraz. Aktualizuje se okamžitě po změně polí použitých ve výpočtu už během vyplňování hodnot. Výsledek je pouze zobrazen, není součástí výsledných dat (resp. není v SP sloupcích).
    2. textové pole a defaultní hodnota – pokud je textové pole napojeno na data, výsledek je součástí SP dat. Pokud je záznam založen/změněn jiným způsobem než pomocí upraveného formuláře, výpočet se neprovede a ve výsledkovém poli bude prázdná/původní hodnota.
    3. .NET kód ve formuláři – i zde platí, že pokud je záznam založen/změněn jiným způsobem, výpočet se neprovede a ve výsledkovém poli bude prázdná/původní hodnota.

Výpočetní možnosti prvních 2 variant jsou dány tím, co nám umožní InfoPath. Standardně jsou k dispozici data z aktuální položky, ale pomocí dalšího datového zdroje je možné pracovat i s dodatečnými záznamy a informacemi. První dvě varianty jsou použitelné jak v on-premise prostředí, tak v SharePointu Online. 3. varianta je možná pouze v on-premise prostředí a z pohledu možností je limitem jen .NET a datové zdroje ve formuláři.

Problémem všech tří variant je v reakci na uživatelské změny sloupců, ať už přidání, odebrání, nebo změna nastavení sloupců se v upraveném formuláři samy neprojeví, je nutné je do něj zapracovat ručně.

JS ve formuláři

Je jedno, jakým způsobem JavaScript do formuláře dostaneme (CustomActions, content editor webpart, …). JS může číst hodnoty již vyplněných polí a případně reagovat na jejich změny (ne vždy je to jednoduché, zejména u polí typu people-picker, lookup a podobně). Může také volat SharePoint (REST API, JavaScript CSOM) a číst z něj další data případně volat externí webové službu a dočítat další informace. Výsledek výpočtu může ukládat do ovládacího prvku dalšího sloupce (pak se výsledek stane součástí dat), nebo ho zobrazit někde ve formuláři. Omezením této metody je, že pokud dojde k vytvoření nebo změně položky mimo upravený formulář, výpočet se neprovede.

Workflow spouštěné po vložení nebo aktualizaci položky

Worflow se dají definovat pomocí SharePoint Designeru, nebo tvořit ve Visual Studiu. Obě varianty jsou použitelné i v SharePointu Online za předpokladu, že si vystačíte s deklarativním způsobem tvorby (standardní aktivity bez .NET kódu) workflow. Toto řešení tedy zahrnuje jak “klikací”, tak kódovou variantu a s tím i související výpočetní možnosti. Nese s sebou ale i poměrně velkou zátěž, protože worklfow runtime není primárně cílen na rychlé operace. Díky tomu může docházet ke zpoždění, tzn. vypočítaná hodnota nemusí být dostupná ihned po uložení položky. Výsledek je uložen ve sloupci záznamu.

Event receivery

Jak SharePoint Online, tak SharePoint v on-premise umožnují reagovat na události vložení, případně změny položky. Díky tomu můžeme provést požadovaný výpočet a položku aktualizovat. V SharePointu Online jsou použitelné pouze remote event receivery, tzn. musíte mít vytvořenou webovou službu, která:

  1. načte data z SharePointu (nemusí se nutně omezit na aktuální položku) například pomocí Client Side Object Modelu.
  2. provede výpočet.
  3. uloží vypočítanou hodnotu do položky opět např. CSOMu.

V obou prostředích je vypočítaná hodnota k dispozici okamžitě, nebo s určitým zpožděním po uložení záznamu (podle použitého typu použitého receiveru). Výsledek je součástí záznamu nejčastěji jako hodnota dalšího sloupce. Musí se implementovat programově. To sebou nese vyšší složitost, na druhou stranu ale široké možnosti výpočtu včetně dočítání dalších informací z jiných zdrojů a podobně.

Job

Pokud pro nás není důležitá aktuálnost vypočítaných údajů (tedy mít je dostupné “ihned”) a pokud například jejich výpočet je náročný, můžeme použít i job. Ten je použitelný jak v on-premise prostředí ve formě klasického SP jobu, tak v SharePointu Online. Tam ale musíme job implementovat ve vlastní infrastruktuře (může jím být i konzolová aplikace spouštěná systémovým timerem) a musí s SharePointem komunikovat vzdáleně. Vysloveně programovací záležitost.

Zveřejněno 26. prosince 2015 22:00 by mazin

Komentář

Žádné komentáře
Neregistrovaní uživatele nemužou přidávat komentáře.

About mazin

V občance mám v kolonce jméno uvedeno Jan Vaněk. Věnuji se SharePointu přes 8 let. Hlavně jako architekt, programátor a autor pilotů a prototypů. Rád se totiž šťourám v tom, co má SharePoint "pod kapotou". A když narazím na něco zajímavého, napíšu o tom článek. Kromě toho občas přednáším, publikuju na Codeplexu a odpovídám na StackExchange. Jsem MVP, MCT, MCSD, MCITP, MCDBA a Certified Scrum Master.

Syndication

News

  • Web Developer
  • Enterprise Application Developer

  • Microsoft Office SharePoint Server 2007, Application Development
  • Microsoft Windows SharePoint Services 3.0, Application Development
  • Microsoft Office SharePoint Server 2007, Configuration
  • Microsoft Windows SharePoint Services 3.0, Configuration
  • .Net Framework 2.0, Distributed Applications
  • .Net Framework 2.0, Web Applications
  • .Net Framework 2.0, Windows Applications
Powered by Community Server (Personal Edition), by Telligent Systems
Vyvojar.cz na prodej!