So para os melhores !!!!
21/02/2003
0
se vc puderem me ajudar eu agradeço.
Renan
Posts
21/02/2003
Cdaraujo
Este talvez seja o assunto mais discutido e o que mais traz dúvidas aos programadores. Este artigo, o primeiro de uma série, visa esclarecer as principais dúvidas e dar aos desenvolvedores todos os subsídios necessários para criar este tipo de aplicação.
Em primeiro lugar discutiremos passo a passo a criação de uma aplicação simples, acessando uma tabela compartilhada em rede. Na aplicação, mostraremos técnicas para tratar lock de registros sempre abordando a utilização do componente TTable.
Após detalhar os tratamentos da aplicação , apresentaremos as técnicas de configuração das estações de trabalho e do servidor em redes ponto-a-ponto e cliente servidor.
Criando a Aplicação
Para servir de base para este artigo, criaremos uma aplicação simples acessando uma tabela e com apenas uma tela de cadastro. Utilizaremos para isso a versão 3.0 e tabelas Paradox 7.0. Mostraremos todos os passos da criação da aplicação pressupondo que o leitor já tenha certa experiência em Delphi e já tenha criado alguma tela com acesso a tabelas utilizando dos data aware controls.
Caso o leitor prefira, é possivel fazer o download dos fontes da aplicação e da tabela através do endereço: http://www.pixelnet.com.br/delphi/arquivos/artxxxxx.zip
A Tabela
Antes de criar a tabela, crie um diretório (ou pasta para a geração Windows 95!) para que a tabela e a aplicação possam ser salvas.
Crie também um ALIAS com o nome DelphiRede apontando para o diretório recém criado. Apesar de não ser necessariamente obrigatório, é conveniente a utilização do ALIAS principalmente quando as tabelas ficarão armazenadas em um único diretório.
Em seguida crie a tabela utilizando o Database Desktop com esta estrutura:
Nome do Campo
Tipo
Tamanho
Chave
Obs
Codigo
Alpha
2
*
Chave Primária
Nome
Alpha
40
Campo Obrigatório (*)
Endereco
Alpha
50
Campo Obrigatório (*)
Cidade
Alpha
20
Campo Obrigatório (*)
(*) Para configurar os campos como obrigatórios, clique no checkbox 1. Required Field que se encontra na área direita da tela de criação de estrutura.
Salve a tabela com o nome CLIENTE.DB .
O Formulário
Como foi dito anteriormente, a aplicação terá apenas um formulário e todos os controles de manipulação de dados serão os data-aware (encontrados na paleta Data Access e Data Controls). Aproveitando a criação do form, mostraremos um recurso interessante para criação de forms rapidamente.
A seguir você tem os passos para criação deste form:
1. Escolha a opção New Application do menu File para criar um novo projeto com um form vazio.
2. Mude o nome (propriedade Name) do form para frmCliente e o Caption para ´Delphi em Rede´.
3. Salve o projeto como DelphiRede.DPR e o form como Cliente.PAS
4. Insira no form um objeto Table e chame-o de tabCliente. Altere também as propriedades:
DatabaseName à DelphiRede
TableName à cliente.db
5. Dê um duplo-clique no objeto Table que você acabou de colar no form. Você verá o Fields Editor. Clique agora com o botão da direita do mouse sobre a área branca da janela. Você verá o seguinte menu de opções:
6. Clique na opção Add Fields, que permitirá que você veja uma janela contendo todos os campos da tabela Cliente.DB. Simplesmente clique no OK pois todos os campos encontram-se selecionados.
7. Na janela Fields Editor agora você vê os campos inseridos: (repare que mais uma vez, todos os campos já estão selecionados)
8. Clique em cima dos campos e, segurando o botão do mouse, arraste-e-solte sobre o form de clientes (de preferência, solte sobre o canto superior esquerdo do form para que os campos já apareçam em sua posição). O resultado da operação deve ser:
Ao arrastar e soltar os campos sobre o form, foi automaticamente criado 4 TDBEdit, 4 Labels e 1 DataSource1. Mude os nomes conforme segue:
DBEdit1 à txtCodigo
DBEdit2 à txtNome
DBEdit3 à txtEndereco
DBEdit4 à txtCidade
DataSource1 à srcCliente
9.. Para finalizar, acrescente um DBNavigator e chame-o de navCliente e preencha a propriedade DataSource com srcCliente:
10. Salve tudo!
OBS.: O processo de arrastar-e-soltar os componentes no formulário facilita a criação de telas simples, pois as propriedades DataSource e DataField já vêm preenchidas e um componente TdataSource é colocado automaticamente, caso não exista um previamente.
11. Agora será necessário abrir e fechar a tabela em momentos oportunos. Como a aplicação se resume neste único form, utilizaremos os eventos do form OnShow para abrir e OnClose para fechar.
//Evento OnShow
procedure TfrmCliente.FormShow(Sender: TObject);
begin
//Abre a tabela
tabCliente.Open;
end;
//Evento OnClose
procedure TfrmCliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Fecha a tabela
tabCliente.Close;
end;
12. Execute o programa e verifique se tudo funciona corretamente. Aproveite para cadastrar alguns registros.
Lock de Registros
O lock de registro consiste basicamente em bloquear o acesso a determinado registro caso este já esteja sendo modificado por outro usuário. A simples consulta é permitida a vários usuários simultaneamente.
O BDE controla o acesso aos registros através dos arquivos PDOXUSRS.NET e PDOXUSRS.LCK.
O PDOXUSRS.NET é o arquivo que server para controlar o acesso de vários usuários através da rede local. A localização deste arquivo é determinada através da opção NETDIR que é ser encontrada na configuração do driver PARADOX no utilitário BDE Configuration . Mais adiante discutiremos como configurar esta opção.
O PDOXUSRS.LCK é criado pelo BDE no diretório onde as tabelas estão localizadas. É através dele que o BDE controla qual tabela e qual registro está sendo utilizado, permitindo assim o controle de lock.
Poderemos testar esta funcionalidade com apenas uma máquina, rodando duas instâncias da nossa aplicação. Execute uma através do Delphi e outra através do Windows Explorer, clicando diretamente sobre o DelphiRede.exe.
1. Para facilitar a visualização, coloque uma ao lado do outra, conforme mostrado na figura abaixo:
2. Em seguida, certifique-se que os dois estão posicionados no mesmo registro.
3. Clique no botão de edição em uma das janelas.
4. Tente clicar no mesmo botão na outra janela.
5. Será mostrada a seguinte mensagem de erro:
6. Ao clicar no botão OK, a edição é cancelada até que o registro da primeira janela seja liberado. Para verificar isso, grave o registro da primeira janela e clique no botão de edição da segunda. Agora é possivel editar o registro!
OBS.: Para evitar que o Delphi exiba outra mensagem de erro antes dessa, desligue a opção Break On Exception na pasta Preferences acessada pelo menu Tools à Environment Options.
Controlando as Mensagens de Lock
Apesar do controle automatico, que facilita bastante o processo de desenvolvimento, é importante poder manipular estes erros (ou exceções), mostrando mensagens em Português ou mesmo modificar o funcionamento do processo.
Quando é detectado uma exceção na hora que o usuário inicia a modificação de um registro, o evento OnEditError do objeto tabCliente (TTable) é gerado, permitindo o tratamento.
Um controle simples é simplesmente modificar a mensagem de erro, o que conseguimos com a seguinte porção de código:
procedure TfrmCliente.tabClienteEditError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
var
wErro: Word;
begin
if E is EDBEngineError then
begin
wErro := (E as EDBEngineError).Errors[1].ErrorCode;
if (wErro = 10241) then
begin
Application.MessageBox(´Outro usuário está editando este registro!´, ´Erro´, MB_OK + MB_ICONSTOP);
Action := daAbort;
end;
end;
end;
O parâmetro E do tipo EDatabaseError guarda as informações a respeito do tipo de exceção que ocorreu.
O comando ´if E is EDBEngineError then´ filtra somente os erros do tipo EDBEngineError onde o erro de lock está incluído.
Na linha ´wErro := (E as...´ atribuimos à variavel wErro o código do erro que ocorreu neste instante.
A linha ´Action := daAbort´ faz com que a operação seja cancelada, ou seja, o registro não entrará em modo de edição.
Melhorando um pouco
Através deste recurso é possível fazer muito mais coisas do que simplesmente mostrar o erro. Poderíamos, por exemplo, avisar o usuário do lock e perguntar se quer tentar novamente. Caso o usuário queira, o comando EDIT é repetido, se não a operação é cancelada.
Neste caso, o código teria esta aparência:
procedure TfrmCliente.tabClienteEditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
var
wErro, wRet: Word;
begin
if E is EDBEngineError then
begin
wErro := (E as EDBEngineError).Errors[1].ErrorCode;
if (wErro = 10241) then
begin
wRet := Application.MessageBox(´Outro usuário está editando este registro! Tenta novamente ?´, ´Atenção´, MB_YESNO + MB_ICONQUESTION);
if wRet = IDYES then
Action := daRetry
else
Action := daAbort;
end;
end;
end;
Neste exemplo, foi criada uma variável chamada wRet para receber a resposta à pergunta.
Caso o usuário responda SIM, atribuimos daRetry à variável Action. Neste caso o comando é repetido até que o usuário libere o registro na outra janela.
Conclusão
Nesta primeira parte vimos como montar uma aplicação rápida e como tratar os locks de registro através de código no evento OnEditError. O objeto TTable tem uma série de outros eventos que permitem ao programador tratar muitas outras situações em uma tela de manutenção cadastral tanto localmente como em um ambiente de rede.
21/02/2003
Anonymous
se for possivel me mande as outras partes de como se montar uma rede em paradox. desde ja lhe agradeço
valeu!!!!!!!!!!!!
meu e-mail : renan.freitas.costa@bol.com.br
:D
21/02/2003
Anonymous
Clique aqui para fazer login e interagir na Comunidade :)