Inquéritos de exemplo do ExpressionScript
From LimeSurvey Manual
Introdução
A melhor forma de aprender a utilizar o ExpressionScript é experimentar exemplos funcionais e adaptá-los às suas necessidades.
Abaixo encontra um conjunto de inquéritos de exemplo que demonstram (e permitem 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 inquirido. Veja abaixo as funcionalidades demonstradas neste exemplo.
Funcionalidades do EM demonstradas
- Relevância - suporte para lógica condicional avançada;
- Piping / Personalização - permite encadear 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.
- Microp ersonalizaçã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 seu peso e altura para determinar se tem peso a menos, peso normal, excesso de peso ou obesidade. Repare que, inicialmente, só são apresentadas 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 próximos exemplos pode ver como utilizar funções matemáticas e outras em relatórios personalizados. Esta é a aparência da página antes de introduzir quaisquer dados. Existe lógica condicional para mostrar células em branco 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 efetuado e o respetivo resultado.

Há 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 de Relevância dinâmica. Como indica o texto de ajuda, experimente diferentes idades e, sobretudo, 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 personalizar facilmente frases para que correspondam ao género e/ou ao número dos seus participantes. Pode até conjugar verbos e declinar 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 usar 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 evitar que a mensagem de conclusão seja apresentada 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 - 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 depois de as anteriores serem respondidas.
Capturas de ecrã
O inquérito gera um relatório personalizado com 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 estrutura de um inquérito cedido por Joy Lane Research, LLC.
Capturas de ecrã
No exemplo seguinte, tenha em atenção que:
- A P02 só mostra o conjunto de produtos marcados na P01 (através de array_filter)
- A P02 mostra também "Another product", o texto introduzido no campo "Other electronic" da P01
- A P04 só mostra os produtos da P02 que foram marcados (pelo que o filtro de tabela funciona em cascata)
- A P05 só mostra os produtos da P02 que não foram marcados na P02 (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 está sozinho. Embora a documentação principal descreva como compor os nomes das variáveis Qcode, nada melhor do que vê-lo numa demonstração funcional. Este inquérito mostra como pode aceder aos atributos e às respostas das perguntas através do ExpressionScript.
Conteúdo
- Exemplos de todos os tipos de pergunta
- Todos os tipos de pergunta que podem utilizar "Outro" estão incluídos 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 todos os 16 sufixos de notação de ponto do EM disponíveis.
- Estes relatórios mostram todos os dados introduzidos até ao momento (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 de todas as variáveis
Capturas de ecrã
Este é um inquérito enorme, por isso optámos por não incluir capturas de ecrã. Em vez disso, transfira-o e experimente.
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 (voltando a desaparecer quando 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 participante não pode submeter uma página com erros de validação. Será avisado imediatamente se introduzir informação incorreta:

A validação pode ser aplicada a células individuais de uma tabela, como neste exemplo, em que 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, precisa de uma validação personalizada que não pode ser obtida com os critérios tradicionais de mínimo/máximo. Para isso, terá de utilizar as opções em_validation_q e em_validation_sq, que lhe 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 toda a pergunta é 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 passa a vermelho para indicar que existe um erro.
Capturas de ecrã

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

No exemplo abaixo, 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)
Pode também escrevê-la da seguinte forma; o LimeSurvey converte-a automaticamente, em tempo de execução, na expressão acima indicada.
(sum(self.sq_A) <= 3) && (sum(self.sq_B) <= 3) && (sum(self.sq_C) <= 3)

Transferência
Para transferir o exemplo de inquérito utilizado nos exemplos acima, clique na seguinte hiperligação: ls2_test_em_sq_validation.lss.
Relevância das 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 a apresentação dinâmica 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 marcamos a "Quinta pergunta secundária" na primeira pergunta "Which rows should appear below". Repare que a soma da segunda pergunta "Enter some numbers" passa a ser 5. Embora a pergunta secundária 5 dessa pergunta ainda tenha o valor 14 (por exemplo, se desmarcar a quinta pergunta secundária, verá novamente o valor 14), esse valor não contribui para a soma, uma vez que é atualmente irrelevante. Todos os dados irrelevantes são apagados (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 quanto às respostas.

Transferência
Para transferir o nosso exemplo, clique aqui: ls2_subquestion_relevance.lss.
Utilização da vírgula como separador decimal (ponto decimal)
Visão geral
O ExpressionScript garante que apenas números válidos possam ser introduzidos 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 funcionarão 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) [;], quando se utiliza o atributo numbers_only
- Lista (Botões de opção) [L], quando se utiliza o atributo other_numbers_only
- Texto livre curto [S], quando se utiliza o atributo numbers_only
- Textos curtos múltiplos [Q], quando se utiliza o atributo numbers_only
- Escolha múltipla [M], quando se utiliza o atributo other_numbers_only
- Escolha múltipla com comentários [P], quando se utiliza o atributo other_numbers_only
Capturas de ecrã
Pode observar nas capturas de ecrã abaixo 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á a Q1, a Q4 ou a Q7. A segunda pergunta aleatorizada da página será a Q2, a Q5 ou a 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 intacta.

Transferência
Para transferir o exemplo acima, clique na seguinte hiperligação: Randomization_Group_Test.lss
Fazer 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. Logo 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 todo o inquérito de uma vez, 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; contudo, 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 for o caso, 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 num grupo.
Fazer 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 existentes 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 no carregamento da página. A cada pergunta é atribuída uma equação de relevância que determina que a soma do "relevanceStatus" de todas as outras perguntas do grupo seja 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 com 5 perguntas aleatórias em 10.
Classificação de uma lista de produtos introduzida pelo utilizador
Visão geral
O exemplo seguinte mostra como pode pedir aos utilizadores que listem um conjunto de produtos que lhes interessam e, em seguida, que os classifiquem.
Funcionalidades do ExpressionScript 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, como apenas os produtos 1, 3 e 5 foram selecionados, apenas 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 são especificadas as respostas personalizadas:

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