Paradox em rede - é possível isso?
Amigos, é o seguinte eu tenho um programa onde o banco de dados é paradox, estou querendo utilizar ele em rede, sei que é possível dispor as tabelas em rede, o problema é que também preciso utiliza-lo sem a necessidade de estar em rede pois também possuo as tabelas do banco de dados no computado ´cliente´, ou seja se o computador principal não estiver ligado o programa utilize a base de dados interna, a minha idéia é o seguinte: na abertura do programa suje uma caixa de diálogo donde listo as opções, se o usuário prefere usar a base de dados do ´servidor´ ou interna... é possível isso? alguém poderia me dar uma dica de como proceder, não quero que vcs. façam, eu já estaria pedindo d+, só quero umas dicas o resto tento correr atrás..
Agradeço antecipadamente, Obrigado...
Agradeço antecipadamente, Obrigado...
Ant.neto
Curtidas 0
Respostas
Lindomar.des
13/10/2005
Colega,
O que vc questiona é possível sim (apesar de ser arriscado). digo isso pq já utilizei algo parecido (configurar o path em run-time).
1-Para vc configurar o path onde esta a base de dados sugiro que utilize um componente TDataBase onde vc irá centralizar as configurações de localização do banco/tabelas e ligar todos os outros componentes TTable/TQuery, etc ao TDataBase pq vc altera o TDataBase e os outros seguem ele.
2-Neste caso sugiro tb vc não utilizar aliases.
3-Utilize um arquivo ini para salvar as configurações.
trecho do codigo do meu sistema:
1-oncreate da tela de login.
incluir as units no uses: Bde, Dbtables, Db
==> aqui o sistema pega as configurações já salvas.
* vc pode verificar se a rede está acessível para carregar as
configurações de rede e/ou locais.
dmnts32.eMacDB.Close;
dmnts32.eMacDB.Params.Clear;
EmacCfg := TIniFile.Create(extractfilepath(application.exename)
+´EmacCfg.ini´);
if bRedeAtiva then //função que retorna True se a rede está ativa
begin
dmnts32.eMacDB.Params.Add(´PATH=´ +
EmacCfg.ReadString´AliasNet´, ´path´, ´´));
end
else
begin
EmacCfg := TIniFile.Create(extractfilepath(application.exename)
+´EmacCfg.ini´);
dmnts32.eMacDB.Params.Add(´PATH=´ +
EmacCfg.ReadString´AliasLocal´, ´path´, ´´));
end;
dmnts32.eMacDB.Open;
2-configurando em run-time
==> possuo uma tela para configurar o path.
oncreate dessa tela:
incluir as units no uses: Bde, Db, DbTables
Session.Open;
DirectoryEdit1.Edit1.Text := session.NetFileDir; //pego o netdir
DirectoryEdit1.Edit2.Text := extractfilepath(application.ExeName);
//botão de OK
procedure TfrmConfigAlias.BitBtn1Click(Sender: TObject);
begin
Panel1.Caption := ´Configurando NETDIR...aguarde....´;
Panel1.Visible := true;
application.ProcessMessages;
if not ChangeNetDir(DirectoryEdit1.Text) then
begin
Showmessage(´Erro ao configurar NetDir!´);
modalresult := mrCancel;
Panel1.Caption := ´´;
Panel1.Visible := false;
application.ProcessMessages;
exit;
end;
EmacCfg := TIniFile.Create(extractfilepath(application.exename) +
´EmacCfg.ini´);
EmacCfg.WriteString(´NetDir´, ´Path´, DirectoryEdit1.Text);
EmacCfg.WriteString(´Alias´, ´Path´, DirectoryEdit2.Text);
Session.NetFileDir := DirectoryEdit1.Text;
Panel1.Caption := ´Configurando LOCAL SHARE...aguarde....´;
application.ProcessMessages;
if not ModifyBDE(´\System\Init´, ´Local Share´, ´TRUE´) then
begin
Showmessage(´Erro ao configurar Local Share!´);
modalresult := mrcancel;
Panel1.Caption := ´´;
Panel1.Visible := false;
application.ProcessMessages;
exit;
end;
Panel1.Visible := false;
application.ProcessMessages;
modalresult := mrok;
end;
bom, do código que postei só não utilizo a verificação de rede ativa, po não precisar, por esse motivo não está testado. o restante funciona legal.
Mais uma coisa: sugeri a verificação da rede ativa para não deixar por conta do usuário a opção para escolher. Se a rede estiver ativa utilizaria a base remota, caso contrario usaria a base local. Mas isso é minha opnião. Utilize da forma que lhe for melhor.
é preciso ainda fazer outras verificações tipo: se o diretório existe, fazer tratamento das possíveis exceções, etc.
acho que com isso vc já tem uma linha inicial.
boa sorte.
OBS: assim que possível migre para um SGDB.
O que vc questiona é possível sim (apesar de ser arriscado). digo isso pq já utilizei algo parecido (configurar o path em run-time).
1-Para vc configurar o path onde esta a base de dados sugiro que utilize um componente TDataBase onde vc irá centralizar as configurações de localização do banco/tabelas e ligar todos os outros componentes TTable/TQuery, etc ao TDataBase pq vc altera o TDataBase e os outros seguem ele.
2-Neste caso sugiro tb vc não utilizar aliases.
3-Utilize um arquivo ini para salvar as configurações.
trecho do codigo do meu sistema:
1-oncreate da tela de login.
incluir as units no uses: Bde, Dbtables, Db
==> aqui o sistema pega as configurações já salvas.
* vc pode verificar se a rede está acessível para carregar as
configurações de rede e/ou locais.
dmnts32.eMacDB.Close;
dmnts32.eMacDB.Params.Clear;
EmacCfg := TIniFile.Create(extractfilepath(application.exename)
+´EmacCfg.ini´);
if bRedeAtiva then //função que retorna True se a rede está ativa
begin
dmnts32.eMacDB.Params.Add(´PATH=´ +
EmacCfg.ReadString´AliasNet´, ´path´, ´´));
end
else
begin
EmacCfg := TIniFile.Create(extractfilepath(application.exename)
+´EmacCfg.ini´);
dmnts32.eMacDB.Params.Add(´PATH=´ +
EmacCfg.ReadString´AliasLocal´, ´path´, ´´));
end;
dmnts32.eMacDB.Open;
2-configurando em run-time
==> possuo uma tela para configurar o path.
oncreate dessa tela:
incluir as units no uses: Bde, Db, DbTables
Session.Open;
DirectoryEdit1.Edit1.Text := session.NetFileDir; //pego o netdir
DirectoryEdit1.Edit2.Text := extractfilepath(application.ExeName);
//botão de OK
procedure TfrmConfigAlias.BitBtn1Click(Sender: TObject);
begin
Panel1.Caption := ´Configurando NETDIR...aguarde....´;
Panel1.Visible := true;
application.ProcessMessages;
if not ChangeNetDir(DirectoryEdit1.Text) then
begin
Showmessage(´Erro ao configurar NetDir!´);
modalresult := mrCancel;
Panel1.Caption := ´´;
Panel1.Visible := false;
application.ProcessMessages;
exit;
end;
EmacCfg := TIniFile.Create(extractfilepath(application.exename) +
´EmacCfg.ini´);
EmacCfg.WriteString(´NetDir´, ´Path´, DirectoryEdit1.Text);
EmacCfg.WriteString(´Alias´, ´Path´, DirectoryEdit2.Text);
Session.NetFileDir := DirectoryEdit1.Text;
Panel1.Caption := ´Configurando LOCAL SHARE...aguarde....´;
application.ProcessMessages;
if not ModifyBDE(´\System\Init´, ´Local Share´, ´TRUE´) then
begin
Showmessage(´Erro ao configurar Local Share!´);
modalresult := mrcancel;
Panel1.Caption := ´´;
Panel1.Visible := false;
application.ProcessMessages;
exit;
end;
Panel1.Visible := false;
application.ProcessMessages;
modalresult := mrok;
end;
bom, do código que postei só não utilizo a verificação de rede ativa, po não precisar, por esse motivo não está testado. o restante funciona legal.
Mais uma coisa: sugeri a verificação da rede ativa para não deixar por conta do usuário a opção para escolher. Se a rede estiver ativa utilizaria a base remota, caso contrario usaria a base local. Mas isso é minha opnião. Utilize da forma que lhe for melhor.
é preciso ainda fazer outras verificações tipo: se o diretório existe, fazer tratamento das possíveis exceções, etc.
acho que com isso vc já tem uma linha inicial.
boa sorte.
OBS: assim que possível migre para um SGDB.
GOSTEI 0
Vinicius2k
13/10/2005
Colega,
Não sou bom em BDE e nunca trabalhei com Paradox em produção, mas *acho* que o caminho é este, ou parecido com este:
1. Tenha dois áliases (um para a base local, outro para a base na rede).
2. Utilize um TDatabase como intermediário entre o álias e os DataSets (TTables e TQueries), ou seja: a Propriedade ´DatabaseName´ dos DataSets devem apontar para o componente TDataBase.
4. Na propriedade ´DatabaseName´ do TDatabase, vc deve configurar um nome para o ´pseudo-álias´ que estará disponível para ser apontado nos DataSets.
3. De acordo com a seleção do usuário vc altera a propriedade ´AliasName´ do TDatabase, antes de abrir qualquer tabela ou query.
Bem, creio que isto seja suficiente para realizar a operação que vc pretende, mas atenção: Paradox em rede costuma ser um grande ´dor de cabeça´ se o BDE não for bem ajustado.
Para auxiliar-lhe nesta tarefa, veja este tópico: http://forum.clubedelphi.net/viewtopic.php?t=32894
T+
Não sou bom em BDE e nunca trabalhei com Paradox em produção, mas *acho* que o caminho é este, ou parecido com este:
1. Tenha dois áliases (um para a base local, outro para a base na rede).
2. Utilize um TDatabase como intermediário entre o álias e os DataSets (TTables e TQueries), ou seja: a Propriedade ´DatabaseName´ dos DataSets devem apontar para o componente TDataBase.
4. Na propriedade ´DatabaseName´ do TDatabase, vc deve configurar um nome para o ´pseudo-álias´ que estará disponível para ser apontado nos DataSets.
3. De acordo com a seleção do usuário vc altera a propriedade ´AliasName´ do TDatabase, antes de abrir qualquer tabela ou query.
Bem, creio que isto seja suficiente para realizar a operação que vc pretende, mas atenção: Paradox em rede costuma ser um grande ´dor de cabeça´ se o BDE não for bem ajustado.
Para auxiliar-lhe nesta tarefa, veja este tópico: http://forum.clubedelphi.net/viewtopic.php?t=32894
T+
GOSTEI 0
Ant.neto
13/10/2005
Colega,
O que vc questiona é possível sim (apesar de ser arriscado). digo isso pq já utilizei algo parecido (configurar o path em run-time).
1-Para vc configurar o path onde esta a base de dados sugiro que utilize um componente TDataBase onde vc irá centralizar as configurações de localização do banco/tabelas e ligar todos os outros componentes TTable/TQuery, etc ao TDataBase pq vc altera o TDataBase e os outros seguem ele.
.
Valeu pela dica... vou tentar ainda hj!! obrigado
GOSTEI 0