VB6 - Compartilhando um banco de dados Access em um ambiente multiusuário.


Hoje veremos como compartilhar um banco de dados Access em um ambiente multiusuário em um servidor local.

Você tem um problema:

Precisa desenvolver uma aplicação em Visual Basic para controlar o atendimento de clientes em uma clinica.(Você é o programador da clínica e tem 5 dias para implantar o sistema, senão... ). Moleza hein ! Mas ... (Pensa que é fácil ganhar 5 mil por mês) para complicar a situação a clinica esta distribuída em três andares : 5 , 6 e 7 andar . Com o seguinte layout de equipamentos distribuídos:

Resumindo : sua aplicação deverá compartilhar o banco dados em um ambiente de acesso multiusuário.

Se a esta altura você já esta suando frio. Não se desespere !!!. Estou aqui para mostrar o caminho das pedras...

A primeira pergunta que deve estar passando pela sua cabeça é : Como eu faço uma aplicação em Visual Basic para um ambiente multiusuário ? ( Sabia pergunta ...)

A sua sorte é que o site tem dois artigos sobre este assunto. Veja os links:

Seria bom você dar uma olhada nos artigos para ter uma visão geral do problema. No entanto eu posso lhe adiantar o seguinte:

Ao escrever uma aplicação multiusuário , geralmente , você deve somente se preocupar quando vai escrever no banco de dados . Isto envolve as tarefas de inclusão , exclusão e atualização dos registros do banco de dados. Estas tarefas podem gerar conflitos quando mais de um usuário tenta realizar a mesma tarefa no mesmo instante. Todas as demais tarefas que envolvam a leitura do banco de dados não geram conflitos

Agora eu vou falar uma coisa que talvez possa parecer estranha mas eu tenho vivenciado isto na prática e não tenho tido problemas. É o seguinte...:

Para criar uma aplicação Visual Basic multiusuário você não tem que fazer nada além de somente compartilhar o banco de dados Access. ( Estou supondo que estamos trabalhando como Access e que o acesso simultâneo não seja gigantesco)

É isto mesmo ! Crie a sua aplicação normalmente , compartilhe o banco de dados e pronto. Sua aplicação vai funcionar sem problemas com acesso para os usuários na rede. (Naturalmente você vai ter que abrir o banco de dados no modo compartilhado.)

Como compartilhar Banco de dados ?

Primeiro vejamos o nosso ambiente: Uma rede ponto a ponto com um servidor Windows 2000 e seis máquinas Windows 98.

Então é simples , você vai ter que adotar o seguinte procedimento :

  1. Instalar a aplicação em todas as máquinas e no Servidor
  2. Compartilhar o banco de dados do servidor com as demais estações de trabalho

Com isto em mente você vai ter que permitir que o seu banco de dados seja acessado pelas estações ; para fazer isto basta você mapear uma conexão com o servidor , e, compartilhar esta conexão em todas as estações.

Perceba que você não vai poder usar um caminho absoluto(fixo) quando for abrir o seu banco de dados na aplicação . Não vai poder abrir o banco de dados como costuma abrir para uma aplicação monousuário :

Set db = DBEngine(0).OpenDatabase(app.path & "\clientes.mdb")

Ao invés disto você vai ter que usar uma variável que representa a localização do banco de dados , para depois definir o caminho em cada estação .

Set db = DBEngine(0).OpenDatabase(caminho)

E como vamos definir para cada estação o caminho do banco de dados ?

Vou mostrar uma das possibilidades que creio ser bem simples. Vamos utilizar os arquivos de perfis : os arquivos .INI. Estes arquivos eram muito usados pela versão do windows anterior ao windows 95 e por muitas aplicações . (Ainda hoje , embora as informações do sistema sejam armazenadas no registro do windows , estes arquivos são usados.)

Funciona assim : Vamos criar um arquivo .INI ; config.ini , por exemplo , e nele vamos definir qual o caminho do banco de dados na rede. Depois cada , em cada estação , vamos o nosso aplicativo irá abrir o arquivo .INI e irá ler o caminho do banco de dados e abrir o banco de dados definido neste caminho.

Um arquivo .INI é um arquivo texto que pode ser aberto em qualquer editor de texto. Ele contém uma estrutura definida da seguinte forma:

[Cabeçalho]
Chave1=valor1
Chave2=valor2
...

[Cabeçalho2]
chave1=valor1
...
 
[windows]
load=
run=
NullPort=None

[Desktop]
Wallpaper=(None)
TileWallpaper=1
WallpaperStyle=0

Estrutura de um arquivo .INI
 
Exemplo de arquivo INI : Win.ini (somente uma parte...)

Um arquivo .INI possui diversos cabeçalhos , cada qual com diversas chaves e a cada chave temos um valor associado.

Podemos ler e gravar os valores de cada chave usando as API´s ( application Programming Interface ) do windows. Para manipular arquivos INI geralmente usamos duas funções :

  1. GetPrivateProfileString - utilizada para ler arquivos INI
  2. WritePrivateProfileString - usada para escrever em arquivos INI

Então a primeira coisa a fazer é declarar as funções acima em nosso projeto. Fazemos isto em um módulo padrão. As declarações são :

Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Agora podemos usar as chamadas a API e criar nossas funções. Vejamos a seguir como criar as funções para ler e escrever em arquivos INI.

1-) A função ReadINI faz a leitura de um valor para uma chave de um arquivo INI

Public Function ReadINI(Section As String, Key As String, FileName As String)
'Filename=nome do arquivo ini
'section=O que esta entre []
'key=nome do que se encontra antes do sinal de igual
Dim retlen As String
Dim Ret As String
Ret = String$(255, 0)
retlen = GetPrivateProfileString(Section, Key, "", Ret, Len(Ret), FileName)
Ret = Left$(Ret, retlen)
ReadINI = Ret
End Function

Você faz a chamada da função assim :

caminho = ReadINI("Cabeçalho", "chave", App.Path & "\nomedoarquivo.ini")

os parâmetros que você deve informar são :

2-) Para escrever em um arquivo INI usamos a função WriteINI

Public Sub WriteINI(Section As String, Key As String, Text As String, FileName As String)
'Filename=nome do arquivo ini
'section=O que esta entre []
'key=nome do que se encontra antes do sinal de igual
'text= valor que vem depois do igual
WritePrivateProfileString Section, Key, Text, FileName
End Sub

A chamada da função é feita assim :

Call WriteINI("Cabeçalho", "Chave", Valor_a_gravar, App.Path & "\nomedoarquivo.ini")

Os parâmetros usados são:

Obs: Os nomes ReadINI e WriteINI foram nomes que eu usei , você pode usar qualquer nome válido.

Bem , agora que já sabemos como trabalhar com arquivos INI vamos criar o nosso arquivo INI. Lembre-se que nosso objetivo é definir a localização do banco de dados. Primeiro temos que mapear o caminho na rede para saber o caminho do banco de dados , feito isto é só criar o arquivo INI e informar o caminho mapeado.

Vamos criar um arquivo INI com o nome de config.ini com a seguinte estrutura:(Você deve adaptar para o seu caso particular)

[Geral]
Caminho=X:\Teste\teste.mdb

Aqui eu criei um cabeçalho com o nome Geral e uma chave chamada Caminho. O valor atribuído a chave Caminho usa o drive X:\teste\teste.mdb. (este é o caminho mapeado na rede)

Agora podemos definir o roteiro para instalar o sistema nas 6 estações e no servidor:

- O sistema deverá ser instalado em todas as máquinas , mas banco de dados deverá estar presente somente no servidor.

- O arquivo config.ini deverá estar presente em todas as máquinas sendo que nas 6 estações vamos usar o arquivo com o seguinte conteúdo:

[Geral]
Caminho=X:\Teste\teste.mdb

- No servidor o conteúdo do arquivo config.ini será outro pois nele o acesso ao banco de dados é local. Podermos ter então algo como:

[Geral]
Caminho=C:\Teste\teste.mdb

- O código usado para ler o arquivo config.ini poderá estar em um módulo Main com o seguinte código:

Sub Main()
Dim caminho as string
'verifica se já há uma instância do programa sendo executado
If App.PrevInstance = True Then
   Dim Form As Form
   For Each Form In Forms
      Unload Form
      Set Form = Nothing
   Next Form
   End
End If

'define caminho para base de dados, help e imagens
caminho = ReadINI("Geral", "Caminho", App.Path & "\Config.ini")

'Abre o banco de dados 
Set area = DBEngine(0)
Set db = area.OpenDatabase(caminho)
frmLogin.Show vbModal

frmmenu.Show
End Sub

Para as estações o caminho do banco de dados lido no arquivo Config.ini será : X:\Teste\teste.mdb

Assim , em todas as estações estaremos acessando o banco de dados teste.mdb que esta presente no servidor.

Pronto ! o seu banco de dados esta compartilhado e sua aplicação VB esta funcionando em um ambiente multiusuário...

Simples , não é mesmo...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

Referências:


José Carlos Macoratti