x

Capítulos principais

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Guia de início rápido - LimeSurvey 3.0+
  3. Instalação - LimeSurvey CE
  4. Como criar um bom inquérito (guia)
  5. Começando
  6. Administração do LimeSurvey
  7. Inquéritos - introdução
  8. Configurações do inquérito
  9. Menu de inquérito
  10. Estrutura do inquérito
  11. Perguntas - introdução
  12. Grupos de perguntas - introdução
  13. Pesquisas - gestão
  14. Opções da barra de ferramentas do inquérito
  15. Inquérito multilingue
  16. ExpressionScript Engine - Guia de início rápido
  17. Recursos não categorizados e avançados
  18. Perguntas frequentes gerais
  19. Resolução de problemas
  20. Soluções alternativas
  21. Licença
  22. Registo de alterações das versões
  23. Plugins
 Actions

ExpressionScript - Apresentação

From LimeSurvey Manual

Esta página pode ter sido traduzida automaticamente e conter erros. Ver o original em inglês · Melhorar esta tradução
This page is a translated version of the page ExpressionScript - Presentation and the translation is 100% complete.


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

  1. 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.
  2. 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.
  3. 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.
  4. 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
  5. 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".
  6. 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.


Nota:
  • 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.

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:

  1. Mostrar condicionalmente mensagens personalizadas aos participantes com base em respostas anteriores;
  2. 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;
  3. Conjugar verbos e flexionar substantivos nas perguntas, respostas e relatórios;
  4. 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
Para manter a consistência entre JavaScript e PHP, o operador de adição (+) faz a soma se ambos os operandos forem numéricos, mas faz a concatenação se ambas as partes forem cadeias de caracteres não numéricas. No entanto, recomendamos que utilize a função "join()" para a concatenação, pois torna a sua intenção mais clara. Também evita resultados inesperados se estivesse à espera de cadeias de caracteres mas obtiver números (ou vice-versa).

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...


  Atenção : A atribuição é feita apenas em PHP. Isto significa que o valor não é atualizado na mesma página, mas apenas quando o utilizador avança para a página seguinte. Por isso, tenha atenção quando o operador de atribuição for utilizado na mesma página com outras expressões.



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.


Tenha em atenção que o XSS está ativado por predefinição em qualquer instalação do LimeSurvey.


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 &amp;
  • < por &lt;
  • > por &gt;

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
  1. suffix é qualquer um dos sufixos normais de qcode (p. ex., NAOK, value, shown)
  1. 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".

Não deve utilizar estas variáveis se
  • 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)
Clique aqui se pretender saber mais sobre as funções planeadas (ou em consideração).

<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:

  1. q1 não é adicionada à cláusula LEManyNA()
  2. 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.


Por dicas, referimo-nos à mensagem de popup que é apresentada quando passa o cursor sobre determinadas funções e variáveis.


Leitura adicional

Inquéritos de exemplo do ExpressionScript

Casos de utilização e guias práticos

Exemplos passo a passo

Referência para programadores

Roteiro, estado e lista de tarefas