Inquéritos de exemplo do Expression Manager
From LimeSurvey Manual
Introdução
A melhor forma de aprender a utilizar o ExpressionScript é experimentar exemplos funcionais e modificá-los de acordo com as suas necessidades.
Encontrará abaixo um conjunto de inquéritos de exemplo para demonstrar (e testar) como o EM pode ser utilizado para melhorar o seu inquérito. Estes inquéritos encontram-se na pasta /docs/demosurveys da distribuição.
Relevância, personalização e equações
Descrição geral
O exemplo seguinte calcula o IMC (Índice de Massa Corporal) de cada participante. Veja abaixo as funcionalidades demonstradas neste exemplo.
Funcionalidades do EM demonstradas
- Relevância - suporte para lógica condicional avançada;
- Piping / Personalização - permite inserir ou personalizar respostas e metadados das perguntas;
- Personalização dinâmica - repare que os relatórios são alterados na página à medida que responde às perguntas.
- Micropersonalização - personalização condicional dentro de frases e relatórios através de instruções if()
- Equações - um novo tipo de pergunta que permite efetuar cálculos e guardar os resultados na base de dados, mesmo que o cálculo esteja oculto
- Validação condicional - os critérios de validação, como o valor mínimo permitido, podem ser condicionais - por exemplo, com base em equações.
Capturas de ecrã
Este exemplo calcula o Índice de Massa Corporal, um cálculo baseado no peso e na altura para determinar se tem excesso de peso. Repare que, inicialmente, apenas vê as quatro perguntas obrigatórias:

Depois de introduzir os seus dados (e de escolher se pretende utilizar unidades métricas ou não métricas), é apresentado um relatório personalizado que resume o que introduziu e indica o seu estado de peso:

Eis um exemplo diferente, com unidades não métricas, para mostrar como o resultado muda dinamicamente:

Existem perguntas do tipo Equação ocultas a nível interno que convertem os dados para o sistema métrico (se necessário), guardando na base de dados a altura, o peso, o IMC e o estado de peso em unidades métricas, sem necessidade de JavaScript personalizado.
Nos exemplos seguintes pode ver como utilizar funções matemáticas e outras funções dentro de relatórios personalizados. Esta é a aparência da página antes de introduzir quaisquer dados. Existe lógica condicional para mostrar células vazias se não forem introduzidos dados (ou se forem não numéricos), em vez de mostrar "NaN" ou "Divide by Zero".

À medida que os números são introduzidos, o relatório na página muda para mostrar o cálculo que está a ser efetuado e o respetivo resultado.

Existem muitos outros exemplos neste inquérito de exemplo. Por exemplo, a captura de ecrã abaixo mostra uma das dezenas de formas de preencher a página Relevância dinâmica. Como indica o texto de ajuda, experimente idades diferentes e, em especial, combinações ilógicas de respostas para ver as mensagens divertidas geradas na parte inferior. Repare também que, se indicar que tem mais do que um filho, a mensagem dirá "I hope you enjoy playing with your X children", em vez de "I hope you enjoy playing with your child". Isto mostra como pode micropersonalizar facilmente as frases para que correspondam ao género e/ou ao número dos seus participantes. Pode até conjugar verbos e flexionar nomes facilmente com base no género e no número.

Transferência
Para aceder ao inquérito de exemplo, clique na seguinte hiperligação: LS3_em_tailoring.zip.
Recenseamento de exemplo
Descrição geral
Este é um exemplo de recenseamento que pergunta quantas pessoas existem no seu agregado familiar.
Demonstra como a relevância ao nível do grupo pode facilitar a implementação de um "ciclo" de perguntas. Depois de criar o grupo para a Pessoa 1, exportei o grupo. Como utilizei nomes de variáveis qcode, como p1_name, em vez do código SGQA, pude utilizar um editor de texto para editar e reimportar rapidamente o grupo várias vezes (por exemplo, demorou cerca de 10 segundos a editar e reimportar cada grupo repetido, garantindo que todas as variáveis tinham nomes únicos e que a lógica ao nível do grupo estava correta).
Também pode utilizar a funcionalidade Copiar pergunta, mas não será tão rápido como a opção sugerida acima.
Isto mostra também como pode impedir que a mensagem de conclusão apareça até que o inquérito esteja realmente concluído (por exemplo, quando todos os grupos necessários estiverem preenchidos).
Funcionalidades do EM demonstradas
- Relevância ao nível do grupo - Os grupos seguintes (Pessoa 1-5) só são apresentados até ao número de coabitantes indicado;
- Personalização (tailoring) - O relatório final resume os dados demográficos de cada coabitante;
- Apresentação progressiva de perguntas - Quer no modo grupo a grupo quer no modo tudo numa página, as perguntas seguintes só são apresentadas assim que as anteriores forem respondidas.
Capturas de ecrã
O inquérito gera um relatório personalizado que mostra os dados demográficos do número de coabitantes indicado:

Se mudar para o modo pergunta a pergunta, verá que o índice personaliza as perguntas. Como o utilizador indicou que a pessoa é uma mulher, é perguntado "Qual é o nome dela?". E, como respondemos "Mary", a pergunta seguinte é "Que idade tem a Mary?".

Transferência
Para transferir o exemplo de inquérito, clique aqui: LS3_group_relevance.zip.
Filtros de tabela em cascata
Descrição geral
Este inquérito baseia-se na conceção de um inquérito cedido por cortesia da Joy Lane Research, LLC.
Capturas de ecrã
Tenha em atenção o seguinte:
- A Q02 só mostra o conjunto de produtos marcados na Q01 (através de array_filter)
- A Q02 mostra também "Outro produto", o texto introduzido no campo "Outro eletrónico" da Q01
- A Q04 só mostra os produtos da Q02 que foram marcados (por isso o filtro de tabela atua em cascata)
- A Q05 só mostra os produtos da Q02 que não foram marcados na Q02 (através de um array_filter_exclude em cascata)


Transferência
Clique na seguinte hiperligação para transferir o exemplo acima: Exemplo de inquérito LS2_cascading_array_filter.
Piping/Personalização com todos os tipos de pergunta e atributos
Descrição geral
Se tem dúvidas sobre como nomear as suas variáveis (SGQA vs. Qcodes), não é o único. Embora a documentação principal descreva como compor os nomes das variáveis Qcode, nada melhor do que ver uma demonstração em funcionamento. Este inquérito mostra como pode aceder a atributos de perguntas e a respostas utilizando o ExpressionScript.
Conteúdo
- Exemplos de todos os tipos de pergunta
- Estão incluídos todos os tipos de pergunta que podem utilizar "outro", para que possa ver como isso afeta a nomenclatura das variáveis
- Valores predefinidos para todos os tipos de pergunta que aceitam valores predefinidos
- Personalização - Relatórios dentro e fora da página que mostram os 16 sufixos de notação com ponto do EM disponíveis.
- Estes relatórios mostram todos os dados atualmente introduzidos (mostrando como pode gerar os seus próprios relatórios imprimíveis para os utilizadores, em vez do ecrã de impressão de respostas)
- Nomenclatura correta de Qcode e SGQA em todas as variáveis
Capturas de ecrã
Este é um inquérito enorme, pelo que optámos por não incluir capturas de ecrã. Em vez disso, transfira-o e experimente-o.
Transferência
Clique na seguinte hiperligação para transferir o inquérito: LS3_EM_question_attributes.lss
Validação tradicional, reinventada
Visão geral
Este exemplo demonstra todos os tipos de validação que utilizam expressões e como afetam cada um dos tipos de pergunta que suportam validação. Em muitos casos, as dicas de validação começam ocultas e só aparecem se uma pergunta não cumprir os critérios de validação (desaparecendo novamente assim que a pergunta passa a cumprir esses critérios).
Tipos de validação demonstrados
- min_num_value_n - valor mínimo para uma resposta
- max_num_value_n - valor máximo para uma resposta
- min_answers - número mínimo de respostas exigidas
- max_answers - número máximo de respostas permitidas
- multiflexible_min - valor mínimo permitido para uma resposta (para o tipo de pergunta de números multiflexíveis)
- multiflexible_max - valor máximo permitido para uma resposta (para o tipo de pergunta de números multiflexíveis)
- min_num_value - soma mínima permitida de todas as respostas da pergunta
- max_num_value - soma máxima permitida de todas as respostas da pergunta
- equals_num_value - a soma de todas as respostas da pergunta tem de ser igual a este valor
- validation - esta é a validação por expressão regular da pergunta - pode aplicar-se a células individuais
Capturas de ecrã
Com os novos estilos CSS, cada tipo de validação apresenta uma dica separada. Se forem apresentadas, podem ser ocultadas através da opção hide_tip. Por predefinição, são apresentadas com tipo de letra vermelho se a pergunta não cumprir os critérios de validação e verde se os cumprir:

Um utilizador não pode submeter uma página com erros de validação. Será imediatamente avisado se tiver introduzido informações incorretas:

A validação pode ser aplicada a células individuais de uma tabela, como neste exemplo em que as validações por expressão regular garantem que cada entrada é um número de telefone dos EUA corretamente formatado, incluindo o indicativo de área.

Transferência
Para transferir o exemplo acima, clique na seguinte hiperligação: LS3_Validation_tests.zip.
Equações de validação
Visão geral
Por vezes, é necessária uma validação personalizada que não pode ser conseguida com os critérios tradicionais de mínimo/máximo. Para isso, terá de utilizar as opções em em_validation_q e em_validation_sq, que permitem construir equações de validação complexas ao nível da pergunta e da pergunta secundária, respetivamente.
Funcionalidades do EM demonstradas
- em_validation_q - esta é uma equação que determina se a pergunta completa é válida
- em_validation_q_tip - esta é a mensagem a apresentar se a pergunta não cumprir os critérios de em_validation_q
- em_validation_sq - esta é a equação que determina se cada pergunta secundária (célula da tabela) é válida
- em_validation_sq_tip - esta é a mensagem a apresentar se alguma das perguntas secundárias for inválida.
Em geral, quando se utiliza em_validation_sq, se alguma célula for inválida, a cor de fundo dessa célula fica vermelha para indicar que existe um erro.
Capturas de ecrã

Esta pergunta garante que as idades dos seus filhos são introduzidas por ordem decrescente, aplicando esta equação de validação:
q1_sq1 >= q1_sq2 && q1_sq2 >= q1_sq3 && q1_sq3 >= q1_sq4

No exemplo seguinte, a validação garante que não são respondidas mais de 3 perguntas em cada linha, aplicando esta equação de validação:
(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= 3) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= 3) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= 3)
Também pode escrever da seguinte forma; o LimeSurvey converte-a automaticamente, em tempo de execução, na expressão apresentada acima.
(sum(self.sq_A) <= 3) && (sum(self.sq_B) <= 3) && (sum(self.sq_C) <= 3)

Transferência
Para transferir o inquérito de exemplo utilizado nos exemplos acima, clique na seguinte hiperligação: ls2_test_em_sq_validation.lss.
Relevância de perguntas secundárias
Visão geral
Este exemplo mostra como o array_filter e os critérios de validação podem interagir. Nas validações que se aplicam a somas, apenas são considerados os valores relevantes (visíveis).
Funcionalidades do EM demonstradas
Mostra também o relatório dinâmico do número de perguntas respondidas nas perguntas principais.
Capturas de ecrã
Alterar o número de linhas visíveis altera dinamicamente a soma. Marcar uma pergunta secundária como irrelevante não apaga o seu valor. Em vez disso, se for irrelevante, os seus valores não contribuem para nenhuma equação.


Repare no que acontece quando assinalamos a "Quinta pergunta secundária" da primeira pergunta "Which rows should appear below". Note que a soma da segunda pergunta "Enter some numbers" é agora 5. Apesar de a pergunta secundária 5 dessa pergunta ainda ter o valor 14 (por exemplo, se desmarcar a quinta pergunta secundária, voltará a ver o valor 14), esse valor não contribui para a soma, uma vez que é atualmente irrelevante. Todos os dados irrelevantes são limpos (definidos como NULL na base de dados) ao submeter, mas permanecem disponíveis na página, caso os participantes queiram ou precisem de mudar de ideias sobre as respostas.

Transferência
Para transferir o nosso exemplo, clique aqui: ls2_subquestion_relevance.lss.
Utilizar a vírgula como separador decimal (ponto decimal)
Visão geral
O ExpressionScript garante que apenas é possível introduzir números válidos em campos numéricos. Se introduzir um número inválido, será avisado de que algo está errado (por exemplo, no caso do tema fruity, toda a pergunta fica a vermelho).
Note que os valores numéricos são sempre convertidos para utilizar um ponto como separador decimal na base de dados. Desta forma, as análises estatísticas funcionam corretamente.
Para alterar o separador decimal, aceda às opções de Elementos de texto, localizadas no separador Configurações, e procure a funcionalidade Separador decimal.
Tipos de pergunta que utilizam o separador decimal
- Entrada numérica [N]
- Entrada numérica múltipla [K]
- Matriz (Números) [:]
- Matriz (Textos) [;], ao utilizar o atributo numbers_only
- Lista (Botões de opção) [L], ao utilizar o atributo other_numbers_only
- Texto livre curto [S], ao utilizar o atributo numbers_only
- Textos curtos múltiplos [Q], ao utilizar o atributo numbers_only
- Escolha múltipla [M], ao utilizar o atributo other_numbers_only
- Escolha múltipla com comentários [P], ao utilizar o atributo other_numbers_only
Capturas de ecrã
Nas capturas de ecrã abaixo, pode observar que a vírgula pode ser utilizada como separador decimal.

Transferência
Para transferir o exemplo acima, clique na seguinte hiperligação: ls2_comma_as_radix_separator.lss.
Grupos de aleatorização
Visão geral
Este inquérito demonstra como utilizar o atributo random_group.
Se este atributo for utilizado, a ordem das perguntas é aleatorizada sempre que iniciar o inquérito. No entanto, depois de o inquérito ser iniciado, a ordem de aleatorização mantém-se fixa, mesmo que mude de idioma.
Capturas de ecrã
Vejamos em conjunto o exemplo abaixo. A primeira pergunta aleatória da página será Q1, Q4 ou Q7. A segunda pergunta aleatorizada da página será Q2, Q5 ou Q8.

Esta é a aleatorização gerada na primeira vez que testei este inquérito.

Foi gerada uma aleatorização diferente na segunda vez que testei o inquérito.

No entanto, quando mudei para francês (sem reiniciar o inquérito), a ordem de aleatorização manteve-se inalterada.

Transferência
Para transferir o exemplo acima, clique na seguinte hiperligação: Randomization_Group_Test.lss
Perguntar aleatoriamente uma pergunta por grupo
Visão geral
Este inquérito mostra como pode configurar um inquérito para apresentar aleatoriamente uma pergunta por grupo. Existem 5 grupos de 6 perguntas cada. No início, no Grupo 0, são preenchidas cinco perguntas de Equação ocultas, chamadas ask1-ask5. Cada uma tem o valor {floor(rand(1,6.9999))} no campo Texto da pergunta, o que significa que as variáveis ask1-ask5 terão cada uma um valor entre 1 e 6. Depois, cada pergunta do grupo tem uma equação de relevância como "ask1==N", em que N é a N-ésima pergunta do grupo (assim, a terceira pergunta do grupo 1 tem a equação de relevância "ask1==3").
Este inquérito funciona igualmente bem nos modos inquérito completo, grupo por grupo e pergunta a pergunta. Como a aleatorização é definida no primeiro grupo, e esse grupo está efetivamente oculto (uma vez que todas as perguntas ask1-ask5 estão ocultas), a aleatorização mantém-se igual para o participante; no entanto, cada participante diferente terá uma aleatorização distinta.
Funcionalidades demonstradas
- Tipo de pergunta Equação
- Funções de aleatorização
- Função condicional (if)
Capturas de ecrã
Este é o Grupo0, que utiliza o tipo de pergunta Equação para selecionar valores aleatórios de 1 a 6 para cada grupo (exceto o último grupo, que tem apenas 4 perguntas). Repare que a função "if()" verifica primeiro se ask1 já foi definida e, se sim, utiliza esse valor. Se o valor ainda não tiver sido definido, utiliza um valor aleatório para definir o valor de ask1.

Este grupo mostra como a variável (ask4) do Grupo0 é utilizada para controlar qual a pergunta visível no quarto grupo.

Transferência
Para transferir o exemplo de inquérito acima, clique aqui: Exemplo de inquérito com perguntas aleatórias dentro de um grupo.
Perguntar aleatoriamente um número específico de perguntas num grupo (um subconjunto das perguntas)
Visão geral
Este inquérito mostra como apresentar um subconjunto aleatório de perguntas num grupo. Por exemplo, mostrar 5 perguntas aleatórias de entre 10 perguntas localizadas num grupo.
O inquérito tem um grupo com 10 perguntas. A todas as perguntas é atribuído o mesmo nome do grupo com aleatoriedade. Como resultado, serão apresentadas por ordem aleatória quando a página for carregada. A cada pergunta é atribuída uma equação de relevância segundo a qual a soma do "relevanceStatus" de todas as outras perguntas do grupo é menor do que o número de perguntas que pretende mostrar. Como o relevanceStatus é atribuído à medida que as perguntas são apresentadas, isto corresponde, na prática, ao total das perguntas anteriores.
Assim, no nosso exemplo de 5 em 10, a equação para a Q1 seria:
sum(Q2.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
Para a Q2, seria:
sum(Q1.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
E assim sucessivamente...
Funcionalidades demonstradas
Transferência
Para transferir o exemplo acima, clique na seguinte hiperligação: exemplo de inquérito Random 5 out of 10.
Classificação de uma lista de produtos introduzida pelo utilizador
Visão geral
O exemplo abaixo mostra como pode pedir aos utilizadores que indiquem um conjunto de produtos que lhes interessam e, de seguida, que classifiquem esses produtos.
Funcionalidades do EM demonstradas
- Personalização de respostas - ao classificar produtos, as etiquetas provêm do campo de comentário da pergunta de escolha múltipla anterior
- Personalização de escalas - muitas opções avançadas das perguntas, como os cabeçalhos das escalas, também podem ser personalizadas.
Capturas de ecrã
Esta imagem mostra que, embora apenas os produtos 1, 3 e 5 tenham sido selecionados, só esses 3 são apresentados (através do atributo array_filter). Além disso, as etiquetas das linhas na segunda pergunta são os números dos produtos (se nada for introduzido no campo de comentário) ou o conteúdo dos campos de comentário.

Esta imagem mostra como as respostas personalizadas são especificadas:

Aqui está o ficheiro de lógica apresentado para essa pergunta, que nos permite verificar se a lógica condicional funciona como pretendido (por exemplo, para ver se existem erros de sintaxe):

A imagem seguinte mostra um grupo no qual especifica uma escala de classificação de 5 pontos (opções 1-5), o título da escala e os produtos que pretende classificar. A última pergunta mostra que cada uma das partes da pergunta do tipo tabela pode ser personalizada:

A imagem seguinte mostra a vista do ficheiro de lógica da última pergunta. Como pode observar, as subperguntas, as respostas e os cabeçalhos da escala podem ser personalizados.

Transferência
Para transferir o exemplo de inquérito acima, clique na seguinte hiperligação: exemplo de inquérito de classificação de uma lista de produtos introduzida pelo utilizador.