ExpressionScript - Apresentação
From LimeSurvey Manual
Introdução
O LimeSurvey utiliza o Script de expressão, que permite ao LimeSurvey suportar ramificações, avaliações, validações e personalizações mais complexas. Substitui a forma como o LimeSurvey gere as substituições, as Condições e as avaliações no back-end. Acelera também consideravelmente o processamento, uma vez que elimina a maioria das leituras da base de dados em tempo de execução. O Script de expressão foi desenvolvido pelo Dr. Thomas White (TMSWhite).
Definições principais
- Expressão: Qualquer conteúdo delimitado por chavetas:
- Desde que não exista espaço em branco imediatamente após a chaveta de abertura ou antes da chaveta de fecho.
- O conteúdo da expressão é avaliado pelo EM, pelo que pode conter fórmulas matemáticas, funções e processamento complexo de cadeias de caracteres e de datas.
- Personalização: Por vezes designada por "piping". É o processo de modificar texto de forma condicional:
- Tem acesso a todos os 'campos de substituição', aos dados do participante e aos dados das respostas.
- Tem também acesso mais fácil às perguntas, às respostas e às respetivas propriedades.
- Equação de relevância: Um novo atributo da pergunta que controla a visibilidade da pergunta:
- Se existir uma equação de relevância, a pergunta só é apresentada se a relevância for avaliada como verdadeira.
- Internamente, todos os comandos array_filter e array_filter_exclude passam a ser relevância ao nível da pergunta secundária.
- SGQA (como as variáveis eram nomeadas no passado):
- Significa Survey-Group-Question-Answer (inquérito-grupo-pergunta-resposta)
- Os nomes das variáveis SGQA têm o aspeto 123X5X382X971 e podem ter sufixos de perguntas secundárias.
- Estes nomes de variáveis são específicos dos códigos S/Q/G/A da base de dados subjacente, pelo que muitas vezes têm de ser alterados
- Equação Tipo de pergunta: Um novo tipo de pergunta que guarda cálculos ou relatórios na base de dados:
- É como uma pergunta Boilerplate, mas o seu conteúdo é guardado na base de dados mesmo que defina "Ocultar sempre esta pergunta".
- Códigos das perguntas: Este é o nome de variável preferido para o EM:
- Pode ser um nome descritivo que indique o objetivo da pergunta, facilitando a leitura de lógica complexa.
- Os códigos das perguntas válidos NÃO devem começar por um número, pelo que, ao usar o código da pergunta para numerar as suas perguntas, utilize simplesmente "q1", "q1a" ou "g1q2".
- Este é o nome que passa a ser a variável se exportar dados para SPSS ou R. Assim, se efetuar análise estatística, só deve criar códigos das perguntas únicos.
Tenho de utilizar o Script de expressão?
A resposta curta é "não". No entanto, depende muito da complexidade do inquérito que pretende criar.
Por exemplo, o editor de condições abrange algumas expressões básicas que podem ser aplicadas às perguntas do seu inquérito. No entanto, o editor de condições é limitado. É por isso que se utiliza o Script de expressão - amplia o âmbito das possibilidades de personalização.
Posso combinar Condições e Equações de relevância?
Sim. Pode utilizar o editor de condições em algumas perguntas e equações de relevância noutras.
Não pode ter condições e expressões configuradas na mesma pergunta! Depois de configurada uma condição, esta substitui qualquer expressão escrita no campo da equação de relevância. Além disso, o campo Equação de relevância deixa de poder ser editado manualmente.
No entanto, existe uma forma de utilizar expressões e condições na mesma pergunta. Como mencionado acima, uma condição substitui o campo da equação de relevância. Depois de feito, verifique qual é a equação recém-criada e copie-a para um editor de texto. Elimine a condição recém-criada no editor de condições e, em seguida, edite a pergunta adicionando as expressões baseadas em condições do seu ficheiro do editor de texto, juntamente com as restantes expressões que pretende utilizar.
Como devo escolher entre Condições e Relevância?
Eis uma lista das vantagens e desvantagens de cada estilo:
| Estilo | Vantagens | Desvantagens |
|---|---|---|
| Condições | 1. Boa interface gráfica para criar condições simples. 2. Interface gráfica bem documentada e compreendida pela equipa de suporte |
1. Só suporta comparações simples e não lida bem com condições "E" e "OU". 2. As condições em cascata funcionam de forma irregular 3. Lento - utiliza intensivamente a base de dados - pode tornar inquéritos longos mais lentos. 4. Alguns problemas reportados ao recarregar condições. 5. A interface gráfica não escala bem quando existem dezenas, centenas ou milhares de perguntas. 6. Pode ser lento converter inquéritos em papel, pois tem de utilizar nomes SGQA. 7. Muitas vezes é necessário um programador para codificar a lógica necessária para ramificações complexas. |
| Relevância | 1. Suporta lógica muito complexa, incluindo mais de 80 funções e operadores matemáticos/de cadeias de caracteres. 2. Suporte perfeito para lógica em cascata. 3. Rápido - sem chamadas adicionais à base de dados, suportando inquéritos com mais de 1000 perguntas. 4. Sem problemas ao recarregar a lógica, pois não requer códigos SGQA. 5. O destaque de sintaxe escala para inquéritos com mais de 1000 perguntas. 6. Fácil e rápido de utilizar para grupos que pretendem informatizar inquéritos existentes em papel. 7. Suporta facilmente entrevistas semiestruturadas e inquéritos epidemiológicos sem necessidade de um programador. |
1. Sem interface gráfica para condições simples - utiliza, em vez disso, o destaque de sintaxe. |
- Recomendamos que utilize a opção que melhor se adapte às suas necessidades.
- Para uma explicação mais detalhada das funcionalidades do EM, clique na seguinte hiperligação.
Primeiros passos
A melhor forma de começar a utilizar o EM é:
- Instalar a versão estável mais recente a partir de https://www.limesurvey.org/en/download.
- Importar e explorar alguns inquéritos de exemplo.
- Explorar os casos de utilização e guias práticos e os exemplos passo a passo.
- Explorar a documentação do EM (esta página)
- Testes unitários de expressões isoladas (avançado)
- mostra exemplos de utilização de todas as funções e operadores do EM, bem como os resultados em PHP e JavaScript;
- tenha em atenção que há poucas funções que geram resultados diferentes nas versões PHP e JavaScript, pelo que esta página permite-lhe planear a lógica do EM em conformidade.
- Testes unitários de expressões isoladas (avançado)
Terminologia
Estas palavras são normalmente utilizadas para descrever as capacidades do EM:
- Ramificação baseada na relevância - se uma pergunta for relevante, é apresentada; caso contrário, não (por exemplo, torna-se invisível e é marcada como NULL na base de dados). Pode encontrar os campos de relevância no painel do editor de perguntas, bem como no painel do editor de grupos de perguntas. Este último é utilizado para aplicar um conjunto de condições a um grupo inteiro sem ter de copiar a mesma condição para cada pergunta, e/ou combinar lógica condicional ao nível do grupo e da pergunta.
- Personalização - Depois de saber quais as perguntas que devem ser colocadas, a personalização (por vezes designada por piping) especifica como a pergunta deve ser colocada. Isto permite suportar não só a substituição simples (como {TOKEN:FIRSTNAME}), mas também a conjugação de verbos e a declinação de substantivos com base no género ou número dos seus sujeitos. Permite também alterar a mensagem que transmite a um inquirido com base no facto de este ter respondido (ou na forma como respondeu) a outras perguntas.
- Equações - O EM adiciona um novo tipo de pergunta denominado Equação, que armazena o resultado de uma expressão. Os resultados das equações são calculados e gravados na base de dados, mesmo que os oculte na página. Assim, são utilizados para cálculos de pontuação ocultos, navegação baseada em equações complexas, avaliações e relatórios que serão gerados e armazenados na base de dados.
Relevância e relevância em cascata
Todos os tipos de pergunta têm agora uma opção de relevância que controla se a pergunta é apresentada ou não. O EM processa cada equação de relevância pela ordem em que aparecem no inquérito. Se a expressão for verdadeira (ou estiver em falta - para suportar inquéritos antigos), a pergunta será apresentada. Se não for relevante, a pergunta será ocultada e o valor será colocado a NULL na base de dados. Se não existirem perguntas relevantes num grupo, o grupo inteiro será ignorado.
Além disso, se alguma das variáveis de uma expressão for irrelevante, a expressão é sempre avaliada como falsa. Isto permite a relevância em cascata, para que não tenha de escrever equações de relevância muito longas para cada pergunta.
Suponha que tem cinco perguntas Q1-Q5 e só pretende mostrar a Q2 se a Q1 tiver sido respondida, a Q3 se a Q2 tiver sido respondida, etc. As equações de relevância poderiam ser:
| Códigos das perguntas | Relevância | Pergunta |
|---|---|---|
| Q1 | 1 | Qual é o seu nome? |
| Q2 | Q1 | {Q1}, que idade tem? |
| Q3 | Q2 | Então, tem {Q2} anos. É casado(a)? |
| Q4 | Q3 == "Y" | {Q1}, há quanto tempo é casado(a)? |
| Q5 | Q4 | Quantos filhos tem, {Q1}? |
Relevância ao nível do grupo
O ExpressionScript também suporta relevância ao nível do grupo. Isto facilita a implementação de ciclos. Suponha que pretende recolher informações sobre até 10 entidades (como produtos ou pessoas de um agregado familiar), em que primeiro determina quantas entidades necessitam de seguimento (por exemplo, perguntando quantas pessoas vivem num agregado familiar ou pedindo às pessoas que assinalem quais os produtos de que gostam numa lista longa). Depois de saber quantas entidades necessitam de seguimento, pode utilizar relevância ao nível do grupo como {count >= 1}, {count >=2}, ... {count >= 10} para cada um dos 10 grupos de perguntas de seguimento. Dentro de cada grupo, pode ter lógica condicional ao nível da pergunta (por exemplo, perguntas de seguimento específicas por género ou idade para cada sujeito). As equações de relevância ao nível da pergunta e do grupo são combinadas com E (AND) para determinar quais devem ser mostradas.
Para consultar um exemplo deste tipo, importe o seguinte inquérito: exemplo de inquérito de recenseamento.
Na captura de ecrã abaixo, pode observar-se que o grupo Person 1 é apresentado (ou relevante) se o inquirido viver com, pelo menos, outro coabitante:

Personalização/Piping
Tudo o que estiver entre chavetas é agora tratado como uma Expressão (com uma exceção descrita abaixo). As expressões têm acesso a todos os LimeReplacementFields e variáveis (através de vários aliases), a todos os operadores de equação habituais (matemáticos, lógicos e de comparação) e a dezenas de funções (que funcionam até dinamicamente do lado do cliente).
Ao utilizar estas equações, pode fazer coisas como:
- Mostrar condicionalmente mensagens personalizadas aos participantes com base em respostas anteriores;
- Criar avaliações e mostrar os resultados das avaliações (ou ramificar condicionalmente ou mostrar mensagens) com base nesses resultados, tudo sem utilizar o próprio módulo de avaliações;
- Conjugar verbos e flexionar substantivos nas perguntas, respostas e relatórios;
- Mostrar resumos das respostas antes da página "Mostrar as suas respostas" no final do inquérito.
Equações
Existe um novo tipo de pergunta chamado Equação. Pense nele como um tipo de pergunta Texto, exceto que armazena na base de dados o valor do que é apresentado. Assim, se o texto da pergunta Equação contiver um cálculo de avaliação, esse valor seria armazenado na base de dados numa variável que pode ser apresentada nas estatísticas públicas ou privadas.
Sintaxe
Tudo o que estiver contido entre chavetas é agora considerado uma Expressão (com uma exceção: não pode haver espaços em branco no início nem no fim - isto é necessário para garantir que o ExpressionScript não tenta processar JavaScript incorporado).
Note que as expressões podem ocupar várias linhas, desde que não haja espaços em branco depois da chaveta de abertura nem antes da chaveta de fecho. Isto é especialmente útil para instruções "if()" aninhadas como esta:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Very Soft',
if(PFTotals >= -3 && PFTotals <= -2,
'Soft',
if(PFTotals == -1,
'Somewhat Soft',
if(PFTotals == 0,
'Moderate',
if(PFTotals == 1,
'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
'Very Hard',
''
)
)
)
)
)
)
)
)}
O ExpressionScript suporta a seguinte sintaxe:
- Todos os operadores matemáticos padrão (p. ex. +,-,*,/,!);
- Todos os operadores de comparação padrão (p. ex. <,<=,==,!=,>,>=, mais os seus equivalentes: lt, le, eq, ne, gt, ge);
- Parênteses (para poder agrupar subexpressões);
- Operadores condicionais (p. ex. &&,| | e os seus equivalentes: and, or);
- Cadeias de caracteres entre aspas simples e duplas (cada uma pode incorporar cadeias com o outro tipo de aspas);
- Operador vírgula (para poder ter uma lista de expressões e devolver apenas o resultado final);
- Operador de atribuição (=);
- Variáveis predefinidas (para se referir a perguntas, atributos da pergunta e respostas) - p. ex., os códigos SGQA;
- Funções predefinidas (já existem mais de 80 e é fácil adicionar mais).
Operadores
A sintaxe do EM segue a precedência normal dos operadores:
| Nível | Operador(es) | Descrição |
|---|---|---|
| 1 | () | parênteses para agrupar ou chamar funções |
| 2 | ! - + | operadores unários: não, negação, mais unário |
| 3 | * / | multiplicação, divisão |
| 4 | + - | adição, subtração |
| 5 | < <= > >= lt le gt ge | comparações relativas |
| 6 | == != eq ne | comparações de igualdade |
| 7 | and | AND lógico |
| 8 | or | OR lógico |
| 9 | = | operador de atribuição |
| 10 | , | operador vírgula |
Aviso sobre incompatibilidade entre número e cadeia de caracteres e comparação alfabética/numérica
Quando quiser comparar valores com comparações relativas ou de igualdade, preste atenção às incompatibilidades. Um valor introduzido pelo utilizador (ou fornecido através de um código de resposta) pode ser usado como número se for claramente um número.
Se colocar um dos valores entre ", será feita uma comparação de texto/cadeia de caracteres. Se quiser comparar como número, nunca coloque um número entre ".
Por exemplo, Q0.NAOK > "50" é verdadeiro se Q0.NAOK for uma pergunta numérica com o valor 9. Isto acontece porque o operador > assume que se trata de uma comparação alfabética e não de uma comparação numérica.
Para garantir que compara valores inteiros, pode utilizar intval(Q0.NAOK) > 50. Lembre-se apenas de que, se Q0.NAOK não for um número (vazio ou uma cadeia de caracteres), então intval(Q0.NAOK) === 0. Para comparar cadeias de caracteres ("A" < "B") utilize diretamente strcmp : strcmp(Q0.NAOK,"B") ou strcmp(Q0.NAOK,"A5").
Cuidado ao utilizar o operador de atribuição (=)
Deve evitar utilizar os operadores de atribuição, a menos que seja absolutamente necessário, pois podem causar efeitos secundários inesperados. Por exemplo, se alterar o valor de uma resposta anterior, a relevância em cascata e a lógica de validação entre essa pergunta e a pergunta atual não são recalculadas, pelo que poderá acabar com dados internamente inconsistentes (p. ex., perguntas que permanecem respondidas mas deveriam ter sido anuladas (NULL), ou perguntas que são ignoradas mas deveriam ter sido respondidas). Em geral, se quiser atribuir um valor a uma variável, deve criar uma pergunta do tipo Equação e utilizar uma expressão para definir o seu valor. No entanto, há raras ocasiões em que as pessoas precisam mesmo deste operador, por isso disponibilizámo-lo.
Para o alertar sobre este operador, ele é apresentado a vermelho nas equações de sintaxe (para que não o confunda com "==").
Utilizar o operador de atribuição
As principais razões pelas quais pode querer utilizar o operador de atribuição são:
- Precisa de definir o valor por defeito através de uma equação para uma pergunta que não aceita valores por defeito (como a lista de botões de opção, em que a interface permite escolher uma das opções de resposta, mas não permite introduzir uma equação). No entanto, tenha cuidado, pois o LimeSurvey não conseguirá validar se a sua equação gera uma das respostas permitidas para essa pergunta;
- Precisa de alterar forçosamente a resposta a uma pergunta anterior com base numa resposta posterior;
- etc...
Pode utilizar todo o sistema do gestor de expressões para este fim. É preferível utilizar uma Equação para este fim.
Alguns exemplos:
- Definir a resposta a uma pergunta de texto curto em minúsculas :
{QCODE=strtolower(QCODE.NAOK)}; - Definir uma resposta por defeito para uma pergunta do tipo tabela no início de um inquérito :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Definir uma resposta por defeito para uma pergunta do tipo tabela de textos no início de um inquérito :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Definir uma resposta com condição :
{QCODE=if(YesNo="Y","A1","")}.
Segurança XSS
Com o XSS ativado, algumas partes do sistema do gestor de expressões não podem ser utilizadas:
- iniciar uma tag HTML numa expressão mas terminá-la noutra expressão;
- utilizar uma expressão complexa dentro de um URL.
Exemplos e soluções alternativas:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}não funciona com a segurança XSS; neste caso, pode utilizar{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, neste caso, pode utilizar uma pergunta de equação, porque utilizar um código de pergunta completo é permitido:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Acesso às variáveis
O ExpressionScript fornece acesso apenas de leitura a todas as variáveis de que possa necessitar. Por compatibilidade com versões anteriores, permite aceder ao seguinte:
- TOKEN:xxx - o valor de um código (token) (p. ex., TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (apenas para inquéritos não anónimos).
- Todos os valores {XXX} utilizados pelos temas.
- No texto da pergunta, pode utilizar {QID}, substituído pelo identificador da pergunta, e {SGQ}, substituído pelo SGQA da pergunta.
- {SAVEDID} para o ID da resposta atual
Além disso, o ExpressionScript permite referir variáveis através do código da pergunta (a coluna 'title' da tabela de perguntas na base de dados). Esta é também a etiqueta da variável utilizada quando exporta os seus dados para SPSS, R ou SAS. Por exemplo, se tiver perguntas sobre nome, idade e sexo, pode chamar a essas variáveis nome, idade e sexo em vez de 12345X13X22, 12345X13X23 e 12345X13X24. Isto torna as equações mais fáceis de ler e de validar por todos, além de permitir reordenar as perguntas sem ter de acompanhar os números dos grupos ou das perguntas.
Importante: É mais seguro referir variáveis que ocorrem em páginas ou perguntas anteriores.
Além disso, o ExpressionScript permite aceder a muitas propriedades da pergunta:
| Sintaxe | Significado | Exemplo | Resultado do exemplo |
|---|---|---|---|
| Qcode | um alias para Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | o código de resposta selecionado para a pergunta, se esta for relevante (caso contrário, vazio), ou o valor de texto se não for uma pergunta com códigos | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | igual a Qcode - consulte a explicação sobre NAOK | {gender.NAOK} | 'M' |
| Qcode.value | o valor da avaliação para a pergunta, se esta for relevante (caso contrário, vazio), ou o valor de texto se não for uma pergunta com códigos | {gender.value} | '1' |
| Qcode.valueNAOK | igual a Qcode.value - consulte a explicação sobre NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | o valor apresentado da pergunta | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | o texto da pergunta | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | se a pergunta é obrigatória (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | o número interno da pergunta (não o número sequencial) | {gender.qid} | 337 |
| Qcode.type | o tipo de pergunta | {gender.type} | 'G' |
| Qcode.jsName | o nome javascript correto da pergunta, independentemente de estar declarada ou não nesta página | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | o número interno do grupo (não o número sequencial) | {gender.gid} | 3 |
| Qcode.qseq | o número sequencial da pergunta, começando em 0 | {gender.qseq} | 5 |
| Qcode.gseq | o número sequencial do grupo, começando em 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | se a pergunta é atualmente relevante (0 ou 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | a equação de relevância ao nível da pergunta | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | a equação de relevância ao nível do grupo | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | o valor SGQA desta pergunta | {gender.sgqa} | '1827X3X337' |
Problema com o Editor HTML
Se utilizar o Editor HTML, alguns caracteres são substituídos por entidades HTML.
- & por &
- < por <
- > por >
Se utilizar o Editor HTML, tem de usar:
- and para &
- lt para <
- le para <=
- gt para >
- ge para >=
Recomenda-se que limpe a sua expressão do HTML que nela apareça. Se utilizar o Editor HTML do LimeSurvey, clique no botão "Source" (localizado na parte superior esquerda do editor) e elimine todos os caracteres que não estejam relacionados com a sua expressão (p. ex.,
,
, etc.).
Nomenclatura das variáveis Qcode
Seguem-se os detalhes de como construir um Qcode (e aceder a algumas propriedades) por tipo de pergunta. Em geral, os Qcodes são construídos assim:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Para comment e other, os códigos de pergunta correspondentes são QuestionCode_comment e QuestionCode_other, respetivamente.
| Tipo | Descrição | Código | Perguntas secundárias | Opções de resposta | Escalas | Código da resposta | Resposta apresentada | Relevância |
|---|---|---|---|---|---|---|---|---|
| 5 | Escolher entre 5 Pontos (botões de opção) | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Matriz (Escolher entre 10 Pontos) (botões de opção) | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Matriz (Escolher entre 5 Pontos) (botões de opção) | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Matriz (Etiquetas flexíveis) de escala dupla | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Matriz (Flexível) - Formato de coluna | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Matriz (Flexível) - Formato de linha | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Matriz (Aumentar/Manter/Reduzir) (botões de opção) | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Matriz (Multi flexível) de 1 a 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Matriz (Multi flexível) de texto | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Matriz (Sim/Incerto/Não) (botões de opção) | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Pergunta de texto fixo (Boilerplate) | Q11 | {Q11.shown} | |||||
| D | Data | Q12 | {Q12} | {Q12.shown} | ||||
| * | Equação | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Submissão de ficheiro (regista o número de ficheiros carregados) | Q14 | {Q14} | {Q14>0} | ||||
| G | Lista de seleção (Drop-down) de sexo | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Texto livre muito longo | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Pergunta de idioma | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Lista - Lista de seleção (Drop-down) | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Lista de seleção (Drop-down)/Lista de botões de opção | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Lista com comentário - Lista de seleção (Drop-down)/Lista de botões de opção + Área de texto | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Texto livre longo | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Escolha múltipla (caixas de seleção) | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Escolha múltipla com comentários (caixas de seleção + texto) | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Pergunta numérica múltipla | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Textos curtos múltiplos | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Tipo de pergunta numérica | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Estilo de classificação (ordenação) | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Texto livre curto | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Sim/Não (botões de opção) | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Utilização de NAOK
NAOK --> "Not Applicable" (NA) is alright (OK), ou seja, "Não aplicável" é aceitável
Utilizar NAOK significa que todas ou algumas das variáveis são irrelevantes (ou seja, "Não aplicável" (NA) é aceitável (OK)).
Por exemplo: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) devolve sempre uma cadeia de caracteres vazia se uma pergunta secundária de Q1 estiver filtrada. Para contar o número de perguntas secundárias selecionadas numa pergunta deste tipo, pode utilizar count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Se a pergunta secundária estiver oculta, o EM devolve uma cadeia de caracteres vazia.
Sem NAOK, se uma pergunta ou uma pergunta secundária estiver oculta, o EM devolve sempre uma cadeia de caracteres vazia (equivalente a devolver falso).
O .shown utiliza sempre o sistema NAOK (cadeia de caracteres vazia se estiver oculto), mas se precisar do código da resposta, é sempre boa ideia adicionar .NAOK a seguir ao código da pergunta (exceto se precisar disso e souber o que está a fazer).
Encontra mais informação na subsecção Substituição das condições em cascata.
As variáveis reservadas "this", "self" e "that"
Muitas vezes, pretende avaliar todas as partes de uma pergunta, como contar quantas perguntas secundárias foram respondidas ou somar as pontuações. Noutras ocasiões, pretende processar apenas determinadas linhas ou colunas de uma pergunta (como obter as somas das linhas ou das colunas e guardá-las na base de dados). Estas variáveis reservadas tornam esse processo relativamente simples.
Variável "This"
A variável "this" é utilizada exclusivamente nas opções "Validação da equação da pergunta" e "Validação da equação da pergunta secundária" (esta última não é possível a partir da interface gráfica). Expande-se para os nomes das variáveis de cada uma das células dessas perguntas. Assim, se quiser garantir que cada entrada é maior do que três, defina a "Validação da equação da pergunta secundária" como (this > 3).
Variável "Self"
As variáveis "self" e "that" são mais poderosas e funcionam como macros que são expandidas antes do processamento das equações. As opções de sintaxe para a variável "self" são:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffix é qualquer um dos sufixos normais de qcode (p. ex., NAOK, value, shown)
- sub-selector pode ser um dos seguintes:
- comments - apenas perguntas secundárias que são comentários (p. ex., Escolha múltipla com comentários e Lista com comentário);
- nocomments - apenas perguntas secundárias que não são comentários;
- sq_X - em que X é um identificador de linha ou coluna. Apenas são selecionadas as perguntas secundárias que correspondem ao padrão X. Tenha em atenção que a pesquisa é feita no identificador de código completo, pelo que sq_X corresponde a e inclui as perguntas secundárias nX, X, Xn (p. ex., se utilizar sq_1, as perguntas secundárias a1, 1a, 1, 11 ou 001 são incluídas). Preste atenção ao tipo de pergunta de escala dupla, em que os códigos das perguntas secundárias são QCODE_SQCODE_1 e QCODE_SQCODE_1, e ao tipo de pergunta de classificação, em que os códigos das perguntas secundárias são QCODE_1,QCODE_2 ....
Exemplos:
- Foi respondida alguma parte de uma pergunta? -> {count(self.NAOK)>0}
- Qual é a pontuação de avaliação desta pergunta? -> {sum(self.value)}
Também pode utilizá-las para obter os totais de linhas e colunas. Imagine que tem uma tabela de números com as linhas A-E e as colunas 1-5.
- Qual é o total final? -> {sum(self.NAOK)}
- Qual é o total da linha B? -> {sum(self.sq_B.NAOK)}
- Qual é o total da coluna 3? -> {sum(self.sq_3.NAOK)}
Variável "that"
A variável "that" é como a variável "self", mas permite fazer referência a outras perguntas. A sua sintaxe é:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname é o nome da pergunta sem quaisquer extensões de pergunta secundária. Assim, vamos criar uma pergunta 'q1', em que 'q' representa também o seu qname.
Exemplos:
- Foi respondida alguma parte da pergunta q1? -> {count(that.q1.NAOK)>0}
- Qual é a pontuação de avaliação de q2? -> {sum(that.q2.NAOK)}
- Qual é o total final de q3? -> {sum(that.q3.NAOK)}
- Qual é o total da linha C em q4? -> {sum(that.q4.sq_C.NAOK)}
- Qual é o total da coluna 2 em q4? -> {sum(that.q4.sq_2.NAOK)}
As variáveis "self" e "that" podem ser utilizadas em qualquer relevância, validação ou personalização.
A única ressalva é que, ao utilizar a funcionalidade Mostrar ficheiro de lógica, será apresentado o valor expandido de "self" e "that". Isto permite-lhe ver a equação real que será gerada, para que você (e o EM) possam validar se as variáveis existem ou não. Isto pode parecer confuso, pois poderá ver equações bastante extensas. No entanto, se editar a pergunta, verá a equação original com "self" e/ou "that".
- quiser nomear explicitamente cada variável utilizada numa equação, ou
- utilizar variáveis que não têm perguntas secundárias (p. ex., perguntas de resposta única). Nesses casos, usar o prefixo "that" numa variável é exagerado e corre o risco de obter resultados inesperados.
Acesso a funções
O ExpressionScript dá acesso a funções matemáticas, de cadeias de caracteres e definidas pelo utilizador, como se mostra abaixo. Tem equivalentes em PHP e JavaScript para estas funções, de modo a que funcionem de forma idêntica no lado do servidor (PHP) e no lado do cliente (JavaScript). É fácil adicionar novas funções.
Funções implementadas
Atualmente, estão disponíveis as seguintes funções:
| Função | Significado | Sintaxe |
|---|---|---|
| abs | Valor absoluto | number abs(number) |
| acos | Arco co-seno | number acos(number) |
| addslashes | Delimitar uma cadeia de caracteres com barras | string addslashes(string) |
| asin | Arco seno | number asin(number) |
| atan | Arco de tangente | number atan(number) |
| atan2 | Arco de tangente com duas variáveis | number atan2(number, number) |
| ceil | Arredondar frações por excesso | number ceil(number) |
| checkdate | Devolve verdadeiro (1) se for uma data válida no calendário gregoriano | bool checkdate(month,day,year) |
| convert_value | Converter um valor numérico utilizando uma tabela de entrada e uma tabela de saída de valores numéricos | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Co-seno | number cos(number) |
| count | Contar o número de perguntas respondidas (não vazias) na lista | number count(arg1, arg12, ..., argN) |
| countif | Contar o número de perguntas respondidas na lista que sejam iguais ao primeiro argumento | number countif(matches, arg1, arg2, ... argN) |
| countifop | Contar o número de perguntas respondidas na lista que cumprem o critério (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Formatar a data/hora local | string date(format [, timestamp=time()]) |
| exp | Calcular o expoente de e | number exp(number) |
| fixnum | Apresentar números com vírgula como separador decimal, se necessário | string fixnum(number) |
| floor | Arredondar as frações por defeito | number floor(number) |
| gmdate | Formatar a data/hora GMT | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Converter todas as entidades HTML nos caracteres correspondentes (utiliza sempre ENT_QUOTES e UTF-8) | string html_entity_decode(string) |
| htmlentities | Converter todos os caracteres aplicáveis em entidades HTML (utiliza sempre ENT_QUOTES e UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Converter caracteres especiais em entidades HTML (utiliza sempre ENT_QUOTES e UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Converter entidades HTML especiais novamente em caracteres (utiliza sempre ENT_QUOTES e UTF-8) | string htmlspecialchars_decode(string) |
| idate | Formatar a hora/data local como inteiro | string idate(string [, timestamp=time()]) |
| if | if ao estilo do Excel: if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Juntar elementos da matriz (array) numa string | string implode(glue,arg1,arg2,...,argN) |
| intval | Obter o valor inteiro de uma variável | int intval(number [, base=10]) |
| is_empty | Determinar se uma variável é considerada vazia | bool is_empty(var) |
| is_float | Verifica se o tipo de uma variável é float | bool is_float(var) |
| is_int | Verifica se o tipo de uma variável é inteiro | bool is_int(var) |
| is_nan | Verifica se um valor não é um número | bool is_nan(var) |
| is_null | Verifica se uma variável é nula | bool is_null(var) |
| is_numeric | Verifica se uma variável é um número ou uma cadeia de caracteres numérica | bool is_numeric(var) |
| is_string | Verifica se o tipo de uma variável é cadeia de caracteres (string) | bool is_string(var) |
| join (New in 2.0 build 130129) | Juntar elementos numa nova cadeia de caracteres | join(arg1, arg2, ... argN) |
| list | Devolver uma lista separada por vírgulas dos valores não vazios | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Devolver uma lista separada por 'glue' da propriedade indicada (retProp) das perguntas da lista que cumprem o critério (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Remover espaços em branco (ou outros caracteres) do início de uma cadeia de caracteres | string ltrim(string [, charlist]) |
| max | Localizar o valor mais elevado | number max(arg1, arg2, ... argN) |
| min | Localizar o valor mais baixo | number min(arg1, arg2, ... argN) |
| mktime | Obter o timestamp UNIX de uma data (cada um dos 6 argumentos é opcional) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | A função módulo ainda não é suportada. Pode utilizar a função floor() como alternativa | floor(x/y)==(x/y) |
| nl2br | Insere quebras de linha HTML antes de todas as novas linhas de uma cadeia de caracteres | string nl2br(string) |
| number_format | Formatar o número com separador de centenas | string number_format(number) |
| pi | Obter valor de pi | number pi() |
| pow | Expressão exponencial | number pow(base, exp) |
| quoted_printable_decode | Converter uma cadeia de caracteres quoted-printable numa cadeia de 8 bits | string quoted_printable_decode(string) |
| quoted_printable_encode | Converter uma cadeia de caracteres de 8 bits numa cadeia quoted-printable | string quoted_printable_encode(string) |
| quotemeta | Citar de metacarateres | string quotemeta(string) |
| rand | Gerar um inteiro aleatório, veja este exemplo | int rand() OR int rand(min, max) |
| regexMatch | Comparar uma cadeia de caracteres com uma expressão regular | bool regexMatch(pattern,input) |
| round | Arredonda um número a uma precisão opcional | number round(val [, precision]) |
| rtrim | Remover espaços em branco (ou outros caracteres) do fim de uma cadeia de caracteres | string rtrim(string [, charlist]) |
| sin | Seno | number sin(arg) |
| sprintf | Devolve um string formatado | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Raiz quadrada | number sqrt(arg) |
| stddev | Calcular o desvio padrão amostral de uma lista de números | number stddev(arg1, arg2, ... argN) |
| str_pad | Preencher uma cadeia de caracteres até um determinado comprimento com outra cadeia de caracteres | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Repetir uma cadeia de caracteres | string str_repeat(input, multiplier) |
| str_replace | Substituir todas as ocorrências da cadeia de caracteres pesquisada pela cadeia de substituição | string str_replace(search, replace, subject) |
| strcasecmp | Comparação em modo binário, sem fazer distinção entre maiúsculas e minúsculas, de cadeias de caracteres | int strcasecmp(str1, str2) |
| strcmp | Comparação em modo binário de cadeias de caracteres | int strcmp(str1, str2) |
| strip_tags | Remover tags HTML e PHP de uma cadeia de caracteres | string strip_tags(str, allowable_tags) |
| stripos | Pesquisar a posição da primeira ocorrência de uma cadeia de caracteres unicode, sem distinção entre maiúsculas e minúsculas (começa em 0, devolve falso se não for encontrada) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Retira aspas de um string com aspas | string stripslashes(string) |
| stristr | Não sensível a Maiúsculas e minúsculas strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Obter comprimento da cadeia de caracteres | int strlen(string) |
| strpos | Pesquisar a posição da primeira ocorrência de uma cadeia de caracteres unicode (começa em 0, devolve falso se não for encontrada) | int strpos(haystack, needle [ offset=0]) |
| strrev | Inverter uma cadeia de caracteres | string strrev(string) |
| strstr | Encontrar primeira ocurrência de um string | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Converter uma cadeia de caracteres para minúsculas | string strtolower(string) |
| strtotime | Converter praticamente qualquer descrição textual de data/hora em inglês num timestamp UNIX | int strtotime(string) |
| strtoupper | Converter uma cadeia de caracteres para maiúsculas | string strtoupper(string) |
| substr | Devolver parte de uma cadeia de caracteres unicode | string substr(string, start [, length]) |
| sum | Calcular a soma de valor num array | number sum(arg1, arg2, ... argN) |
| sumifop | Somar os valores das perguntas respondidas na lista que cumprem o critério (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangente | number tan(arg) |
| time | Devolver o timestamp UNIX atual | number time() |
| trim | Remover espaços em branco (ou outros caracteres) do início e do fim de uma cadeia de caracteres | string trim(string [, charlist]) |
| ucwords | Converter para maiúscula o primeiro caractere de cada palavra de uma cadeia de caracteres | string ucwords(string) |
| unique | Devolve verdadeiro se todas as respostas não vazias forem unicas | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Criar novas funções de expressão com um plugin (New in 4.0.0 )
Se necessitar de uma nova função que não exista no Principal, pode criá-la com um plugin. Essa nova função é criada através do evento expressionManagerStart.
O ExpressionScript sabe quais as variáveis que são locais
Para construir corretamente o JavaScript de uma página, o EM precisa de saber quais as variáveis definidas na página e qual é o respetivo ID JavaScript (por exemplo, para document.getElementById(x)). Também tem de saber quais as variáveis definidas noutras páginas (para garantir que os campos <input type='hidden' value='x'> necessários estão presentes e preenchidos).
Condições em cascata
Se alguma das variáveis for irrelevante, toda a equação será irrelevante (falsa). Por exemplo, na tabela seguinte, N/A significa que uma das variáveis não era relevante:
| Operador | Exemplo | a | b | Resultado |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (or eq) | a == b | N/A | 5 | false |
| == (or eq) | a == b | N/A | 0 | false |
| == (or eq) | a == b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 5 | false |
| != (or ne) | a != b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 0 | false |
| > (or gt) | a > b | N/A | 5 | false |
| >= (or ge) | a >= b | N/A | 5 | false |
| < (or lt) | a < b | N/A | 5 | false |
| <= (or le) | a <= b | N/A | 5 | false |
| and | a and b | N/A | 5 | false |
| and | a and b | N/A | N/A | false |
| or | a or b | N/A | N/A | false |
| or | a or b | N/A | 5 | false |
| + | a + b | N/A | 5 | false |
| * | a * b | N/A | 5 | false |
| / | a / b | 5 | N/A | false |
| () | (a) | N/A | false | |
| (exp) | (a && b) | N/A | 5 | false |
| (exp) op (exp) | (b + b) > (a && b) | N/A | 5 | false |
| function | sum(a,b,b) | N/A | 5 | false |
| function | max(a,b) | N/A | 5 | false |
| function | min(a,b) | N/A | 5 | false |
| function | implode(', ',a,b,a,b) | N/A | 5 | false |
| function | if(a,a,b) | N/A | 5 | false |
| function | is_empty(a) | N/A | false | |
| function | is_empty(a) | 0 (or blank) | true | |
| function | !is_empty(a) | N/A | false |
Substituir as condições em cascata
Imagine que pretende mostrar um total acumulado de todas as respostas relevantes. Poderia tentar usar a equação {sum(q1,q2,q3,...,qN)}. No entanto, esta é traduzida internamente para LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Assim, se algum dos valores q1-qN for irrelevante, a equação devolverá sempre falso. Neste caso, sum() mostrará "0" até que todas as perguntas sejam respondidas.
Para contornar isto, pode adicionar a cada variável o sufixo ".NAOK" (que significa que Not Applicable is OK, ou seja, "Não aplicável" é aceitável). Nesses casos, ocorre o seguinte comportamento. Suponha que tem uma variável q1.NAOK:
- q1 não é adicionada à cláusula LEManyNA()
- LEMval('q1') continuará a verificar se a resposta é relevante e devolverá "" se não for (assim, as respostas irrelevantes individuais serão ignoradas, mas não invalidarão toda a expressão).
Assim, a solução para o problema do total acumulado é usar a equação sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
A utilização do sufixo .NAOK também permite aos autores criar inquéritos com vários percursos possíveis que depois convergem em percursos comuns. Por exemplo, imagine que os participantes respondem a um inquérito de forma incomum, fora do intervalo normal de respostas. O autor poderia avisá-los de que poderão não obter resultados válidos e perguntar-lhes se realmente querem continuar com o inquérito. Se responderem "Sim", as restantes perguntas serão mostradas. A condição para "as restantes perguntas" verificaria se as respostas iniciais foram dadas dentro do intervalo normal OU se o participante respondeu "Sim" à pergunta que só é relevante se tiver respondido fora do intervalo normal.
Como é que o ExpressionScript suporta a microadaptação condicional?
Eis um exemplo de microadaptação (em que Tipo de pergunta=='expr' significa uma Equação):
| Códigos das perguntas | Relevância | Tipo de pergunta | Pergunta |
|---|---|---|---|
| name | 1 | text | Qual é o seu nome? |
| age | 1 | text | Que idade tem? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Lamentamos, {name}, mas é demasiado {if( (age<16),'jovem',if( (age>80),'velho','de meia-idade') ) } para este teste. |
| kids | !badage | yesno | Tem filhos? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Quantos filhos tem? |
| kid1 | parents && numKids >= 1 | text | Que idade tem o seu primeiro filho? |
| kid2 | parents && numKids >= 2 | text | Que idade tem o seu segundo filho? |
| kid3 | parents && numKids >= 3 | text | Que idade tem o seu terceiro filho? |
| kid4 | parents && numKids >= 4 | text | Que idade tem o seu quarto filho? |
| kid5 | parents && numKids >= 5 | text | Que idade tem o seu quinto filho? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, indicou que tem {age} anos e que tem {numKids} filhos. A soma das idades dos seus primeiros {min(numKids,5)} filhos é {sumage} |
Para descarregar o exemplo de inquérito acima, clique na seguinte hiperligação: Exemplo de inquérito sobre o número de filhos.
Todas estas perguntas podem estar numa única página (por exemplo, no mesmo grupo) e apenas as perguntas relevantes serão apresentadas. Além disso, à medida que introduz as idades dos filhos, a expressão sum() na última pergunta será atualizada dinamicamente.
O ExpressionScript fornece esta funcionalidade envolvendo cada expressão num elemento <span> com nome. Sempre que um valor muda, recalcula a expressão que deve aparecer nesse elemento <span> e regenera a apresentação. Pode ter dezenas ou mesmo centenas dessas expressões adaptadas na mesma página.
Realce de sintaxe
Para ajudar a introduzir e validar expressões, o EM disponibiliza realce de sintaxe com as seguintes características:
Tipos e significados do realce de sintaxe
| Cor | Exemplo | Significado | Dica | Comentários |
|---|---|---|---|---|
| fundo castanho-claro | Sample | toda a equação | nenhuma | Tudo o que estiver entre chavetas e for reconhecido como uma equação (por exemplo, sem espaços em branco no início ou no fim) será assinalado com um fundo castanho-claro para o distinguir do texto circundante |
| texto vermelho a negrito | Sample | Um erro | Alguma explicação sobre o erro | Pode ser uma variável desconhecida ou um erro numa função. O inquérito fica danificado e as perguntas que dependem da respetiva expressão não serão mostradas aos participantes. |
| texto azul | Sample | nome de função | significado e sintaxe permitida | Refere-se a nomes de funções ou a elementos que deveriam ser funções, uma vez que são seguidos de um parêntese de abertura. São apresentados em azul a negrito. As dicas mostram o significado e a sintaxe permitida da função. |
| texto cinzento | Sample | cadeia de caracteres | nenhuma | As cadeias de caracteres entre aspas simples e duplas são apresentadas em texto cinzento. |
| texto ciano | Sample | variável definida na mesma página, | [nome]: pergunta; valor; lista de respostas com os códigos de cada valor | Qualquer variável definida na mesma página da pergunta que está a editar é apresentada em texto ciano (pode ser atualizada em JavaScript). A dica mostra o seu nome, a pergunta propriamente dita e o seu valor atual (ou em branco, se não estiver definido). Se o tipo de pergunta esperar respostas de um conjunto de valores enumerados, é apresentado o mapeamento dos códigos para os valores de apresentação. |
| texto verde | Sample | variável definida numa página anterior | [nome]: pergunta; valor; lista de respostas com os códigos de cada valor | Qualquer variável definida numa página anterior é apresentada em texto verde a negrito. A dica mostra o seu nome, a pergunta propriamente dita e o seu valor atual (ou em branco, se não estiver definido). Se o tipo de pergunta esperar respostas de um conjunto de valores enumerados, é apresentado o mapeamento dos códigos para os valores de apresentação. |
| texto rosa a negrito | Sample | variável definida numa página posterior em geral: vazia no início do inquérito, mas pode ser preenchida com o índice ou ao retroceder | [nome ou código SGQA]: pergunta; valor; lista de respostas com os códigos de cada valor | Qualquer variável definida numa página posterior é apresentada em texto rosa a negrito. A dica mostra o seu nome, a pergunta propriamente dita e o seu valor atual (ou em branco, se não estiver definido). Se o tipo de pergunta esperar respostas de um conjunto de valores enumerados, é apresentado o mapeamento dos códigos para os valores de apresentação. |
| texto castanho a negrito | Sample | um valor de substituição do Lime | o valor | As cadeias de substituição do Lime (como {TOKEN:xxx}, {PRIVACY_MESSAGE}) são apresentadas em texto castanho a negrito. |
| texto vermelho | Sample | operador de atribuição (=) | mensagem de aviso | Se utilizar um dos operadores de atribuição (=), esse operador será apresentado em texto vermelho. Isto destina-se a evitar a reatribuição acidental de valores quando na realidade pretendia verificar se a == b em vez de definir o valor de a = b. |
| texto preto normal | Sample | pontuação | nenhuma | Todos os outros sinais de pontuação dentro da expressão são apresentados em texto preto normal. |
| texto com caixa vermelha | uma linha vermelha a negrito envolve o erro | erro de sintaxe | descrição do erro | Quaisquer erros de sintaxe detetados são apresentados dentro de caixas vermelhas. A dica mostra o erro. Os exemplos incluem parênteses sem correspondência, utilização de funções não definidas, passagem de um número errado de argumentos a funções, expressões mal estruturadas (por exemplo, operadores em falta entre variáveis), tentativa de atribuir um novo valor a uma variável só de leitura, tentativa de atribuir valores a elementos que não são variáveis ou utilização de sintaxe não suportada. Note que o sistema de deteção de erros de sintaxe pode comunicar apenas um erro numa expressão, mesmo que existam vários; no entanto, se forem detetados erros, será mostrado pelo menos um. |
Leitura adicional
Inquéritos de exemplo do ExpressionScript
Casos de utilização e guias práticos
Exemplos passo a passo
Referência para programadores