Uso do Generator está Correto?

Firebird

29/09/2004

eu tenho uma tabela de vendas onde preciso que o banco gere um numero sequencial automatico estou utilizando em master/detail 2 clientdataset 1 para cabecalho da venda e outro para itens e no banco criei as 2 tabelas p/ venda/itens e uma tabela nvenda que contem um campo nvenda que tem um trigger que no before insert executa:

new.nvenda=gen_id(gennvenda,1);

eu executo esse codigo no banco para gerar o numero da venda e na aplicacao tenho um ibtable ligado a tabela nvenda que ao inciar a venda executa:

tabnvenda.insert;
tabnvendadata.asdate:=date;//para gerar o numero automatico
tabnvenda.post;
************************
cdsvenda.insert;
cdsvendanvenda.asinteger:=tabnvendanvenda.asinteger;

bom isso dá certo, mas eu gostaria de saber se isto é correto e se tem uma outra maneira para isso, porque eu tentei fazer o trigger na tabela de vendas mas o clientdataset não aceita quando e´executado o .post ele diz que o campo nvenda está null e como ele é primary key a operação não pode ser finalizada, mas nas tabelas de cadastro de clientes etc. eu consigo efetuar o trigger e gerar o numero automatico na mesma tabela e não utilizar outra como na venda isso porque no cadastro eu uso ibdataset.


Tap_pedroso

Tap_pedroso

Curtidas 0

Respostas

Afarias

Afarias

29/09/2004

|na aplicacao tenho um ibtable ligado a tabela nvenda que ao inciar a

n.ã.o use TABLE!


|bom isso dá certo, mas eu gostaria de saber se isto é correto

Não é a solução mais adequada, isso é certo.

vc poderia pegar o valor do generator simplesmente executando uma Query com o SQL:

select gen_id(nome_generator, 1) from rdb$database;

tipo

Query.Open;
ID := Query.Fields[0].AsInteger;
Query.Close;

dê uma olhada neste tópico para algo mais detalhado::

http://delphiforum.icft.com.br/forum/viewtopic.php?t=30242&highlight=generator


|eu tentei fazer o trigger na tabela de vendas mas o clientdataset não
|aceita quando e´executado o .post ele diz que o campo nvenda está null

basta configurar a propriedade REQUIRED do TField para FALSE. Entretanto, acho mais prático para vc não usar triggers, mas pegar o valor na aplicação (como citado acima) -- mas veja ai o mais adequado a sua aplicação.


T+


GOSTEI 0
Tap_pedroso

Tap_pedroso

29/09/2004

afarias vc passou o seguinte código no forum:

[b]Código: 

function TFormx.GetNewID(const AGenerator: string): Integer; 
const 
  SQLText = ´select gen_id(¬s, 1) from rdb$database´; 
begin 
  with IBSQL1 do 
  begin 
    SQL.Text := Format(SQLText, [AGenerator]); 
    Transaction.StartTransaction; 
    try 
      ExecQuery; 
      Result := Fields[0].AsInteger; 
    finally 
      Transaction.Commit; 
    end; 
  end; 
end;  [/b]



na linha:

SQLText = ´select gen_id(¬s, 1) from rdb$database´; 


com o valor ,1 um ele irá adicionar +1 no numero do generator e já metrazer o generator com o numero adicionado e se ,0 não adiciona, estou certo!

e o que significa ¬s?

depois do from eu sempre isarei rdb$database´?


obrigado.


GOSTEI 0
Afarias

Afarias

29/09/2004

|com o valor ,1 um ele irá adicionar +1 no numero do generator e já
|metrazer o generator com o numero adicionado e se ,0 não adiciona,
|estou certo!

Sim


|e o que significa ¬s?

é um parâmetro para a função FORMAT (do Delphi) no lugar do ¬s será ´adicionado´ o nome do generator (valor da variável AGenerator)


|depois do from eu sempre isarei rdb$database´?

ou qualquer outra tabela q *sempre* possua 1 e apenas 1 registro



T+


GOSTEI 0
Tap_pedroso

Tap_pedroso

29/09/2004

1º)essa function eu vou ter que usala um cada form que tenha um modulo que use generator não é?


2º)não tem como eu colocar essa function em uma unit e fazer com que todos os modulos que usem generator dependa dassa unit?


GOSTEI 0
Afarias

Afarias

29/09/2004

|2º)não tem como eu colocar essa function em uma unit e fazer com que
|todos os modulos que usem generator dependa dassa unit?

é o ideal. Eu costumo colocá-la no meu dataModule principal ( como um método do DataModule, dai eu chamo:: id := dmPrincipal.GenId(...); )




T+


GOSTEI 0
POSTAR