domingo, 3 de julho de 2011

Inserção em banco de dados com múltiplas interfaces em rede (web, desktop, celular).

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