Problemas ao alterar registro usando Query
Olá, preciso gravar os dados em uma tabela paradox que possuem campos texto,
numérico, memorando e data.
no data module criei um componente [Data source] um Componente [Query] e um
componente [UpdateSQL]
O que ocorre é:
Quando Crio um registro novo, tudo funciona todos os campos são salvos e o
registro gerado.
Quando modifico um registro ou excluo um registro existente é exibido a
seguinte mensage: [Type mismatch in expression]
No componente datasource esta setado em dataset a query clientes
No componente [Query] está com os seguinte parâmetros
Active: True
CachedUpdate: True
DatabaseName: Sistest
SQL: Select * from Clientes
UpdateObject: UpdateSQL1
No componente UpdateSQL:
Foi gerado de forma altomatica, através de Generate Sql, sendo:
Modify
update Clientes
set
Codigo = :Codigo,
Nome = :Nome,
Ordem = :Ordem,
Endereco = :Endereco,
Bairro = :Bairro,
Cidade = :Cidade,
UF = :UF,
Fone = :Fone,
Nascimento = :Nascimento,
Comissao = :Comissao,
Preferencial = :Preferencial,
Obs = :Obs
where
Codigo = :OLD_Codigo and
Nome = :OLD_Nome and
Ordem = :OLD_Ordem and
Endereco = :OLD_Endereco and
Bairro = :OLD_Bairro and
Cidade = :OLD_Cidade and
UF = :OLD_UF and
Fone = :OLD_Fone and
Nascimento = :OLD_Nascimento and
Comissao = :OLD_Comissao and
Preferencial = :OLD_Preferencial and
Obs = :OLD_Obs
Insert
insert into Clientes
(Codigo, Nome, Ordem, Endereco, Bairro, Cidade, UF, Fone, Nascimento,
Comissao, Preferencial, Obs)
values
(:Codigo, :Nome, :Ordem, :Endereco, :Bairro, :Cidade, :UF, :Fone,
:Nascimento,
:Comissao, :Preferencial, :Obs)
Delete
delete from Clientes
where
Codigo = :OLD_Codigo and
Nome = :OLD_Nome and
Ordem = :OLD_Ordem and
Endereco = :OLD_Endereco and
Bairro = :OLD_Bairro and
Cidade = :OLD_Cidade and
UF = :OLD_UF and
Fone = :OLD_Fone and
Nascimento = :OLD_Nascimento and
Comissao = :OLD_Comissao and
Preferencial = :OLD_Preferencial and
Obs = :OLD_Obs
Desde já agradeço pelo ajuda.
numérico, memorando e data.
no data module criei um componente [Data source] um Componente [Query] e um
componente [UpdateSQL]
O que ocorre é:
Quando Crio um registro novo, tudo funciona todos os campos são salvos e o
registro gerado.
Quando modifico um registro ou excluo um registro existente é exibido a
seguinte mensage: [Type mismatch in expression]
No componente datasource esta setado em dataset a query clientes
No componente [Query] está com os seguinte parâmetros
Active: True
CachedUpdate: True
DatabaseName: Sistest
SQL: Select * from Clientes
UpdateObject: UpdateSQL1
No componente UpdateSQL:
Foi gerado de forma altomatica, através de Generate Sql, sendo:
Modify
update Clientes
set
Codigo = :Codigo,
Nome = :Nome,
Ordem = :Ordem,
Endereco = :Endereco,
Bairro = :Bairro,
Cidade = :Cidade,
UF = :UF,
Fone = :Fone,
Nascimento = :Nascimento,
Comissao = :Comissao,
Preferencial = :Preferencial,
Obs = :Obs
where
Codigo = :OLD_Codigo and
Nome = :OLD_Nome and
Ordem = :OLD_Ordem and
Endereco = :OLD_Endereco and
Bairro = :OLD_Bairro and
Cidade = :OLD_Cidade and
UF = :OLD_UF and
Fone = :OLD_Fone and
Nascimento = :OLD_Nascimento and
Comissao = :OLD_Comissao and
Preferencial = :OLD_Preferencial and
Obs = :OLD_Obs
Insert
insert into Clientes
(Codigo, Nome, Ordem, Endereco, Bairro, Cidade, UF, Fone, Nascimento,
Comissao, Preferencial, Obs)
values
(:Codigo, :Nome, :Ordem, :Endereco, :Bairro, :Cidade, :UF, :Fone,
:Nascimento,
:Comissao, :Preferencial, :Obs)
Delete
delete from Clientes
where
Codigo = :OLD_Codigo and
Nome = :OLD_Nome and
Ordem = :OLD_Ordem and
Endereco = :OLD_Endereco and
Bairro = :OLD_Bairro and
Cidade = :OLD_Cidade and
UF = :OLD_UF and
Fone = :OLD_Fone and
Nascimento = :OLD_Nascimento and
Comissao = :OLD_Comissao and
Preferencial = :OLD_Preferencial and
Obs = :OLD_Obs
Desde já agradeço pelo ajuda.
Carlos
Curtidas 0
Respostas
Alisson Santos
22/05/2013
Qual é o componente que está utilizando para fazer isso???
GOSTEI 0
Carlos
22/05/2013
Qual é o componente que está utilizando para fazer isso???
Os componentes descritos acima, um Data source, Query, UpdateSQL dentro de um datamodule
A gravação de um registro funciona corretamente, o erro só ocorre quando o registro é alterado ou excluído.
O formulário com as dbedits além de um componente dbmemo (para observações)
Testei de duas formas em um botão gravar com o código (além do descrito acima) dm1.QClientes.Post e também pelo componente dbnavigator, de uma forma ou de outra ao fazer um dos dois procedimentos ocorre o erro, lembrando que a inclusão de novos registros funciona normalmente.
GOSTEI 0
Carlos
22/05/2013
Ainda sem solução se alguém souber, agradeço.
GOSTEI 0
Eduardo Pacheco
22/05/2013
Tente alterar a propriedade CacheUpdates do Query Como true.
GOSTEI 0
Guilherme Wiethaus
22/05/2013
Não interessa o tipo de componente ou cache. O que a mensagem "Type mismatch in expression" significa "Incompatibilidade de tipo na expressão", ou seja é um campo que você tem de um tipo tentando escrever outro tipo de registro que pode pelo próprio mecanismo de banco de dados não consegue converter. Reveja a declaração dos campos no próprio componente, a declaração dos tipos de campos no banco de dados e os dados escrevendo para estes.
Um exemplo que cito é na montagem de uma sequencia (string) para filtro.
Erros comuns: StrToInt(' 00012 '), espaços não é entendível como caracter numérico, e logo, se não houver tratamento pela própria função irá gerar uma exceção. é como tentar converter StrToInt('A00012A') exceção na certa.
Uma coisa insignificante como um espaço a mais pode fazer total diferença.
Abraços
Um exemplo que cito é na montagem de uma sequencia (string) para filtro.
Erros comuns: StrToInt(' 00012 '), espaços não é entendível como caracter numérico, e logo, se não houver tratamento pela própria função irá gerar uma exceção. é como tentar converter StrToInt('A00012A') exceção na certa.
Uma coisa insignificante como um espaço a mais pode fazer total diferença.
Abraços
GOSTEI 0
Carlos
22/05/2013
Olá obrigado a todos, [resolvido]
o problema está na clausula where que apenas deve verificar se o campo valor antigo é igual ao novo, portanto ficando assim:
Modify
update Clientes
set
Codigo = :Codigo,
Nome = :Nome,
Ordem = :Ordem,
Endereco = :Endereco,
Bairro = :Bairro,
Cidade = :Cidade,
UF = :UF,
Fone = :Fone,
Nascimento = :Nascimento,
Comissao = :Comissao,
Preferencial = :Preferencial,
Obs = :Obs
where
Codigo = :OLD_Codigo
o problema está na clausula where que apenas deve verificar se o campo valor antigo é igual ao novo, portanto ficando assim:
Modify
update Clientes
set
Codigo = :Codigo,
Nome = :Nome,
Ordem = :Ordem,
Endereco = :Endereco,
Bairro = :Bairro,
Cidade = :Cidade,
UF = :UF,
Fone = :Fone,
Nascimento = :Nascimento,
Comissao = :Comissao,
Preferencial = :Preferencial,
Obs = :Obs
where
Codigo = :OLD_Codigo
GOSTEI 0
Thiago Santana
22/05/2013
Esse erro ocorre quando por exemplo o um determinado campo está esperando um tipo char e vc manda uma string!
Verifique se os tipos de dados estão sendo compatíveis!
Verifique se os tipos de dados estão sendo compatíveis!
GOSTEI 0
Carlos
22/05/2013
Esse erro ocorre quando por exemplo o um determinado campo está esperando um tipo char e vc manda uma string!
Verifique se os tipos de dados estão sendo compatíveis!
Verifique se os tipos de dados estão sendo compatíveis!
Olá amigo, não é o caso aqui, o problema é que ao usar a sql, os campos são compatíveis, não existe nenhuma interação de dados de tipos diferentes sendo atribuídos ao seu campo, como disse acima o problema já foi resolvido, pois ao gerar o código sql é atribuído na clausula where que o valor do campo é igual ao antigo valor, sendo que o único campo que pode ocorrer isso é o codigo, pois os outros podem sofrer alterações, veja que ao determinar que o campo UF = :OLD_UF, isso faz com que a query fique inválida, já que ao modificar quaisquer um dos campos que não seja o código, sempre este será diferente, invalidando a clausula where.
GOSTEI 0
Eduardo Pacheco
22/05/2013
Olá amigo, não é o caso aqui, o problema é que ao usar a sql, os campos são compatíveis, não existe nenhuma interação de dados de tipos diferentes sendo atribuídos ao seu campo, como disse acima o problema já foi resolvido, pois ao gerar o código sql é atribuído na clausula where que o valor do campo é igual ao antigo valor, sendo que o único campo que pode ocorrer isso é o codigo, pois os outros podem sofrer alterações, veja que ao determinar que o campo UF = :OLD_UF, isso faz com que a query fique inválida, já que ao modificar quaisquer um dos campos que não seja o código, sempre este será diferente, invalidando a clausula where.
Também passei por esse erro, com uma situação parecida porém pra mim aparecia a seguinte mensagem: 'Update Failed', porém n sei por que no teu caso foi o erro "Type mismatch in expression", resolvi marcando a chave primária da tabela no key field do UpdateSQL,
Até.
GOSTEI 0