IF-THEN-ELSE in xPath

Există multă documentație și exemple pe Internet legate de utilizarea condițiilor IF-THEN-ELSE în formularele personalizate în InfoPath din SharePoint. De ce încă despre InfoPath? Pentru că este încă un produs suportat în versiunea de SharePoint 2016 și a fost prelungit suportul pentru InfoPath 2013. De ce xPath? Pentru că va mai rezista ceva timp.

În modimage clasic în xPath 1.0, cel care poate fi folosit pe formularele InfoPath 2013, nu există o sintaxă de tip IF-THEN-ELSE dar există o adaptare a acesteia, oarecum mai complicată dar care funcționează inclusiv pentru IF-uri imbricate.

În mod simplificat sintaxa este:

concat(
substring(TrueResult, 1, (BoolCondition) * string-length(TrueResult)),
substring(ElseResult, 1, (not(BoolCondition)) * string-length(ElseResult))
)

Formula poate fi scrisă pe mai multe rânduri sau pe un singur rând caracterele Enter nefiind interpretate în execuție. O altă formă a IF-THEN-ELSE-ului este prezentată în forma:

concat(
    substring(TrueResult, 1 div BoolCondition),
    substring(ElseResult, 1 div not(BoolCondition))
    )

Din punctul meu de vedere formula în schimb nu este la fel de exactă, rezultatul pentru True fiind de multe ori altertat, mai ales când se operează cu numere.

 

Introducerea unei noi condiții pe ramura IF-THEN transformă formula în:

concat(
    substring(
            concat(
                substring(
                    TrueResult1
                    , 1, (BoolCondition) * string-length(
                    TrueResult1
                    )),
                substring(
                    ElseResult1
                    , 1, (not(BoolCondition)) * string-length(
                    ElseResult1
                    ))
                )
            , 1, (BoolCondition) * string-length(
            concat(
                substring(
                    TrueResult1
                    , 1, (BoolCondition) * string-length(
                    TrueResult1
                    )),
                substring(
                    ElseResult1
                    , 1, (not(BoolCondition)) * string-length(
                    ElseResult1
                    ))
                )
            )),
    substring(
            ElseResult2
            , 1, (not(BoolCondition)) * string-length(
            ElseResult2
            ))
    )

Condițiile folosesc operatorii clasici: =, >, etc. În cazul în care valoarea comparată în condiție este un număr trebuie să folosim funcția number(câmp).

Prezentul articol este mai mult un exemplu de calculare a unui câmp dintr-un formular pe baza alegerilor sau datelor introduse de un utilizator. Practic există și alte metode de lucru, xPath fiind una din metodele foarte dificile. Astfel, dacă avem un formular prin intermediul căruia dorim să comparăm două valori, Value1 și Value2 atunci pentru a rezolva problema trebuie să folosim următoarea formulă:

image

Formularul conține două câmpuri cu numele Value1 și Value2 și un buton care determină valoarea textului afișat prin utilizarea formulei respective:

image

Pas cu pas implementarea:

1. Am creat un formular simplu în SharePoint cu cele două coloane;

2. Am personalizat formularul în InfoPath și am adăugat butonul Compare…

3. La acțiunea butonului am pus setare valoare câmp Title la formula de mai sus.

Simplu, nu? Smile

Condițiile cumulative

În IF-uri mai avem de multe ori și condiții cumulative. Pentru a specifica acest cumul de condiții trebuie să folosim operatorul AND sau OR după caz.

Formula devine în acest caz:

concat(
    substring(TrueResult, 1, (BoolCondition1 and BoolCondition2) * string-length(TrueResult)),
    substring(ElseResult, 1, (not(BoolCondition1 and BoolCondition2)) * string-length(ElseResult))
    )

 

Exemplu de formulă pentru compararea sumară a trei valori:

concat(
    substring(„Ambele valori sunt mai mari”, 1,
        ((number(dfs:dataFields/my:SharePointListItem_RW/my:Value1)>number(dfs:dataFields/my:SharePointListItem_RW/my:Value3))
        and (number(dfs:dataFields/my:SharePointListItem_RW/my:Value2)>number(dfs:dataFields/my:SharePointListItem_RW/my:Value3))) *
        string-length(„Ambele valori sunt mai mari”)),
    substring(„Una din valori este mai mica”, 1,
        (not((number(dfs:dataFields/my:SharePointListItem_RW/my:Value1)>number(dfs:dataFields/my:SharePointListItem_RW/my:Value3))
        and (number(dfs:dataFields/my:SharePointListItem_RW/my:Value2)>number(dfs:dataFields/my:SharePointListItem_RW/my:Value3)))) *
        string-length(„Una din valori este mai mica”))
    )

Sper să vă fie util!

SIA Darts Cup 2016

SiglaIDCVineri 20 Mai 2016, în locația Play Again, Palas Mall, a avut loc a doua ediție a cupei de darts pentru studenți de la Masterul SIA, Facultatea de Economie și Administrarea Afacerilor. Evenimentul a avut loc în contextul licitației caritabile Și mIE îmi pasă ediția 2016 organizată de studenții de la specializarea de Informatică Economică anul III sub directa coordonatoare a doamnei profesor Doina Fotache. ”Obiectul” supus licitației a fost un joc/școală de Darts în scopul popularizării acestui sport al minții şi îndemânării care implică o mare putere de concentrare și coordonare. Studenții de la specializarea de master SIA, anul II, au licitat cea mai mare sumă pentru pentru prezența în grup la acest eveniment.

Văzut de multe ori ca un sport de bar (social), beneficiile jocului de Darts sunt explicate pe de colegii de la clubul Iași Darts Club, dar cred că fiecare simte jocul în felul său. (Trebuie să menționăm că în cadrul competițiilor oficiale este interzis consumul de băuturi alcoolice în zona de joc.)

Pentru mine cel mai important este spiritul de competiție, dar am observat că pentru a avea o prestație mai bună în joc, trebuie să îți îmbunătățești constant și considerabil capacitatea de concentrare, capacitatea de redresare și gândirea aritmetică simplă. În prima competiție la care am participat oficial mi-am dat seama că pur și simplu operațiunile aritmetice simple sunt un adevărat chin: socotiți rapid în minte Dublu 13+5+triplu de 19 după care scădeți din 501. Greu, nu? Smile

După care ajungi la închiderile cu dublă și trebuie să-ți stabilești o strategie de închidere din cât mai puține săgeți, preferabil două la scoruri de până în 110: Triplu 20 + Bull (50). Dacă nu nimerești cu prima săgeată tripla de 20 ci un 20 simplu, rămâi în 90, ceea ce înseamnă că poți închide cu Triplu 18 + Dublu 18. Și toate aceste gânduri trebuie să se întâmple în 5-6 secunde. Antrenamentul este cheia aritmeticii, dar concentrarea și calmul, coordonarea și atenția sunt elementele unui joc bun.

Studenții de la SIA (Sisteme Informaționale pentru Afaceri) au ani buni de experiență în lucrul cu calculatorul, dar logica lui IF-Then-Else nu este suficientă în timpul unui joc tensionat. Un moment amuzant s-a produs în finala dintre Adrian și Lucia. După ce Lucia a condus cu scorul de 3-1, Adian a egalat, iar în ultimul leg (joc) a ajuns la închidere și mai avea 14 puncte pentru 3 săgeți: a aruncat prima săgeată greșit în 13 încercând o aruncare de 4, în speranța să rămână în dublu 5. După ce a aruncat în 13 a rămas pe poziție întrebându-se ce dublă trebuie să arunce. Mirat a întrebat: Acum trebuie să arunc dubla de 1 nu? Smile I-am explicat frumos pentru că era în transă din cauza tensiunii: Ca să arunci la dubla de 1 trebuia să fi rămas în 2, nu? -Da. -Dar tu ai aruncat 13 din 14, fac 2? Răspunsul său mirat: Nu? Smile

Per ansamblu, chiar dacă au fost puțini studenți prezenți, contribuția conducerii clubului Iași Darts Club a asigurat o atmosferă destinsă și profesionistă, Florin Tănase, secretarul clubului, fiind ca de obicei cel mai bun coach ever, explicând clar și părintește regulile jocului, fără a lăsa nici un moment impresia de superioritate sau aroganța uneori întâlnită la jucătorii experimentați din toate domeniile.

Câștigătorul concursului, Adrian a primit ca premiu, pe lângă trofeu și diplomă, un set de săgeți profesionale din partea organizatorului, un board profesional Nodor din partea clubului Iași Darts Club. Lucia, locul 2 a primit diplomă și din partea organizatorului un set de săgeți profesionale Phil Taylor.

Cei doi semifinaliști au primit din partea clubului diplome și câte un set de săgeți profesionale din partea președintelui Federație de Darts din România, Dragos Dumitrescu și a site-ului de profil PlayDarts.ro, în valoare de peste 200 lei.

 

Cupa SIA - Iasi Darts Club

Fotografia de final a evenimentului cu finaliștii și organizatorii.

Detalii de la prima ediție găsiți în articolul: Cupa Studenţilor la Darts.

Mulțumesc tuturor participanților și organizatorilor și închei cu tradiționalul: „MERGI LA ŢINTĂ!”

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!

Blog la WordPress.com.

SUS ↑