Ola pessoal,
Tentando manter um sequência de posts, mas falo para vocês! esta difícil, muito trabalho, sistemas a desenvolver, sites, estudos.
Bom! a ideia deste post me ocorreu após uma conversa com um amigo da área. Para mim é solução fácil mas que as vezes pode complicar para os novatos ou os que não estão acostumados a desenvolver sistemas em rede. Então ai vai!
Primeiro, vamos a descrição do sistema desse meu amigo, talvez se assemalha ao de vocês:
Um servidor dedicado a um Banco de Dados em MySQL.
Uma tabela principal (Ordem de Serviço) que se conecta com varias outras tabelas pelo código.
Então temos uma idéia da estrutura:
TabelaOrdemServico - CampoCódigo, ..., CampoCodCliente, CampoCodMotorista, CampoCodVeiculo;
TabelaCliente - CampoCodCliente, CampoNome, ...;
TabelaMotorista - CampoCodMotorista, CampoNome, CampoRG, ...;
TabelaVeiculo - CampoCodVeiculo, CampoDescricao, ...;
TabelaServicos - CampoCodServico, CampoDescricao, ..., CampoCodOrdemServico.
Como vocês podem perceber o Relacionamento esta definido nos Códigos e estão definidos como AutoIncremental.
O problema do meu amigo era que várias interfaces (Web, Desktop e Celular) -terminais faziam inserções simultâneas. Ele não sabia como controla os códigos gerados para informar o usuário.
Neste caso eu não faço a exibição do código porque quem define este código é o próprio Banco de Dados. Só o faço no final da inserção.
Quem quiser exibir o código no início. Uma solução é você modificar os campos para não serem AutoIncrementais e fazer com que seu programa gere o código. Mas mesmo assim ocorreram alguns problemas em sistemas de rede.
Meus programas quando exigem a exibição do código na tela inicial, funcionam em duas etapas para controle do código.
Primeiro eu verifico o ultimo registro no banco de dados e exibo para o usuário este ultimo código + 1.
Por exemplo: se tivermos 10 registros, mostro que a próxima inserção sera á 11.
Só que se dois terminais abrirem simultaneamente, os dois exibiram o código 11.
Pra resolver isso temos a segunda etapa:
Os dois terminais estão exibindo o código 11 e quem salvar primeiro, pegara o código. O que acontecerá com o segundo terminal? Temos que estar preparado para esse caso.
Eu desenvolvo atualmente em Delphi então mostro a baixo o meu código.
if (dm.ordem_servico.Locate('codigo',codigo,[])) then
begin
Query_pega_ultimo_codigo.Close;
Query_pega_ultimo_codigo.Open;
Query_pega_ultimo_codigo.Last;
ShowMessage('Ordem de Serviço gerado com novo código: '+IntToStr(Query_pega_ultimo_codigo.FieldByName('codigo').AsInteger + 1));
Query_pega_ultimo_codigo.Close;
end;
Que ele apenas faz uma verificação, caso tente salvar com código existente, ele informara o usuário que o sistemas salvou com outro código (neste caso o código 12).
É isso ai gente! Simples e rápido ;-) E funcional! O mais importante porque utilizo esta idéia em muitos programas e funciona com vários bancos de dados (access, mysql, postgre, ...).
Espero que eu tenha ajudado os novatos já que programação em rede realmente exige mais atenção do que o usual, mas que com um pouco de prática se supera isso.
Abraços
Nenhum comentário:
Postar um comentário