Atualizando dados em uma aplicação Multi-Tier
No artigo desta semana, veremos como resolver uma dúvida encontrada por um colega-usuário. Para isso, partiremos do seguinte ponto:
-Temos uma aplicação simples, que utiliza DBExpress com uma conexão ao banco employee.gdb do Interbase.
-No SQLDataSet temos a propriedade CommandText preenchida com a declaração: select CUST_NO, CONTACT_FIRST, COUNTRY from CUSTOMER
-Por fim, temos um DataSetProvider conectado ao SQLDataSet, um ClientDataSet conectado ao DataSetProvider e um DataSource conectado ao ClientDataSet.
Insira no formulário da aplicação, 1 DBGrid, 1 DBNavigator e 3 Buttons. Veja na figura 1 como o formulário deverá ficar.
Figura 1 – A aplicação.
Não esqueça de conectar o DBGrid e o DBNavigator ao DataSource e também inserir nos eventos OnShow e OnClose do Form os seguintes códigos:
OnShow:
ClientDataSet1.Open;
OnClose:
ClientDataSet1.Close;
Nos botões adicione as seguintes linhas:
Atualizar Reg:
ClientDataSet1.RefreshRecord;
Cancelar:
ClientDataSet1.CancelUpdates;
Salvar
ClientDataSet1.ApplyUpdates(0);
Com a aplicação nesse estado, o usuário, disse que no momento em que o método RefreshRecord do ClientDataSet fosse chamado uma exception era gerada com a seguinte mensagem: “Unable to find record. No key specified"
Se você também se deparou com este erro, veja agora como podemos resolver este problema de forma simples e rápida.
RefreshRecord
Diferente do Refresh, o RefreshRecord atualiza somente o registro atual, e não gera uma exceção se o log de modificação do dataset estiver vazio. Esta foi uma definição bem simples do método.
Para que possamos utilizar o método, devemos configurar o pfInKey do campo chave-primária. E chama-lo somente quando o UpdateStatus do registro for usUnmodified. Portanto corriga no código do exemplo o botão Atualizar Reg. Insira nele a seguinte codificação:
If ClientDataSetl.UpdateStatus = usUnmodified them
ClientDataSetl.RefershRecord;
Não esqueça de configurar o pfInKey e execute a aplicação. Agora esta tudo OK. Na próxima matéria veremos como interceptar dados entre cliente e servidor. Então, até lá!