Array
(
)

Paradox em Rede, não consigo atualizar.

O.mago
   - 05 nov 2005

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á.


Darlan
   - 05 nov 2005

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


Sabado
   - 05 nov 2005

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.


O.mago
   - 06 nov 2005

É 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.


Firekiller
   - 06 nov 2005

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.


Firekiller
   - 06 nov 2005

Desculpe, me esqueci de uma coisa, tente assim:


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


Firekiller
   - 06 nov 2005

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


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


Edilcimar
   - 06 nov 2005

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


O.mago
   - 06 nov 2005

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.

fireKiller 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.

Edilcimar 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:


Firekiller
   - 06 nov 2005

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.


O.mago
   - 06 nov 2005

É 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.


Firekiller
   - 06 nov 2005

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.


O.mago
   - 06 nov 2005

Blz, Vou testar amanhã e posto o resultado.

Valew pela boa vontade, muito obrigado firekiller. T+


Silviogs
   - 07 nov 2005

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:

Configuração do BDE para ambiente de rede

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


O.mago
   - 08 nov 2005

Olá silviogs, 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.

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


Silviogs
   - 08 nov 2005

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


O.mago
   - 09 nov 2005

Galera, encontrei uma solução que não me agrada mas resolve o problema em parte. Depois do afterpost da query coloquei:
query1.close;
query1.open;

e um botão atualizar que faz a mesma coisa.

Não entendo porque não tem um meio mesmo usando paradox de atualizar os dados sem precisar fechar e abrir tabela. Tenho que fechar a tabela de quem insere os dados e também de quem vai vê-los. Considero isso uma gambiarra muito grande. Não entendi também pq o refresh não funciona, pra min servia pra isso.

O que acontece é que os dados ficam armazenados no buffer quando eu fecho o programa (a tabela) ele grava no disco (verifiquei no desktop database), porém mesmo dando refresh na query em outra estação não exibe esse dado porque ele atualiza localmente aí não vê os dados inseridos. Fechando a tabela e abrindo novamente, ele busca denovo na rede e exibe os dados que foram cadastrados.

Resumido: A aplicação está gravando localmente e quando fecho a query ele grava no disco. Quando abre a aplicação ele carrega os registro existente naquele momento, quando o refresh é utilizado ele atualiza localmente. Para buscar na rede tenho que fechar e abrir novamente a query.

Será que não tem um jeito de resolver isso sem ter que ficar abrindo e fechando a query? Já que se eu colocar um timer, pode sobrecarregar a rede, e um botão manual de update não é muito funcional.

Obrigado a todos que tem tentado me ajudar.

Valew

T+


J0nat45
|
MVP
Pontos: 1020
    18 out 2015

Boa Noite

O que você poderia fazer nesta situação, é utilizar o componente TTable, pois após a Inclusão/Edição/Exclusão/Gravação/Cancelamento, seria necessário incluir:

#Código

ttable.refresh


Também, seria necessário incluir este comando em cada deslocamento do ponteiro:

exemplo:

#Código
ttable.next
ttable.refresh


Conclusão: Seria necessário construir a rotina, para que os dados do Paradox, sempre estejam atualizados em todos os Clients. realizando isto, não é necessário fechar e abrir o programa, objetivando visualizar os dados atuais.