Problema com ClientDataSet
Pessoal, estou com um problema já fazem dois dias e já tentei de tudo pra resolve-lo e nao consegui.
Tenho um banco em IB 6 com uma tabela de candidatos e outra com seus dados especificos(mestre detalhe).
CANDIDATO -> Cod, Nome
DADOSCAND -> Cod, DTNasc, TipoCand
Para visualizar os dados tá funcionando beleza.
Estou usando um IBDataset, um DataSetProvider e um ClientDataSet para pegar os dados da tabela com os dados especificos. Porem, quando dou o ApplyUpdates(com 0 ou -1), o seguinte erro é mostrado:
SQL Parse Error:
Parameter name expected
Consequentemente, nao grava os dados no banco. Ja tentei usar o componente IBClientDataSet da paleta IBX mas nada.
Espero q vcs possam me ajudar.
Obrigado,
Eduardo
Tenho um banco em IB 6 com uma tabela de candidatos e outra com seus dados especificos(mestre detalhe).
CANDIDATO -> Cod, Nome
DADOSCAND -> Cod, DTNasc, TipoCand
Para visualizar os dados tá funcionando beleza.
Estou usando um IBDataset, um DataSetProvider e um ClientDataSet para pegar os dados da tabela com os dados especificos. Porem, quando dou o ApplyUpdates(com 0 ou -1), o seguinte erro é mostrado:
SQL Parse Error:
Parameter name expected
Consequentemente, nao grava os dados no banco. Ja tentei usar o componente IBClientDataSet da paleta IBX mas nada.
Espero q vcs possam me ajudar.
Obrigado,
Eduardo
Educmelo
Curtidas 0
Respostas
Euclidesgc
14/01/2004
Eu estava com este problema quando usava o IBClientDataset e resolvi desta maneira:
Selecionei o campo que é a chave primária e marquei pfInkey = True na propriedade ProviderFlags.
Consegui resolver isto hoje, e encontrei essa dica procurando em outros Fóruns que eu nem sei mais quais foram... E pra tua sorte eu vi essa mensagem!
Selecionei o campo que é a chave primária e marquei pfInkey = True na propriedade ProviderFlags.
Consegui resolver isto hoje, e encontrei essa dica procurando em outros Fóruns que eu nem sei mais quais foram... E pra tua sorte eu vi essa mensagem!
GOSTEI 0
Educmelo
14/01/2004
Caro amigo,
mesmo trocando essa propriedade, o erro continua. Só para ver se esclareco mais um pouco, na minha tabela mestre ´CANDIDATO´, tenho uma trigger para gerar o codigo do candidato, juntamente com um GENERATOR.
Tem q ter alguma coisa na propriedade FieldDefs e na Params do componente ClientDataSet da tabela detalhe?
Já tentei trocar aqui de todo jeito mas ainda não tá gravando.
Obrigado!
mesmo trocando essa propriedade, o erro continua. Só para ver se esclareco mais um pouco, na minha tabela mestre ´CANDIDATO´, tenho uma trigger para gerar o codigo do candidato, juntamente com um GENERATOR.
Tem q ter alguma coisa na propriedade FieldDefs e na Params do componente ClientDataSet da tabela detalhe?
Já tentei trocar aqui de todo jeito mas ainda não tá gravando.
Obrigado!
GOSTEI 0
Euclidesgc
14/01/2004
Tenta usar uma StoredProcedure ao invés de um Trigger. Como eu uso o IBExpert e ele já me da o código da StoredProcedure eu não sei de cabeça como é. Amanhã quando eu chegar no trabalho eu te mando. Porém a idéia a seguinte. Você cria uma StoredProcedure que retorna o Próximo Numero do generatore no evento BeforePost do ClientDataset eu atribuo o valor retornado. Uso uma IBStoredProcedured para isso. Vê aí se da certo agora.
Porém tem um detalhe...
Eu estou pesquisando muito sobre isso e alterando demais meu projeto, to mexendo em tanto lugar que nem me lembro direito. Acontece que lá no meu trabalho eu consegui fazer tudo funcionar, fiquei até animado, mas quando cheguei em casa e fiz a mesma coisa que eu disse pra você fazer, não deu certo! Pode ser que a configuração no meu trabalho esteja diferente do que eu estou fazendo em casa, só vou ver amanhã. Mas se você descobrir como fazer me manda um e-mail. Eu farei o mesmo. Isso serve pra todos que estão lendo também!
Valeu e até mais.
Porém tem um detalhe...
Eu estou pesquisando muito sobre isso e alterando demais meu projeto, to mexendo em tanto lugar que nem me lembro direito. Acontece que lá no meu trabalho eu consegui fazer tudo funcionar, fiquei até animado, mas quando cheguei em casa e fiz a mesma coisa que eu disse pra você fazer, não deu certo! Pode ser que a configuração no meu trabalho esteja diferente do que eu estou fazendo em casa, só vou ver amanhã. Mas se você descobrir como fazer me manda um e-mail. Eu farei o mesmo. Isso serve pra todos que estão lendo também!
Valeu e até mais.
GOSTEI 0
Brunolspp
14/01/2004
Talvez a maneira mais simples de resolver seja explodindo esta operação em dois datasets, um para tabela mestre e o outro para a detalhe, fazendo o seu relacionamento através de um datasource, aí então colocando um datasetprovidre para o dataset mestre e um clientdataset para este, adicione todos os campos e em seguida crie um clientdataset para o dataset detalhe mas configure a opção datasetfield deste clientdataset para fazer o relacionamente e pronto, é só trabalhar normalmente.
[]´s
[]´s
GOSTEI 0
Euclidesgc
14/01/2004
[b:70f7b4e2f9]Agora tem um problema! a ùltima versão desta atualzação retira o IbClientDataset. Ele está descontinuado, o que eu acho uma grande perda, Pois até agora foi a melhor manira de se trabalhar com ClientDatasets que eu achei. (opnião de iniciante!) [/b:70f7b4e2f9]
afarias escreveu:
Vc configurou a ´chave primária´ nos TFields do IBQuery (duplo-clique no IBQuery, adicione todos os campos, configure a propriedade PROVIDER FLAGS dos TFields q são chave para InKey = TRUE)
Configure o DataSetProvider para UpdateMode = WhereKeyOnly (isso é só uma forma de usar, depois vc pode dar uma lida sobre as diversas opções e ver o q mais se adequa)
Se seu SQL tiver parâmentros, chame o método FetchParams do ClientDataSet, e preencha os parâmetros antes de abrir o ClientDataSet.
T+
já fiz e o resultado foi o mesmo.
quando dou um click em fecthParams nao acontece nada
[]´s
Paulo.
_____________________________________________________________
afarias, obrigado por tentar me ajudar, o problema era o meu ibx que estava com algum bug. fiz a atualização e funcionou perfeitamente, conforme artigo da edião 45.
PARA AQUELES QUE ESTÃO COM O MESMO PROBLEMA atualizem o ibx, no link abaixo.
http://www.theclub.com.br/site/download/Arq.aspx?Ling=98&Cat=09
[]´S Paulo
afarias escreveu:
Vc configurou a ´chave primária´ nos TFields do IBQuery (duplo-clique no IBQuery, adicione todos os campos, configure a propriedade PROVIDER FLAGS dos TFields q são chave para InKey = TRUE)
Configure o DataSetProvider para UpdateMode = WhereKeyOnly (isso é só uma forma de usar, depois vc pode dar uma lida sobre as diversas opções e ver o q mais se adequa)
Se seu SQL tiver parâmentros, chame o método FetchParams do ClientDataSet, e preencha os parâmetros antes de abrir o ClientDataSet.
T+
já fiz e o resultado foi o mesmo.
quando dou um click em fecthParams nao acontece nada
[]´s
Paulo.
_____________________________________________________________
afarias, obrigado por tentar me ajudar, o problema era o meu ibx que estava com algum bug. fiz a atualização e funcionou perfeitamente, conforme artigo da edião 45.
PARA AQUELES QUE ESTÃO COM O MESMO PROBLEMA atualizem o ibx, no link abaixo.
http://www.theclub.com.br/site/download/Arq.aspx?Ling=98&Cat=09
[]´S Paulo
GOSTEI 0
Educmelo
14/01/2004
Euclides,
Como é o corpo dessa procedure q vc colocou no banco?
Obrigado
Como é o corpo dessa procedure q vc colocou no banco?
Obrigado
GOSTEI 0
Euclidesgc
14/01/2004
O corpo da procedure é esse:
CREATE PROCEDURE STP_CLI_CODIGO
RETURNS (CODIGO INTEGER)
AS
BEGIN
CODIGO = GEN_ID(NOME_DO_GENERATOR, 1);
SUSPEND;
END
Pra usá-la vc já sabe. Coloca um componente IBStoreProc e no evento BeforePost do IBClientDataset tu chama a procedure. Faz o código d tabela (que provavelmente é a chave pimária) receber o retorno da storeProcedure.
[b:b7ae512a2a]Infelizmente estou preocupado com o IBClientDataset, uso o Delphi 7 e percebi que após um atualização da paleta, o componente deixa de existir!
Por quê??? Será que tem algum problema sério com ele?
Se alguém souber a razão disso seria bom reportar aqui no fórum!
Até mais![/b:b7ae512a2a][/b]
CREATE PROCEDURE STP_CLI_CODIGO
RETURNS (CODIGO INTEGER)
AS
BEGIN
CODIGO = GEN_ID(NOME_DO_GENERATOR, 1);
SUSPEND;
END
Pra usá-la vc já sabe. Coloca um componente IBStoreProc e no evento BeforePost do IBClientDataset tu chama a procedure. Faz o código d tabela (que provavelmente é a chave pimária) receber o retorno da storeProcedure.
[b:b7ae512a2a]Infelizmente estou preocupado com o IBClientDataset, uso o Delphi 7 e percebi que após um atualização da paleta, o componente deixa de existir!
Por quê??? Será que tem algum problema sério com ele?
Se alguém souber a razão disso seria bom reportar aqui no fórum!
Até mais![/b:b7ae512a2a][/b]
GOSTEI 0
Euclidesgc
14/01/2004
O corpo da procedure é esse:
CREATE PROCEDURE STP_CLI_CODIGO
RETURNS (CODIGO INTEGER)
AS
BEGIN
CODIGO = GEN_ID(NOME_DO_GENERATOR, 1);
SUSPEND;
END
Pra usá-la vc já sabe. Coloca um componente IBStoreProc e no evento BeforePost do IBClientDataset tu chama a procedure. Faz o código d tabela (que provavelmente é a chave pimária) receber o retorno da storeProcedure.
[b:4ea3129ae8]Infelizmente estou preocupado com o IBClientDataset, uso o Delphi 7 e percebi que após um atualização da paleta, o componente deixa de existir!
Por quê??? Será que tem algum problema sério com ele?
Se alguém souber a razão disso seria bom reportar aqui no fórum!
Até mais![/b:4ea3129ae8][/b]
CREATE PROCEDURE STP_CLI_CODIGO
RETURNS (CODIGO INTEGER)
AS
BEGIN
CODIGO = GEN_ID(NOME_DO_GENERATOR, 1);
SUSPEND;
END
Pra usá-la vc já sabe. Coloca um componente IBStoreProc e no evento BeforePost do IBClientDataset tu chama a procedure. Faz o código d tabela (que provavelmente é a chave pimária) receber o retorno da storeProcedure.
[b:4ea3129ae8]Infelizmente estou preocupado com o IBClientDataset, uso o Delphi 7 e percebi que após um atualização da paleta, o componente deixa de existir!
Por quê??? Será que tem algum problema sério com ele?
Se alguém souber a razão disso seria bom reportar aqui no fórum!
Até mais![/b:4ea3129ae8][/b]
GOSTEI 0
Educmelo
14/01/2004
caro colega euclides,
como tenho que entregar esse programa até segunda q vem, resolvi trocar todo o meu form e estou utilizando agora somente DataSets para fazer os procedimentos entre a tabela mestre e a tabela detalhe. Sei q é mais lento, mas...
O DataSet principal é normal, com o generator e tudo mais.
No DataSet da tabela detalhe, mudei a propriedade DataSource apontando para o DataSource da tabela mestre.
Porém, se continuasse assim, no momento do post na tabela Mestre iria dar um erro, entao coloquei um DataSource em branco, e antes de dar o Post na tabela Mestre, aponto o DataSource da tabela detalhe para o em branco.
Dou o Post e volto a apontar para a tabela mestre, e depois dou o post normalmente na tabela detalhe.
Nao ficou mto bem explicado, qq duvida me fala. Vou continuar tentando arrumar aquele caso do ClientDataSet, mesmo ja tendo atualizado e paleta e perdido o componenten IBClientDataSet.
Até mais,
Eduardo
como tenho que entregar esse programa até segunda q vem, resolvi trocar todo o meu form e estou utilizando agora somente DataSets para fazer os procedimentos entre a tabela mestre e a tabela detalhe. Sei q é mais lento, mas...
O DataSet principal é normal, com o generator e tudo mais.
No DataSet da tabela detalhe, mudei a propriedade DataSource apontando para o DataSource da tabela mestre.
Porém, se continuasse assim, no momento do post na tabela Mestre iria dar um erro, entao coloquei um DataSource em branco, e antes de dar o Post na tabela Mestre, aponto o DataSource da tabela detalhe para o em branco.
Dou o Post e volto a apontar para a tabela mestre, e depois dou o post normalmente na tabela detalhe.
Nao ficou mto bem explicado, qq duvida me fala. Vou continuar tentando arrumar aquele caso do ClientDataSet, mesmo ja tendo atualizado e paleta e perdido o componenten IBClientDataSet.
Até mais,
Eduardo
GOSTEI 0
Euclidesgc
14/01/2004
Olha, descobri mais uma.
Obs: Estou usando o Delphi 7.
Quando atualizei a Paleta IBX no D7 (utilizei aquele link ali em cima!) o componte IBClientDataset sumiu, porém na Instalação da Atualização, aparece uma tela falando sobre as coreções contidas no arquivo e lá diz que realmente o IBClientDataset foi removido da instlação por padrão mas se você quiser instalar é só pegar os arquivos do seguinte diretório:
C:\Arquivos de programas\Borland\Delphi7\Demos\Db\SQLClientDataset.
Então beleza. Agora eu tenho os componentes da paleta IBX Atualizados e ainda o ClientDatset. Não esqueça de macar IpfInkey = True.
Será que da certo agora?! :D
Obs: Estou usando o Delphi 7.
Quando atualizei a Paleta IBX no D7 (utilizei aquele link ali em cima!) o componte IBClientDataset sumiu, porém na Instalação da Atualização, aparece uma tela falando sobre as coreções contidas no arquivo e lá diz que realmente o IBClientDataset foi removido da instlação por padrão mas se você quiser instalar é só pegar os arquivos do seguinte diretório:
C:\Arquivos de programas\Borland\Delphi7\Demos\Db\SQLClientDataset.
Então beleza. Agora eu tenho os componentes da paleta IBX Atualizados e ainda o ClientDatset. Não esqueça de macar IpfInkey = True.
Será que da certo agora?! :D
GOSTEI 0