Paradox em Rede, não consigo atualizar.
05/11/2005
0
Os dados não são atualizados. Vou tentar explicar.
Digamos que dois computadores insiram dados, o computador 1 só ver os dados inseridos pelo computador 2 se fechar o programa e abrir novamente. Tentei resolver isso com um comando refresh no evento scroll da query mas da pau.
Já não sei mais o que fazer. Se alguém por favor me puder ajudar.
Estou usando BDE e paradox.
Agradeço desde já.
O.mago
Posts
05/11/2005
Darlan
05/11/2005
Sabado
Quanto ao Request Live, se não estiver utilizando grid para gravar, melhor é deixar em false.
Já o paradox vai te trair sendo usado em rede. Para que os outros computadores vejam as atualizações realizadas por um segundo equipamento, você vai ter que ficar atualizando temporariamente sua base de dados.
Experimente outro banco dedas, como SQL, Mysql, Interbase, dentre outros.
06/11/2005
O.mago
Como atualizo temporariamente a base de dados? O que não entendo é como na máquina onde registra o dado ele atualiza, porém na outra máquina só se fechar o programa e abrir denovo. Que coisa ridícula, não sei mais o que fazer. Mundar de banco de dados eu vou mudar para o Interbase, mas como nunca trabelhei com banco de dados que não fosse paradox, não tenho nenhuma noção de outro banco de dados, para eu aprender vai requerer tempo e tenho que terminar esse programa até segunda-feira. Será que não tem jeito um refresh em uma outra situação ou uma configuração diferente do net dir do BDE. Já tetei muita coisa e até agora nada. :cry:
06/11/2005
Firekiller
Após dar um post ou delete (eventos afterpost e afterdelete), coloque o seguinte código:
dbiSaveChanges(Query1.Handle);
ou
dbiSaveChanges(Table1.Handle);
//Depende do que você tá usando;
Bom, então coloque um timer com Interval = 10000
e coloque
Database.CloseDatasets; //Se estiver usando database;
E você disse que no evento AfterScroll dá um erro ao colocar refresh... Que erro é esse? Pois a técnica do refresh é muito boa.
06/11/2005
Firekiller
UpdateCursorPos;
Check( dbiSaveChanges( Table1.Handle ) );
CursorPosChanged;
06/11/2005
Firekiller
UpdateCursorPos;
Check( dbiSaveChanges( Table1.Handle ) );
CursorPosChanged;
06/11/2005
Edilcimar
table1.refresh; dbgrid1.refresh; aí as atualizações serão mostradas
06/11/2005
O.mago
Eu uso query, datasource e updateSQL.
[b:b9b77f3bb5]fireKiller[/b:b9b77f3bb5] vou tentar o que vc postou.
O que é a propriedade chachedupdate? Aqui ela está configurada como true, será que é por isso que não atualiza, apesar de como false dá pau.
[b:b9b77f3bb5]Edilcimar[/b:b9b77f3bb5] Tentei com Query.refresh e não deu certo, não estou usando DBGrid para mostrar os dados e sim DBedit.
Nunca pensei que uma coisa tão simples fosse dar tanto trabalho. :roll:
06/11/2005
Firekiller
Se eu não estou enganado, a propriedade CachedUpdates quando está true, faz com que as alterações sejam feitas em um cache de memória, para depois serem transmitidas ao banco (como um clientdataset). Para transmitir essas informações para o banco (quando estiver true), você tem que colocar, após o Post ou Delete: Query.ApplyUpdates;
Se estiver false, não precisa do applyupdates.
06/11/2005
O.mago
Se vc puder analisar pra mim, te mando o código do programa. É que só está isso pendende para ele funcionar e já estou com esse problema a duas semans. :cry:
06/11/2005
Firekiller
AfterPost:
Query1.ApplyUpdates;
UpdateCursorPos;
Check( dbiSaveChanges( Query1.Handle ) );
CursorPosChanged;
Query1.Refresh;
AfterScroll:
Query1.Refresh;
E se quiser, pode implementar a idéia do timer:
No OnTimer do Timer:
if Not (Query1.State In [dsInsert, dsEdit]) then
Database.CloseDatasets;
Tente da forma com a qual postei agora, e retorne se obteve sucesso ou não. Apenas lembrando, você deve tirar o Refresh do evento BeforePost.
06/11/2005
O.mago
Valew pela boa vontade, muito obrigado firekiller. T+
07/11/2005
Silviogs
´ Mundar de banco de dados eu vou mudar para o Interbase, mas como nunca trabelhei com banco de dados que não fosse paradox, não tenho nenhuma noção de outro banco de dados´
você não irá mudar de banco de dados, simplesmente você vai começar a usar um banco de dados (Interbase Firebird, PostgreSql etc.) pois o paradox não é banco de dados, ele é um gerenciador de arquivos.
veja : http://forum.clubedelphi.net/viewtopic.php?t=68924&highlight=
Caro amigo desde 1998 que não trabalho mais com piradox desde então utilizo banco de dados e mais recentemente PostgreSQL.(faça um pesquisa de autor silviogs e veja algums post´s falando a respeito). Voltando a seu assunto:
[b:4dcf52c40e]Configuração do BDE para ambiente de rede[/b:4dcf52c40e]
Para o seu aplicativo feito em Delphi rodar em rede, você deve instalar o BDE em todas as estações. No BDE de cada estação, você deve colocar no parâmetro NET DIR do drive PARADOX o local onde estão as bases de dados e na PATH do Alias especificar o caminho das base de dados. Mas muita atenção, todas as estações devem estar com a mesma configuração do BDE. Veja o exemplo abaixo para configuração do parâmetro NET DIR do drive PARADOX e o PATH do Alias.
Estação n.1
NET DIR F:\
Path do Alias F:\DIRETORIO
Estação n.2
NET DIR F:\
Path do Alias F:\DIRETORIO
Estação n.3
NET DIR F:\
Path do Alias F:\DIRETORIO
Não é aconselhável que os aplicativos feitos em Delphi 1, sejam executados no servidor da base de dados, pois o PARADOX apresenta problemas de corrupção de arquivos e índices neste caso. É aconselhável que no servidor você coloque somente as bases de dados. Mas caso você tenha necessidade de utilizar o servidor você pode utilizar uma solução alternativa para o problema do PARADOX, esta solução esta sendo satisfatória na maioria dos casos. Digamos que a letra do drive de rede que você vai acessar o servidor, seja a letra ´F:´, então, faça o seguinte: Coloque a linha abaixo no arquivo AUTOEXEC.BAT, do servidor.
SUBST F: C:
Configure o BDE do servidor para que ele acesse o drive ´F:´
Esta linha deverá ser colocada apenas no servidor, com isso você passa a ter em seu servidor, um drive virtual para acessar o
drive C:, evitando o problema do PARADOX.
No Delphi 2 e Delphi 3, você deve utilizar um instalador de programas. No CD do Delphi 2 e Delphi 3 existe um instalador
chamado InstallShield para fazer a instalação e configuração do aplicativo e do BDE.
Veja abaixo os exemplos da configuração do BDE p/ Delphi 2 e 3:
Servidor Estação 1
NET DIR \\SERVIDOR\C NET DIR \\SERVIDOR\C
PATH DO ALIAS \\SERVIDOR\C\DIRETORIO PATH DO ALIAS \\SERVIDOR\C\DIRETORIO
LOCAL SHARE TRUE LOCAL SHARE FALSE
Estação 2 Estação 3
NET DIR \\SERVIDOR\C NET DIR \\SERVIDOR\C
PATH DO ALIAS \\SERVIDOR\C\DIRETORIO PATH DO ALIAS \\SERVIDOR\C\DIRETORIO
LOCAL SHARE FALSE LOCAL SHARE FALSE
DICA:
O executável pode ser colocado em cada máquina da rede, diminuindo assim o tráfego de rede.
Atenciosamente
Silvio Guedes
08/11/2005
O.mago
Sobre a configuração do BDE no qual você falou, está configurado certo, tanto que o programa roda em todas as estações, Net Dir e Alias estão funcionando sem problemas.
O que acontece é que quando a máquina 1 registra um dado, as outras máquinas só veêm esse registro se fecharem e abrirem o programa, o que é um absurdo todos os usuários terem que fechar o programa e abrir novamente cada vez que algum registro é adiciondo. Esse é meu problema.
[b:c34f985c16]firekiller[/b:c34f985c16] sua dica também não deu certo, coloquei o refresh nos locais indicados, aliás no post anterior eu errei coloquei o refresh no evento beforescroll e não beforepost. No afterscroll eu também já havia tentado, mas sem sucesso. O que foi novidade foi no evento afterpost, porém também não tive resultado nenhum. Essa parte do programa:
UpdateCursorPos;
Check( dbiSaveChanges( Query1.Handle ) );
CursorPosChanged;
Não compilou undeclared identifier.
Nem o refresh do DBNavigator funcionou, nem assim.
Mais alguma alternativa. :?:
08/11/2005
Silviogs
Evitando Perdas de Dados
Um dos problemas dos programadores Delphi é salvar as informações fisicamente no disco rígido. Quando estamos trabalhando com o programa as informações ficam retidas no buffer, o que, em caso de queda de energia ou até mesmo se o usuário fechar o Windows com a aplicação aberta resulta na perda dos dados, que foram processados na execução atual do sistema.
Para resolver o problema, basta acrescentar no evento AfterPost de cada componente Table as linhas de código que estão abaixo.
Na lista de Uses acrescente a unit DBIProcs.
Dessa forma, você não precisa temer perder os seus dados por uma falha elétrica ou pela quebra do sistema (como um erro GPF, por exemplo), após atualizar o banco de dados.
implementation
uses DBIProcs;
{$R *.DFM}
procedure TForm1.Table1AfterPost(DataSet: Dataset);
begin
DBISaveChanges(Table1.Handle);
end;
end.
Sobre as outras estações poderem ver o que foi cadastrado recentemente, vc pode colocar um timer para abrir e fechar a tabela depois de alguns segundo ou minutos. Acontece que o piradox não possui eventos para capturar quando o um dado foi inserido, só banco de dados possui esta caracteística.
Atencisoamente
Silvio Guedes
Clique aqui para fazer login e interagir na Comunidade :)