Uso do Generator está Correto?
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.
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
Curtidas 0
Respostas
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+
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
29/09/2004
afarias vc passou o seguinte código no forum:
na linha:
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.
[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
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+
|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
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?
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
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+
|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