Fórum Como Chamar Trigger pelo Delphi 7 Para Fazer o Autoincrement? #383122

09/08/2010

0

Olá! Gostaria de saber como chamar pelo Delphi um Trigger que tem a função de gerar um código automaticamente para inserir numa tabela que criei em Firebird.   Eu criei um generator chamado gen1 e criei um Trigger: CREATE trigger TRIG1 for CLIENTE active before insert position 0 As BEGIN     if (NEW.CODIGO IS NULL) then                  NEW.CODIGO = GEN_ID (TRIG1, 1); END   No programa que eu criei em Delphi, tem a tela de cadastro normal, mas eu quero que não seja necessário digitar nenhum código no DBEdit1. Quero chamar essa trigger pra ela adcionar o código automaticamente quando eu clicar em "Novo Cadastro". Eu utilizo um ClientDataSet pra fazer conexão com o Firebird. É possível chamar esse Trigger usando ClientDataSet? Como ficaria isso? Alguém poderia me ajudar? Estou quebrando cabeça a um tempão pra tentar inserir o código automaticamente. Obrigado!  
Ricardo

Ricardo

Responder

Posts

09/08/2010

Marcos Iwazaki

Então amigo...

Trigger dispara sozinho de acordo com a ação que vc escolheu, no caso "Before Insert" isso quer dizer antes de inserir. Mas isso significa antes de inserir no banco.

Outra coisa vc esta usando ClientDataSet, qdo vc faz um cds.Insert isso faz um insert no seu ClientDataSet e não no banco. Somente qdo vc fizer um applyupdates vai salvar no banco.

Vc pode deixar o seu campo vazio e salvar, dae qdo for para o banco a trigger vai disparar.
Se caso vc tiver problema pois o campo do codigo tem que estar preenchido, então preencha com "0" e na trigger verifique "if isnull or codigo=0" 

Espero ter ajudado...
flw.
Responder

Gostei + 0

09/08/2010

Ricardo

Como assim o ClientDataSet não salva no banco? Desculpe a minha ignorância, é que e ainda estou aprendendo. Eu tenho um programa que eu fiz que ele inclui, altera e exclui do banco de dados. Para conexão eu usei um SQLConection, SQLDataSet, DataSetProvider, ClientDataSet e um DataSource. Eu digito o conteúdo em DBEdits e quando clico em Salvar o conteúdo é salvo no meu banco Firebird e é exibido num DBGrid. O banco que eu criei tem esse Trigger aí que eu mostrei, mas quando eu clico em salvar, se o campo CÓDIGO não tiver sido preenchido ele não está salvando automaticamente, por isso achei que tivesse que fazer algo diferente como "chamar" o Trigger no Delphi. Quando eu clico em Salvar, se eu não informar o CÓDIGO, ele da erro de "Violation of Primary and Unique Key", entende? Você saberia me dizer o que eu estou fazendo errado então?
Responder

Gostei + 0

10/08/2010

Ricardo

Alguém aí tem idéia de como resolver isso????????
Responder

Gostei + 0

10/08/2010

Wilson Junior

No seu código você está dizendo que o seu GENERATOR tem o mesmo nome da TRIGGER. Esta correto isto?
NEW.CODIGO = GEN_ID (TRIG1, 1);


Deve ser criado um GENERATOR para efetuar o auto-incremento do campo código. Ex.: GEN_CLIENTE
NEW.CODIGO = GEN_ID (GEN_CLIENTE, 1);

Espero ter colaborado.
Responder

Gostei + 0

10/08/2010

Deivison Melo

Poderia utilizar essa forma com o dbexpress:   function GeneratorID (aName: string; Connection: TSQLConnection;
  Incrementa: Boolean): integer;
var
  Qry: TSQLQuery;
begin
  Qry := TSQLQuery.Create(nil);
  try
    Qry.SQLConnection := Connection;
    if Incrementa then
      Qry.SQL.Add(
        'SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
    else
      Qry.SQL.Add(
        'SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
    Qry.Open;
    Result := Qry.Fields[0].AsInteger;
  finally
    FreeAndNil(Qry);
  end;
end;     Qualquer coisa estou à disposição!!!
Responder

Gostei + 0

10/08/2010

Ricardo

No seu código você está dizendo que o seu GENERATOR tem o mesmo nome da TRIGGER. Esta correto isto?
NEW.CODIGO = GEN_ID (TRIG1, 1);


Deve ser criado um GENERATOR para efetuar o auto-incremento do campo código. Ex.: GEN_CLIENTE
NEW.CODIGO = GEN_ID (GEN_CLIENTE, 1);

Espero ter colaborado.
  Realmente eu escrevi o código do Trigger errado aqui no Forum.
Mas lá no firebird ta certinho, tanto que tá incrementando o código sozinho quando faço a inserção por lá.
O problema tá no Delphi mesmo.
Me disseram que isso acontece porque o ClientDataSet requer que todos os campos sejam digitados.
E disseram que tem um jeito de o ClientDataSet não requerer o campo código, mas não souberam me explicar isso. Se alguém souber como se faz isso agradeçeria, porque é horrível criar um código para fazer auto increment sendo que o firebird faz isso de modo mais simples com generator e trigger.
Alguém saberia me explicar com detalhes como faz para o ClientDataSet não requerer o código?
Se alguém já passou por isso ou sabe do que eu estou falando, da uma ajudinha por favor?
Vlw aê a todos!!!
Responder

Gostei + 0

10/08/2010

Eriley Barbosa

No Fields Editor do SQLDataset selecione o campo código do cliente e no object Inspector altere a propriedade Required para False, repita a operação para o clientDataset.   Atenciosamente   Eriley
Responder

Gostei + 0

10/08/2010

Ricardo

No Fields Editor do SQLDataset selecione o campo código do cliente e no object Inspector altere a propriedade Required para False, repita a operação para o clientDataset.   Atenciosamente   Eriley
  Opa! Agora sim Tá perfeito!!! Modifiquei o required pra false e zerei o generator do banco. Agora tá inserindo automaticamente perfeitamente, hehehe!!! Vlw aê a todo mundo que ajudou!!! Abraço!!!
Responder

Gostei + 0

04/05/2013

Frederico Brigatte***

Como que uso generator no delphi para incrementar no campo. Tenho o generator criado no banco:

CREATE SEQUENCE GEN_FUNCIONARIOS_ID;
ALTER SEQUENCE GEN_FUNCIONARIOS_ID RESTART WITH 0;


Não estou sabendo utilizar no Delphi.
Responder

Gostei + 0

16/06/2013

Ricardo

Como que uso generator no delphi para incrementar no campo. Tenho o generator criado no banco:

CREATE SEQUENCE GEN_FUNCIONARIOS_ID;
ALTER SEQUENCE GEN_FUNCIONARIOS_ID RESTART WITH 0;


Não estou sabendo utilizar no Delphi.


Amigo, que componentes você utiliza para conectar o delphi no banco de dados?

Se for usando o IBDatabase, coloca um IBQuery e na propriedade "GeneratorField" do IBQuery, Clica nos (...) que tem lá e vai abrir uma janela pra configurar o auto increment. É só a sua chave primária no campo FIELD e dar ok.
Não esqueça de setar as propriedades do IBQuery "DataSource", "Transaction" e "UpdateObject" para seus respectivos componentes.
Responder

Gostei + 0

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

Aceitar