ClipaTec Informática

Receba novidades por e-mail. Digite seu e-mail abaixo e clique no botão "Cadastrar"

Delivered by FeedBurner

22 de janeiro de 2018

Delphi: UpdateMode e ProviderFlags


delphi dbx updatemode providerflags

Olá clipatequeiros 😁, neste artigo vamos abordar sobre UpdateMode e ProviderFlags, dois recursos pouco comentados, porém, muito importantes, quando se trabalha com DBExpress + TClientDataSet, o famoso conjunto TSQLDataSet + TDataSetProvider + TClientDataSet.
Ao configurar estes dois recursos, podemos obter uma melhor performance na execução de comandos SQL de update e delete, além de evitar exceções quando se utiliza união (join) na instrução SQL.


UpdateMode

Nas configurações do UpdateMode, definimos quais campos serão utilizados para localizar um determinado registro no banco de dados, o que na prática significa quais campos farão parte da cláusula Where nas instruções de Update e Delete que serão geradas pelo TDataSetProvider.
Muito bem, para configurar o UpdateMode, seguindo o conjunto que citamos no início deste artigo, basta selecionar o componente TDataSetProvider, e na propriedade UpdateMode, escolher a opção desejada. Temos três opções a ser escolhida na configuração do UpdateMode: upWhereAll, upWhereChanged e upWhereKeyOnly. O que significa cada uma delas?
upWhereAll: Todos os campos serão utilizados para encontrar o registro original no banco de dados. Esta é a opção padrão que já vem definida no componente.
upWhereChanged: Apenas os campos que foram alterados durante a edição de um registro serão utilizados para encontrar o registro original no banco de dados.
upWhereKeyOnly: Somente os campos que foram definidos como chave primária serão utilizados para encontrar o registro original no banco de dados.
A escolha de uma dessas opções é muito importante e deve ser feira cuidadosamente, uma vez que, elas influenciam na performance. Devemos nos atentar para as vantagens e desvantagens dessas opções. Quando escolhemos a opção upWhereAll que é a padrão, temos uma performance muito ruim, porque todos os campos serão usados na cláusula Where, ou seja, antes de uma instrução update ou delete ser executada, todos os campos serão usados na comparação para localizar o registro original a ser alterado ou excluído. Usando esta opção, é possível termos problemas quando a aplicação é usada por diversos usuários simultâneos. Imagine a seguinte situação, dois usuários por coincidentemente localizam um mesmo registro e realiza algumas alterações nele, o primeiro que gravar, não terá problemas, porém, o segundo que tentar gravar, terá problemas, pois o registro original foi modificado por um outro usuário, e como a opção upWhereAll faz a comparação no Where usando todos os campos, ele não vai conseguir mais encontrar o registro, visto que seus valores originais foram modificados, portanto, as informações estão diferentes do momento em que o mesmo foi carregado inicialmente, ou seja, esta opção é muito restritiva.
Se usarmos a opção upWhereKeyOnly, qualquer informação pode ser alterada no registro original, com exceção das chaves primárias, que por sua vez não podem ser alteradas até mesmo por uma questão de integridade de dados, regras de normalização de banco de dados, então, qualquer informação pode ser alterada, pois apenas as chaves primárias serão usadas para localizar o registro original e executar a instrução de update ou delete, desta maneira temos uma performance muito melhor, além de ser bem menos restritivo.
Por fim, temos a opção upWhereChanged, que é um intermediário entre as duas citadas anteriormente, tem uma performance boa, porém, com a mesma desvantagem da opção upWhereAll.

Creio que até aqui você já tenha percebido o quão importante é configurar o UpdateMode corretamente. Após configurar, teste sua aplicação, abrindo mais de uma instância e alterando registros simultaneamente, principalmente o mesmo registro nas duas aplicações para se certificar que nenhuma exceção vai ocorrer quando seu usuário estiver usando sua aplicação, evitando desconforto.


ProviderFlags

Esta propriedade, trabalha em conjunto com o UpdateMode, é importante que a mesma seja configurada para obtermos sucesso.

A propriedade ProviderFlags, pertence a classe TField, isso significa que, cada campo de um DataSet possui esta propriedade, logo, ela deve ser configurada campo a campo.
Quando você dá um duplo clique sobre um DataSet, a janela do Fields Editor será aberta, inicialmente ela vem vazia, quando clicamos com o botão direito do mouse sobre ela, podemos adicionar todos os campos através da opção "Add All Fields", feito isso, você pode navegar entre os campos do DataSet, e configurá-los conforme suas necessidades. Note que na janela "Object Inspector" vai aparecer a propriedade ProviderFlags conforme você navega entre um campo e outro. É justamente esta propriedade que devemos configurar também, lembrando que, todos os campos devem ser configurados.
Temos quatro opções a serem configuradas, lembrando que elas são multivalor, ou seja, pode ter mais de um valor definido, são elas: pfInUpdate, pfInWhere, pfInKey e pfHidden.

Ao ativar a opção pfInUpdate, estaremos definindo que o campo selecionado será incluído na instrução de update. Esta opção é importante, porque se não ativarmos ela, mesmo que você altere o valor deste campo no registro, a alteração não será persistida no banco, pois este campo não irá para a instrução de Update. Esta opção é importante quando usamos união (join) na nossa instrução SQL, onde, trazemos um campo de outra tabela, por exemplo, no cadastro de cliente você traz o campo "nomeCidade" que pertence a tabela de "Cidade", então, este campo deve ficar desmarcado a opção pfInUpdate, porque ele não pode fazer parte da instrução de update, pois ele não é um campo da tabela Cliente, caso contrário, ao uma exceção no banco de dados será levantada ao tentar executar uma instrução de Update dizendo que não foi possível encontrar a coluna "nomeCidade".
A opção pfInWhere, define que o campo será incluído na cláusula Where para localizar o registro original que será atualizado, esta opção deve estar de acordo com a configuração do UpdateMode, porque se você configurar o UpdateMode como upWhereKeyOnly, somente os campos chave primária poderão ter a opção pfInWhere definida como True no ProviderFlags.
Ao setar a opção pfInKey, você define o campo como sendo parte da chave primária, ele será usado para localizar o registro atual caso ocorrer uma falhar na atualização do registro.

Por fim, temos a opção pfHidden que garante a unicidade do registro e também usado para localizar o registro original a ser atualizado, contudo, o campo não será visível para a aplicação. Esta opção é a menos utilizada, em 98% dos casos, ela fica sempre False.
É importante ressaltar que as configurações do ProviderFlags interferem diretamente nas instruções de Update e Delete geradas pelo TDataSetProvider, portanto, deve-se ter muito cuidado ao configurá-las. 

Assim chegamos ao final de mais um artigo, espero que você tenha entendido perfeitamente, qualquer dúvida, deixe seu comentário. Abaixo, segue uma vídeo aula onde sucinta e objetivamente configuramos o UpdateMode e ProviderFlags em um exemplo prático de cadastro. Até o próximo. Abraço.

Vídeo aula


(Por Welinton J. Dias)

2 comments:

  1. Bom dia!
    uso IBObjects com delphi2010 e tenho estas configurações que você falou acima... porém tento fazer o mesmo no delphi 10.3 e não dá certo! diz que nao especifiquei o campo chave primária.. mais está configurado certinho, sabe o que pode ser?

    ResponderExcluir

Visite nossa página de Política de comentarios antes de comentar para ter certeza de que seu comentário não será excluído! Lembre-se, assim que aprovarmos o teu comentário ele será publicado, por isso, não deixe de sempre visitar nosso blog e conferir nossa resposta ao seu comentário, abraço!