Funzioni
Funzioni stringa
Quando si lavora con le stringhe nelle espressioni, è importante usare virgolette singole (’’) per racchiudere le stringhe letterali. Tuttavia, si presenta un’eccezione quando si vuole includere virgolette singole all’interno di una stringa letterale. In tal caso, puoi usare le virgolette doppie ("") per racchiudere l’intera stringa.
Per esempio:
- Corretto: if(${yesno} = 1, “una stringa con ‘virgolette singole’ al suo interno”, “nessuna virgoletta singola qui”)
- Errato: if(${yesno} = 1, ‘una stringa con ‘virgolette singole’ al suo interno’, ’nessuna virgoletta singola qui’)
Per quanto riguarda le smart quotes, è fondamentale essere consapevoli della loro presenza, poiché possono causare problemi nelle espressioni. Molti editor di testo formattato convertono automaticamente le virgolette diritte ("" o ‘’) in smart quotes o virgolette curve ("" o ‘’), che possono causare errori di sintassi o comportamenti imprevisti. Per evitare ciò, assicurati di usare sempre virgolette diritte (’’) nelle tue espressioni.
rtSurvey supporta varie funzioni, tra cui:
string(field): Converte un campo in una stringa.- Esempio:
string(34.8)verrà convertito in'34.8'.
- Esempio:
string-length(field): Restituisce la lunghezza di un campo stringa.- Esempio:
string-length(.) > 3 and string-length(.) < 10può essere usato per assicurarsi che il campo corrente abbia tra 3 e 10 caratteri.
- Esempio:
substr(fieldorstring, startindex, endindex): Restituisce una sottostringa che inizia astartindexe termina appena prima diendindex. Gli indici partono da 0 per il primo carattere nella stringa.- Esempio:
substr(${phone}, 0, 3)restituirà le prime tre cifre di un numero di telefono.
- Esempio:
concat(a, b, c, ...): Concatena campi (e/o stringhe) insieme.- Esempio:
concat(${firstname}, ' ', ${lastname})restituirà il nome completo combinando i valori nei campifirstnameelastname.
- Esempio:
linebreak(): Restituisce un carattere di interruzione di riga.- Esempio:
concat(${field1}, linebreak(), ${field2}, linebreak(), ${field3})restituirà un elenco di tre valori di campo con interruzioni di riga tra di essi.
- Esempio:
lower(): Converte una stringa in tutti caratteri minuscoli.- Esempio:
lower('Nome della Via')restituirà “nome della via”.
- Esempio:
upper(): Converte una stringa in tutti caratteri maiuscoli.- Esempio:
upper('Nome della Via')restituirà “NOME DELLA VIA”.
- Esempio:
Funzioni select_one e select_multiple
count-selected(field): Restituisce il numero di elementi selezionati in un campo select_multiple.- Esempio:
count-selected(.) = 3può essere usato come espressione di vincolo per assicurarsi che vengano selezionate esattamente tre scelte.
- Esempio:
selected(field, value): Restituisce true o false a seconda che il valore specificato sia stato selezionato nel campo select_one o select_multiple.- Esempio:
selected(${color}, 'Blue')può essere usato come espressione di rilevanza per mostrare un gruppo o un campo solo se il rispondente ha selezionato “Blue” come colore preferito. - Nota: Il secondo parametro deve sempre specificare il valore della scelta, non l’etichetta della scelta. Usa il valore dalla colonna value nel foglio choices della definizione del modulo.
- Esempio:
selected-at(field, number): Restituisce l’elemento selezionato alla posizione specificata in un campo select_multiple. Quando il numero passato è 0, restituisce il primo elemento selezionato; quando il numero è 1, restituisce il secondo elemento selezionato, e così via.- Esempio:
selected-at(${fruits}, 0) = 'Apple'può essere usato come espressione di rilevanza per mostrare un gruppo o un campo solo se la prima scelta selezionata è “Apple”. - Nota: Il valore restituito sarà il valore della scelta, non l’etichetta della scelta.
- Esempio:
choice-label(field, value): Restituisce l’etichetta per una scelta di un campo select_one o select_multiple, come definita nel foglio choices della definizione del modulo.- Esempio 1:
choice-label(${country}, ${country})restituirà l’etichetta della scelta per la scelta attualmente selezionata nel campo denominatocountry. - Esempio 2:
choice-label(${languages}, selected-at(${languages}, 0))restituirà l’etichetta per la prima scelta selezionata nel campo denominatolanguages. - Nota: Questa funzione recupera l’etichetta della scelta, non il valore.
- Esempio 1:
Funzioni per i campi ripetuti
In rtSurvey, se vuoi fare la stessa domanda più volte, puoi inserire un campo all’interno di un gruppo repeat. Questo genera più istanze dello stesso campo. Le seguenti funzioni possono aiutarti a gestire questi campi ripetuti e i dati ripetuti che producono.
join(string, repeatedfield): Per un campo all’interno di un gruppo repeat, genera una lista di valori separata da stringhe. Il primo parametro specifica il delimitatore da usare per separare i valori.- Esempio:
join(', ', ${member_name})genererà un singolo elenco separato da virgole da tutti i nomi inseriti.
- Esempio:
join-if(string, repeatedfield, expression): Funziona esattamente comejoin(), tranne che controlla ogni istanza nel gruppo repeat usando l’espressione fornita. Se l’espressione restituisce false, l’elemento verrà omesso dall’output.- Esempio:
join-if(', ', ${member_name}, ${age} >= 18)genererà un elenco separato da virgole dei nomi dei soli membri adulti (quelli con età 18 e più).
- Esempio:
count(repeatgroup): Restituisce il numero corrente di volte che un gruppo repeat si è ripetuto.- Esempio:
count(${groupname})restituirà il numero di istanze del gruppo.
- Esempio:
count-if(repeatgroup, expression): Funziona esattamente comecount(), tranne che controlla ogni istanza nel gruppo repeat usando l’espressione fornita. Se l’espressione restituisce false, l’elemento verrà omesso dall’output.- Esempio:
count-if(${members}, ${age} >= 18)restituirà il conteggio dei membri adulti basato sul campo age all’interno del gruppo repeat “members”.
- Esempio:
sum(repeatedfield): Per un campo all’interno di un gruppo repeat, calcola la somma di tutti i valori.- Esempio:
sum(${loan_amount})restituirà il valore totale di tutti i prestiti.
- Esempio:
sum-if(repeatedfield, expression): Funziona esattamente comesum(), tranne che controlla ogni istanza nel gruppo repeat usando l’espressione fornita. Se l’espressione restituisce false, l’elemento verrà omesso dall’output.- Esempio:
sum-if(${loan_amount}, ${loan_amount} > 500)restituirà il valore totale di tutti i prestiti superiori a 500. I prestiti più piccoli verranno ignorati.
- Esempio:
min(repeatedfield): Per un campo all’interno di un gruppo repeat, calcola il minimo di tutti i valori.- Esempio:
min(${member_age})restituirà l’età del membro più giovane del gruppo.
- Esempio:
min-if(repeatedfield, expression): Funziona esattamente comemin(), tranne che controlla ogni istanza nel gruppo repeat usando l’espressione fornita.- Esempio:
min-if(${member_age}, ${member_age} >= 18)restituirà l’età dell’adulto più giovane del gruppo. Quelli con meno di 18 anni verranno ignorati.
- Esempio:
max(repeatedfield): Per un campo all’interno di un gruppo repeat, calcola il massimo di tutti i valori.- Esempio:
max(${member_age})restituirà l’età del membro più anziano del gruppo.
- Esempio:
max-if(repeatedfield, expression): Funziona esattamente comemax(), tranne che controlla ogni istanza nel gruppo repeat usando l’espressione fornita.- Esempio:
max-if(${member_age}, ${member_age} >= 18)restituirà l’età dell’adulto più anziano del gruppo. Quelli con meno di 18 anni verranno ignorati.
- Esempio:
index(): Chiamata all’interno di un gruppo repeat, restituisce il numero di indice per il gruppo o l’istanza corrente.- Esempio:
index()usato all’interno di un gruppo repeat restituirà 1 per la prima istanza, 2 per la seconda, e così via.
- Esempio:
indexed-repeat(repeatedfield, repeatgroup, index): Fa riferimento a un campo o gruppo che si trova all’interno di un gruppo repeat dall’esterno di quel repeat. Il primo parametro specifica il campo o gruppo ripetuto di interesse, il secondo specifica il gruppo repeat all’interno del quale si trova il campo o gruppo, e il terzo specifica il numero di istanza all’interno del gruppo repeat da usare.- Esempio 1:
indexed-repeat(${name}, ${names}, 1)restituirà il primo nome disponibile quando il campo name si trova all’interno di un gruppo repeat precedente denominato “names”. - Esempio 2:
indexed-repeat(${name}, ${names}, index())recupererà il nome corrispondente al numero di istanza del gruppo repeat corrente.
- Esempio 1:
rank-index(index, repeatedfield): Questa funzione calcola il rango ordinale dell’istanza specificata di un campo ripetuto per l’uso al di fuori del gruppo repeat. Il rango 1 è assegnato all’istanza con il valore più alto, il rango 2 all’istanza con il valore successivo più alto, e così via. Se si passa un indice non valido o un indice a un’istanza con un valore non numerico, verrà restituito un rango di 999.- Esempio:
rank-index(1, ${random_draw})calcola il rango della prima istanza in base al valore del suo camporandom_drawrispetto ai valori delle altre istanze.
- Esempio:
rank-index-if(index, repeatedfield, expression): Questa funzione funziona in modo simile arank-index(), ma controlla ogni istanza nel gruppo repeat del campo ripetuto usando l’espressione fornita. Se l’espressione restituisce false, l’elemento verrà omesso dal calcolo.- Esempio:
rank-index-if(1, ${age}, ${age} >= 18)calcola il rango per età all’interno del gruppo degli adulti, considerando solo le istanze in cui l’età è maggiore o uguale a 18.
- Esempio:
Funzioni numeriche
| Operatore | Operazione | Esempio | Risposta di esempio |
|---|---|---|---|
+ | Addizione | 1 + 1 | 2 |
- | Sottrazione | 3 - 2 | 1 |
* | Moltiplicazione | 3 * 2 | 6 |
div | Divisione | 10 div 2 | 5 |
mod | Modulo | 9 mod 2 | 1 |
rtSurvey supporta funzioni numeriche, tra cui:
number(field): Converte il valore del campo in un numero.- Esempio:
number('34.8')= 34.8
- Esempio:
int(field): Converte il valore del campo in un intero.- Esempio:
int('39.2')= 39
- Esempio:
min(field1, ..., fieldx): Restituisce il valore minimo tra i campi passati.- Esempio:
min(${father_age}, ${mother_age})restituirà l’età del padre o della madre, a seconda di quale sia minore.
- Esempio:
max(field1, ..., fieldx): Restituisce il valore massimo tra i campi passati.- Esempio:
max(${father_age}, ${mother_age})restituirà l’età del padre o della madre, a seconda di quale sia maggiore.
- Esempio:
format-number(field): Formatta il valore di un campo intero o decimale secondo le impostazioni locali dell’utente.- Esempio:
format-number(${income})potrebbe formattare “120000” come “120.000”.
- Esempio:
round(field, digits): Arrotonda il valore numerico del campo al numero specificato di cifre dopo il punto decimale.- Esempio:
round(${interest_rate}, 2)
- Esempio:
abs(number): Restituisce il valore assoluto di un numero.pow(base, exponent): Restituisce il valore del primo parametro elevato alla potenza del secondo parametro.- Ogni parametro può essere un campo, un numero o un’espressione.
log10(fieldorvalue): Restituisce il logaritmo in base dieci del campo o valore passato.sin(fieldorvalue): Restituisce il seno del campo o valore passato, espresso in radianti.cos(fieldorvalue): Restituisce il coseno del campo o valore passato, espresso in radianti.tan(fieldorvalue): Restituisce la tangente del campo o valore passato, espresso in radianti.asin(fieldorvalue): Restituisce l’arcoseno del campo o valore passato, espresso in radianti.acos(fieldorvalue): Restituisce l’arcocoseno del campo o valore passato, espresso in radianti.atan(fieldorvalue): Restituisce l’arcotangente del campo o valore passato, espresso in radianti.atan2(x, y): Restituisce l’angolo in radianti sotteso all’origine dal punto con coordinate (x, y) e l’asse x positivo. Il risultato è nell’intervallo -pi() a pi().sqrt(fieldorvalue): Restituisce la radice quadrata non negativa del campo o valore passato.exp(x): Restituisce il valore di e^x.pi(): Restituisce il valore di pi greco.
Funzioni di data e ora
I valori data in rtSurvey sono memorizzati come stringhe nel formato YYYY-MM-DD. I valori datetime sono memorizzati come stringhe ISO 8601 (YYYY-MM-DDTHH:MM:SS). Usa decimal-date-time() per convertire in un numero per l’aritmetica (ad esempio, calcolare durate).
today(): Restituisce la data odierna come stringa nel formatoYYYY-MM-DD. Valutata una volta quando il modulo si apre.- Esempio:
today()→'2024-03-15' - Uso comune: colonna
defaultper pre-compilare la data odierna, o inrelevant/constraintper confrontare con un campo data.
- Esempio:
now(): Restituisce la data e l’ora correnti come stringa ISO 8601. Valutata ogni volta che l’espressione viene calcolata.- Esempio:
now()→'2024-03-15T14:32:00.000+03:00' - Uso comune: Registrare il timestamp esatto di un evento specifico durante il sondaggio.
- Esempio:
date(value): Converte un valore (stringa o numero) in una stringa data. Utile per convertire valori calcolati in un tipo data.- Esempio:
date('2024-03-15')→'2024-03-15'
- Esempio:
date-time(value): Converte un valore in una stringa datetime.- Esempio:
date-time(${event_timestamp})
- Esempio:
decimal-date-time(value): Converte una stringa data o datetime in un numero decimale che rappresenta i millisecondi dall’epoca Unix divisi per 86400000 (cioè, giorni frazionari dal 1970-01-01). Usalo per eseguire operazioni aritmetiche sulle date.- Esempio: Durata in giorni tra due date:
decimal-date-time(${end_date}) - decimal-date-time(${start_date}) - Esempio: Durata in minuti tra due datetime:
(decimal-date-time(${end_time}) - decimal-date-time(${start_time})) * 1440
- Esempio: Durata in giorni tra due date:
format-date(date, format): Formatta un valore data usando una stringa di pattern.- Token di formato:
%Y(anno a 4 cifre),%y(anno a 2 cifre),%m(mese 01–12),%d(giorno 01–31),%a(giorno della settimana abbreviato),%b(nome del mese abbreviato) - Esempio:
format-date(today(), '%d/%m/%Y')→'15/03/2024'
- Token di formato:
format-date-time(datetime, format): Formatta un valore datetime usando una stringa di pattern. Accetta tutti i token diformat-datepiù:%H(ora 00–23),%h(ora 01–12),%M(minuti 00–59),%S(secondi 00–59),%3(millisecondi),%P(AM/PM)- Esempio:
format-date-time(now(), '%d/%m/%Y %H:%M')→'15/03/2024 14:32'
Funzioni booleane
boolean(value): Converte qualsiasi valore in un booleano. Restituiscetrueper stringhe non vuote, numeri diversi da zero etrue; restituiscefalseper stringhe vuote,0efalse.- Esempio:
boolean(${name})restituiscetruesenamenon è vuoto.
- Esempio:
boolean-from-string(string): Restituiscetruese la stringa è'1'o'true'(non sensibile alle maiuscole); restituiscefalsealtrimenti.- Esempio:
boolean-from-string(${enabled_flag})— utile quando un campo memorizza'true'/'false'come testo.
- Esempio:
true(): Restituisce il valore booleanotrue.- Esempio: Nella colonna
required,true()è equivalente ayes.
- Esempio: Nella colonna
false(): Restituisce il valore booleanofalse.- Esempio:
if(${skip_section} = 'yes', false(), true())— imposta dinamicamente il campo come obbligatorio.
- Esempio:
not(expression): Restituisce la negazione logica dell’espressione. Restituiscetruese l’espressione è falsa, e viceversa.- Esempio:
not(${consent} = 'yes')— mostra un avviso quando il consenso NON è stato dato. - Esempio:
not(selected(${issues}, 'none'))— richiede dettagli solo se “nessuno” non è stato selezionato.
- Esempio:
Funzioni stringa aggiuntive
starts-with(string, prefix): Restituiscetruesestringinizia conprefix.- Esempio:
starts-with(${phone}, '+254')controlla se il numero di telefono inizia con il prefisso del Kenya.
- Esempio:
contains(string, substring): Restituiscetruesestringcontienesubstring.- Esempio:
contains(${email}, '@')controlla che un indirizzo email abbia un segno@. - Esempio:
contains(${notes}, 'urgente')attiva una domanda di follow-up se le note menzionano “urgente”.
- Esempio:
substring-before(string, needle): Restituisce la parte distringche appare prima della prima occorrenza dineedle.- Esempio:
substring-before(${full_name}, ' ')estrae la prima parola (nome).
- Esempio:
substring-after(string, needle): Restituisce la parte distringche appare dopo la prima occorrenza dineedle.- Esempio:
substring-after(${email}, '@')estrae la parte del dominio di un indirizzo email.
- Esempio:
normalize-space(string): Rimuove gli spazi iniziali e finali e riduce tutte le sequenze di spazi interni a un singolo spazio.- Esempio:
normalize-space(${name})— pulisce un nome che potrebbe essere stato digitato con spazi extra.
- Esempio:
translate(string, search_chars, replace_chars): Sostituisce ogni carattere instringche appare insearch_charscon il carattere corrispondente inreplace_chars. I caratteri insearch_charssenza carattere corrispondente inreplace_charsvengono eliminati.- Esempio:
translate(${phone}, ' -()', '')rimuove spazi, trattini e parentesi da un numero di telefono.
- Esempio:
Funzioni matematiche aggiuntive
floor(number): Restituisce il più grande intero minore o uguale anumber(arrotonda verso meno infinito).- Esempio:
floor(4.9)= 4,floor(-2.1)= -3
- Esempio:
ceiling(number): Restituisce il più piccolo intero maggiore o uguale anumber(arrotonda verso più infinito).- Esempio:
ceiling(4.1)= 5,ceiling(-2.9)= -2
- Esempio:
random(): Restituisce un numero decimale casuale tra 0.0 (incluso) e 1.0 (escluso). Tipicamente usato nei campicalculateper assegnare valori casuali o randomizzare l’ordine delle domande.- Esempio:
random()→ es.0.7341 - Esempio:
int(random() * 6) + 1→ numero casuale 1–6 (lancio del dado)
- Esempio:
coalesce(a, b): Restituisceaseanon è vuoto; altrimenti restituisceb. Utile come fallback quando un campo potrebbe essere vuoto.- Esempio:
coalesce(${preferred_name}, ${full_name})— usa il nome preferito se impostato, altrimenti ricorre al nome completo.
- Esempio:
once(value): Valutavaluee lo memorizza, ma solo se il campo corrente è vuoto. Se il campo ha già un valore (ad esempio, è stato impostato in precedenza),once()restituisce il valore esistente invariato. Questo impedisce al ricalcolo di sovrascrivere l’input dell’utente.- Esempio:
once(today())nella colonnadefaultimposta la data odierna una volta e non si aggiorna se l’enumeratore riapre il modulo. - Esempio:
once(uuid())genera un UUID una volta e lo mantiene stabile tra le modifiche successive.
- Esempio:
Funzioni geografiche
area(geoshape_value): Calcola l’area in metri quadrati racchiusa da un valore geoshape (poligono).- Il parametro è un valore di campo geoshape nel formato
lat1 lon1 0 0; lat2 lon2 0 0; ... - Esempio:
area(${field_boundary})— calcola l’area di un campo rilevato in m². - Esempio:
round(area(${field_boundary}) div 10000, 2)— converti in ettari.
- Il parametro è un valore di campo geoshape nel formato
distance(coordinates): Calcola la lunghezza totale del percorso in metri di un geotrace (linea), o la distanza tra due geopoint.- Per un geotrace:
distance(${route})restituisce la lunghezza totale del percorso in metri. - Per due geopoint:
distance(concat(${point_a}, ' ', ${point_b}))restituisce la distanza tra loro. - Esempio:
round(distance(${road_trace}) div 1000, 3)— lunghezza della strada in chilometri.
- Per un geotrace:
Funzioni di validazione
regex(value, pattern): Restituiscetruesevaluecorrisponde all’espressione regolarepattern. Usalo nella colonnaconstraintper la validazione basata su pattern.- Il pattern usa la sintassi regex standard (sottoinsieme POSIX ERE).
- Esempio:
regex(., '^[0-9]{10}$')— valida un numero a 10 cifre. - Esempio:
regex(., '^[A-Z]{2}[0-9]{6}$')— valida il formato di un numero di passaporto (2 lettere maiuscole seguite da 6 cifre). - Esempio:
regex(., '^[^@]+@[^@]+\.[^@]{2,}$')— verifica di base del formato email.
checklist(min, max, v1, v2, ...): Valuta un elenco di espressioni booleane e restituiscetruese il numero di valoritrueè compreso traminemax(inclusi). Passa-1perminomaxper saltare quel limite.- Esempio:
checklist(2, 3, ${q1} = 'yes', ${q2} = 'yes', ${q3} = 'yes')— passa se esattamente 2 o 3 delle tre condizioni sono vere.
- Esempio:
weighted-checklist(min, max, v1, w1, v2, w2, ...): Comechecklist(), ma ogni valore ha un peso. La somma dei pesi per i valoritruedeve essere compresa traminemax.- Esempio:
weighted-checklist(10, -1, ${has_toilet}, 4, ${has_sink}, 3, ${has_shower}, 5)— la somma dei pesi delle strutture presenti deve essere almeno 10.
- Esempio:
Funzioni di utilità
uuid(): Genera un UUID casuale (formato RFC 4122 v4) come stringa.- Esempio:
uuid()→'a3f8b2c1-4d5e-6f7a-8b9c-0d1e2f3a4b5c' - Tipicamente usato con
once()per generare un ID univoco stabile:once(uuid())
- Esempio:
version(): Restituisce il valore dell’attributoversiondel modulo come impostato nel foglio settings.- Esempio:
version()→'3.1' - Utile nei campi
calculateper incorporare la versione del modulo nei dati esportati.
- Esempio:
position(): Chiamata all’interno di un gruppo repeat, restituisce l’indice a base 1 dell’istanza corrente del repeat.- Esempio:
position()nella prima istanza restituisce1, nella seconda restituisce2, e così via. - Vedi anche:
index()(alias),indexed-repeat()per fare riferimento ai valori del repeat dall’esterno del gruppo.
- Esempio:
thousandsep(length, separator, value): Formatta un numero con un separatore delle migliaia.lengthè la lunghezza minima totale della stringa (riempita con spazi se più corta),separatorè il carattere da usare (ad esempio,','), evalueè il numero da formattare.- Esempio:
thousandsep(0, ',', 1234567)→'1,234,567' - Esempio:
thousandsep(0, '.', ${income})→ formatta il reddito con il punto come separatore delle migliaia.
- Esempio:
substr-jsonpath(value, jsonpath): Estrae una sottostringa da una stringa JSON usando un’espressione JSONPath.- Esempio:
substr-jsonpath(${api_response}, '$.data.name')— estrae il camponameda una stringa JSON memorizzata inapi_response. - Tipicamente usato insieme a
callapi()per estrarre valori specifici dalle risposte API.
- Esempio: