x

Capítulos principais

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. LimeSurvey Cloud - Guia de início rápido
  3. Instalação - LimeSurvey CE
  4. Como criar um bom inquérito (guia)
  5. Iniciando
  6. Administrando o LimeSurvey
  7. Questionários - introdução
  8. Configurações do questionário
  9. Menu da pesquisa
  10. Estrutura da pesquisa
  11. Perguntas - introdução
  12. Grupos de perguntas - introdução
  13. Questionários - gerenciamento
  14. Opções da barra de ferramentas do questionário
  15. Questionário multilíngue
  16. ExpressionScript Engine - Guia de início rápido
  17. Recursos avançados e não categorizados
  18. FAQ geral
  19. Solução de problemas
  20. Soluções alternativas
  21. Licença
  22. Registro de mudanças da versão
  23. Plugins
 Actions

Gerenciador de Expressões

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 Expression Manager and the translation is 100% complete.

Tutorial de início rápido

Visão geral

Ao personalizar suas pesquisas, você geralmente precisa especificar o seguinte:

  1. Navegação/Ramificação - permitindo que as respostas de um participante mude a ordem em que as perguntas são feitas
  2. Tailoring/Piping - como formular a pergunta (como referir-se a respostas anteriores ou elaborar frases com base em um número ou gênero de seus participantes) ou como gerar relatórios personalizados (como pontuações de avaliação ou insights personalizados).
  3. Validação - garante que as respostas passem por determinados critérios, como valores mínimos e máximos, ou correspondam a um padrão de entrada

O Expression Manager (EM) fornece uma forma intuitiva de especificar a lógica para cada uma dessas características. Quase tudo o que se possa escrever como uma equação matemática padrão é uma expressão válida, mesmo se estiver trabalhando com funções. Atualmente, o EM fornece acesso a 80 funções, e pode ser facilmente alimentado para suportar mais funções. Também lhe permite modificar às suas variáveis usando nomes de variáveis amigaveis (em vez dos nomes SGQA).

Os tópicos a seguir mostram os principais casos onde o Expression Manager pode ser utilizado.

==Relevância (Controle de Navegação / Ramificação)

Alguns inquéritos usam a "lógica Goto": se você responder à pergunta 1 com a opção C, ele salta para a pergunta 5. Essa abordagem é muito limitada, pois é difícil de validar e quebra facilmente quando você precisa reordenar as perguntas. O EM usa uma equação de relevância booleana para especificar todas as condições em que uma pergunta pode ser válida. Se a pergunta for relevante, ela é exibida; caso contrário, ela é Não aplicável e o valor NULL é armazenado no banco de dados. Isso é semelhante ao que pode ser feito por meio do editor de condições, mas o EM permite especificar facilmente critérios muito mais complexos e poderosos (e permite usar o nome da variável em vez da nomenclatura SGQA).

Esta imagem mostra uma forma de revisar a lógica de relevância de um inquérito. Ele calcula o Índice de Massa Corporal. A equação de relevância é exibida entre colchetes logo após o nome da variável (que está em verde). Assim, a relevância de weight, weight_units, height e height_units é 1 em todos os casos, o que significa que essas perguntas são sempre feitas. No entanto, a relevância de BMI é {!is_empty(height) and !is_empty(weight)}, o que significa que o BMI só será calculado se o participante informar um valor para a altura e para o peso (evitando assim o risco de um erro de divisão por zero). Além disso, a pergunta Report só é exibida se o participante responder às quatro perguntas principais (height, height_units, weight, weight_units).

A relevância é exibida e pode ser editada nos seguintes locais:

Visualizando / editando a relevância no nível da pergunta

Esta equação calcula o Índice de Massa Corporal (IMC). Ela só é perguntada se a pessoa informar primeiro a altura e o peso.

Esta é a tela de edição da pergunta BMI.

Observe que você não usa chaves ao inserir uma equação de relevância.

Visualizando / editando a relevância no nível do grupo

Este é um exemplo de inquérito de censo. A primeira página pergunta quantas pessoas moram com você e armazena o valor na variável "cohabs". Esta página só é exibida se você tiver mais de um coabitante (portanto, é exibida para a segunda pessoa que mora com você) e também só é exibida se você tiver especificado qual é a relação da Pessoa Um com você (p1_rel).

Como você pode ver, o grupo também tem critérios de relevância no nível da pergunta, de modo que cada pergunta só aparece depois que você responde à pergunta anterior (por exemplo, {!is_empty(p1_sex)}). O EM combina para você a relevância do grupo e a do nível da pergunta. As perguntas de um grupo só são feitas se o grupo como um todo for relevante. Então, somente o subconjunto de perguntas relevantes dentro do grupo é apresentado.

Esta é a tela para editar a relevância no nível do grupo para essa pergunta:

Observe que você não usa chaves ao inserir uma equação de relevância.

Personalização/Piping

O EM permite fazer facilmente personalizações condicionais simples e complexas das suas perguntas. Às vezes você só precisa de uma substituição simples, como dizer: "Você disse que comprou [Produto]. Do que você mais gostou nele?". Às vezes você precisa de uma substituição condicional, como "[Sr./Sra.] [Sobrenome], você estaria disposto(a) a responder ao nosso inquérito?". Neste caso, você quer usar Sr. ou Sra. de acordo com o gênero da pessoa. Em outros casos, você precisa de uma substituição ainda mais complexa (por exemplo, baseada em um cálculo matemático). O EM oferece suporte a todos esses tipos de personalização/piping.

Equações condicionais

O exemplo do Índice de Massa Corporal mostra a capacidade de calcular o IMC de uma pessoa, mesmo permitindo que ela informe a altura e o peso em unidades métricas ou não métricas.

Aqui, weight_kg é {if(weight_units == 'kg', weight, weight * .453592)}. Essa função if() significa que, se o participante informou o peso em quilogramas, o valor é usado como está; caso contrário, o valor informado (que estava em libras) é multiplicado por .453592 para convertê-lo em quilogramas. A variável height_m usa uma abordagem semelhante para calcular a altura da pessoa em metros, mesmo que ela tenha informado a altura em polegadas.

BMI calcula a fórmula do peso como {weight_kg / (height_m * height_m)}.

Por fim, o relatório personaliza condicionalmente a mensagem para o participante, informando o que ele digitou. ("Você disse que tem 2 metros de altura e pesa 70 kg.")

Embora não esteja bem visível na imagem acima, weight_status usa instruções if() aninhadas para classificar a pessoa de abaixo do peso a obesidade severa. Você pode ver a equação na Visualização da lógica.

Na janela de edição desta pergunta, você pode observar duas coisas:

  1. A personalização deve envolver as expressões com chaves
  2. As expressões podem ocupar várias linhas se, como neste caso, você quiser facilitar a leitura da lógica condicional aninhada.

Perguntas, respostas e relatórios personalizados

Nota: A personalização dinâmica pode não funcionar se as opções de resposta forem exibidas em caixas de seleção na mesma página da pergunta. Isso ocorre porque a personalização insere uma tag <span>, que não é válida dentro de opções de seleção.

Este exemplo mostra o relatório de IMC.

Esta é a janela de edição da mesma pergunta.

Como você pode ver, tudo o que está entre chaves é tratado como uma expressão e, por isso, aparece com destaque de sintaxe (codificado por cores) na imagem anterior. Se houver erros de digitação (como nomes de variáveis ou funções escritos incorretamente ou não definidos), o EM exibirá um erro, como este, mostrando que height_unit é um nome de variável não definido (o correto é height_units) e que rnd() é uma função não implementada (o nome correto da função é round()). Em ambos os casos, os erros são circundados por uma caixa vermelha para facilitar a identificação e a correção.

Você também pode ver que é possível criar rapidamente relatórios complexos, como uma tabela de valores informados ou conselhos personalizados.

Lembre-se de que, em toda personalização, as expressões devem estar entre chaves, para que o LimeSurvey saiba quais partes da pergunta são texto livre e quais devem ser processadas pelo Expression Manager.

Validação

O EM controla o funcionamento da maioria das opções avançadas de pergunta. Elas definem aspectos como números mínimo/máximo de respostas, valores individuais mínimo/máximo, valores mínimo/máximo de soma e a verificação de que os valores informados correspondem a padrões de texto especificados. Você continua inserindo essas opções avançadas de pergunta normalmente. No entanto, agora qualquer valor em um desses campos é considerado uma expressão, portanto você pode definir critérios de mínimo/máximo com relações condicionais complexas com outras perguntas.

Em todos esses casos, como a opção avançada de pergunta é sempre considerada uma expressão, você não usa chaves ao especificá-la.

A página Pesquisas de exemplo mostra vários exemplos práticos de uso de expressões para validação.

Introdução

O LimeSurvey usa o novo módulo Expression Manager (EM), que permite ao LimeSurvey oferecer suporte a ramificações, avaliações, validações e personalizações mais complexas. Ele substituirá a forma como o LimeSurvey gerencia Substituições, Condições e Avaliações no back-end. Também acelerará consideravelmente o processamento, pois elimina a maioria das leituras no banco de dados em tempo de execução. O EM foi desenvolvido pelo Dr. Thomas White (TMSWhite).

Esta página da wiki é a referência definitiva para a sintaxe e as funcionalidades do Expression Manager.

Definições principais

  1. Expressão: Qualquer coisa entre chaves
    • Desde que não haja espaço em branco imediatamente após a chave de abertura ou antes da chave de fechamento
    • O conteúdo das expressões é avaliado pelo EM, portanto pode conter fórmulas matemáticas, funções e processamento complexo de textos e datas.
  2. Personalização: Às vezes chamada de "piping", é o processo de modificar um texto de forma condicional
    • Você tem acesso a todos os 'campos de substituição', aos dados do participante e aos dados de resposta.
    • Você também tem acesso mais fácil às perguntas, às respostas e às suas propriedades.
  3. Equação de relevância: Um novo atributo de pergunta que controla a visibilidade da pergunta
    • Se houver uma equação de relevância, a pergunta só é exibida se a relevância for avaliada como verdadeira.
    • Internamente, todos os comandos array_filter e array_filter_exclude se tornam relevância no nível de pergunta secundária
  4. Tipo de pergunta Fórmula: Um novo tipo de pergunta que salva cálculos ou relatórios no banco de dados
    • É como uma pergunta Boilerplate, mas seu conteúdo é salvo no banco de dados mesmo que você defina "Sempre ocultar esta questão"
  5. Código da pergunta: É o nome de variável preferido para o EM
    • Pode ser um nome descritivo que indique a finalidade da pergunta, facilitando a leitura de lógicas complexas
    • Códigos de pergunta válidos NÃO devem começar com um número; portanto, ao usar o código da pergunta para numerar suas perguntas, use simplesmente "q1", "q1a" ou "g1q2".
    • Atualmente, é isso que se torna o nome da variável ao exportar dados para SPSS ou R; se você faz análises estatísticas, provavelmente já o tornou único.

Preciso usar o EM?

A resposta curta é não (mas também sim).

O EM é totalmente compatível com versões anteriores das pesquisas existentes. Portanto, se você preferir usar Condições e Avaliações no estilo que o LimeSurvey usava nas versões <= 1.91+, pode continuar a fazê-lo.

No entanto, o EM substitui completamente a forma como o LimeSurvey lida internamente com as Condições. Embora você ainda possa usar o editor de Condições para criar e gerenciar condições, o LimeSurvey 1.92 as converterá em Equações de relevância equivalentes. Como parte da atualização, o LimeSurvey 1.92 converterá automaticamente todas as Condições existentes em Equações de relevância.

Isso deve oferecer o melhor dos dois mundos: você pode continuar usando o LimeSurvey como está acostumado, mas verá a Equação de relevância equivalente, podendo migrar gradualmente para as Equações de relevância diretamente quando achar conveniente.

Posso misturar o uso de Condições e Relevância?

Sim. Você pode usar o editor de Condições para algumas perguntas e o editor de Relevância para outras. As condições são convertidas automaticamente em relevância quando você salva a pergunta.

Observe que presumimos que, se você estiver usando o editor de Condições, deseja que essas Condições substituam qualquer equação de relevância inserida manualmente. Portanto, se você tem Condições existentes e deseja editar a Relevância manualmente, exclua primeiro as Condições dessa pergunta. Mais especificamente, copie a equação de relevância gerada para um editor de texto, use o menu Condições para excluir todas as condições dessa pergunta (o que também excluirá a relevância), depois edite a pergunta e cole a equação de relevância gerada, do editor de texto, de volta no campo de relevância dessa pergunta (e salve a pergunta). Se houver demanda suficiente para excluir condições sem excluir a equação de relevância gerada, poderemos adicionar um processo de conversão em massa.

Como devo escolher entre Condições e Relevância?

Veja uma lista de prós e contras de cada estilo:

Estilo Prós Contras
Condições 1. Boa interface gráfica para criar condições simples
2. Interface gráfica bem documentada e conhecida pela equipe de suporte
1. Suporta apenas comparações simples e não lida bem com condições E/OU
2. Condições em cascata funcionam de forma irregular
3. Lento - usa muito o banco de dados, o que pode deixar pesquisas longas mais lentas
4. Alguns problemas relatados ao recarregar condições
5. A interface gráfica não escala bem quando há dezenas, centenas ou milhares de perguntas
6. Pode ser lento converter pesquisas em papel, pois é necessário usar nomes SGQA
7. Geralmente é necessário um programador para codificar a lógica de ramificações complexas
Relevância 1. Suporta lógica muito complexa, incluindo mais de 80 funções e operadores matemáticos/de texto
2. Suporte perfeito para lógica em cascata
3. Rápido - sem chamadas extras ao banco de dados, o que permite pesquisas com mais de 1000 perguntas
4. Sem problemas ao recarregar a lógica, pois não exige códigos SGQA
5. O destaque de sintaxe escala para pesquisas com mais de 1000 perguntas
6. Fácil e rápido de usar para grupos que desejam informatizar pesquisas em papel existentes.
7. Suporta facilmente entrevistas semiestruturadas e pesquisas epidemiológicas sem a necessidade de programadores
1. Sem interface gráfica para condições simples - use o destaque de sintaxe no lugar
2. Novo, portanto as equipes de suporte ainda não dominam o EM.

Em resumo, se você está satisfeito com o funcionamento do LimeSurvey 1.91+, não há motivo para mudar o que você faz.

Quais são alguns outros benefícios de usar o EM?

Aqui estão alguns outros motivos pelos quais você pode querer usar o EM.

  1. Cálculos - você pode criar qualquer cálculo que imaginar:
    • Você tem acesso a todos os operadores e funções matemáticas comuns
    • Você tem acesso a mais de 70 funções matemáticas, de data e de processamento de texto
    • É relativamente fácil para os desenvolvedores adicionarem novas funções, caso os usuários precisem delas
  2. Armazenamento de cálculos no banco de dados
    • Agora você pode realizar cálculos simples e complexos e/ou pontuações de escala E armazená-los no banco de dados sem precisar de JavaScript.
    • Para isso, você usa o tipo de pergunta Equação.
  3. Avaliações
    • Agora você pode criar avaliações ou pontuações de escala a partir de qualquer tipo de pergunta, não apenas do subconjunto que era suportado anteriormente
    • Você pode usar a personalização (Tailoring) para exibir pontuações de avaliação parciais ou totais onde for necessário - até mesmo na mesma página
    • Você tem mais controle sobre os relatórios gerados com base nessas pontuações de avaliação
    • Você pode armazenar pontuações de avaliação no banco de dados sem precisar de JavaScript
    • Você pode ocultar pontuações de avaliação sem precisar de JavaScript ou CSS
  4. Campos de substituição
    • Use o Código da pergunta para inserir valores das respostas a perguntas anteriores - isso facilita a leitura e a validação.
  5. Personalização (Tailoring) - você pode exibir texto condicionalmente com base em outros valores
    • Use o tratamento adequado para um participante, como (p. ex.: "Olá [Sr./Sra.] Silva")
    • Gere frases gramaticalmente corretas quando singular/plural fizer diferença: (p. ex.: "Você tem 1 filho" vs. "Você tem 2 filhos")
    • Conjugue verbos e flexione substantivos de forma adequada com base no gênero e no número do participante.
  6. Novos atributos de variável - você pode acessar os seguintes itens para fazer a personalização:
    • (sem sufixo) - um alias para qcode.code
    • .code - o código de resposta selecionado para a pergunta, se ela for relevante (caso contrário, vazio), ou o valor de texto, se não for uma pergunta com código
    • .NAOK - igual a .code, mas pode fazer parte de cálculos ou listas mesmo que seja irrelevante
    • .value - o valor de avaliação da pergunta, se ela for relevante (caso contrário, vazio), ou o valor de texto, se não for uma pergunta com código -- disponível se as avaliações estiverem ativadas para o inquérito; caso contrário, é sempre zero
    • .valueNAOK - igual a .value, mas pode fazer parte de cálculos ou listas mesmo que seja irrelevante
    • .shown - a resposta como exibida ao usuário
    • .qid - o ID da pergunta
    • .gid - o ID do grupo
    • .sgqa - o valor SGQA da pergunta
    • .jsName - o nome correto da variável JavaScript da pergunta, independentemente de estar definida nesta página ou em outra
    • .qseq - a sequência da pergunta (começando em 0)
    • .gseq - a sequência do grupo (começando em 0)
    • .mandatory - se a pergunta é obrigatória (Y/N)
    • .question - o texto da pergunta
    • .relevance - a equação de relevância da pergunta
    • .grelevance - a equação de relevância do grupo
    • .relevanceStatus - se a pergunta é ou não relevante no momento (booleano (pode ser diferente em PHP e JS))
    • .type - o tipo da pergunta (o código de um caractere)
  7. Alterações dinâmicas na página
    • Toda a relevância, cálculo e personalização funcionam dinamicamente em uma página - assim, as mudanças nos valores atualizam a página instantaneamente
    • Dessa forma, as perguntas aparecem/desaparecem dinamicamente conforme sejam ou não relevantes
    • As perguntas também são personalizadas dinamicamente com base nas respostas dadas na página, de modo que você pode ver totais parciais, frases personalizadas e relatórios customizados.
  8. Nova tela para entrada de dados
    • Além de usar o sistema atual de entrada de dados, você pode simplesmente usar o Inquérito-Tudo-em-Um.
    • Isso oferece suporte à relevância e à personalização na página, de modo que os operadores de entrada de dados podem navegar rapidamente com a tecla Tab e só precisarão inserir as respostas relevantes
    • Isso pode ser essencial se o responsável pela entrada de dados precisar ver a personalização, que também é dinâmica.
  9. Elimina a necessidade da maior parte do JavaScript personalizado
    • O EM oferece suporte fácil a cálculos complicados, pontuação, personalização e lógica condicional.
    • Algumas coisas ainda exigirão JavaScript (como layouts personalizados e ocultação condicional de subelementos da pergunta), mas o seu JavaScript pode usar as funções do EM para acessar as perguntas pelo Qcode em vez do SGQA e acessar qualquer uma das propriedades de pergunta listadas acima.

Quais são alguns outros recursos novos úteis habilitados pelo EM?

Independentemente de você continuar usando o Editor de condições ou criar manualmente Equações de relevância, você obtém estes benefícios adicionais:

  1. Você pode criar critérios de validação mais complexos
    • Todos os atributos avançados de pergunta (como max_answers, min_num_value_n, max_num_value) podem usar Expressões. Assim, seus critérios de mínimo/máximo podem ser facilmente ajustados com base em respostas anteriores, mesmo que estejam na mesma página.
    • O EM também trata toda a validação baseada em expressões regulares, de modo que você pode combinar com robustez atributos de pergunta baseados em preg e em equações.
  2. Reordenação (ou exclusão) fácil de perguntas e grupos
    • Antes da versão 1.92, você não podia reordenar perguntas ou grupos se o LimeSurvey considerasse que essa reordenação poderia quebrar condições nas quais eles eram usados. Da mesma forma, você não podia excluir perguntas se outras perguntas dependessem delas.
    • Com o destaque de sintaxe do EM, é fácil ver e validar se você tenta usar perguntas antes de elas serem declaradas. Por isso, agora permitimos que você reordene ou exclua perguntas e grupos quando quiser. O EM atualizará todo o destaque de sintaxe para mostrar possíveis erros.
    • A visualização de reordenação de perguntas foi aprimorada para ajudar nessa revisão. Agora ela mostra a equação de relevância e a personalização da pergunta, de modo que você pode ver imediatamente se alguma variável fica rosa (o que significa que é usada antes de ser declarada).
  3. O índice de navegação de perguntas/grupos está sempre disponível e preciso
    • Antes da versão 1.92, esses índices não estavam disponíveis se houvesse condições complexas
    • Com o EM, podemos garantir que eles sejam precisos.
    • Os participantes podem até voltar a uma pergunta anterior, alterar a resposta e depois avançar (ou enviar)
      • Ao avançar, o EM revalidará todas as perguntas/grupos intermediários.
      • Se alguma pergunta se tornar irrelevante, ela será definida como NULL no banco de dados, para que seus dados sejam internamente consistentes
      • Se alguma pergunta se tornar relevante ou passar a falhar nas regras de obrigatoriedade ou de validação, o EM parará nessa página e obrigará o usuário a responder a essas perguntas antes de avançar para o destino final.
  4. Conversão automática de condições em relevância
    • Quando você atualiza seu banco de dados, todos os inquéritos existentes que têm condições terão equações de relevância geradas para eles
    • Sempre que você importa um inquérito, as equações de relevância são criadas conforme necessário
    • Sempre que você adiciona, exclui ou modifica condições, o EM gera a equação de relevância apropriada.
  5. Destaque de sintaxe conveniente
    • Quando o EM mostra a equação de relevância, ele exibe o Qcode, mesmo que você tenha inserido um código SGQA, pois presumimos que isso seja mais fácil de ler.
    • Todas as variáveis são codificadas por cores para mostrar se foram declaradas antes ou depois da pergunta atual (ou antes ou depois do grupo atual). Isso permite detectar e corrigir rapidamente os casos em que você tenta usar variáveis em relevância (incluindo array_filter), personalização ou equações de validação antes de declará-las.
    • Além disso, se você passar o mouse sobre a variável codificada por cores, verá os metadados mais importantes dessa pergunta. Isso inclui o nº de sequência do grupo, o nº de sequência da pergunta, o Qcode, o texto da pergunta e todas as opções de resposta disponíveis (se for um tipo de pergunta com opções de resposta enumeradas).
      • A lista de opções de resposta usa esta sintaxe: 'answers':{key:val, ... }.
      • key tem a sintaxe 'scale~code', em que scale é a escala de resposta (p. ex., para escala dupla) e code é o código da resposta.
      • val tem a sintaxe 'value~shown', em que value é o valor de avaliação (se estiver usando avaliações; caso contrário, code) (p. ex., Qcode.value) e shown é o valor de exibição visto pelo participante (p. ex., Qcode.shown)
      • Isso significa que muitos inquéritos podem usar cálculos sem precisar do modo de avaliação. Se você tem opções de resposta enumeradas que são únicas, não decimais e não negativas, pode simplesmente fazer cálculos com os valores Qcode.code.
  6. Revisão fácil de toda a lógica e do conteúdo do inquérito
    • Há um novo recurso Mostrar lógica do inquérito que permite ver tudo sobre o inquérito (ou grupo ou pergunta) em uma única página.
    • Ele mostra os detalhes de grupo, pergunta, pergunta secundária e resposta para o escopo selecionado (inquérito vs. grupo vs. pergunta)
    • Ele também mostra a relevância, a relevância no nível de pergunta secundária (para array_filter e array_filter_exclude), a equação de validação gerada (para preg e quaisquer regras de validação, como soma/número mínimo/máximo de valores) e todos os atributos de pergunta não vazios.
    • Tudo tem destaque de sintaxe, para que você possa ver possíveis erros de sintaxe (como parênteses não balanceados ou uso de variáveis antes de serem declaradas)
    • O destaque de sintaxe permite navegação e edição rápidas do inquérito.
      • Se você clicar no nome de uma variável, será aberta uma janela (ou aba) do navegador que mostra essa pergunta e permite editá-la.
      • Se você clicar no nome de um grupo, será aberta uma janela (ou aba) do navegador mostrando a visualização de reordenação do grupo, para que você possa mover as perguntas facilmente.
      • Todos os atributos de pergunta também têm destaque de sintaxe. Isso permite definir e ver expressões nas opções avançadas de pergunta (como basear o máximo/mínimo do número/soma de valores em uma expressão)
    • O autor do EM usou uma visualização semelhante (um pouco mais limpa) para permitir que seus colaboradores epidemiologistas e o Comitê de Ética em Pesquisa validassem e autorizassem inquéritos com milhares de perguntas em entrevistas estruturadas altamente ramificadas e personalizadas

Primeiros passos

A melhor maneira de começar a usar o EM é:

  • Instalar a versão estável mais recente em http://www.limesurvey.org/en/download
  • Importar e explorar os inquéritos de exemplo.
  • Explorar os casos de uso e tutoriais e os exemplos passo a passo.
  • Explorar a documentação do EM (esta página)
  • Examinar o conjunto de testes do EM incluído
    • Em qualquer inquérito, em ferramentas, selecione a opção EM
    • Funções disponíveis lista as mais de 70 funções e a sintaxe
    • Testes unitários de expressões isoladas
      • mostra exemplos de uso de todas as funções e operadores do EM, além dos resultados em PHP e JavaScript
      • observe que existem poucas funções que geram resultados diferentes nas versões PHP e JavaScript, portanto esta página permite planejar sua lógica do EM de acordo.

Quais funcionalidades o Expression Manager expande/substitui? (LimeSurvey <= 1.91+)

Condições => Relevância

As condições controlavam quais perguntas eram visíveis. A sintaxe geral era SGQA operador Valor, como 111X2X3 == "Y". As condições podiam ser combinadas com AND ou OR, mas misturar ANDs e ORs era difícil. As próprias condições eram armazenadas em uma tabela separada, e grande parte do código do LimeSurvey era dedicada ao gerenciamento de condições. Devido ao acesso intenso ao banco de dados, o processamento de um grande número de condições podia causar problemas perceptíveis de desempenho. Além disso, depois que você atribuía condições a perguntas ou grupos, muitas vezes não era permitido reordená-los ou excluí-los.

Avaliações => Equações e micropersonalização (Micro-Tailoring)

As avaliações permitiam que os usuários criassem pontuações de escala a partir de um conjunto de perguntas. No entanto, elas não podiam mudar dinamicamente na página atual, e seus valores não eram armazenados no banco de dados.

Substituições => Micropersonalização (Micro-Tailoring)

Os usuários podiam personalizar algumas mensagens e perguntas com base em respostas anteriores. Por exemplo, uma pergunta poderia ser: {TOKEN:FIRSTNAME}, você disse que {SPORT.shown} era o seu esporte favorito. No entanto, não era possível fazer personalização condicional (como dizer "Sr." ou "Sra." dependendo do gênero da pessoa), nem conjugar verbos ou flexionar substantivos sem JavaScript sofisticado. Os autores podiam implementar inquéritos que pareciam personalizar as perguntas, mas isso exigia perguntas separadas para cada permutação e condições complexas para decidir quais perguntas exibir.

Validação

As perguntas podiam ser validadas com expressões regulares, com valores mínimos/máximos, ou usando uma resposta como valor mínimo ou máximo. No entanto, as validações não podiam se basear em cálculos com outras variáveis sem JavaScript sofisticado.

Equações

As equações não eram suportadas sem JavaScript sofisticado.

Tipo de pergunta Equação

As equações não podiam ser salvas no banco de dados (por exemplo, a pontuação final de uma avaliação) sem JavaScript sofisticado.

Como o Expression Manager substituirá/expandirá essa funcionalidade?

O Expression Manager é um novo módulo principal do LimeSurvey que facilita muito o suporte ao tipo de funcionalidade complexa que antes exigia JavaScript personalizado. Ele também está substituindo a forma como o LimeSurvey gerencia atualmente as condições e as avaliações.

Nova terminologia ao se referir ao Expression Manager (EM)

O EM "pensa" em sua funcionalidade nos seguintes termos:

  • Ramificação baseada em relevância - se uma pergunta é relevante, ela é exibida; caso contrário, não (por exemplo, fica invisível e é marcada como NULL no banco de dados). Há um novo campo de relevância para todos os tipos de pergunta e também para cada grupo (assim, você pode aplicar um conjunto de condições a um grupo inteiro sem precisar copiar a mesma condição para cada pergunta, e/ou combinar a lógica condicional do grupo e da pergunta).
  • Personalização - Depois de saber quais perguntas devem ser exibidas, a personalização (às vezes chamada de piping) especifica como a pergunta deve ser feita. Isso permite não apenas substituições simples (como {TOKEN:FIRSTNAME}), mas também a conjugação de verbos e a flexão de substantivos de acordo com o gênero ou o número dos seus participantes. Também permite alterar a mensagem exibida a um participante com base em ter respondido (ou em como respondeu) a outras perguntas.
  • Equações - O EM adiciona um novo tipo de pergunta chamado Equação, que armazena o resultado de uma expressão. Os resultados dessas equações são calculados e gravados no banco de dados, mesmo que você as oculte na página. Assim, são úteis para cálculos de pontuação ocultos, navegação baseada em equações complexas, avaliações e relatórios que devem ser gerados e ficar facilmente disponíveis no banco de dados.

Relevância e relevância em cascata

Todo tipo de pergunta agora tem uma opção de relevância que controla se a pergunta é exibida. O EM processa cada uma das equações de relevância na ordem em que devem aparecer no inquérito. Se a expressão for verdadeira (ou estiver ausente, para dar suporte a inquéritos antigos), a pergunta será exibida. Se não for relevante, a pergunta ficará oculta e o valor será definido como NULL no banco de dados. Se não houver perguntas relevantes em um grupo, o grupo inteiro será ignorado.

Além disso, se qualquer uma das variáveis de uma expressão for irrelevante, a expressão sempre resultará em falso. Isso habilita a relevância em cascata, de modo que você não precise escrever equações de relevância muito longas para cada pergunta.

Digamos que você tenha 5 perguntas, Q1-Q5, e queira exibir Q2 somente se Q1 foi respondida, Q3 somente se Q2 foi respondida, e assim por diante. As equações de relevância poderiam ser:

Código da pergunta Relevância Pergunta
Q1 1 Qual é o seu nome?
Q2 Q1 {Q1}, qual é a sua idade?
Q3 Q2 Então, você tem {Q2} anos. Você é casado(a)?
Q4 Q3 == "Y" {Q1}, há quanto tempo você é casado(a)?
Q5 Q4 Quantos filhos você tem, {Q1}?

Os cálculos de relevância também funcionam em JavaScript - assim, você poderia colocar todas as perguntas acima em uma única página e tudo continuaria funcionando como esperado. Na verdade, o EM substitui totalmente a forma como o LimeSurvey processa os formatos de inquérito por inquérito, por grupo ou por pergunta. Todos agora usam exatamente o mesmo mecanismo de navegação e, portanto, funcionam de forma idêntica, independentemente do estilo do inquérito.

Enquanto você estiver na mesma página, os dados inseridos continuarão lá, apenas ocultos. Assim, se você inserir alguma informação, depois escolher uma opção que as torne irrelevantes e, em seguida, torná-las relevantes novamente, suas respostas continuarão disponíveis. No entanto, assim que você passar para outra página, todas as respostas irrelevantes serão perdidas, para preservar a integridade do conjunto de dados.

Relevância em nível de grupo

O Expression Manager também oferece suporte à relevância em nível de grupo. Isso facilita a implementação de repetições (loops). Digamos que você queira coletar informações sobre até 10 entidades (como produtos ou pessoas de uma residência), determinando primeiro quantas entidades precisam de perguntas complementares (por exemplo, perguntando quantas pessoas moram na residência ou pedindo que marquem de quais produtos gostam em uma lista longa). Depois de saber quantas entidades precisam de acompanhamento, você pode usar relevância em nível de grupo como {count >= 1}, {count >=2}, ... {count >= 10} para cada um dos 10 grupos de perguntas complementares. Dentro de cada grupo, você pode ter lógica condicional em nível de pergunta (por exemplo, perguntas complementares específicas por gênero ou idade para cada pessoa). As equações de relevância da pergunta e do grupo são combinadas com AND para determinar o que deve ser exibido.

Personalização / Piping

Tudo o que estiver entre chaves agora é tratado como uma expressão (com uma exceção descrita abaixo). As expressões têm acesso a todos os LimeReplacementFields, a todas as variáveis (por meio de vários aliases), a todos os operadores de equação típicos (matemáticos, lógicos e de comparação) e a dezenas de funções (que funcionam dinamicamente até mesmo no lado do cliente).

Usando essas equações, você pode fazer coisas como:

  1. Exibir condicionalmente mensagens personalizadas aos respondentes com base em respostas anteriores
  2. Criar avaliações e exibir os resultados da avaliação (ou ramificar condicionalmente ou exibir mensagens) com base nesses resultados, tudo isso sem usar o módulo de avaliações em si
  3. Conjugar verbos e flexionar substantivos em perguntas, respostas e relatórios.
  4. Exibir resumos das respostas antes da página "Mostrar suas respostas" no final do inquérito

Equações

Existe um novo tipo de pergunta chamado Equação. Ele é semelhante a uma pergunta Boilerplate, exceto que armazena no banco de dados o valor do que é exibido. Assim, se o texto da pergunta Equação contiver um cálculo de avaliação, esse valor será armazenado no banco de dados em uma variável que pode ser exibida nas estatísticas públicas ou privadas.

Isso resolve uma solicitação comum: armazenar as pontuações de avaliação no banco de dados.

Sintaxe

Tudo o que estiver entre chaves agora é considerado uma expressão (com uma exceção: não deve haver espaços em branco no início ou no fim - isso é necessário para garantir que o Expression Manager não tente processar JavaScript incorporado).

Observe que as expressões podem ocupar várias linhas, desde que não haja espaço em branco após a chave de abertura ou antes da chave de fechamento. Isso é 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 Expression Manager suporta a seguinte sintaxe:
  • Todos os operadores matemáticos padrão (p. ex.: +,-,*,/,!)
  • Todos os operadores de comparação padrão (p. ex.: <,<=,==,!=,>,>=, mais estes equivalentes: lt,le,eq,ne,gt,ge)
  • Parênteses (para que você possa agrupar subexpressões)
  • Operadores condicionais (p. ex.: &&,| | e estes equivalentes: and,or)
  • Strings entre aspas simples e duplas (cada uma pode conter strings com o outro tipo de aspas)
  • Operador vírgula (permite ter uma lista de expressões e retornar apenas o resultado final)
  • Operador de atribuição (=)
  • Variáveis predefinidas (para se referir a perguntas, atributos de perguntas e respostas) - p. ex.: todos os códigos SGQA
  • Funções predefinidas (já existem mais de 70 e é fácil adicionar outras)

Operadores

A sintaxe do EM segue a precedência normal dos operadores:

Nível Operador(es) Descrição
1 () parênteses para agrupamento ou chamada de 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 E lógico
8 or OU lógico
9 = operador de atribuição
10 , operador vírgula

Aviso sobre o operador de adição (+)

Para manter a consistência entre JavaScript e PHP, o operador de adição (+) soma se ambos os operandos forem numéricos, mas concatena se ambas as partes forem strings não numéricas. No entanto, recomendamos usar a função join() para concatenação e a função sum() para adição, pois isso deixa sua intenção mais clara e evita resultados inesperados caso você esperasse strings, mas recebesse números (ou vice-versa).

Aviso sobre incompatibilidade entre número e string e comparação alfabética

Ao comparar valores com comparações relativas ou de igualdade, preste atenção à incompatibilidade de tipos. O valor digitado pelo participante ou o código de resposta selecionado pode ser usado como número se for claramente um número. Se você colocar um dos valores entre ", a comparação será forçada como texto (comparação alfabética). Se quiser comparar numericamente, nunca coloque o número entre aspas, ".

Por exemplo, Q0.NAOK > "50" é verdadeiro se Q0.NAOK for uma pergunta numérica com valor 9. Isso ocorre porque o operador > assume uma comparação alfabética e não numérica.

Para ter certeza de comparar valores inteiros, você pode usar intval(Q0.NAOK) > 50, apenas lembre-se de que, se Q0.NAOK não for um número (vazio ou uma string), então intval(Q0.NAOK) == 0. Para comparar valores de texto ("A" < "B"), use strcmp diretamente: strcmp(Q0.NAOK,"B") ou strcmp(Q0.NAOK,"A5").

Cuidado ao usar o operador de atribuição (=)

Observe que você deve evitar o uso de operadores de atribuição, a menos que seja absolutamente necessário, pois eles podem causar efeitos colaterais inesperados. Por exemplo, se você alterar o valor de uma resposta anterior, a lógica de relevância em cascata e de validação entre essa pergunta e a pergunta atual não é recalculada, e você pode acabar com dados internamente inconsistentes (p. ex.: perguntas que permanecem respondidas, mas deveriam ter sido definidas como NULL, ou perguntas que são ignoradas, mas deveriam ter sido respondidas). Em geral, se quiser atribuir um valor a uma variável, você deve criar uma pergunta do tipo Equação e usar uma expressão para definir seu valor. No entanto, há raras ocasiões em que as pessoas realmente precisam desse operador, por isso o disponibilizamos.

Para alertar você sobre esse operador, ele é exibido em fonte vermelha nas equações de sintaxe (para que você não o confunda com "==").

Usando o operador de atribuição

Os principais motivos para usar a atribuição são:

  • Você precisa definir o valor padrão de uma pergunta que não aceita valores padrão por meio de equação (como lista com botões de opção, em que a interface permite escolher uma das opções de resposta, mas não permite digitar uma equação). No entanto, tenha cuidado, pois o LimeSurvey não poderá validar se sua equação gera uma das respostas permitidas para essa pergunta.
  • Você precisa alterar à força a resposta de uma pergunta anterior com base em uma resposta posterior
  • Você precisa de uma cota complexa: usar uma pergunta oculta de escolha única para a cota e defini-la por meio de atribuição
  • etc...

Você pode usar todos os recursos do Expression Manager para essa finalidade.

  A atribuição é feita apenas em PHP. Ela não atualiza nenhum valor na mesma página, mas somente quando o participante navega com avançar, voltar, salvar ….


  Se você não usar uma pergunta de equação para essa finalidade: a atribuição é feita somente depois que a lógica da página atual for concluída. O método recomendado é sempre usar uma pergunta de equação.


Alguns exemplos:

  • Definir a resposta de uma pergunta de texto curto em minúsculas: {QCODE=strtolower(QCODE.NAOK)}
  • Definir uma resposta padrão para uma pergunta do tipo matriz no início de um inquérito: {Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
  • Definir uma resposta padrão para uma pergunta do tipo matriz 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, alguns recursos do Expression Manager não podem ser usados:

  • iniciar uma tag HTML em uma expressão, mas terminá-la em outra expressão
  • usar uma expressão complexa em uma URL.

Exemplo e solução alternativa

  • {if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")} não funciona com a segurança XSS; nesse caso, você pode usar {if(1,"<strong>information</strong>","information")}
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>; nesse caso, você pode usar uma pergunta de equação, pois usar um código de pergunta completo é permitido: <a href="/script.php?value={EQUATION.NAOK}">next</a>

Acesso às variáveis

O Expression Manager fornece acesso somente leitura a quaisquer variáveis de que possamos precisar. Para compatibilidade com versões anteriores, ele fornece acesso ao seguinte:

  • TOKEN:xxx - o valor de um TOKEN (p. ex.: TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (somente para inquéritos NÃO anônimos).
  • QCODE.shown - o valor exibido de uma resposta (p. ex.: "Sim") usando o Expression Manager.
  • Todos os valores {XXX} usados pelos temas.
  • No texto da pergunta, você pode usar {QID}, que é substituído pelo ID da pergunta, e {SGQ}, que é substituído pelo SGQA da pergunta

Além disso, o Expression Manager permite que você se refira às variáveis pelo código da pergunta (a coluna 'title' da tabela de perguntas no banco de dados). Este também é o rótulo da variável usado ao exportar seus dados para SPSS, R ou SAS. Por exemplo, se você tiver perguntas sobre nome, idade e sexo, poderá chamar essas variáveis de name, age e gender em vez de 12345X13X22, 12345X13X23 e 12345X13X24. Isso facilita para todos a leitura das equações e a validação da lógica, além de permitir reorganizar as perguntas sem precisar controlar números de grupos ou de perguntas.

Importante: só é seguro se referir a variáveis que ocorram em páginas ou perguntas anteriores.

Além disso, o Expression Manager permite acessar várias 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 ela for relevante (caso contrário, vazio), ou o valor de texto se não for uma pergunta com código {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK igual a Qcode - veja a discussão sobre NAOK {gender.NAOK} 'M'
Qcode.value o valor da avaliação para a pergunta se ela for relevante (caso contrário, vazio), ou o valor de texto se não for uma pergunta com código {gender.value} '1'
Qcode.valueNAOK igual a Qcode.value - veja a discussão sobre NAOK {gender.valueNAOK} '1'
Qcode.shown o valor exibido 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 ter sido declarada nesta página ou em outra {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 é relevante no momento (0 ou 1) {gender.relevanceStatus} 1
Qcode.relevance a equação de relevância no nível da pergunta {gender.relevance} '!is_empty(name)'
Qcode.grelevance a equação de relevância no nível do grupo {gender.grelevance} 'num_children >= 5'
Qcode.sgqa o valor SGQA desta pergunta {gender.sgqa} '1827X3X337'

Problema com o editor HTML

  Este problema foi corrigido após a versão 2.05 build 140803


Se você usar o editor HTML, alguns caracteres são substituídos por entidades HTML.

  • & por &amp;
  • < por &lt;
  • > por &gt;

Se você usar o editor HTML, precisará usar:

  • and para &
  • lt para <
  • le para <=
  • gt para >
  • ge para >=

Nomenclatura de variáveis Qcode

Veja a seguir os detalhes de como construir um Qcode (e acessar algumas propriedades) por tipo de pergunta. Em geral, os Qcodes são construídos assim:

 QuestionCode . '_' . SubQuestionCode . '_' . ScaleId

O código da pergunta secundária e o ID da escala devem ou não ser usados, dependendo do tipo de pergunta - veja a tabela abaixo. Para comentário e outros, os códigos da pergunta são QuestionCode_comment e QuestionCode_other

Tipo Descrição Código Perguntas secundárias Opções de resposta Escalas Código da resposta Resposta exibida Relevância
5 Escolha de 5 pontos (botões de opção) Q1 1-5 {Q1} {Q1.shown} {Q1==3}
B Matriz (escolha de 10 pontos) (botões de opção) Q2 L1-L6 1-10 {Q2_L2} {Q2_L2.shown} {Q2_L2==7}
A Matriz (escolha de 5 pontos) (botões de opção) Q3 1-5 1-5 {Q3_1} {Q3_1.shown} {Q3_1>=3}
1 Matriz (rótulos flexíveis) 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 (múltipla 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 (múltipla flexível) 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 padrão Q11 {Q11.shown}
D Data Q12 {Q12} {Q12.shown}
* Equação Q13 {Q13} {Q13.shown} {Q13>5}
~124~ Envio de arquivo (registra o número de arquivos carregados) Q14 {Q14} {Q14>0}
G Lista suspensa de gênero Q15 M,F {Q15} {Q15.shown} {Q15=='M'}
U Texto livre extenso Q16 {Q16} {Q16.shown} {strlen(Q16)>100}
I Pergunta de idioma Q17 {Q17} {Q17.shown} {Q17=='en'}
! Lista - Lista suspensa Q18 1-5 {Q18} {Q18.shown} {Q18==3}
L Lista suspensa/lista de botões de opção Q19 A-Z {Q19} {Q19.shown} {Q19=='X'}
O Lista com comentários, lista suspensa/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 Múltipla escolha (caixa de seleção) Q22 A-F, other {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P Múltipla escolha com comentário (caixa 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 Texto curto múltiplo 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 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'}

As variáveis reservadas 'this', 'self' e 'that'

Com frequência, você quer avaliar todas as partes de uma pergunta, como contar quantas perguntas secundárias foram respondidas ou somar as pontuações. Em outros casos, você quer processar apenas determinadas linhas ou colunas de uma pergunta (como obter as somas de linhas ou colunas e armazená-las no banco de dados). Essas variáveis reservadas tornam esse processo relativamente simples.

A variável 'this' é usada exclusivamente nas opções avançadas de pergunta "Fórmula de validação da pergunta inteira" e "Fórmula de validação da pergunta secundária". Ela é expandida para os nomes de variáveis de cada uma das células dessas perguntas. Assim, se você quiser garantir que cada entrada seja maior do que três, defina a "Fórmula de validação da pergunta secundária" como (this > 3).

As variáveis 'self' e 'that' são mais poderosas e funcionam como macros que são expandidas antes do processamento das fórmulas. As opções de sintaxe são:

  • self
  • self.suffix
  • self.sub-selector
  • self.sub-selector.suffix

suffix é qualquer um dos sufixos normais de qcode (por exemplo, NAOK, value, shown)

sub-selector é um destes:

  • comments - somente perguntas secundárias que são comentários (por exemplo, de múltipla escolha com comentário e de lista com comentários)
  • nocomments - somente perguntas secundárias que não são comentários
  • sq_X - onde X é um identificador de linha ou coluna. Somente as perguntas secundárias que correspondem ao padrão X são selecionadas. Observe que a busca é feita no identificador de código completo; assim, a correspondência sq_X inclui as perguntas secundárias nX, X e Xn (por exemplo, se você usar sq_1, as perguntas secundárias a1, 1a, 1, 11 ou 001 serã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 ...
  • nosq_X - onde X é um identificador de linha ou coluna. Somente as perguntas secundárias que não correspondem ao padrão X são selecionadas. Observe que a busca é feita no identificador de código completo; assim, a correspondência nosq_X não inclui as perguntas secundárias nX, X e Xn

Exemplos:

  • Alguma parte de uma pergunta foi respondida? {count(self.NAOK)>0}
  • Qual é a pontuação de avaliação desta pergunta? {sum(self.value)}

Você também pode usá-las para obter totais de linhas e colunas. Suponha que você tenha uma matriz de números com linhas A-E e colunas 1-5.

  • Qual é o Total Geral? {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)}

A variável 'that' é como a variável 'self', mas permite se referir a outras perguntas. Sua sintaxe é:

  • that.qname
  • that.qname.suffix
  • that.qname.sub-selector
  • that.qname.sub-selector.suffix

qname é o nome da pergunta sem nenhuma extensão de pergunta secundária. Assim, se você criar uma pergunta 'q1', esse é o seu qname

Exemplos:

  • Alguma parte da pergunta q1 foi respondida? {count(that.q1.NAOK)>0}
  • Qual é a pontuação de avaliação de q2? {sum(that.q2.NAOK)}
  • Qual é o Total Geral 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 usadas em qualquer relevância, validação ou personalização.

Uma ressalva: ao usar o recurso Mostrar arquivo de lógica, ele mostrará o valor expandido de 'self' e 'that'. Isso permite ver a fórmula real que será gerada, para que você (e o Expression Manager) possa validar se as variáveis existem. Isso pode parecer confuso, pois você pode ver fórmulas bem extensas. No entanto, se você editar a pergunta, verá a fórmula original usando 'self' e/ou 'that'

Observe também que você não deve usar essas variáveis se (a) quiser nomear explicitamente cada variável usada em uma fórmula, ou (b) usar variáveis que não têm perguntas secundárias (por exemplo, perguntas de resposta única). Nesses casos, prefixar uma variável com 'that' é exagero, e você corre o risco de obter resultados inesperados.

Uso de NAOK

NAOK --> "Não aplicável" (NA) está tudo bem (OK)

Usar NAOK significa que todas ou algumas das variáveis são irrelevantes (ou seja, "Não aplicável" (NA) está tudo bem (OK)).

Quando você coloca alguma variável de uma pergunta em qualquer fórmula: se essa pergunta (ou pergunta secundária) estiver oculta por uma condição, toda a fórmula é desativada.

Por exemplo: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) sempre retorna uma string vazia se uma pergunta secundária de Q1 estiver filtrada. Para contar o número de perguntas secundárias marcadas nessa pergunta, use count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Se a pergunta secundária estiver oculta, o Expression Manager retorna uma string vazia.

Sem NAOK: se uma pergunta ou uma pergunta secundária estiver oculta, o Expression Manager sempre retorna uma string vazia, o que equivale a retornar falso.

O .shown sempre usa o sistema NAOK (string vazia se estiver oculta), mas se você precisar do código da resposta, é sempre uma boa ideia adicionar .NAOK após o código da pergunta, exceto se você precisar do comportamento padrão e souber o que está fazendo.

Outro exemplo e mais informações estão disponíveis em Substituição de condições em cascata

Acesso a funções

O Expression Manager fornece acesso a funções matemáticas, de string e definidas pelo usuário, conforme mostrado abaixo. Ele tem equivalentes em PHP e JavaScript para essas funções, de modo que funcionam de forma idêntica no lado do servidor (PHP) e no lado do cliente (JavaScript). É fácil adicionar novas funções.

Funções implementadas

As seguintes funções estão disponíveis atualmente:

Função Significado Sintaxe
abs Valor Absoluto number abs(number)
acos Arco cosseno number acos(number)
addslashes Adiciona barras invertidas a uma string string addslashes(string)
asin Arco seno number asin(number)
atan Arco tangente number atan(number)
atan2 Arco tangente de duas variáveis number atan2(number, number)
ceil Arredonda números fracionados para cima number ceil(number)
checkdate Retorna verdadeiro (1) se for uma data válida no calendário gregoriano bool checkdate(month,day,year)
convert_value Converte um valor numérico usando uma tabela de entrada e uma tabela de saída de valores numéricos number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList)
cos Cosseno number cos(number)
count Conta o número de perguntas respondidas (preenchidas) na lista number count(arg1, arg12, ..., argN)
countif Conta o número de perguntas respondidas na lista que são iguais ao primeiro argumento number countif(matches, arg1, arg2, ... argN)
countifop Conta o número de perguntas respondidas na lista que atendem ao critério (arg op value) number countifop(op, value, arg1, arg2, ... argN)
date Formata a data/hora local string date(format [, timestamp=time()])
exp Calcula a potência de e number exp(number)
fixnum Exibe números com vírgula como separador decimal, se necessário string fixnum(number)
floor Arrendonda números fracionados para baixo number floor(number)
gmdate Formata uma data/hora GMT string gmdate(format [, timestamp=time()])
html_entity_decode Converte todas as entidades HTML em seus caracteres correspondentes (sempre usa ENT_QUOTES e UTF-8) string html_entity_decode(string)
htmlentities Converte todos os caracteres aplicáveis em entidades HTML (sempre usa ENT_QUOTES e UTF-8) string htmlentities(string)
expr_mgr_htmlspecialchars Converte caracteres especiais em entidades HTML (sempre usa ENT_QUOTES e UTF-8) string htmlspecialchars(string)
expr_mgr_htmlspecialchars_decode Converte entidades HTML especiais de volta em caracteres (sempre usa ENT_QUOTES e UTF-8) string htmlspecialchars_decode(string)
idate Formata uma data/hora local como inteiro string idate(string [, timestamp=time()])
if (Updated in 3.0.2 ) if no estilo do Excel: if(test,result_if_true[,result_if_false = ""]) if(test,result_if_true[,result_if_false = ""])
implode Une elementos de um vetor com uma string string implode(glue,arg1,arg2,...,argN)
intval Retorna o inteiro de uma variável int intval(number [, base=10])
is_empty Determina se uma variável é considerada vazia bool is_empty(var)
is_float Verifica se o tipo de uma variável é float (ponto flutuante) 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 string numérica bool is_numeric(var)
is_string Verifica se o tipo de uma variável é string bool is_string(var)
join (New in 2.0 build 130129) Une elementos em uma nova string join(arg1, arg2, ... argN)
list Retorna uma lista, separada por vírgulas, dos valores preenchidos string list(arg1, arg2, ... argN)
listifop (New in 3.16.1 ) Retorna uma lista separada por 'glue' da propriedade especificada (retProp) das perguntas da lista que atendem ao critério (cmpProp op value) string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN)
log O logaritmo do número na base informada, se fornecida, ou o logaritmo natural. number log(number,base=e)
ltrim Remove espaços em branco (ou outros caracteres) do início de uma string string ltrim(string [, charlist])
max Procura o maior valor number max(arg1, arg2, ... argN)
min Procura o menor valor number min(arg1, arg2, ... argN)
mktime Retorna 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. Você pode usar a função floor() no lugar floor(x/y)==(x/y)
nl2br Insere quebras de linha HTML antes de todas as novas linhas de uma string string nl2br(string)
number_format Formata um número com grupo de milhares string number_format(number)
pi Retorna o valor de pi number pi()
pow Expressão exponencial number pow(base, exp)
quoted_printable_decode Converte uma string quoted-printable em uma string de 8 bits string quoted_printable_decode(string)
quoted_printable_encode Converte uma string de 8 bits em uma string quoted-printable string quoted_printable_encode(string)
quotemeta Adiciona barra invertida antes de caracteres meta string quotemeta(string)
rand Gera um número aleatório, veja este exemplo int rand() OR int rand(min, max)
regexMatch Compara uma string com uma expressão regular bool regexMatch(pattern,input)
round Arredonda um número de acordo com a precisão informada number round(val [, precision])
rtrim Remove espaços em branco (ou outros caracteres) do final de uma string string rtrim(string [, charlist])
sin Seno number sin(arg)
sprintf Retorna uma string formatada string sprintf(format, arg1, arg2, ... argN)
sqrt Raiz quadrada number sqrt(arg)
stddev Calcula o desvio padrão amostral para a lista de números number stddev(arg1, arg2, ... argN)
str_pad Preenche uma string até um determinado tamanho com outra string string str_pad(input, pad_length [, pad_string])
str_repeat Repetir uma string string str_repeat(input, multiplier)
str_replace Substitui todas as ocorrências da string procurada pela string de substituição string str_replace(search, replace, subject)
strcasecmp Comparação binária segura insensível a maiúscula/minúscula int strcasecmp(str1, str2)
strcmp Comparação binária segura int strcmp(str1, str2)
strip_tags Remove as tags HTML e PHP de uma cadeia de caracteres (string) string strip_tags(str, allowable_tags)
stripos Encontra a posição da primeira ocorrência de uma string unicode, sem diferenciar maiúsculas de minúsculas (começando em 0, retorna false se não for encontrada) int stripos(haystack, needle [, offset=0])
stripslashes Tira a citação de um texto entre apóstrofos string stripslashes(string)
stristr strstr sem diferenciação de minúsculas e maiúsculas string stristr(haystack, needle [, before_needle=false])
strlen Retorna o tamanho de uma string int strlen(string)
strpos Encontra a posição da primeira ocorrência de uma string unicode (começando em 0, retorna false se não for encontrada) int strpos(haystack, needle [ offset=0])
strrev Inverte uma palavra string strrev(string)
strstr Encontra a primeira ocorrência de uma palavra string strstr(haystack, needle[, before_needle=false])
strtolower Converte uma string para minúsculas string strtolower(string)
strtotime Converte quase qualquer descrição textual de data/hora em inglês em um timestamp UNIX int strtotime(string)
strtoupper Converte uma string para maiúsculas string strtoupper(string)
substr Retorna parte de uma string unicode string substr(string, start [, length])
sum Calcula a soma de valores em um vetor number sum(arg1, arg2, ... argN)
sumifop Soma os valores das perguntas respondidas na lista que atendem ao critério (arg op value) number sumifop(op, value, arg1, arg2, ... argN)
tan Tangente number tan(arg)
time Retorna data/hora corrente do UNIX number time()
trim Remove espaços em branco (ou outros caracteres) do início e do final de uma string string trim(string [, charlist])
ucwords Converte para maiúscula o primeiro caractere de cada palavra de uma string string ucwords(string)
unique Retorna verdadeiro se todas as respostas preenchidas são únicas boolean unique(arg1, ..., argN)

Funções planejadas ou em avaliação

Outras funções planejadas (ou em avaliação), mas que ainda não foram implementadas, incluem as seguintes. Algumas delas existem para compatibilidade retroativa com outra ferramenta de inquérito.

Sintaxe Significado Comentários
e() retorna o valor de e
formatDate(X,PAT) retorna o valor em texto da data X formatada de acordo com o padrão de formato de data Java PAT
formatNumber(X,PAT) retorna o valor em texto do número X formatado de acordo com o padrão de formato de número Java PAT
getAnsOption(X) Plugin Principal ExpressionAnswerOptions
getAnsOption(X,Y) Plugin Principal ExpressionAnswerOptions
getRelevance(X) retorna a equação de relevância da pergunta X
getStartTime() retorna a data correspondente ao horário do sistema em que a entrevista foi iniciada
getType(X) retorna o nome em texto do tipo de dado - por exemplo, *NA* se isNA()
gotoFirst() salta para o primeiro conjunto de perguntas relevantes - isso viola o fluxo normal do sistema
gotoNext() salta para o próximo conjunto de perguntas relevantes - isso viola o fluxo normal do sistema
gotoPrevious() salta para o conjunto anterior de perguntas relevantes - isso viola o fluxo normal do sistema
isAsked(X) retorna verdadeiro se a resposta não for *NA*, *INVALID* nem *UNASKED*
isInvalid(X) retorna verdadeiro se a resposta for do tipo *INVALID*
isNA(X) retorna verdadeiro se a resposta for do tipo *NA*
isNotUnderstood(X) retorna verdadeiro se a resposta for do tipo *HUH*
isRefused(X) retorna verdadeiro se a resposta for do tipo *REFUSED*
isSpecial(X) retorna verdadeiro se a resposta for do tipo *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* ou *HUH*
isUnknown(X) retorna verdadeiro se a resposta for do tipo *UNKNOWN*
jumpTo(X) salta para o grupo que contém a pergunta indicada -- isso viola o fluxo normal do sistema
jumpToFirstUnasked() salta para a primeira pergunta não feita ignorando assim as perguntas já respondidas isso viola o fluxo normal do sistema
lastIndexOf(X,Y) retorna o último índice (base 0) do texto Y no texto X. Retorna -1 se Y não estiver contido em X
list(X,...) um texto contendo uma lista separada por vírgulas dos valores positivos, com "e" separando os dois últimos
mean(X,...) retorna a média de uma lista de valores
numAnsOptions(X) retorna o número de opções de resposta que a pergunta X possui
orlist(X,...) um texto contendo uma lista separada por vírgulas dos valores positivos, com "ou" separando os dois últimos
parseDate(X,PAT) retorna o valor de data do texto X interpretado com o padrão de formato de data Java PAT
parseNumber(X,PAT) retorna o valor numérico do texto X interpretado com o padrão de formato de número Java PAT
showAllResponsesExcept( questionList,attributeList,attributeTitleList) questionList = lista de identificadores de perguntas delimitada por barras verticais; attributeList = lista de atributos delimitada por barras verticais (como número da pergunta, título, texto, tipo - para que você decida o que mostrar); attributeTitleList = lista de cabeçalhos de tabela delimitada por barras verticais, para que o relatório possa ser internacionalizado.
showTheseResponses( questionList,attributeList,attributeTitleList) questionList = lista de identificadores de perguntas delimitada por barras verticais; attributeList = lista de atributos delimitada por barras verticais (como número da pergunta, título, texto, tipo - para que você decida o que mostrar); attributeTitleList = lista de cabeçalhos de tabela delimitada por barras verticais, para que o relatório possa ser internacionalizado.

O Expression Manager sabe quais variáveis são locais

Para construir corretamente o JavaScript da página, o Expression Manager precisa saber quais variáveis são definidas na página e qual é o seu ID JavaScript (por exemplo, para document.getElementById(x)). Ele também precisa saber quais variáveis são definidas em outras páginas (para garantir que os campos <input type='hidden' value='x'> necessários estejam presentes e preenchidos).

Condições em cascata

Se qualquer uma das variáveis for irrelevante, toda a equação será irrelevante (falsa). Por exemplo, na tabela a seguir, 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

Substituindo as condições em cascata

Digamos que você queira mostrar um total acumulado de todas as respostas relevantes. Você poderia tentar usar a equação {sum(q1,q2,q3,...,qN)}. No entanto, ela é traduzida internamente para LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Assim, se qualquer um dos valores q1-qN for irrelevante, a equação sempre retornará falso. Nesse caso, sum() mostrará 0 até que todas as perguntas sejam respondidas.

Para contornar isso, cada variável pode receber o sufixo ".NAOK" (significando que Não Aplicável é aceitável). Nesses casos, ocorre o seguinte comportamento. Digamos que você tenha uma variável q1.NAOK

  1. q1 não é adicionada à cláusula LEManyNA()
  2. LEMval('q1') continuará verificando se a resposta é relevante e retornará '' se não for (assim, respostas irrelevantes individuais serão ignoradas, mas não invalidarão toda a expressão).

Portanto, a solução para o problema do total acumulado é usar a equação sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).

O uso do sufixo .NAOK também permite que os autores criem inquéritos com vários caminhos possíveis que depois convergem para caminhos comuns. Por exemplo, suponha que os participantes respondam a um inquérito de maneira fora do intervalo normal de respostas. O autor poderia alertá-los de que talvez não obtenham resultados válidos e perguntar se realmente desejam continuar o inquérito. Se responderem Sim, o restante das perguntas será exibido. A condição para o "restante das perguntas" verificaria se as respostas iniciais estavam dentro do intervalo normal OU se o participante respondeu Sim à pergunta que só é relevante se ele respondeu fora do intervalo normal.

Como o Expression Manager oferece suporte à micropersonalização condicional?

Aqui está um exemplo de micropersonalização (onde Question Type=='expr' significa uma Equação):

Código da pergunta Relevância Tipo de pergunta Pergunta
name 1 text What is your name?
age 1 text How old are you?
badage !is_empty(age) expr {(age<16) or (age>80)}
agestop badage message Sorry, {name}, you are too {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for this test.
kids !badage yesno Do you have children?
parents 1 expr {!badage && kids=='Y'}
numKids parents text How many children do you have?
kid1 parents && numKids >= 1 text How old is your first child?
kid2 parents && numKids >= 2 text How old is your second child?
kid3 parents && numKids >= 3 text How old is your third child?
kid4 parents && numKids >= 4 text How old is your fourth child?
kid5 parents && numKids >= 5 text How old is your fifth child?
sumage 1 expr {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
report parents yesno {name}, you said you are {age} and that you have {numKids}. The sum of ages of your first {min(numKids,5)} kids is {sumage}

Todas essas perguntas podem estar em uma única página (por exemplo, no mesmo grupo), e somente as perguntas relevantes serão exibidas. Além disso, à medida que você insere as idades dos filhos, a expressão sum() da última pergunta será atualizada dinamicamente na página.

O Expression Manager oferece essa funcionalidade envolvendo cada expressão em um elemento <span> nomeado. Sempre que um valor muda, ele recalcula a expressão que deve aparecer nesse elemento <span> e regenera a exibição. Você pode ter dezenas, ou até centenas, dessas expressões personalizadas na mesma página, e a página exibirá todas elas novamente em uma única atualização de tela.

Mapeamento das funcionalidades do LimeSurvey 1.91+ para o Expression Manager

Recurso antigo Novo recurso Comentários
Condições Relevância Você pode usar equações condicionais muito complexas e acessar uma gama mais ampla de variáveis
Avaliações Equação Qualquer pontuação de avaliação pode ser reestruturada como uma Equação. Isso garante que a pontuação seja gravada no banco de dados e também permite ver alterações dinâmicas no valor da pontuação na página atual
Substituições Expression Manager O mecanismo principal recebe o texto de entrada e trata tudo o que estiver entre chaves como uma Expressão - assim, ele lida com todos os tipos históricos de substituição. Para não atrapalhar o JavaScript incorporado, o Expression Manager só processa o conteúdo entre chaves desde que (a) não haja espaço em branco no início ou no fim dentro das chaves - por exemplo, {expr} é uma expressão, mas { expr}, {expr } e { expr } não são expressões. Além disso, o Expression Manager não processa o conteúdo dentro de suas próprias strings (por exemplo, {list('hi','there {braces}')} gera "hi there {braces}"). Ele também ignora chaves com escape (por exemplo, \{this is not an expression\})
Validação Expression Manager O plano é pegar os atuais Atributos da questão de mínimo/máximo e fazer com que o Expression Manager os processe. Dessa forma, os valores de mínimo/máximo podem ser eles próprios expressões

Realce de sintaxe

Para ajudar na inserção e na validação de expressões, o EM oferece realce de sintaxe com os seguintes recursos:

Tipos e significados do realce de sintaxe

Cor Exemplo Significado Dica de ferramenta Comentários
fundo bege Sample a equação inteira nenhuma Qualquer coisa entre chaves que seja reconhecida como uma equação (por exemplo, sem espaço em branco no início ou no fim) será destacada com fundo bege para distingui-la do texto ao redor
texto vermelho em negrito Sample Um erro Alguma explicação sobre o erro Pode ser uma variável desconhecida ou um erro em uma função, .... O inquérito pode ficar totalmente quebrado; isso não é mostrado ao usuário público.
texto azul Sample nome de função significado e sintaxe permitida nomes de funções, ou itens que deveriam ser funções por serem seguidos de um parêntese de abertura, são apresentados em texto azul em negrito. As dicas de ferramenta mostram o significado e a sintaxe permitida da função.
texto cinza Sample string nenhuma strings entre aspas simples e duplas são mostradas em texto cinza
texto ciano Sample variável definida na mesma página, [nome ou código SGQA]: pergunta; valor; lista de respostas mostrando os códigos de cada valor Qualquer variável definida na mesma página da pergunta atual é mostrada em texto ciano, indicando que pode ser atualizada em JavaScript. A dica de ferramenta mostra seu nome, a pergunta em si e seu valor atual (ou vazio, se não definido). Se o tipo de pergunta espera respostas de um conjunto de valores enumerados, é mostrado o mapeamento dos códigos para os valores exibidos.
texto verde Sample variável definida em uma página anterior [nome ou código SGQA]: pergunta; valor; lista de respostas mostrando os códigos de cada valor Qualquer variável definida em uma página anterior é mostrada em texto verde em negrito. A dica de ferramenta mostra seu nome, a pergunta em si e seu valor atual (ou vazio, se não definido). Se o tipo de pergunta espera respostas de um conjunto de valores enumerados, é mostrado o mapeamento dos códigos para os valores exibidos.
texto rosa em negrito Sample variável definida em uma página posterior em geral: vazia no início do inquérito, mas pode ser preenchida pelo índice ou ao voltar [nome ou código SGQA]: pergunta; valor; lista de respostas mostrando os códigos de cada valor Qualquer variável definida em uma página seguinte é mostrada em texto rosa em negrito. A dica de ferramenta mostra seu nome, a pergunta em si e seu valor atual (ou vazio, se não definido). Se o tipo de pergunta espera respostas de um conjunto de valores enumerados, é mostrado o mapeamento dos códigos para os valores exibidos.
texto marrom em negrito Sample um valor de substituição do Lime o valor As strings de substituição do Lime (como {TOKEN:xxx}, {PRIVACY_MESSAGE}) são mostradas em texto marrom em negrito.
texto vermelho Sample operador de atribuição (=) mensagem de aviso Se você usar um operador de atribuição (=), ele será exibido em texto vermelho. Isso serve para evitar a reatribuição acidental de valores quando você realmente queria verificar se a == b, em vez de definir o valor a = b.
texto preto normal Sample pontuação nenhuma Toda a outra pontuação dentro da expressão é mostrada em texto preto normal.
texto em caixa vermelha uma linha vermelha em negrito envolve o erro erro de sintaxe descrição do erro Qualquer erro de sintaxe detectado é mostrado envolvendo o erro com uma caixa vermelha. A dica de ferramenta mostra o erro. Exemplos incluem parênteses sem correspondência, uso de funções indefinidas, passagem de um número errado de argumentos para funções, expressões mal estruturadas (por exemplo, operadores ausentes entre variáveis), tentativa de atribuir um novo valor a uma variável somente leitura, tentativa de atribuir valores a não variáveis ou uso de Sintaxe não suportada. Observe que o sistema de detecção de erros de sintaxe pode relatar apenas um erro em uma expressão, mesmo que haja vários; no entanto, se algum erro for detectado, pelo menos um será mostrado.

Leitura adicional

Inquéritos de exemplo do Expression Manager

Casos de uso e tutoriais

Exemplos passo a passo

Funções estatísticas do Expression Manager

Referência para desenvolvedores

Roteiro/Status/Lista de tarefas