Paradox em Rede, não consigo atualizar.

05/11/2005

0

Ae galera estou desenvolvendo meu primeiro programa para rodar em rede e estou tendo muitos problemas.

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

O.mago

Responder

Posts

05/11/2005

Darlan

faça um teste com a propiedade RequestLive = true e checkupdate = true


Responder

05/11/2005

Sabado

Se está usando query pode utilizar os comandos SQL, como por exemplo, dar um select * from após a gravação dos dados.
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.


Responder

06/11/2005

O.mago

É com o Request Live não dá certo, já tentei. A opção checkupdate que vc citou seria cachedUpdate? Se for já tentei também. E não deu certo.

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:


Responder

06/11/2005

Firekiller

Não sei se te ajudará mas tenta aí:

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.


Responder

06/11/2005

Firekiller

Desculpe, me esqueci de uma coisa, tente assim:


UpdateCursorPos;
Check( dbiSaveChanges( Table1.Handle ) );
CursorPosChanged;


Responder

06/11/2005

Firekiller

Desculpe, me esqueci de uma coisa, tente assim no AfterPost ou AfterDelete:


UpdateCursorPos;
Check( dbiSaveChanges( Table1.Handle ) );
CursorPosChanged;


Responder

06/11/2005

Edilcimar

para que as pessoas possam ver as atualizações no piradox dê
table1.refresh; dbgrid1.refresh; aí as atualizações serão mostradas


Responder

06/11/2005

O.mago

Colocar um Refresh na query no evento onscroll na verdade não dá nenhum pau, porém simplesmente não funciona, gera apenas um incoveniente que quando mando inserir um registro mostrar a mensagem que criei para um campo obrigatório.

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:


Responder

06/11/2005

Firekiller

Esqueci de dizer, deixe o Query1.Refresh no AfterScroll.

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.


Responder

06/11/2005

O.mago

É eu uso o applyupdates e comitupdates nos eventos afterpost e after delete da query. O Refresh não pode ser no beforepost? Porque está dando erro, exibe a mensagem de um campo requerido.

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:


Responder

06/11/2005

Firekiller

Bom, então seu problema tá resolvido (eu acho).... tire o refresh do beforePost, e coloque-o no AfterPost e no AfterScroll. Bom então você teria algo assim:

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.


Responder

06/11/2005

O.mago

Blz, Vou testar amanhã e posto o resultado.

Valew pela boa vontade, muito obrigado firekiller. T+


Responder

07/11/2005

Silviogs

Olá o.mago

´ 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


Responder

08/11/2005

O.mago

Olá [b:c34f985c16]silviogs[/b:c34f985c16], tenho mesmo que parar de usar paradox e usar um banco de dados, como o interbase, porém isso vai requerer um tempo, coisa que no momento não tenho já que esse programa deveria começar rodar hoje.

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. :?:


Responder

08/11/2005

Silviogs

Olá

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


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar