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

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

Keron

Responder

Posts

10/08/2009

Diegotiemann

Qual o interval do seu timer?


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

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

Aceitar