Passar valor para campos requeridos no firebird que não estão na tela e capturar campos que tem seus default definido no Firebird
OLá Equipe DevMedia
Preciso de uma ajuda de vocês.
Tecnologia utilizada : Delphi 2009 com DbExpress e Firebird 2.1
Como sou iniciante no Delphi, não consigo realizar tudo o que gostaria de fazer, fiz toda estrutura no firebird e agora estou tentando por isto em pratica no Delphi.
No meu banco de Dados no Firebird, tenho alguns campos que são padrões em minhas tabelas.
Nestes campos , temos por exemplo os campos DATAAUD e AUDWIN que exemplifica os dois casos na qual preciso de ajuda.
O primeiro campo (DATAAUD) é apenas para gravar no banco a data da operação do usuario (este campo eu não vou mostar na tela do delphi) e ele é um campo NOT NULL no firebird, Como faço dentro do delphi para passar um valor para o mesmo (no caso deste campo, o valor seria "NOW', ja que ele é um timestamp) no momento da inclusão do meu registro?
Ja o segundo campo (AUDWIN), ele é gerado por um trigger, semelhante a ação do generator, ele me traz algumas informações que vou mostrar na tela do delphi, atravez de um DBTEXT, para facilitar ao usuario (e o meu trabalho tbm, pois não precisarei ficar logando no banco para saber quem incluiu ou alterou o registro, ou qual a data das operações, etc), como eu faço para capturar seu resultado do firebird para a tela do delphi, no momento q eu salvar o registro na sua inclusão ou alteração, sem precisar pesquisar o registro e entrar nele novamente para ver o resultado.
Vale observar que eu terei este campo tanto em tabelas master como em tabelas detalhes.
Segue abaixo uma tabela de exemplo com sua trigger, se você criar a tabela com a trigger e incluir um ou dois registros na tabela, preenchendo apenas o campo DESCRICAOALUNO e mesmo alterando, você verá o resultado do campo, retornado pela triggers, esta trigger tem sua ação tanto no before insert qto no before update;
CREATE GENERATOR GEN_ALUNOS_ID;
CREATE TABLE ALUNOS (
ALUNOS_ID INTEGER NOT NULL,
DATAAUD TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
AUDWIN VARCHAR(50) COLLATE WIN_PTBR,
USUARIO VARCHAR(30) DEFAULT CURRENT_USER,
EMPRESA INTEGER DEFAULT 0 NOT NULL,
DESCRICAOALUNO VARCHAR(50)
);
ALTER TABLE ALUNOS ADD CONSTRAINT PK_ALUNOS PRIMARY KEY (ALUNOS_ID);
/* Trigger: ALUNOS_BI */
CREATE OR ALTER TRIGGER ALUNOS_BI FOR ALUNOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ALUNOS_ID IS NULL) THEN
NEW.ALUNOS_ID = GEN_ID(GEN_ALUNOS_ID,1);
END
^
/* Trigger: ALUNOS_BIU_AUDWIN */
CREATE OR ALTER TRIGGER ALUNOS_BIU_AUDWIN FOR ALUNOS
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
declare variable hoje TIMESTAMP;
declare variable usuario VARCHAR(30);
declare variable operacao VARCHAR(30);
begin
hoje = current_timestamp;
usuario = user;
if (inserting) then
operacao = 'Incluido por';
else
if (updating) then
operacao = 'Alterado por';
new.audwin = :operacao || ' ' || :usuario || ' em ' || :hoje;
end
^
Abraços,
Rogério Nascimento.
Preciso de uma ajuda de vocês.
Tecnologia utilizada : Delphi 2009 com DbExpress e Firebird 2.1
Como sou iniciante no Delphi, não consigo realizar tudo o que gostaria de fazer, fiz toda estrutura no firebird e agora estou tentando por isto em pratica no Delphi.
No meu banco de Dados no Firebird, tenho alguns campos que são padrões em minhas tabelas.
Nestes campos , temos por exemplo os campos DATAAUD e AUDWIN que exemplifica os dois casos na qual preciso de ajuda.
O primeiro campo (DATAAUD) é apenas para gravar no banco a data da operação do usuario (este campo eu não vou mostar na tela do delphi) e ele é um campo NOT NULL no firebird, Como faço dentro do delphi para passar um valor para o mesmo (no caso deste campo, o valor seria "NOW', ja que ele é um timestamp) no momento da inclusão do meu registro?
Ja o segundo campo (AUDWIN), ele é gerado por um trigger, semelhante a ação do generator, ele me traz algumas informações que vou mostrar na tela do delphi, atravez de um DBTEXT, para facilitar ao usuario (e o meu trabalho tbm, pois não precisarei ficar logando no banco para saber quem incluiu ou alterou o registro, ou qual a data das operações, etc), como eu faço para capturar seu resultado do firebird para a tela do delphi, no momento q eu salvar o registro na sua inclusão ou alteração, sem precisar pesquisar o registro e entrar nele novamente para ver o resultado.
Vale observar que eu terei este campo tanto em tabelas master como em tabelas detalhes.
Segue abaixo uma tabela de exemplo com sua trigger, se você criar a tabela com a trigger e incluir um ou dois registros na tabela, preenchendo apenas o campo DESCRICAOALUNO e mesmo alterando, você verá o resultado do campo, retornado pela triggers, esta trigger tem sua ação tanto no before insert qto no before update;
CREATE GENERATOR GEN_ALUNOS_ID;
CREATE TABLE ALUNOS (
ALUNOS_ID INTEGER NOT NULL,
DATAAUD TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
AUDWIN VARCHAR(50) COLLATE WIN_PTBR,
USUARIO VARCHAR(30) DEFAULT CURRENT_USER,
EMPRESA INTEGER DEFAULT 0 NOT NULL,
DESCRICAOALUNO VARCHAR(50)
);
ALTER TABLE ALUNOS ADD CONSTRAINT PK_ALUNOS PRIMARY KEY (ALUNOS_ID);
/* Trigger: ALUNOS_BI */
CREATE OR ALTER TRIGGER ALUNOS_BI FOR ALUNOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ALUNOS_ID IS NULL) THEN
NEW.ALUNOS_ID = GEN_ID(GEN_ALUNOS_ID,1);
END
^
/* Trigger: ALUNOS_BIU_AUDWIN */
CREATE OR ALTER TRIGGER ALUNOS_BIU_AUDWIN FOR ALUNOS
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
declare variable hoje TIMESTAMP;
declare variable usuario VARCHAR(30);
declare variable operacao VARCHAR(30);
begin
hoje = current_timestamp;
usuario = user;
if (inserting) then
operacao = 'Incluido por';
else
if (updating) then
operacao = 'Alterado por';
new.audwin = :operacao || ' ' || :usuario || ' em ' || :hoje;
end
^
Abraços,
Rogério Nascimento.
Rogério Nascimento
Curtidas 0
Respostas
Rodrigo Mourão
08/06/2009
Olá Rogério,
Vamos lá. O primeiro caso se resolve apenas indo no evento OnNewRecord do clientdataset que tem este campo e adicionando o seguinte codigo:
ClienteDataSet.FieldByName('DATAAUD').ASDataTime := Now;
Agora o segundo problema você deverá fazer o seguinte. Ao inserir ou altera a trigger irá disparar com isso seus dados serão gerados. Após dar um ApplyUpdates(0) chame o metodo refresh do clientDataset. Isso irá atualizar o registro e trazer os dados gerados pela trigger.
Espero ter ajudado.
Abs.
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Vamos lá. O primeiro caso se resolve apenas indo no evento OnNewRecord do clientdataset que tem este campo e adicionando o seguinte codigo:
ClienteDataSet.FieldByName('DATAAUD').ASDataTime := Now;
Agora o segundo problema você deverá fazer o seguinte. Ao inserir ou altera a trigger irá disparar com isso seus dados serão gerados. Após dar um ApplyUpdates(0) chame o metodo refresh do clientDataset. Isso irá atualizar o registro e trazer os dados gerados pela trigger.
Espero ter ajudado.
Abs.
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0
Rogério Nascimento
08/06/2009
Mais uma vez, obrigado Rodrigo.
GOSTEI 0
Rodrigo Mourão
08/06/2009
Disponha,
Estamos sempre a disposição.
Abs.
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Estamos sempre a disposição.
Abs.
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
GOSTEI 0