Evento Form OnSave (referência da API do cliente) em aplicativos controlados por modelo

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:

  1. Aceda a https://make.powerapps.com.

  2. Certifique-se de que escolhe o ambiente correto.

  3. Selecione Aplicações no painel de navegação esquerdo.

  4. Seleciona a app, seleciona ... (elipses), e depois seleciona Editar.

  5. Selecione Configurações na barra de comandos.

  6. Quando a caixa de diálogo abrir, selecione Recursos.

  7. Ative o manipulador Async onSave.

  8. Selecione Guardar.

    Captura de ecrã da funcionalidade do handler Async onSave ativada no diálogo de Definições da aplicação.

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.

Evento Grid OnSave
Eventos (referência da API do cliente)
Eventos em formulários e grelhas em aplicações condicionadas por modelo