Auto Incremento
Estou utilizando D7 com Fb1.53, criei no FB uma Trigger e um generators, onde estou incrementando o codigo de cliente, ate ai blz, faço cadastro pelo IBExperts e funciona direitinho, mas como eu implemento isso no DBExpress SqlDataset+Provider+ClientDataset?
Abs
Abs
Felipeiw
Curtidas 0
Respostas
Thiago Vidal
29/11/2006
normalmente eu nao gosto de utilizar triggers, pois o seu sistema fica sem saber qual numero foi associado ao seu ultimo registro no banco.
uso apenas o generator, e para saber o proximo valor, eu deixo um TSQLDataSet apenas para isso no data module principal, com o código:
Sendo SQLGenerator o nome do meu TSQLDataSet especifico pra isso:
e faço uma chamada à esta função no evento OnNewRecord ou AfterInsert do ClientDataSet, assim, caso eu precise cadastrar Detalhes para este registro, eu já sei qual valor de chave primária será atribuído ao meu registro recém-criado.
acredito que para programar 3 camadas vc deva chamar a função em algum lugar do seu servidor de aplicações, e não no seu ClientDataSet.
uso apenas o generator, e para saber o proximo valor, eu deixo um TSQLDataSet apenas para isso no data module principal, com o código:
Sendo SQLGenerator o nome do meu TSQLDataSet especifico pra isso:
function Tdm.GenID(GeneratorName: string): Integer; begin with SQLGenerator do try CommandText := Format(´select gen_id(¬s, 1) from rdb$database´, [GeneratorName]); Open; Result := Fields[0].AsInteger; finally Close; end; end;
e faço uma chamada à esta função no evento OnNewRecord ou AfterInsert do ClientDataSet, assim, caso eu precise cadastrar Detalhes para este registro, eu já sei qual valor de chave primária será atribuído ao meu registro recém-criado.
acredito que para programar 3 camadas vc deva chamar a função em algum lugar do seu servidor de aplicações, e não no seu ClientDataSet.
GOSTEI 0
Brjedi
29/11/2006
Oi Thiago,
Esse seu problema é muito fácil de resolver. Você deve indicar que o campo é chave primária e que não deve ser atualizado pela aplicação.
Dê um duplo clique no componente, clique no campo da chave primária e altere as seguintes propriedades:
AutoGenerateValue = arAutoInc
Required = False
ProviderFlags: pfInUpdate = False; pfInWhere = True
Deste modo vc indica que o campo é chave primária, não é requerido e não é atualizado pela aplicação.
Nos outros campos:
ProviderFlags: pfInUpdate = True; pfInWhre = False
Assim esses campos não serão utilizados na cláusula WHERE para atualização (UPDATE e DELETE).
Faça isso primeiro no SQLDataSet e depois no ClientDataSet.
Se vc precisar do próximo código, dê uma olhada na ClubeDelphi deste mês. Tem um artigo meu com uma solução para isso.
[]s,
Esse seu problema é muito fácil de resolver. Você deve indicar que o campo é chave primária e que não deve ser atualizado pela aplicação.
Dê um duplo clique no componente, clique no campo da chave primária e altere as seguintes propriedades:
AutoGenerateValue = arAutoInc
Required = False
ProviderFlags: pfInUpdate = False; pfInWhere = True
Deste modo vc indica que o campo é chave primária, não é requerido e não é atualizado pela aplicação.
Nos outros campos:
ProviderFlags: pfInUpdate = True; pfInWhre = False
Assim esses campos não serão utilizados na cláusula WHERE para atualização (UPDATE e DELETE).
Faça isso primeiro no SQLDataSet e depois no ClientDataSet.
Se vc precisar do próximo código, dê uma olhada na ClubeDelphi deste mês. Tem um artigo meu com uma solução para isso.
[]s,
GOSTEI 0
Laelsonc
29/11/2006
Acho que vcs estão inteirados...comentem aq por favor.
[url]http://forum.clubedelphi.net/viewtopic.php?t=82636[/url]
[url]http://forum.clubedelphi.net/viewtopic.php?t=82636[/url]
GOSTEI 0