Problema estranho ao inserir dados
Peguei um sistema aqui com Delphi + access e surgiu um fato curioso.
Existe um datamodule e nele um adotable e um adoquery ambos ligados na mesma tabela, porque em alguns casos usa um ou outro.
Em um formulário de cadastro existem os botões de ação com comando Insert/append, edit, delete, post e uma datasource ligada a esses campos.
Quando a source esta ligada ao adotable todos os comando funcionam normalmente, insere, salva edita, deleta. Agora quando liga a datasource ao ADOquery somente no momento de dar um insert ou apppend está dando erro, o edit, delete e port funciona perfeitamente com a query.
Quando clica no botão de adicionar registro ele executa a linha datamodule.adoquery.append ou insert. (não estou citando o nome da tabela aqui, somente os componentes), aparece uma mensagem de erro de que o campo 'alguma coisa' não pode ser localizado, se eu fizer isso com o adotable funciona de boa.
Por que será que ele não encontra os campos quando estou usado a query sendo que todos estão ligados corretamente ao datasource e seus respectivos campos no banco de dados?
Existe um datamodule e nele um adotable e um adoquery ambos ligados na mesma tabela, porque em alguns casos usa um ou outro.
Em um formulário de cadastro existem os botões de ação com comando Insert/append, edit, delete, post e uma datasource ligada a esses campos.
Quando a source esta ligada ao adotable todos os comando funcionam normalmente, insere, salva edita, deleta. Agora quando liga a datasource ao ADOquery somente no momento de dar um insert ou apppend está dando erro, o edit, delete e port funciona perfeitamente com a query.
Quando clica no botão de adicionar registro ele executa a linha datamodule.adoquery.append ou insert. (não estou citando o nome da tabela aqui, somente os componentes), aparece uma mensagem de erro de que o campo 'alguma coisa' não pode ser localizado, se eu fizer isso com o adotable funciona de boa.
Por que será que ele não encontra os campos quando estou usado a query sendo que todos estão ligados corretamente ao datasource e seus respectivos campos no banco de dados?
Ricardo
Curtidas 0
Respostas
Joel Rodrigues
19/01/2014
Veja no Fields Editor (duplo clique sobre a ADOQuery) da ADOQuery se todos os campos que estão listados lá (se existirem campos listados) estão sendo recuperados na instrução de SELECT dessa query. Uma forma de garantir que todos os campos do select sejam listados no Fields Editor seria apagar todos existentes na lista, e adicionar todos novamente (esqueci o atalho, mas é só clicar com a direita sobre a área branca onde ficam os campos).
Se o problema persistir, avise aqui, por favor.
Se o problema persistir, avise aqui, por favor.
GOSTEI 0
Ricardo
19/01/2014
Veja no Fields Editor (duplo clique sobre a ADOQuery) da ADOQuery se todos os campos que estão listados lá (se existirem campos listados) estão sendo recuperados na instrução de SELECT dessa query. Uma forma de garantir que todos os campos do select sejam listados no Fields Editor seria apagar todos existentes na lista, e adicionar todos novamente (esqueci o atalho, mas é só clicar com a direita sobre a área branca onde ficam os campos).
Se o problema persistir, avise aqui, por favor.
Se o problema persistir, avise aqui, por favor.
Amigo Joel,
Eu já havia feito isso, inclusive mesmo que não existam campos no fields editor os comandos funcionam, mas resolvei seguir o que vc falou e não adianta o problema persiste. A única coisa que mudou foi que o campo que ele informa não pode ser localizado é outro no momento de abrir a query para edição. Eu até fui desabilitando os campos ligados a essa query um por um no formulário, mas o erro vai acontecendo com cada um deles até que todos sejam verificados, ou seja, ele não consegue localizar nenhum campo.
Fiz um teste agora e aparentemente o erro esta nessa linha no botão de adicionar: SQL.Add('select max(id_end) as id_end from endereco');
Ela funciona perfeitamente ligada ao ADOtable, mas ao ADOQuery esta dando esse erro de não encontrar nada. Alterei a linha para SQL.Add('select * from endereco') e funcionou beleza. Então o erro está nela mas eu preciso que ela fique assim: SQL.Add('select max(id_end) as id_end from endereco'); porque eu preciso retornar o id do último registro inserido e o resultado deve ser somado +1 para ser o ID do próximo registro.
Sugestões?
GOSTEI 0
Joel Rodrigues
19/01/2014
Se você apenas abrir a query em design, isso acontece? Ou só em tempo de execução, no momento do insert/append?
GOSTEI 0
Ricardo
19/01/2014
Se você apenas abrir a query em design, isso acontece? Ou só em tempo de execução, no momento do insert/append?
Fiz um teste agora e aparentemente o erro esta nessa linha no botão de adicionar: SQL.Add('select max(id_end) as id_end from endereco');
Ela funciona perfeitamente ligada ao ADOtable, mas ao ADOQuery esta dando esse erro de não encontrar nada. Alterei a linha para SQL.Add('select * from endereco') e funcionou beleza. Então o erro está nela mas eu preciso que ela fique assim: SQL.Add('select max(id_end) as id_end from endereco'); porque eu preciso retornar o id do último registro inserido e o resultado deve ser somado +1 para ser o ID do próximo registro.
olha só que estranho:
if DataModule1.ADOQendereco.RecordCount = 0 then
endID := 0
else
with DataModule1.ADOQendereco do
begin
Close;
SQL.Clear;
SQL.Add('select max(id_end) as id_end from endereco');
Open;
endID:=FieldByName('id_end').AsInteger;
end;
DataModule1.ADOQendereco.Append;
DataModule1.ADOQendereco.FieldByName('id_end').Value := endID+1
end;
Dessa forma acima eu ligo o DataSource na Query e faço a pesquisa na Query e Append nela também. Não funciona, da erro para localizar os campos.
if DataModule1.ADOQendereco.RecordCount = 0 then
endID := 0
else
with DataModule1.ADOQendereco do
begin
Close;
SQL.Clear;
SQL.Add('select max(id_end) as id_end from endereco');
Open;
endID:=FieldByName('id_end').AsInteger;
end;
DataModule1.ADOendereco.Append;
DataModule1.ADOenderecoid_end.Value := endID+1;
end;
Exatamente como está acima eu ligo o DataSource ao ADOtable faço a pesquisa na Query e o append na tabela mesmo. Funciona 100%.
Sugestões?
GOSTEI 0
Joel Rodrigues
19/01/2014
Você está ligando os controles à query ou à table? Se você ligar os controles à query, não poderá usá-la para fazer essa consulta, pois no momento em que você altera a instrução de select, as referências dos campos são perdidas. Se você precisa ligar os controles à query, use outra para fazer essa consulta do id.
GOSTEI 0
Ricardo
19/01/2014
Você está ligando os controles à query ou à table? Se você ligar os controles à query, não poderá usá-la para fazer essa consulta, pois no momento em que você altera a instrução de select, as referências dos campos são perdidas. Se você precisa ligar os controles à query, use outra para fazer essa consulta do id.
ontem a noite isso me passou pela cabeça, inclusive em deixar apenas o modo de inserção em outro formulário, pior que em modo de edição ela não perde a referencia somente em inserção.
GOSTEI 0
Joel Rodrigues
19/01/2014
É porque, provavelmente, na edição você não precisa fazer esse select, mudando a instrução SQL original que contém os campos. Enfim, você vai precisar de outra query, cara.
GOSTEI 0