SharePoint XSL Conditional Formatting for custom lists

Given that users are familiar with Microsoft Office Excel applications, find it absolutely normal to use conditional formatting in SharePoint lists.

In fact, SharePoint lists are web pages that cannot be formatted as easy as in Excel. Most experts recommend three methods of formatting lists custom: JS scripts, XSL styles or acquisition of specialized applications.

Script on which I propose is based on XSL style and is customizable for both the SharePoint site of on-premises and for Office 365.

The script also contains many formatting of the default SharePoint designated to improve the end users experience, but it can make more improvements.

Custom list structure:

clip_image002

You have to use in XSL the internal name of columns:

If you want to identify the internal names of columns you have to use a custom XSL with the template:

<xsl:template match=”/” xmlns:x=”http://www.w3.org/2001/XMLSchema”>

<!– Defining variable userd for all records from a Links list –>
<xsl:variable name=”Rows” select=”/dsQueryResponse/Rows/Row” />
   
<!– Display the list as a unsorted list. Also you can choose to create a table. –>   
<ul>
    <xsl:for-each select=”$Rows”>
    <!– Extract the columns of an object. –>
        <li>
            <xsl:for-each select=”@*”>
                <xsl:value-of select=”name()” /> |
            </xsl:for-each>   
        </li>
    </xsl:for-each>
</ul>
</xsl:template>

 

If you want to test my script into a test development you can download it from the address: https://gallery.technet.microsoft.com/XSL-Conditional-Formatting-576f55bd

Internal Names of the columns in this sample:

ID | PermMask | FSObjType | Title | FileLeafRef | FileLeafRef.Name | FileLeafRef.Suffix | Created_x0020_Date | Created_x0020_Date.ifnew | FileRef | FileRef.urlencode | FileRef.urlencodeasurl | File_x0020_Type | HTML_x0020_File_x0020_Type.File_x0020_Type.mapall | HTML_x0020_File_x0020_Type.File_x0020_Type.mapcon | HTML_x0020_File_x0020_Type.File_x0020_Type.mapico | ContentTypeId | Stock | Stock. | SS | SS. | RS |

  • ProductName = Title
  • Stock = Stock
  • Safety Stock = SS
  • Required Supply = RS – calculated column. Formula: =IF([Safety Stock]-Stock>0;[Safety Stock]-Stock;0)
    Depending your locale the formula could be different. Replace ”;” character with ”,”. Also the internal name could be different.

To proceed to the following steps, you have to be sure that you have appropiate permissions.

Test steps:

  1. Download the script from previous Link;
  2. Create a custom list in SharePoint on-premises or Office 365;
  3. Give the name of the list Stocks… or other names… is not important for this sample;
  4. Create columns with short name (eg. SS) and rename columns with a display name;
  5. Create new records, and fill the sample data to accieve condition;
  6. Create a new View and name it Formatting. Is not so important but you have to modify the XSL script if you choose to specify a different name;
  7. Customize your XSL script and uploade it on the SharePoint site in Site Assets library;
  8. Open the Formatting view from the custom list Stocks and from the Settings menu choose Edit Page option;
  9. From the Edit page choose Web part properties:
    image
  10. Expand Miscellaneous and in text box XSL Link type: /SiteAssets/cf_Stocks.xsl
    image
  11. Click Apply button, Ok and close Page editing.

If you want to choose another condition for you custom solution you have to modify the XSL file and to edit another condition on the line 74 from my script:

image

Also you can apply multiple formats using different xsl:when conditions.

Script details:

image

Results:

image

Hope it helps and thank you for future feedback!

Transformare numere in litere in Excel si SharePoint

În urma publicării articolului trecut legat de transformarea numerelor în litere în Excel, un mare specialist în Excel, Ciprian Stoian, membru al comunității DrExcel.ro și ITLearning.ro mi-a trimis o variantă actualizată a formulei care poate fi folosită fără tabele de căutare și funcții VLOOKUP(). Provocarea a fost legată de idea de a implementa această funcționalitate în listele de tip SharePoint, care se poate realiza prin coloane calculate în mod nativ sau xPath pe formularele InfoPath.

Problema coloanelor calculate în SharePoint este dată de limitarea formulelor la 1024 de caractere, așa că am folosit formula lui Ciprian (vezi imaginea) și am descompus-o în 3 coloane calculate diferite (Bani, SuteZeci, SuteMii) a căror rezultat l-am reconcatenat într-o coloană calculată cu LitereTotal.

image

Noua versiune, pentru care am obținut acordul lui Ciprian, a fișierului Excel incluzând ambele variante poate fi descărcat de aici, sau aici: https://gallery.technet.microsoft.com/Romanian-Transformare-917b9167 . Din punctul meu de vedere formula lui Ciprian este mai bună decât cea propusă inițial de mine pentru că funcționează oarecum diferit pe partea de calcul matematic a zecimalelor și este mai scurtă, deci mai ușor de memorat. ”Marele meu merit” este că am reușit să-l provoc! Smile Mai trebuie să vă amintesc faptul că Ciprian a fost cel care a propus cea mai funcțională soluție pentru problema cu combinațiile unice între mulțimi.

Mai jos găsiți un model de implemetare adaptată a formulei lui Ciprian în format funcțional pentru SharePoint din Office 365.

image

Pentru cei care doresc să dezvolte astfel de formulare citiți înainte seria de articole despre business forms. Pe lângă formula în sine apare problema completării on-line a formularului. Câmpurile calculate nu apar pe formularele de date Excel, ci apar abia după ce a fost completat formularul. Poate fi deranjant pentru cineva care are de completat mai multe date din cauză ca trebuie să deschidă și apoi să printeze formularul. Pentru a rezolva problema am creat un secondary data connection către lista de OP-uri care să fie declanșată la modificarea sumei. Utilizatorul scrie suma în caseta dedicată, ceea ce înseamnă change. După change, formularul trimite datele în listă (sursa Main), pasul 2 este interogarea pe secondary și apoi setarea formulei calculate de litere pe formularul curent. Asta se traduce prin a salva în timp real.

Cineva m-a întrebat de ce fără VBA?

Pentru că VBA-ul chiar dacă este excelent de bun și util, nu este suportat în toate mediile. În SharePoint poți introduce date în liste de date asemănător Excelului și poți folosi coloane calculate pentru combinarea valorilor. Dar nu poți folosi toate funcțiile Excel și nici pe departe VBA. De asemenea, în Excel Services (aplicațiile de editare on-line a fișierelor Excel) nu sunt permise macrourile VBA, din rațiuni de securitate. Pentru mine este suficient să caut metode, sau prieteni dispuși să-și își aloce timp pentru a ajuta. Nu în ultimul rând, consider că utilizatorii obișnuiți caută soluții simple la probleme complicate. Iar pentru mulți VBA-ul este deja o soluție suficient de complexă. Sigur uneori chiar nu se poate fără VBA, vezi aici propunerea mea pentur formula de însumare a unor celule Excel pe bază de culori.

Dacă mai aveți probleme interesate de Excel nu exitați să mă contactați sau să contactați forumurile

 

Sper să vă fie util! Mulțumim Ciprian!

#SharePoint Business Forms – Liste vs Biblioteci (2)

În primul episod al acestei serii scriam despre versiunile de SharePoint care suportă personalizarea formularelor de introducere a datelor în SharePoint. În acest articol voi prezenta câteva detalii despre modul de stocare a datelor în SharePoint și modul în care luăm decizia pentru o formă de implementare sau alta.

Puțină teorie

Fiecare proces economic poate fi abstractizat: date de intrare + prelucrări + date de ieșire. În cadrul companiilor majoritatea proceselor economice sunt standardizate, fapt care permite automatizarea acestora prin utilizarea aplicațiilor financiar-contabile și nu numai.

De exemplu, la nivel simplificat procesul economic de vânzare poate fi: primim comanda de la client, livram marfa cu factura sau aviz, încasăm banii. Asta înseamnă că o aplicație trebuie să permită introducerea de date într-un formular de comandă, maparea cu o altă aplicație sau modul sau tabelă de stocuri, completarea câmpurilor de pe un formular de factură, scăderea automată a stocului, înregistrarea creanței, stingerea creanței.  Pentru aceste tipuri de procese există foarte multe soluții pe piață, de la aplicații stand-alone la aplicații ERP de tip client-server sau web-based. În funcție de furnizor sau de modulele comandate, scopul aplicațiilor ERP este de a automatiza fiecare proces economic din cadrul companiei, inclusiv pentru modulele de Marketing, HR, Clienți etc.  Fiind produse foarte scumpe, multe companii preferă să cumpere module esențiale sau doar module fără personalizări ale produsului pentru adaptarea la specificul proceselor de business locale.

În urma acestor decizii, apar o serie de procese economice și funcționale care nu sunt automatizate și care se derulează în modul clasic pe documente de hârtie (paper based) sau documente Office atașate în e-mailuri. SharePoint-ul și alte produse de document management oferă funcționalități avansate pentru gestionarea documentelor electronice, sau pentru documentele paper based scanate și încărcate electronic în aceste sisteme, cu scopul partajării, aprobării sau arhivării.

Dintr-un document Office sau PDF nu pot fi extrase informații sau date pentru realizarea rapoartelor de sinteză, de aceea, scopul prezentului articol este de a identifica metode și a propune forme electronice de înregistrare a datelor cu scopul de a obține rapoarte.

Specificul stocării datelor: liste vs formulare

Pentru a se putea instala un SharePoint are nevoie de o bază de date. Chiar dacă sunt multe articole care descriu modul de lucru al SharePoint-ului cu alte tipuri de baze de date, rămâne preferată de majoritatea implementatorilor utilizarea SQL Server cu diferitele sale variante. Trebuie să menționăm că în versiunea SharePoint 2016 nu va mai fi disponibilă versiunea de SharePoint Foundation (ediție gratuită), iar instalarea SharePoint Server pe mediile de producție folosind SQL Server Express nu este recomandată. Toate tipurile de documente (Office și PDF) sunt stocate in format hexazecimal direct în câmpuri ale bazei de date în tabela DocStreams. În Office 365 modul și locul de stocare a fișierelor este transparent față de administratori și utilizatorii finali.

Date din liste sunt stocate în mod netransparent în SharePoint dar pot fi folosite ca surse de date pentru alte liste și librării. Crearea unei liste presupune crearea structurii tabelare asemănător tabelelor din bazele de date prin definirea numelui, tipului de câmp și eventualele formatări, restricții și validări.

image

În cadrul unei liste se pot înregistra doar structuri de date normalizate, interconectarea entităților sau dinamica unor înregistrări constând în utilizarea mai multor liste. Etapa de adăugare a unei înregistrări într-o listă presupune scrierea unei singure linii, nefiind posibilă adăugarea simultană de înregistrări în mai multe liste. Folosind tehnica fluxurilor de lucru, o înregistrare creată într-o listă poate declanșa crearea unor înregistrări automate în alte liste. Pe lângă problema înregistrării dinamice a datelor, în cazul proceselor complexe listele pot avea un număr mare de coloane (maximum 276). Normal că în momentul în care se stabilește un număr de coloane atât de mare este greu de crezut că cineva se va apuca să le creeze manual. De aceea, în urmă cu ceva timp am încercat să dezvolt un script de creare a coloanelor unei liste bazându-mă pe descrierea CAML a unei liste. Puteți descărca și utiliza for free produsul CAML Creator de pe Technet. Pentru detalii de utilizare și execuție folosiți referința de pe Youtube.

Exemplu de formular pentru o cerere de avans pentru deplasare sau decontare în funcție de necesități:

image

Fiecare din câmpurile din dreapta este o coloană separată în lista asimilată de SharePoint. Modul de funcționare al acestui formular  îl voi prezenta într-un episod următor.

În partea de deconturi un angajat trebuie să completeze o serie de documente justificative.

image

În derularea procesului efectiv nu avem de unde să știm câte facturi poate aduce un om dintr-o deplasare, de aceea cel mai corect din punct de vedere al afacerii este ca aceștia să poată introduce o linie nouă pentru fiecare document justificativ. Utilizând liste de date nu putem construi linii dinamice, așa cum spuneam anterior. Dar angajatul poate trece cu virgulă sau alt separator toate facturile dintr-o categorie în același câmp și valoarea cumulată a acestora pe coloana de valoare.

Bibliotecile de formulare stochează diferit informațiile, permițând dezvoltatorului crearea unor formulare cu un număr dinamic de înregistrări. În mare parte dezavantajul acestui format este că datele nu sunt normalizate și nu pot fi văzute în SharePoint asemănător unei liste, valorile de pe linii multiple beneficiind totuși de o serie de funcții de numărare, sumă sau se pot face operațiuni de cumulare (merge).

Chiar dacă pot fi completate prin browser sau prin InfoPath Filler, stocarea datelor introduse se realizează prin intermediul fișierelor XML, a căror structură depinde de fiecare tip de aplicație în parte.

Exemplu de formular InfoPath cu completare în Browser:

image

Tipul acesta de formulare suportă un număr variabil de linii, pe baza regulilor de publicare fișierul având nume în funcție de câmpurile selectate.

Stocarea în format XML (vezi imagine) poate provoca probleme de centralizare a datelor, fiind necesară crearea unor servicii Web dedicate extragerii datelor din fișiere multiple.

image

Personal, pentru centralizare prefer o metodă semiautomată: maparea schemei XML într-un fișier Excel și importul mai multor fișiere nenormalizate în Excel.

Alte aspecte

Listele precum și formularele InfoPath suportă atașarea de fișiere pentru justificarea anumitor acțiuni în cadrul unui proces. În liste fișierele atașate vor putea fi ulterior descărcate în format Windows Explorer, în formulare, fișierele fiind reprezentate în format binar în conținutul fișierului XML final. Personal nu recomand utilizarea excesivă a fișierelor atașate pe liste sau formulare pentru că apare avantajul lipsei de acces direct la fișier. Ele pot fi indexate și regăsite ulterior prin funcțiile de search.

Semnarea electronică am explicat-o în articolul cu Fișa de lichidare. Listele nu suportă semnare electronică. Formularele permit inclusiv în browser semnarea electronică. Trebuie doar să amintesc faptul că în momentul modificării unui formular care conține semnături electronice se invalidează toate semnăturile deja aplicate pe documentele din Biblioteca de formulare.

Sursele de date pentru forlularele personalizate trebuie să aibă o dimensiune cât mai redusă cu putință. În momentul în care o sursă de date conține un număr semnificativ de înregistrări (100+), procesul de conversie al formularului în pagină web va consuma o perioadă însemnată de timp pentru a putea reprezenta toate opțiunile posibile din drop-down-urile dintr-un formular renderizat.

Cam atât pentru moment. Voi reveni într-un episod următor cu elemente de business logics, fluxurile de aprobare și un exemplu concret de formular pentru avansuri și deconturi.

O zi bună!

Blog la WordPress.com.

SUS ↑