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!

Anunțuri

Un gând despre “IF-THEN-ELSE in xPath

  1. Pingback: Calculating Time Difference in InfoPath Form | Valy Greavu's Live Blog

Lasă un răspuns

Completează mai jos detaliile tale sau dă clic pe un icon pentru a te autentifica:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s