Fórum Atualizar base firebird via serviço do windows #373320
10/08/2009
0
Olá amigos,
Pessoal tenho um banco de dados firebird e o mesmo precisa atualizar duas vezes por dia um outro banco também firebird que encontra-se na net.
Fazendo em aplicação simples funciona normal, mas tentei colocar tudo como numa Service Application e mesmo estando inicializado o serviço não está executando a atualização. Segue Código
Grato desde Já por qualquer dica.
Pessoal tenho um banco de dados firebird e o mesmo precisa atualizar duas vezes por dia um outro banco também firebird que encontra-se na net.
Fazendo em aplicação simples funciona normal, mas tentei colocar tudo como numa Service Application e mesmo estando inicializado o serviço não está executando a atualização. Segue Código
unit untPrincipal;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls, IBQuery, DB, IBCustomDataSet, IBStoredProc, IBDatabase, Registry;
type
TRhemaService = class(TService)
Remoto: TIBDatabase;
TRemoto: TIBTransaction;
SPCadastro: TIBStoredProc;
Local: TIBDatabase;
TLocal: TIBTransaction;
QOrigem: TIBQuery;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
procedure Atualiza;
end;
var
RhemaService: TRhemaService;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
RhemaService.Controller(CtrlCode);
end;
procedure TRhemaService.Atualiza;
begin
if Remoto.Connected=false then Remoto.Connected:=True;
if Local.Connected=false then Local.Connected:=true;
if not TRemoto.InTransaction then
TRemoto.StartTransaction;
QOrigem.Open;
QOrigem.First;
while not QOrigem.Eof do
begin
SPCadastro.Params[0].Value := QOrigem.FieldByName(´item´).AsString;
SPCadastro.Params[1].Value := QOrigem.FieldByName(´gp´).AsString;
SPCadastro.Params[2].Value := QOrigem.FieldByName(´sg´).AsString;
SPCadastro.Params[3].Value := QOrigem.FieldByName(´descricao´).AsString;
SPCadastro.Params[4].Value := QOrigem.FieldByName(´referencia´).AsString;
SPCadastro.Params[5].Value := QOrigem.FieldByName(´unidade´).AsString;
SPCadastro.Params[6].Value := QOrigem.FieldByName(´cf´).AsString;
SPCadastro.Params[7].Value := QOrigem.FieldByName(´plano1´).AsFloat;
SPCadastro.Params[8].Value := QOrigem.FieldByName(´plano2´).AsFloat;
SPCadastro.Params[9].Value := QOrigem.FieldByName(´plano3´).AsFloat;
SPCadastro.Params[10].Value := QOrigem.FieldByName(´plano4´).AsFloat;
SPCadastro.Params[11].Value := QOrigem.FieldByName(´plano5´).AsFloat;
SPCadastro.Params[12].Value := QOrigem.FieldByName(´estoque´).AsFloat;
SPCadastro.Params[13].Value := QOrigem.FieldByName(´emvales´).AsFloat;
SPCadastro.Params[14].Value := QOrigem.FieldByName(´icms´).AsFloat;
SPCadastro.Params[15].Value := QOrigem.FieldByName(´ipi´).AsFloat;
SPCadastro.Params[16].Value := QOrigem.FieldByName(´frete´).AsFloat;
SPCadastro.Params[17].Value := QOrigem.FieldByName(´desconto´).AsFloat;
SPCadastro.Params[18].Value := QOrigem.FieldByName(´status´).AsString;
SPCadastro.Params[19].Value := FormatDateTime(´mm/dd/yyyy´,StrToDate(QOrigem.FieldByName(´atualizado´).AsString));
SPCadastro.Params[20].Value := QOrigem.FieldByName(´endereco´).AsString;
SPCadastro.Params[21].Value := QOrigem.FieldByName(´aplicacao´).AsString;
SPCadastro.Params[22].Value := QOrigem.FieldByName(´barra´).AsString;
SPCadastro.ExecProc;
QOrigem.Next;
end;
TRemoto.Commit;
if Remoto.Connected=True then Remoto.Connected:=False;
if Local.Connected=True then Local.Connected:=False;
end;
function TRhemaService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TRhemaService.Timer1Timer(Sender: TObject);
var
h,m,s,i:word;
begin
decodetime(now,h,m,s,i);
if (((h=11) or (h=17)) and (m=59) and(s=00)) then
Atualiza;
end;
end.Grato desde Já por qualquer dica.
Keron
Curtir tópico
+ 0
Responder
Posts
10/08/2009
Diegotiemann
Qual o interval do seu timer?
Tente alterar o seguinte
Se levar menos de um minuto para atualizar a base, coloca um sleep, ou usa uma variável
Tente alterar o seguinte
procedure TRhemaService.Timer1Timer(Sender: TObject); var h,m,s,i:word; begin decodetime(now,h,m,s,i); if (((h=11) or (h=17)) and (m=59) ) then begin timer1.enabled:=False; Atualiza; timer1.enabled:=True; end; end;
Se levar menos de um minuto para atualizar a base, coloca um sleep, ou usa uma variável
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)