Autor
Mensagem
Uso o Delphi2010 e criei um sistema em DataSnap
Tenho um servidor ( Windows Server 2008 ) dedicado ao Servidor de Aplicativos (Server.exe), acessando um banco de dados em um linux ( BD em Firebird ).
Tenho aproximadamente 50 terminais usando o sistema cliente ( Cliente.exe ).
Segui os passos da revista clubedelphi para criar todo o projeto.
Durante uns 2 horas funciona que é uma beleza, só que se ocorre um erro no Servidor de Aplicações ( Server.exe )
ele trava e todos os clientes travam tb.
Preciso reiniciar o aplicativo do servidor.
Será que tem uma forma de ocorrer o erro, porém, não travar ?
Obrigado.
Tem vezes que não aparece nenhum erro, outras vezes aparece o erro: " write error ", coisa assim.
ai só reiniciando o sistema servidor.exe
Já coloquei o Delphi para depurar o sistema e deixa-lo , ate aparecer o erro, mas se trava uma vez, o sistema cliente.exe, precisa sair e entrar de novo.
Isso e complicado.
Sei que trava, por causa de um ou mais erros, mas ficar esperando o erro aparecer, para corrigi-lo. O pessoal me mata rs.
Tem alguma idéia ?
Obrigado.
Se o erro é write error. Com toda certeza é algum módulo do cliente que esta tentando gravar algum registro no sistema server o interesante sertia você ficar atento em qual tela do cliente o erro é apresentado, seu sistema tem algum módulo de visualização de processos dos clientes no servidor? Com toda certeza algum cliente deve estar visualizando uma mensagem de erro "bem bonita" rsrsrs com todas as informações que você precisa.
Obrigado Leonardo.
Vou ter que monitorar, o cliente também.
O meu problema, e que o sistema e grande, e saber qual foi vai ser complicado, somente na hora do erro mesmo.
As vezes nem o cliente mostra o erro. ( outros erros )
E coisa de teste mesmo, ficar emcima e corrigir tudo rs.
Mas , essa e a nossa vida né, melhorar sempre.
Obrigado, Abraços
há alguns anos me deparei com um erro desses... era um cálculo...
acho que era um cálculo de comissão no aplicativo servidor. algo mais ou menos assim:
cdsComissaoValor.Value := cdsFATURAS.Value * (cdsVendedorComissao.Value / 100);
o erro ocorria quando um desses valores era null. tive que trocar todos os .Value por .AsFloat e o problema foi resolvido. a partir desse dia deixei de usar .Value e sempre referencio o tipo correto do campo (AsString, AsFloat, AsDateTime, AsSQLTimeStamp, etc).
veja se não é algo do tipo.
acho que era um cálculo de comissão no aplicativo servidor. algo mais ou menos assim:
cdsComissaoValor.Value := cdsFATURAS.Value * (cdsVendedorComissao.Value / 100);
o erro ocorria quando um desses valores era null. tive que trocar todos os .Value por .AsFloat e o problema foi resolvido. a partir desse dia deixei de usar .Value e sempre referencio o tipo correto do campo (AsString, AsFloat, AsDateTime, AsSQLTimeStamp, etc).
veja se não é algo do tipo.
Pois é, são detalhes assim, que ocorre um erro, e nos preocupamos demais.
Vou analisar todo os processos em meu sistema servidor.
Já no cliente, vai ser demorado, porém, tem que ser feito né.
Fiz uma coisa aqui em meu servidor.
coloquei o componente ApplicationEvents. Assim que ocorrer um erro, peço para ele me mostrar qual foi.
E ocorreu um erro, só que ao invés de corrigi-lo ( que é o correto ) Fechei a conexão e abri novamente.
Resultado : não travou mais.
Agora posso deixar o povo conectado e trabalhando, enquanto eu pego os erros e corro atrás para concerta-los.
pois não posso deixar o sistema parado.
Sei que não é o certo, mas, por enquanto terá que ser assim, até analisar tudo.
Também, não sei se estou certo fazendo isso, mas pelo menos, o servidor ( aplicação ) não trava.
Obrigado,pela ajuda Amigos.
Anderson, verifique também as possíveis divisões por 0, que podem causar o mesmo problema.
imagine o código:
Percentual := cdsFATURAS.Asfloat / cdsVendedorComissao.AsFloat;
se houver a possibilidade do divisor - no caso, cdsVendedorComissao.AsFloat - ser 0 (zero), faça uma avaliação antes ou coloque a operação num try..except.
if cdsVendedorComissao.AsFloat <> 0 then
Percentual := cdsFATURAS.Asfloat / cdsVendedorComissao.AsFloat
else
Percentual := 0;
ou
try
Percentual := cdsFATURAS.Asfloat / cdsVendedorComissao.AsFloat
except
Percentual := 0;
end;
imagine o código:
Percentual := cdsFATURAS.Asfloat / cdsVendedorComissao.AsFloat;
se houver a possibilidade do divisor - no caso, cdsVendedorComissao.AsFloat - ser 0 (zero), faça uma avaliação antes ou coloque a operação num try..except.
if cdsVendedorComissao.AsFloat <> 0 then
Percentual := cdsFATURAS.Asfloat / cdsVendedorComissao.AsFloat
else
Percentual := 0;
ou
try
Percentual := cdsFATURAS.Asfloat / cdsVendedorComissao.AsFloat
except
Percentual := 0;
end;
Pode deixar, vou olhar bem as rotinas e funções e procurar esse tipo e outro iguais a esse ai.
Estou já dando uma varredura, e isso que me mostrou me ajudou a prestar mais atenção em minhas funções.
Vou olhar melhore ver os blocos de try, e lhe passo o que achar de erro, para ajudar outras pessoas também, caso o meu erro sirva de ajuda a todos.
Emerson, Muito Obrigado.
Abraços.







