Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O evento de formulário OnSave em aplicações orientadas a modelos permite-lhe executar lógica, validar dados ou cancelar uma gravação antes de um registo ser guardado. O OnSave evento ocorre quando:
- O utilizador seleciona o botão Guardar ou Atualizar na barra de comandos, mesmo quando não há dados alterados para guardar.
- O código executa o método formContext.data.entity.save mesmo quando não há dados alterados para guardar.
- O usuário navega para fora do formulário e há dados não salvos no formulário.
- A opção Guardar Automaticamente está ativada 30 segundos após a alteração dos dados e a existência de dados não guardados no formulário.
- O código executa o método formContext.data.save e há dados não salvos no formulário.
- O código executa o método formContext.data.refresh passando um valor verdadeiro como o primeiro parâmetro e há dados não salvos no formulário.
Observação
O OnSave evento para registos de marcação, marcação recorrente ou atividade de serviço cancela a operação de gravação e usa a Book mensagem para guardar a alteração em vez de Create ou Update. Por causa deste comportamento, OnSave e PostSave os gestores de eventos para estas tabelas não funcionam.
Para determinar qual botão foi clicado para executar o salvamento, use o método getSaveMode .
Podes cancelar a ação de gravação usando o método preventDefault dentro do objeto argumentos do evento. O preventDefault método é acessível usando o método getEventArgs , que faz parte do contexto de execução. O contexto de execução é passado automaticamente para o manipulador de eventos do formulário.
Suporte a manipulador de eventos assíncrono
O evento OnSave tem a capacidade de aguardar que as promessas retornadas pelos manipuladores de eventos sejam liquidadas antes de salvar, permitindo que o evento seja assíncrono OnSave ("async").
O OnSave evento torna-se assíncrono quando o manipulador de OnSave eventos retorna uma promessa. O salvamento do registro acontece quando cada promessa retornada por um manipulador é resolvida. Para quaisquer promessas que sejam devolvidas, há um limite de 10 segundos para cada promessa, depois disso a plataforma considera que as promessas estão esgotadas. Este tempo limite é aplicado por promessa. Por exemplo, se tivermos cinco promessas devolvidas, o tempo total de espera é de 50 segundos.
Se a promessa for rejeitada ou atingir o tempo limite, a operação de salvamento continuará a se comportar de forma semelhante aos erros de script atuais. Use o método preventDefault dentro do objeto de argumentos de evento nesse manipulador específico se quiser impedir que o evento save aconteça se houver um erro de script/promessa rejeitada ou o tempo limite do manipulador.
Você também pode cancelar a operação de salvamento independentemente do erro no manipulador ou não usar o método preventDefault dentro do objeto de argumentos de evento. Se esse método for chamado, o evento Async OnSave aguardará que todas as promessas sejam liquidadas, mas o salvamento não ocorrerá. Chamar esse método significa que a lógica dentro .then() de & .catch() será executada.
O OnSave evento aguarda uma promessa retornada por manipulador. Se várias promessas forem necessárias, é recomendável envolver todas as promessas no Promise.all() método e retornar a única promessa resultante. Para vários manipuladores que retornam uma promessa, recomendamos que você crie um manipulador que chame todos os eventos e retorne uma única promessa que envolva todas as promessas necessárias. Esta prática é para minimizar os tempos de espera causados pelo tempo limite.
Exemplo: Quando usar handlers OnSave assíncronos
Considere criar uma Tarefa de Serviço de Ordem de Trabalho onde precisa de validar que o Ativo do Cliente selecionado tem a mesma conta listada na Ordem de Trabalho. Obter a conta na Ordem de Trabalho e no Ativo do Cliente são ambos processos assíncronos e tens de concluir ambos antes de poderes validar.
Neste cenário, como existem múltiplos processos assíncronos e ambas as chamadas retornam uma única promessa, envolve ambos no Promise.all() método.
Observação
Só podes usar o preventDefault método de forma síncrona.
Por exemplo:
function myHandler() {
return Promise.all([getWorkOrderPromise, getCustomerAssetPromise]).then((values) => {
var workOrder = values[0];
var customerAsset = values[1];
// Perform validation
if (isValid(workOrder, customerAsset)) {
return Promise.resolve();
}
return Promise.reject(new Error("Validation failed for the work order and customer asset"));
});
}
Ativa os handlers OnSave assíncronos usando uma configuração de aplicação
Para usar handlers assíncronos onSave, ativa a funcionalidade através de uma definição da aplicação:
Aceda a https://make.powerapps.com.
Certifique-se de que escolhe o ambiente correto.
Selecione Aplicações no painel de navegação esquerdo.
Seleciona a app, seleciona ... (elipses), e depois seleciona Editar.
Selecione Configurações na barra de comandos.
Quando a caixa de diálogo abrir, selecione Recursos.
Ative o manipulador Async onSave.
Selecione Guardar.
Desative os tempos de expiração do handler OnSave assíncronos
Quando você usa um manipulador assíncrono OnSave , o formulário aguarda que a promessa retornada pelo manipulador seja cumprida. Para garantir que o save do formulário seja concluído atempadamente, o handler lança uma exceção de timeout após 10 segundos para te avisar de ajustar o handler assíncrono OnSave para melhor desempenho.
Há cenários em que pausar o OnSave manipulador por mais de 10 segundos é necessário. Um exemplo é abrir uma caixa de diálogo e aguardar a entrada do usuário antes de continuar a salvar. Para garantir que a operação assíncrona espera que a promessa seja resolvida, use o método disableAsyncTimeout .
Observação
Você deve ligar disableAsyncTimeout antes de qualquer instrução de espera ou chamadas assíncronas.
Por exemplo:
async function myHandler(context) {
context.getEventArgs().disableAsyncTimeout();
// The 10000ms time out will not be disabled if the above line does not come before all async awaits
await Xrm.Navigation.openConfirmDialog({ text: "Are you sure you want to save?" });
}
Quando chamas o disableAsyncTimeout, o timeout desse handler não é aplicado. Continua à espera que a promessa do manipulador seja cumprida.
Este padrão pode afetar o desempenho do save de forma.
Artigos relacionados
Evento Grid OnSave
Eventos (referência da API do cliente)
Eventos em formulários e grelhas em aplicações condicionadas por modelo