Dispara evento manualmente, tem como ?
olá pessoal
utilizo D7 e FB 1.5
tenho uma tela de agenda onde nela são realizadas operações.
no banco, tenho uma trigger abaixo, para os eventos After insert, update e delete.
na tela de agenda eu tenho o MDOEvents (que tem as mesmas funcionalidades do IBEvents, IBXEventAlerter, etc..). que captura os eventos de banco.
a trigger é a seguinte
no form no MdoEvents eu tenho:
Só que eu não gostaria de usar a trigger (ou usar a trigger dessa maneira), porque eu gostaria de disparar eventos Manualmente, ou seja, após serem concluidas diversas operações que são realizadas automaticamente na minha agenda, eu disparasse um evento para que os outros micros o recebessem e atualizassem.
como posso fazer?
obrigado
Diogo
utilizo D7 e FB 1.5
tenho uma tela de agenda onde nela são realizadas operações.
no banco, tenho uma trigger abaixo, para os eventos After insert, update e delete.
na tela de agenda eu tenho o MDOEvents (que tem as mesmas funcionalidades do IBEvents, IBXEventAlerter, etc..). que captura os eventos de banco.
a trigger é a seguinte
CREATE TRIGGER TRG_AGENDA FOR AGENDA ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0 AS BEGIN POST_EVENT ´ATUALIZA´; END
no form no MdoEvents eu tenho:
procedure TForm1.MDOEvents1EventAlert(Sender: TObject; EventName: String; EventCount: Integer; var CancelAlerts: Boolean); begin if EventName = ´ATUALIZA´ then TblAgenda.Refresh; end;
Só que eu não gostaria de usar a trigger (ou usar a trigger dessa maneira), porque eu gostaria de disparar eventos Manualmente, ou seja, após serem concluidas diversas operações que são realizadas automaticamente na minha agenda, eu disparasse um evento para que os outros micros o recebessem e atualizassem.
como posso fazer?
obrigado
Diogo
Diogoalles
Curtidas 0
Respostas
Firekiller
19/10/2005
Bom, não sei se testou, mas no outro tópico que vc tinha aberto com esse problema, foi respondido...
Bom, para disparar eventos manualmente, crie uma procedure com o nome de DIapara_Atualizacao, com o seguinte conteúdo:
CREATE PROCEDURE DISPARA_ATUALIZACAO
AS
BEGIN
POST_EVENT ´ATUALIZA´;
END
Daí pra disparar a procedure, você pode usar um MDOQuery com o sql
EXECUTE PROCEDURE DISPARA_ATUALIZACAO
ou então usar um componente MDOStoredProc.
Bom, para disparar eventos manualmente, crie uma procedure com o nome de DIapara_Atualizacao, com o seguinte conteúdo:
CREATE PROCEDURE DISPARA_ATUALIZACAO
AS
BEGIN
POST_EVENT ´ATUALIZA´;
END
Daí pra disparar a procedure, você pode usar um MDOQuery com o sql
EXECUTE PROCEDURE DISPARA_ATUALIZACAO
ou então usar um componente MDOStoredProc.
GOSTEI 0
Diogoalles
19/10/2005
sim Firekiller
havia testado o que voce postou no outro e funcionou perfeitamente,
só que naquele jeito é disparado a cada operação de Insert, Update e Delete.. acabei analisando e descobri que isso não me server...
por isso vou implementar o que você passou agora.. show de bola.. valeu mesmo!
Diogo
havia testado o que voce postou no outro e funcionou perfeitamente,
só que naquele jeito é disparado a cada operação de Insert, Update e Delete.. acabei analisando e descobri que isso não me server...
por isso vou implementar o que você passou agora.. show de bola.. valeu mesmo!
Diogo
GOSTEI 0
Diogoalles
19/10/2005
bom dia Firekiller
Estou tentando fazer o seguinte, só que não tá aceitando, tentei juntar a ideia que você havia passado na trigger:
só que não tá identificando a tabela Agenda.
o que seria?
obrigado
Diogo
Estou tentando fazer o seguinte, só que não tá aceitando, tentei juntar a ideia que você havia passado na trigger:
CREATE PROCEDURE AGENDA_ATUALIZACAO AS BEGIN EVENTO = AGENDA.CD_AGENDA||´_´||EXTRACT(DAY FROM AGENDA.DT_AGENDA)||EXTRACT(MONTH FROM AGENDA.DT_AGENDA)||EXTRACT(YEAR FROM AGENDA.DT_AGENDA); POST_EVENT :EVENTO; END;
só que não tá identificando a tabela Agenda.
o que seria?
obrigado
Diogo
GOSTEI 0
Diogoalles
19/10/2005
bem, dando uma estudada acho q cosegui , só ñ testei ainda:
tenho o camando que dispara a SP acima qdo eu precisar:
e no OnEventAlert eu tenho:
só fiquei com uma duvida na questão do parametro DT_AGENDA que passo para a procedure, dependedo da configuração do micro a data pode ser 01/10/2005 ou 01/10/05, então no Oneventalert quando eu comparar pode estar com formato diferente em outro micro.
qual seria a melhor maneira d passar um formato X e ler com o formato X?
obrigado
Diogo
CREATE PROCEDURE ATENDIMENTO_ATUALIZACAO (CD_AGENDA INTEGER, DT_AGENDA DATE) RETURNS (EVENTO VARCHAR(30)) AS BEGIN EVENTO = :CD_AGENDA || ´_´ || :DT_AGENDA; POST_EVENT :EVENTO; END;
tenho o camando que dispara a SP acima qdo eu precisar:
procedure Atendimento_Atualiza_Eventos(Cd_Agenda:Integer;Dt_Agenda:TDate); begin DtMdlGcm1.MDOspAtu.Params[0].AsInteger := Cd_Agenda; DtMdlGcm1.MDOspAtu.Params[1].AsDate := Dt_Agenda; DtMdlGcm1.MDOspAtu.ExecProc; end;
e no OnEventAlert eu tenho:
if EventName = (frm500a.QAgenda.FieldByName(´CD_AGENDA´).Value+´_´+frm500a.Calendario.Date)then frm500a.TblAgenda.Refresh;
só fiquei com uma duvida na questão do parametro DT_AGENDA que passo para a procedure, dependedo da configuração do micro a data pode ser 01/10/2005 ou 01/10/05, então no Oneventalert quando eu comparar pode estar com formato diferente em outro micro.
qual seria a melhor maneira d passar um formato X e ler com o formato X?
obrigado
Diogo
GOSTEI 0
Firekiller
19/10/2005
Colega, o único problema que você pode vir a ter é justamente esse, a diferença na forma de exportar e receptar o evento.
Tente fazer assim:
CREATE PROCEDURE ATENDIMENTO_ATUALIZACAO (CD_AGENDA INTEGER, DT_AGENDA DATE)
RETURNS (EVENTO VARCHAR(30))
AS
BEGIN
EVENTO = :CD_AGENDA || ´_´ || EXTRACT(DAY FROM :DT_AGENDA)||EXTRACT(MONTH FROM :DT_AGENDA)||EXTRACT(YEAR FROM :DT_AGENDA);
POST_EVENT :EVENTO;
END;
Porque daí não ficaria dependente da formatação de data do sistema.
Tente fazer assim:
CREATE PROCEDURE ATENDIMENTO_ATUALIZACAO (CD_AGENDA INTEGER, DT_AGENDA DATE)
RETURNS (EVENTO VARCHAR(30))
AS
BEGIN
EVENTO = :CD_AGENDA || ´_´ || EXTRACT(DAY FROM :DT_AGENDA)||EXTRACT(MONTH FROM :DT_AGENDA)||EXTRACT(YEAR FROM :DT_AGENDA);
POST_EVENT :EVENTO;
END;
Porque daí não ficaria dependente da formatação de data do sistema.
GOSTEI 0
Diogoalles
19/10/2005
bem pessoal
parece tudo muito bonito, mas não consigo fazer funcionar
e o problema está nessa questão de registrar eventos e saber os eventos que podem ser recebidos...
se eu estiver no micro1 na tela vou ter o Profissional1 e a data 20/10/2005.
e nele eu fizer as devidas operações e disparo a SP.
é necessário adicionar o evento (Profssional1+Data) antes ou depois de executar a SP ?
pq no micro2 eu não vou ter esse evento cadastrado ou registrado, tanto que coloquei o brakePoint no OneventAlert e em nenhum momento a aplicação passou por ali.
o que está faltando ?
já fiz uma série de modificações mas nenhuma surtiu efeito.
obrigado
Diogo
parece tudo muito bonito, mas não consigo fazer funcionar
e o problema está nessa questão de registrar eventos e saber os eventos que podem ser recebidos...
se eu estiver no micro1 na tela vou ter o Profissional1 e a data 20/10/2005.
e nele eu fizer as devidas operações e disparo a SP.
é necessário adicionar o evento (Profssional1+Data) antes ou depois de executar a SP ?
pq no micro2 eu não vou ter esse evento cadastrado ou registrado, tanto que coloquei o brakePoint no OneventAlert e em nenhum momento a aplicação passou por ali.
o que está faltando ?
já fiz uma série de modificações mas nenhuma surtiu efeito.
obrigado
Diogo
GOSTEI 0
Diogoalles
19/10/2005
complementando
pude reparar que sempre após executar a SP ele fecha a tabela e a query que estão ligadas ao mesmo database....
pude reparar que sempre após executar a SP ele fecha a tabela e a query que estão ligadas ao mesmo database....
// Stored Procedure de Atualização MDOspAtu.Prepare; MDOspAtu.Params[0].AsString := FormatFloat(´0000000000´,2); MDOspAtu.Params[1].AsString := FormatDateTime(´00/00/0000´,Dt_Agenda); MDOspAtu.ExecProc;
GOSTEI 0
Diogoalles
19/10/2005
olá pessoal,
agora sim, tudo funcionando...
vou deixar postado aqui para os que precisarem futuramente....
criei a storep procedure no banco:
na Sp acima, optei por criar tudo como varchar.. mas isso fica a critério.
no meu form tenho uma tabela de Profissionais, onde eu seleciono um profissional, e tenho um Calendário para obter a data.
eu trabalho com MDO, mas os outros pacotes tem os componentes similares que fazem a mesma coisa e vcs poderão substituir com os respectivos.
no form tb tenho um MDOTransaction (Autocommit=True;ReadCommited), MDOStoredProcedured que está liga a SP criada acima, um MDOEvents e uma tabela ATENDIMENTO....
no OnCreate do form:
no OnChange do Calendario e ao mudar de Profissional eu também tenho o seguinte codigo:
isso porque eu vou ter rotinas somente para os eventos que forem igual ao profissional/data que estou utilizando,
isto serve para que não tenho que executar a atualização da minha agenda para qualquer evento ou para evento de outros profissionais data. Então registro no Events somente o que quero, no caso o profissional/data que estou utilizando no momento.
no MDOEvents no evento OnEventAlert tenho:
e abaixo tenho a rotina que executa a SP do banco e dispara os eventos...
eu executo essa SP após algumas operações na agenda, para somente então mandar o evento pro banco para atualizar os outros pontos que tem o mesmo profissional/data aberto.
*** não sei quanto aos outros pacotes, mas o MDO necessita abrir novamente a tabela/query após atualiza o evento...
agradeço a todos que ajudaram e fica aqui a solução pra quem precisar.
abraço
Diogo
agora sim, tudo funcionando...
vou deixar postado aqui para os que precisarem futuramente....
criei a storep procedure no banco:
CREATE PROCEDURE ATENDIMENTO_ATUALIZACAO (CD_AGENDA VARCHAR(8), DT_AGENDA VARCHAR(10)) RETURNS (EVENTO VARCHAR(20)) AS BEGIN EVENTO = :CD_AGENDA || :DT_AGENDA; POST_EVENT :EVENTO; END;
na Sp acima, optei por criar tudo como varchar.. mas isso fica a critério.
no meu form tenho uma tabela de Profissionais, onde eu seleciono um profissional, e tenho um Calendário para obter a data.
eu trabalho com MDO, mas os outros pacotes tem os componentes similares que fazem a mesma coisa e vcs poderão substituir com os respectivos.
no form tb tenho um MDOTransaction (Autocommit=True;ReadCommited), MDOStoredProcedured que está liga a SP criada acima, um MDOEvents e uma tabela ATENDIMENTO....
no OnCreate do form:
MDOevents.UnRegisterEvents; MDODatabase.Connected := True; MDOtransaction.Active := True; TblAtend.Open; MDOevents.Events.Clear; MDOevents.Events.Add(FormatFloat(´00000000´,CdProfissional)+FormatDateTime(´dd/mm/yyyy´,Calendario.Date)); MDOevents.RegisterEvents;
no OnChange do Calendario e ao mudar de Profissional eu também tenho o seguinte codigo:
MDOevents.Events.Clear; MDOevents.Events.Add(FormatFloat(´00000000´,CdProfissional)+FormatDateTime(´dd/mm/yyyy´,Calendario.Date)); MDOevents.RegisterEvents;
isso porque eu vou ter rotinas somente para os eventos que forem igual ao profissional/data que estou utilizando,
isto serve para que não tenho que executar a atualização da minha agenda para qualquer evento ou para evento de outros profissionais data. Então registro no Events somente o que quero, no caso o profissional/data que estou utilizando no momento.
no MDOEvents no evento OnEventAlert tenho:
if EventName = (FormatFloat(´00000000´,CdProfissional)+FormatDateTime(´dd/mm/yyyy´,EdtData.Date)) then TblAtend.Refresh;
e abaixo tenho a rotina que executa a SP do banco e dispara os eventos...
eu executo essa SP após algumas operações na agenda, para somente então mandar o evento pro banco para atualizar os outros pontos que tem o mesmo profissional/data aberto.
procedure TForm1.Atendimento_Atualiza_Eventos(Cd_Agenda:Integer;Dt_Agenda:TDate); begin MDOspAtu.Prepare; MDOspAtu.Params[0].AsString := FormatFloat(´00000000´,2); MDOspAtu.Params[1].AsString := FormatDateTime(´dd/mm/yyyy´,Dt_Agenda); MDOspAtu.ExecProc; MDOtransaction.Commit; TblAtend.Open; end;
*** não sei quanto aos outros pacotes, mas o MDO necessita abrir novamente a tabela/query após atualiza o evento...
agradeço a todos que ajudaram e fica aqui a solução pra quem precisar.
abraço
Diogo
GOSTEI 0