Erro para alterar registro no BD
Pessoal me ajudem
Estou com problema ao atualizar um registro me deparo com o seguinte erro:
Linha não pode ser localizada para a atualização. Alguns valores podem ter sido alterados desde que ela foi lida pela última vez".
Porém esse erro só ocorre quando tento atualizar vamos dizer um registro antigo pois quando acabo de inserir um registro no banco e logo na sequência tento alterar eu consigo com sucesso. Não sei o que fazer mais todas as chaves primárias e estrangeiras envolvidas estão devidamente criadas no banco. ME AJUDEM POR FAVOR
Estou utilizando Delphi 7 -> SqlServer2014 -> e o componente ADO Query
Estou com problema ao atualizar um registro me deparo com o seguinte erro:
Linha não pode ser localizada para a atualização. Alguns valores podem ter sido alterados desde que ela foi lida pela última vez".
Porém esse erro só ocorre quando tento atualizar vamos dizer um registro antigo pois quando acabo de inserir um registro no banco e logo na sequência tento alterar eu consigo com sucesso. Não sei o que fazer mais todas as chaves primárias e estrangeiras envolvidas estão devidamente criadas no banco. ME AJUDEM POR FAVOR
Estou utilizando Delphi 7 -> SqlServer2014 -> e o componente ADO Query
Sidnei Junior
Curtidas 0
Respostas
Valquiria Silva
14/08/2014
Sidnei, você configurou no providerflags qual dos campos da qry é a chave primaria?
GOSTEI 0
Sidnei Junior
14/08/2014
Valquiria você está falando da propriedade pfInKey do field? se for eu alterei o valor das duas chaves primárias para true apenas a chave estrangeira está setada como false. Poém já tentei com os três com o valor true e nada! Não funciona
GOSTEI 0
Sidnei Junior
14/08/2014
segue o meu select
select
conveniados.CONV_ID,
conveniados.TITULAR,
conveniados.LIBERADO,
conveniados.EMPRES_ID,
conveniados.GRUPO_CONV_EMP,
conveniados.CARGO,
conveniados.SETOR,
conveniados.COD_EMPRESA,
conveniados.DT_NASCIMENTO,
conveniados.CPF,
conveniados.RG,
conveniados.ENDERECO,
conveniados.NUMERO,
conveniados.BAIRRO,
conveniados.CIDADE,
conveniados.ESTADO,
conveniados.CEP,
conveniados.BANCO,
conveniados.AGENCIA,
conveniados.CONTACORRENTE,
conveniados.DIGITO_CONTA,
conveniados.TIPOPAGAMENTO,
conveniados.TELEFONE1,
conveniados.TELEFONE2,
conveniados.CELULAR,
conveniados.OBS1,
conveniados.OBS2,
conveniados.DTCADASTRO,
conveniados.OPERCADASTRO,
conveniados.DTALTERACAO,
conveniados.OPERADOR,
conveniados.DTULTCESTA,
conveniados.DTASSOCIACAO,
conveniados.EMAIL,
conveniados.LIMITE_MES,
conveniados.CONSUMO_MES,
conveniados.LIMITE_TOTAL,
conveniados.LIMITE_PROX_FECHAMENTO,
conveniados.CESTABASICA,
conveniados.SALARIO,
conveniados.FIDELIDADE,
conveniados.CONTRATO,
conveniados.TIPOSALARIO,
conveniados.FLAG,
conveniados.SENHA,
conveniados.DTAPAGADO,
conveniados.APAGADO,
conveniados.VALE_DESCONTO,
conveniados.LIBERA_GRUPOSPROD,
conveniados.COMPLEMENTO,
conveniados.USA_SALDO_DIF,
conveniados.ABONO_MES,
conveniados.SALDO_RENOVACAO,
conveniados.SALDO_ACUMULADO,
conveniados.DATA_ATUALIZACAO_ACUMULADO,
conveniados.CHAPA,
conv_detail.CONV_ID,
conv_detail.DATA_ADMISSAO,
conv_detail.DATA_DEMISSAO,
conv_detail.NUM_DEPENDENTES,
conv_detail.SALDO_DEVEDOR,
conv_detail.SALDO_DEVEDOR_FAT,
conv_detail.PIS,
conv_detail.NOME_PAI,
conv_detail.NOME_MAE,
conv_detail.CART_TRAB_NUM,
conv_detail.CART_TRAB_SERIE,
conv_detail.REGIME_TRAB,
conv_detail.VENC_TOTAL,
conv_detail.FIM_CONTRATO,
conv_detail.DISTRITO,
conv_detail.ESTADO_CIVIL,
empresas.FANTASIA,
empresas.BAND_ID,
empresas.nome empresa,
empresas.TIPO_CREDITO
from conveniados
left join conv_detail on conv_detail.conv_id = conveniados.conv_id
join empresas on empresas.empres_id = conveniados.empres_id and empresas.apagado <> 'S'
where conveniados.conv_id = 0
select
conveniados.CONV_ID,
conveniados.TITULAR,
conveniados.LIBERADO,
conveniados.EMPRES_ID,
conveniados.GRUPO_CONV_EMP,
conveniados.CARGO,
conveniados.SETOR,
conveniados.COD_EMPRESA,
conveniados.DT_NASCIMENTO,
conveniados.CPF,
conveniados.RG,
conveniados.ENDERECO,
conveniados.NUMERO,
conveniados.BAIRRO,
conveniados.CIDADE,
conveniados.ESTADO,
conveniados.CEP,
conveniados.BANCO,
conveniados.AGENCIA,
conveniados.CONTACORRENTE,
conveniados.DIGITO_CONTA,
conveniados.TIPOPAGAMENTO,
conveniados.TELEFONE1,
conveniados.TELEFONE2,
conveniados.CELULAR,
conveniados.OBS1,
conveniados.OBS2,
conveniados.DTCADASTRO,
conveniados.OPERCADASTRO,
conveniados.DTALTERACAO,
conveniados.OPERADOR,
conveniados.DTULTCESTA,
conveniados.DTASSOCIACAO,
conveniados.EMAIL,
conveniados.LIMITE_MES,
conveniados.CONSUMO_MES,
conveniados.LIMITE_TOTAL,
conveniados.LIMITE_PROX_FECHAMENTO,
conveniados.CESTABASICA,
conveniados.SALARIO,
conveniados.FIDELIDADE,
conveniados.CONTRATO,
conveniados.TIPOSALARIO,
conveniados.FLAG,
conveniados.SENHA,
conveniados.DTAPAGADO,
conveniados.APAGADO,
conveniados.VALE_DESCONTO,
conveniados.LIBERA_GRUPOSPROD,
conveniados.COMPLEMENTO,
conveniados.USA_SALDO_DIF,
conveniados.ABONO_MES,
conveniados.SALDO_RENOVACAO,
conveniados.SALDO_ACUMULADO,
conveniados.DATA_ATUALIZACAO_ACUMULADO,
conveniados.CHAPA,
conv_detail.CONV_ID,
conv_detail.DATA_ADMISSAO,
conv_detail.DATA_DEMISSAO,
conv_detail.NUM_DEPENDENTES,
conv_detail.SALDO_DEVEDOR,
conv_detail.SALDO_DEVEDOR_FAT,
conv_detail.PIS,
conv_detail.NOME_PAI,
conv_detail.NOME_MAE,
conv_detail.CART_TRAB_NUM,
conv_detail.CART_TRAB_SERIE,
conv_detail.REGIME_TRAB,
conv_detail.VENC_TOTAL,
conv_detail.FIM_CONTRATO,
conv_detail.DISTRITO,
conv_detail.ESTADO_CIVIL,
empresas.FANTASIA,
empresas.BAND_ID,
empresas.nome empresa,
empresas.TIPO_CREDITO
from conveniados
left join conv_detail on conv_detail.conv_id = conveniados.conv_id
join empresas on empresas.empres_id = conveniados.empres_id and empresas.apagado <> 'S'
where conveniados.conv_id = 0
GOSTEI 0
Sidnei Junior
14/08/2014
Me ajudem isso ta me complicando!!
GOSTEI 0
Sidnei Junior
14/08/2014
Alguma idéia pessoal?
GOSTEI 0
Sidnei Junior
14/08/2014
Por favoooor me ajudem!!
GOSTEI 0
Renato Rubinho
14/08/2014
Buenos,
Achei estranhas essas cláusulas, pois você está dando left join pelo campo "conv_id", mas quer trazer apenas o que tiver "conv_id" = 0
Após a inclusão você não está alimentando este campo "conv_id", fazendo com que não se encaixe mais do critério da consulta ?
Como você fazer para gravar os dados no banco ?
Põe a procedure que está utilizando a gravação e refresh dos dados para podermos analisar melhor.
Abraççç,
Renato
Achei estranhas essas cláusulas, pois você está dando left join pelo campo "conv_id", mas quer trazer apenas o que tiver "conv_id" = 0
from conveniados left join conv_detail on conv_detail.conv_id = conveniados.conv_id join empresas on empresas.empres_id = conveniados.empres_id and empresas.apagado <> 'S' where conveniados.conv_id = 0
Após a inclusão você não está alimentando este campo "conv_id", fazendo com que não se encaixe mais do critério da consulta ?
Como você fazer para gravar os dados no banco ?
Põe a procedure que está utilizando a gravação e refresh dos dados para podermos analisar melhor.
Abraççç,
Renato
GOSTEI 0
Marisiana Battistella
14/08/2014
Olá Sidnei!
Poderia postar o código com o UPDATE que vc está fazendo?
Poderia postar o código com o UPDATE que vc está fazendo?
GOSTEI 0
Sidnei Junior
14/08/2014
procedure TFCadConv.ButGravaClick(Sender: TObject);
var Item : String;
begin
if DBDateEdit2.Date = 0 then
QCadastroDATA_DEMISSAO.IsNull;
{Atribui a chave que o campo CONV_ID está recebendo para
o campo conv_detailCONV_ID}
QCadastroCONV_ID_1.Value := QCadastroCONV_ID.Value;
{Após a atribuição acima herda a função de cadastro da Unit FCad}
inherited;
if QConvDetail.State in [dsInsert,dsEdit] then
Self.TextStatus := ' Titular: ['+QCadastroCONV_ID.AsString+'] - '+QCadastroTITULAR.AsString+
' Empresa: ['+QCadastroEMPRES_ID.AsString+'] - '+QCadastroempresa.AsString;
end;
no inheirited herda de um formulário padrão dentro do nosso projeto o FCAD que por sua vez também possui a aba de cadastro e botão cadastrar. Segue o código do form herdado:
procedure TFCad.ButGravaClick(Sender: TObject);
begin
if QCadastro.State in [dsInsert,dsEdit] then
QCadastro.Post;
end;
var Item : String;
begin
if DBDateEdit2.Date = 0 then
QCadastroDATA_DEMISSAO.IsNull;
{Atribui a chave que o campo CONV_ID está recebendo para
o campo conv_detailCONV_ID}
QCadastroCONV_ID_1.Value := QCadastroCONV_ID.Value;
{Após a atribuição acima herda a função de cadastro da Unit FCad}
inherited;
if QConvDetail.State in [dsInsert,dsEdit] then
Self.TextStatus := ' Titular: ['+QCadastroCONV_ID.AsString+'] - '+QCadastroTITULAR.AsString+
' Empresa: ['+QCadastroEMPRES_ID.AsString+'] - '+QCadastroempresa.AsString;
end;
no inheirited herda de um formulário padrão dentro do nosso projeto o FCAD que por sua vez também possui a aba de cadastro e botão cadastrar. Segue o código do form herdado:
procedure TFCad.ButGravaClick(Sender: TObject);
begin
if QCadastro.State in [dsInsert,dsEdit] then
QCadastro.Post;
end;
GOSTEI 0
Marisiana Battistella
14/08/2014
Sidnei, encontrei esse tópico aqui no fórum [url]https://www.devmedia.com.br/forum/a-linha-nao-pode-ser-localizada-para-atualizacao/307766[/url]
Veja se é mesmo caso que vc está tentando resolver...
E também encontrei um outro post em um fórum e a pessoa que conseguiu resolver postou a seguinte observação:
Veja se é mesmo caso que vc está tentando resolver...
E também encontrei um outro post em um fórum e a pessoa que conseguiu resolver postou a seguinte observação:
Quando agente não cria uma chave primaria para uma tabela, na hora do update ou post a ADO interpreta o primeiro campo como uma chave, ou seja
se na hora do post houver um outro registro na tabela cujo o valor do primeiro campo se repita da erro!
Para solucionar o problema na propriedade CursorLocation do ADOTable, ponha como clUseServer
se na hora do post houver um outro registro na tabela cujo o valor do primeiro campo se repita da erro!
Para solucionar o problema na propriedade CursorLocation do ADOTable, ponha como clUseServer
GOSTEI 0
Sidnei Junior
14/08/2014
Oi Marisiana então eu já tinha visto esses tópicos porém não funcionou comigo. se eu mudo o cursorLocation para clUseserver da erro e nem carrega as informações no Grid. sinceramente não sei viu
GOSTEI 0
Marisiana Battistella
14/08/2014
Mas como vc tá fazendo a alteração dos dados no banco?
Qual é o UPDATE que vc utiliza? A passagem de parâmetros está correta?
Qual é o UPDATE que vc utiliza? A passagem de parâmetros está correta?
GOSTEI 0
Renato Rubinho
14/08/2014
Você está usando o QCadastro (deve ser um TADOQuery) usando um join das duas tabelas e tentando gravar com post ?
Acho que isso não vai funcionar, pois nesse caso o objeto QCadastro está unidirecional, trazendo dados para a tela, mas não vai conseguir atualizar as tabelas do join.
Para utilizar o post, você precisa colocar um objeto para cada tabela, veja o TADOTable.
ou
Para a query que você já possui, utiliza uma nova para dar o update no banco.
Acho que isso não vai funcionar, pois nesse caso o objeto QCadastro está unidirecional, trazendo dados para a tela, mas não vai conseguir atualizar as tabelas do join.
Para utilizar o post, você precisa colocar um objeto para cada tabela, veja o TADOTable.
ou
Para a query que você já possui, utiliza uma nova para dar o update no banco.
GOSTEI 0
Sidnei Junior
14/08/2014
Exatamente rrubinho eu estou utilizando exatamente desta forma. Agora tendo em vista o que você falou aí vai algo que me deixa muito encucado. Acabei de fazer um insert que por sua vez também verefica o estado do AdoQuery qcadastro e se em modo de insert da um post até aí tudo bem. Aí eu pego esse registro que acabei de inserir e altero. A alteração é concluída sem nenhum erro isso quantas vez eu quiser para esse registro. Agora se eu fechar a aplicação já era também não consigo mais alterar o registro em questão devido ao erro em questão. Visando o que vc falou não era pra funcionar de forma alguma né?!!
GOSTEI 0
Renato Rubinho
14/08/2014
Isso. Não funciona nem o insert, nem o update. O que está ocorrendo é que você está usando o registro em memória. Em nenhum momento ele foi gravado no banco. Após o Insert/Post, consulte no banco através de alguma ferramenta se o registro existe.
Você vai ter que utilizar cada tabela em um objeto e gravar ambas ou, mantendo sua query única, utilizar outro objeto para dar INSERT / UPDATE no banco de dados passando os valores contidos na sua query.
Você vai ter que utilizar cada tabela em um objeto e gravar ambas ou, mantendo sua query única, utilizar outro objeto para dar INSERT / UPDATE no banco de dados passando os valores contidos na sua query.
GOSTEI 0
Sidnei Junior
14/08/2014
Pior que gravou essa busca aí foi obtida depois do post através do SQL management studio. mandei rodar a query e retornou
[img]http://arquivo.devmedia.com.br/forum/imagem/328217-20140818-151448.jpg[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/328217-20140818-151448.jpg[/img]
GOSTEI 0
Sidnei Junior
14/08/2014
rrubinho após ter feito o select no banco alterei esse registro que eu tinha acabado de inserir deu certo. Fui no management executei novamente a query e tava lá alterado no banco tbm. =/
GOSTEI 0
Renato Rubinho
14/08/2014
Gravou os dados nas duas tabelas ? conveniados e conv_detail ?
Sinceramente desconhecia esse "poder" dele gravar com a query unida... rsrs
Um problema é que o CONV_ID, por estar "duplicado" na query, não irá trazer o nome correto e talvez por isso não grave (teoricamente, pois você conseguiu inserir e isso é estranho)
Só consigo ver a hipótese de utilizar um objeto para cada tabela, quem sabe alguém tenha outra idéia.
Abraççç,
Renato
Sinceramente desconhecia esse "poder" dele gravar com a query unida... rsrs
Um problema é que o CONV_ID, por estar "duplicado" na query, não irá trazer o nome correto e talvez por isso não grave (teoricamente, pois você conseguiu inserir e isso é estranho)
Só consigo ver a hipótese de utilizar um objeto para cada tabela, quem sabe alguém tenha outra idéia.
Abraççç,
Renato
GOSTEI 0