Erro para alterar registro no BD

Delphi

14/08/2014

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

Curtidas 0

Respostas

Valquiria Silva

Valquiria Silva

14/08/2014

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

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

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

Sidnei Junior

14/08/2014

Me ajudem isso ta me complicando!!
GOSTEI 0
Sidnei Junior

Sidnei Junior

14/08/2014

Alguma idéia pessoal?
GOSTEI 0
Sidnei Junior

Sidnei Junior

14/08/2014

Por favoooor me ajudem!!
GOSTEI 0
Renato Rubinho

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

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

Marisiana Battistella

14/08/2014

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

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;
GOSTEI 0
Marisiana Battistella

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:
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
GOSTEI 0
Sidnei Junior

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

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?
GOSTEI 0
Renato Rubinho

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.
GOSTEI 0
Sidnei Junior

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

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.
GOSTEI 0
Sidnei Junior

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]
GOSTEI 0
Sidnei Junior

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

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
GOSTEI 0
POSTAR