Crie um botão para adicionar e remover uma seção

Em designs de formulário interativos, é comum ter uma ou mais seções no formulário que são exibidas somente quando o usuário seleciona a opção para incluí-las. Com o Designer, é possível adicionar um botão com um script que adiciona ou remove dinamicamente uma seção específica (subformulário) no formulário quando o usuário clica nesse botão.

Por exemplo, na amostra do formulário interativo Pedido de compra, o usuário pode clicar no botão Adicionar comentários para exibir a seção comentários (subformulário comments). Esse botão apresenta uma ou duas legendas alternadas, Adicionar comentários ou Limpar comentários, dependendo do estado atual do subformulário. Sempre que ele é clicado, o script verifica se o subformulário comments é ou não exibido e, em seguida, atualiza a respectiva legenda.

O botão aciona um script que usa instanceManager, o objeto de Modelo de objeto de formulário XML que gerencia a criação, a remoção e a movimentação de instâncias de objetos de formulário. Quando o usuário final exclui o subformulário comments, o objeto instanceManager o remove do DOM (Modelo de objeto de documento) de formulários e do DOM de dados.

Observe que o instanceManager usa quatro métodos: addInstance, removeInstance, moveInstance e setInstances. A convenção de nomenclatura de instanceManager é o nome do subformulário prefixado com um sublinhado (_subformname). A sintaxe para instanceManager é _subformname.methodname().

Na amostra de formulário interativo de Pedido de compra, o autor do formulário digitou o seguinte script JavaScript no Editor de scripts usando o método setInstances para adicionar e remover o subformulário comments e alterar a legenda do botão. Observe que a propriedade comments.count == 0 retorna o número de instâncias de subformulário ativadas.

// Invoke the Instance Manager to add and remove the comments subform. 
 
if (_comments.count == 0) {// The count property specifies the current number      
                                            // of instances instantiated. 
    _comments.setInstances(1);                                                // Add the comments subform. 
    this.resolveNode("caption.value.#text").value = "Clear Comments";                                                                                                            // Change the button's caption. 
} 
 
else { 
    _comments.setInstances(0);                                                // Remove the comments subform. 
    this.resolveNode("caption.value.#text").value = "Add Comments";                                                                                                            // Change the button's caption. 
}
Você também pode usar a caixa de diálogo ActionBuilder no menu Ferramentas para criar recursos interativos comuns nos formulários com layout flutuante, sem gravar scripts.

Crie botões Adicionar e Excluir

A inclusão de botões em um formulário interativo fornece aos usuários finais uma maneira de iniciar uma ação, por exemplo, adicionar e excluir instâncias de subformulários que definam seções, como linhas de item, em um formulário de pedido.

Também é possível adicionar uma dica de ferramenta ao botão Excluir para exibir as palavras “Excluir item” quando o usuário posicionar o cursor sobre o botão. O uso de botões Excluir separados é uma boa maneira de permitir que os usuários removam linhas específicas do formulário.

Por exemplo, a amostra de formulário interativo de Pedido de compra tem um botão Adicionar item e um botão Excluir rotulado como “X” para cada subformulário detail. Quando o usuário clica no botão Adicionar item, um script adiciona uma linha de item. Por outro lado, quando esse usuário clica em um dos botões Excluir, um script exclui a linha de item associada.

Você também pode usar a caixa de diálogo Action Builder no menu Ferramentas para criar recursos interativos comuns nos formulários com layout flutuante, sem gravar scripts. Consulte Como criar ações nos formulários.

Botão Adicionar item

O seguinte script JavaScript no evento click do botão Adicionar Item permite que os usuários adicionem uma linha de item à amostra de formulário interativo de Pedido de compra. Esse script também recalcula o formulário de forma que o campo Total inclua a nova linha no cálculo.

Como os usuários apenas adicionam linhas de item usando o botão Adicionar Item, esse script não precisa verificar o valor de contagem (ocorrência) mínima.

// Invoke the Instance Manager to add one instance of the detail subform. 
_detail.addInstance(1); 
 
//Invoke the recalculate method to include the field values from the added subform in calculations. 
xfa.form.recalculate(1);

Botão Excluir

O seguinte script JavaScript no evento click do botão Excluir permite que os usuários usem esse botão para excluir uma instância do subformulário detail da amostra de formulário interativo de Pedido de compra. Esse script também recalcula o formulário de forma que o campo Total não inclua mais a linha excluída no cálculo.

// Invoke the Instance Manager to remove the current instance of the detail subform. 
_detail.removeInstance(this.parent.index); 
 
// Invoke the recalculate method to update the form calculations. 
xfa.form.recalculate(1);

Como o valor inicial de ocorrência mínima para o subformulário detail é 2, o script precisa reduzir esse valor para permitir que o usuário do formulário exclua as duas linhas de item que são exibidas automaticamente no momento em que o formulário é renderizado. Esse script é adicionado ao evento initialize do subformulário detail.

// Reset the minimum occurrence value of the detail subform. 
this.occur.min = "0";

Como o formulário permite que os usuários excluam todas as instâncias do subformulário detail, o script para o evento calculate do campo Total (numTotal) precisa verificar se existe pelo menos uma instância do campo numAmount no subformulário detail. Caso contrário, um erro será exibido porque o cálculo não consegue localizar nenhuma ocorrência do campo numAmount. Esse script é adicionado ao evento Calculate do campo numTotal.

// Verify at least one instance of the numAmount field exists. 
if (exists(detail[0].numAmount) == 1) then 
    Sum(detail[*].numAmount) 
endif