ClientDataSet apontando para IBDataSet com trigger
Olá! Tenho uma tabela com a seguinte estrutura:
Tenho um trigger nessa tabela que preenche o campo código pelo valor de um generator. Coloquei um IBDataSet apontando para essa tabela. Como KeyField coloquei o campo código e como UpdatedFields coloquei os outros menos o campo código afinal o trigger vai preenchê-lo para mim. Gerei as SQLs. Depois coloquei um DataSetProvider apontando para o IBDataSet e um ClientDataSet apontando para o DataSetProvider. Acontece que todo o processo de inserção de dados é feito em cima do ClientDataSet e quando eu chamo o ApplyUpdates ele dá erro no ´PK_PROD´.
Observação 1: Depois de Gerar as SQLs no IBDataSet eu adicionei os TFields no FieldsEditor tanto do IBDataSet quanto do ClientDataSet.
Observação 2: Percebi que quando esse tipo de ligação é feita basta chamar o método Open do ClientDataSet que os dados da tabela são carregados (sem precisar chamar o ´Open´ do IBDataSet. Isso é o modo correto de se fazer? Atualmente estou fazendo desse jeito mesmo.
Valeu! Até!
CODIGO INTEGER NOT NULL
DESCRICAO VARCHAR(40)
...
CONTRAINT "PK_PROD" PRIMARY KEY("CODIGO")
Tenho um trigger nessa tabela que preenche o campo código pelo valor de um generator. Coloquei um IBDataSet apontando para essa tabela. Como KeyField coloquei o campo código e como UpdatedFields coloquei os outros menos o campo código afinal o trigger vai preenchê-lo para mim. Gerei as SQLs. Depois coloquei um DataSetProvider apontando para o IBDataSet e um ClientDataSet apontando para o DataSetProvider. Acontece que todo o processo de inserção de dados é feito em cima do ClientDataSet e quando eu chamo o ApplyUpdates ele dá erro no ´PK_PROD´.
Observação 1: Depois de Gerar as SQLs no IBDataSet eu adicionei os TFields no FieldsEditor tanto do IBDataSet quanto do ClientDataSet.
Observação 2: Percebi que quando esse tipo de ligação é feita basta chamar o método Open do ClientDataSet que os dados da tabela são carregados (sem precisar chamar o ´Open´ do IBDataSet. Isso é o modo correto de se fazer? Atualmente estou fazendo desse jeito mesmo.
Valeu! Até!
Delphi32
Curtidas 0
Respostas
Vinicius2k
22/10/2004
Colega,
Em uma camada de acesso usada em conjunto com a Midas (Provider+CDS), o DataSet desta camada só precisa* conter a instrução SELECT, todo o resto é controlado pela própria Midas que interage com o DataSet realizando todas as operações...
* na verdade nem o SELECT é estritamente necessário... se a propriedade Options -> poAllowCommandText for setada para True, a instrução SELECT pode estar no próprio CommandText do CDS. Particularmente, não utilizo-me deste recurso, preferindo a instrução SELECT e manipulação dos parametros no DataSet.
Nesta ligação NADA deve ser realizado diretamente no DataSet, como o Open que vc citou... vc deve restringir a aplicação dos métodos sobre o CDS.
Nunca utilizei, em produção, IBX em conjunto com a Midas, mas se esta regra é válida tanto para dbExpress e ADO (com os quais trabalho com a Midas), não creio que haja diferença em relação ao IBX.
No seu caso específico, quando valor de uma coluna é dado pelo próprio SGBD através de uma trigger, basta que vc configure a propriedade [b:b452d50c63]Required[/b:b452d50c63] do TField (tanto no DataSet quanto no CDS) para [b:b452d50c63]False[/b:b452d50c63].
Espero ter ajudado.
T+
Em uma camada de acesso usada em conjunto com a Midas (Provider+CDS), o DataSet desta camada só precisa* conter a instrução SELECT, todo o resto é controlado pela própria Midas que interage com o DataSet realizando todas as operações...
* na verdade nem o SELECT é estritamente necessário... se a propriedade Options -> poAllowCommandText for setada para True, a instrução SELECT pode estar no próprio CommandText do CDS. Particularmente, não utilizo-me deste recurso, preferindo a instrução SELECT e manipulação dos parametros no DataSet.
Nesta ligação NADA deve ser realizado diretamente no DataSet, como o Open que vc citou... vc deve restringir a aplicação dos métodos sobre o CDS.
Nunca utilizei, em produção, IBX em conjunto com a Midas, mas se esta regra é válida tanto para dbExpress e ADO (com os quais trabalho com a Midas), não creio que haja diferença em relação ao IBX.
No seu caso específico, quando valor de uma coluna é dado pelo próprio SGBD através de uma trigger, basta que vc configure a propriedade [b:b452d50c63]Required[/b:b452d50c63] do TField (tanto no DataSet quanto no CDS) para [b:b452d50c63]False[/b:b452d50c63].
Espero ter ajudado.
T+
GOSTEI 0