GARANTIR DESCONTO

Fórum Erro para alterar registro no BD #488841

14/08/2014

0

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
Sidnei Junior

Sidnei Junior

Responder

Posts

14/08/2014

Valquiria Silva

Sidnei, você configurou no providerflags qual dos campos da qry é a chave primaria?
Responder

Gostei + 0

14/08/2014

Sidnei Junior

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
Responder

Gostei + 0

14/08/2014

Sidnei Junior

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
Responder

Gostei + 0

14/08/2014

Sidnei Junior

Me ajudem isso ta me complicando!!
Responder

Gostei + 0

14/08/2014

Sidnei Junior

Alguma idéia pessoal?
Responder

Gostei + 0

18/08/2014

Sidnei Junior

Por favoooor me ajudem!!
Responder

Gostei + 0

18/08/2014

Renato Rubinho

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

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
Responder

Gostei + 0

18/08/2014

Marisiana Battistella

Olá Sidnei!
Poderia postar o código com o UPDATE que vc está fazendo?
Responder

Gostei + 0

18/08/2014

Sidnei Junior

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;
Responder

Gostei + 0

18/08/2014

Marisiana Battistella

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:
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
Responder

Gostei + 0

18/08/2014

Sidnei Junior

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
Responder

Gostei + 0

18/08/2014

Marisiana Battistella

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?
Responder

Gostei + 0

18/08/2014

Renato Rubinho

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.
Responder

Gostei + 0

18/08/2014

Sidnei Junior

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é?!!
Responder

Gostei + 0

18/08/2014

Renato Rubinho

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar