Array
(
)

a linha nao pode ser localizada para atualizacao

Fernando_cunha
   - 04 jan 2006

a linha nao pode ser localizada para atualizacao. alguns valores podem ter sido alterados desde que ela foi lida pela ultima vez ...

pq da esse erro???
como evita-lo???

estou usando os seguintes comandos ...

tabela.append para colocar a tabela em estado de insercao ...
tabela.post para postar os dados que estao em modo de insercao ...

logo apos esse comando creio que a tabela entra em State dsBrowse certo???

se eu fizer alguma modificacao e tenntar postar vai dar erro ...
tentei resolver da seguinte forma

#Código

with tabela do
begin
if state = dsBrowse then Edit;
end;

post;


sei la, deem uma força ai please!!


Rômulo Barros
   - 04 jan 2006

Explique-se melhor, cara ! :wink:


Fernando_cunha
   - 04 jan 2006

tenho uma tabela qualquer ...

para inserir dados em uma tabela uso o comando
tabelaX.append;

quando faço isso a tabela fica em modo DsInsert certo??

insiro os dados nos DBEdits e utilizo o comando TabelaX.Post; para gravar os dados ...

quando faço isso a tabela fica em modo DsBrowse, Certo???

pelo o que eu sei, em modo DsBrowse nao vou conseguir inserir dados na tabela, a tabela tem que estar em modo DsEdit para poder modificar os dados ...

se eu seguir a ordem certinha de execucao nao vai gerar nenhum erro, mas pensem que o usuario nao vai fazer nada certo ...

por exemplo, quando eu insiro dados na tabela e uso post para gravar os dados na mesma a tabela entra em modo DsBrowse (por favor me corrijam se eu estiver errado) se logo apos o o usuario tentar mudar alguma coisa nos dbedits e clicar em post, vai dar o erro que eu mencionei acima

´a linha nao pode ser localizada para atualizacao. alguns valores podem ter sido alterados desde que ela foi lida pela ultima vez ... ´

o que eu quero saber é, como resolver esse erro!!
o mlehor jeito édesabilitar os botoes que nao devem ser pressionados??
tem como eu tratar isso via codigo, por exemplo, se o usuario der post e a tabela estiver em modo de visualizacao fazer ela entrar em modo de edicao????

captaram???

[]ss


Rômulo Barros
   - 04 jan 2006

Acredito que o bom mesmo era vc deixar habilitado apenas os botões que o usuário pode utilizar ( eu faço desse jeito )

Tenho o seguinte método:

#Código

Procedure ControlaBotoes(){
botaoAppend.Enabled := DataSet.State In [dsBrowse];
botaoEdit.Enabled := (DataSet.State In [dsBrowse] And Not (DataSet.isEmpty));
botaoPost.Enabled := DataSet.State In [dsInsert,dsEdit];
botaoCancel.Enabled := DataSet.State In [dsInsert,dsEdit];
botaoDelete.Enabled := (DataSet.State In [dsBrowse] And Not (DataSet.isEmpty));
}



Pronto, agora basta vc chamar esta procedure no evento OnStateChange do DataSource que está ligado ao seu dataset.


Fernando_cunha
   - 04 jan 2006

me sugeriram tbm trocar a propriedade cursorlocation para clUseServer, tem algum fundamento??

[]s

obrigado pela ajuda!!


Rômulo Barros
   - 04 jan 2006

Nunca ouvi falar do CursorLocation, mas pelo que percebi no help do delphi o mesmo refere-se aos componentes Table/Query da Tecnologia de Acesso a Dados ADO. Não sei se seria uma boa, pois se um dia precisares migrar a aplicação para outra tecnologia de acesso a dados vc precisaria de uma outra solução. Por outro lado, se achares que valerá a pena, manda bronca !


Fernando_cunha
   - 04 jan 2006

tem como eu jogar num showmessage o estado da tabela em determnado instante??

[]s


Fernando_cunha
   - 04 jan 2006

amigo ...

coloquei o seguinte codigo dentro da procedure controlabotoes()

#Código

if dm.tb1.State in [dsBrowse] then ShowMessage(´Browse´);
if dm.tb1.State in [dsEdit] then ShowMessage(´Edit´);
if dm.tb1.State in [dsInsert] then ShowMessage(´dsInsert´);
if dm.tb1.State in [dsSetKey] then ShowMessage(´dsSetKey´);



colokei apenas para saber em qual modo a tabela esta operando no momento do erro !!!
e tbm para saber em que modo esta operando em cada acao que eu faço!!

vejamosss

quando clico no botaoAppend - tabela.append;
recebo um showmessage(´Dsinsert´)

quando clico em post logo apos preencher os dados recebo
DsBrowse

ate aqui correu tudo como esperado ...

apos dar post, clikei no botao edit e a tabela entrou em modo de edicao ...

quando mando postar, da o erro que eu citei acima!!!

nao tem pq dar o erro se a tabela esta em modo de edicao!!

por favor somebody help me!!!

[]ss


Martins
   - 04 jan 2006


Citação:
Acredito que o bom mesmo era vc deixar habilitado apenas os botões que o usuário pode utilizar ( eu faço desse jeito )

Tenho o seguinte método:

#Código

Procedure ControlaBotoes(){
botaoAppend.Enabled := DataSet.State In [dsBrowse];
botaoEdit.Enabled := (DataSet.State In [dsBrowse] And Not (DataSet.isEmpty));
botaoPost.Enabled := DataSet.State In [dsInsert,dsEdit];
botaoCancel.Enabled := DataSet.State In [dsInsert,dsEdit];
botaoDelete.Enabled := (DataSet.State In [dsBrowse] And Not (DataSet.isEmpty));
}



Pronto, agora basta vc chamar esta procedure no evento OnStateChange do DataSource que está ligado ao seu dataset.


Acredito q o código do Rômulo Barros seja o mais indicado, com algumas correções bem pequeninas.

#Código

botaoAppend.Enabled := DataSet.State In [dsBrowse];
botaoEdit.Enabled := ((DataSet.State In [dsBrowse] )And Not (DataSet.isEmpty));
botaoPost.Enabled := DataSet.State In [dsInsert,dsEdit];
botaoCancel.Enabled := DataSet.State In [dsInsert,dsEdit];
botaoDelete.Enabled := ( (DataSet.State In [dsBrowse]) And Not (DataSet.isEmpty));


O Código do Rômulo é o melhor pois assim vc não se preocupa se o usuário vai clicar no botão Gravar ou não pois o mesmo estará habilitado apenas em modo de inserção ou edição, e tb pq caso vc migre sua base e seus componentes de acesso, vc não terá trabalho.

Quanto ao erro no se vc pudesse mostra mais detalhes do código, pq se a tabela está em modo de edição não deveria dar nenhum erro ao dar um post.


Boa Sorte!


Rômulo Barros
   - 04 jan 2006

Acho que agora eu estou começando a entender o que vc quer.
Veja só, quando damos um POST em uma Table ou Query e a mesma não se encontra em modo de inserção (dsInsert) ou em modo de edição (dsEdit), o delphi levanta a seguinte exceção:

DataSet Not In Insert or Edit Mode ( algo assim )
No seu caso, acho que vc terá que configurar os ProviderFlags dos fields da sua query/table. Quando as flags não estão setadas corretamente, os registros a serem atualizados não são encontrados e diversas exceção podem ser levantadas, entre elas esta: Unable to Find Record. No key Specify

Já respondi algo parecido [url=http://forum.devmedia.com.br/viewtopic.php?t=62416&highlight=providerflags&sid=121432fbde342a60d8095a842ae3f0d4]NESTE LINK[/url]

Caso o link anterior não resolva seu problema, entre [url=http://translate.google.com/translate?u=http¬3A¬2F¬2Fdelphi.about.com¬2Fgi¬2Fdynamic¬2Foffsite.htm¬3Fzi¬3D1¬2FXJ¬26sdn¬3Ddelphi¬26zu¬3Dhttp¬253A¬252F¬252Fbdn.borland.com¬252Fborcon2004¬252Farticle¬252Fpaper¬252F0¬252C1963¬252C32229¬252C00.html&langpair=en¬7Cpt&hl=pt-BR&ie=UTF-8&oe=UTF-8&prev=¬2Flanguage_tools]NESTE LINK[/url], localize a palavra ´ProviderFlags´, e configurea conforme o artigo ensina.

Acredito que não voltarei mais a postar neste tópico durante 30 dias, muito menos neste fórum e outros, pois estou entrando de férias hoje e passarei um bom tempo longe do pc.

:wink: Boa Sorte !


Fernando_cunha
   - 04 jan 2006

segue o codigo .. nao tem nada de diferente nele rs mas mesmo assim vamos tentar

codigo no evento form create do form que inicializa a tabela!!

#Código

procedure TFrmCadastroRE.FormCreate(Sender: TObject);
var
x: integer;
pais, inco: TADOTable;
begin
Dm.tb1.TableName:= ´tbRegistroExportacao´;
Dm.tb1.Active:= True;
Dm.Ds1.OnStateChange:= ControlaBotoes;
{
rotinas que setam os datafields de cada componente
rotinas que carregam dados em componentes combobox!!
}

end;



procedures dos botoes ...
#Código


procedure TFrmCadastroRE.botaonovoClick(Sender: TObject);
begin
dm.tb1.Append;
dm.tb1.FieldByName(´dtRE´).AsDateTime:= Date;
end;

procedure TFrmCadastroRE.botaopostClick(Sender: TObject);
begin
Dm.tb1.Post;
end;

procedure TFrmCadastroRE.SpeedButton5Click(Sender: TObject);
begin
if not Dm.tb1.IsEmpty then Dm.tb1.Delete;
end;

procedure TFrmCadastroRE.SpeedButton2Click(Sender: TObject);
begin
dm.tb1.Edit;
end;


procedure controlabotes que estou usando unica e exclusivamente para mostrar o modo em que a tabela esta

#Código
procedure TFrmCadastroRE.ControlaBotoes(Sender: TObject);
var
x: integer;
begin
if dm.tb1.State in [dsBrowse] then ShowMessage(´Browse´);
if dm.tb1.State in [dsEdit] then ShowMessage(´Edit´);
if dm.tb1.State in [dsInsert] then ShowMessage(´dsInsert´);
if dm.tb1.State in [dsSetKey] then ShowMessage(´dsSetKey´);

{Botaonovo.Enabled:= Dm.Ds1.State in [DsBrowse];
BotaoPost.Enabled:= Dm.Ds1.State in [DsEdit,DsInsert];}


end;



no mais, estou usando ado com mysql e odbc!!

agora vejam as acoes que executo antes dar o erro

1 - executo o comando append - tabela em modo de insercao
2- preencho os dbedits
3 - executo o comando post - tabela em modo browse
4 - executo o comando edit - tabela em modo de edicao
5 - altero algum dado e cexecuto o comando post!!

6 - ERRROOOOOOOOOOOOOOOOOOOOOOOOOOOO!!!

se alguem puder me ajudar, agradeço muito

[]s


Rômulo Barros
   - 04 jan 2006

Concluindo: Sua query está em modo de edição e o post não está funcionando pq os flags dos fields não estão configurados.
Nem se preocupe com os modos, pois tenho certeza de que sua query estáem modo de edição e o post está sendo aplicado corretamente, apenas o registro não está sendo localizado para atualização.
Se sua query não estivesse em edição, o delphi levantaria a exceção: DataSet Not In Insert or Edit Mode ( algo assim )

Boa Sorte !


Fernando_cunha
   - 04 jan 2006

ai é que esta o problema romulo, a tabela esta em modo de edicao ..
nao deveria dar nenhum erro
ou deveria??
boas ferias!!

[]s


Martins
   - 04 jan 2006

Quais são seus componentes DataWare?

vc está usando Query, Table, ADOQuery, ClientDataSet?


Fernando_cunha
   - 04 jan 2006

ADO , MySQL, ODBC

estou usando ADOTable ...

tenho 3 tabelas em um DataModule ...
eu mudo algumas propriedades em tempo de execucao para alternar as tabelas ... pq se fosse inserir um componente para cada tabela teria que inserir mais de 50 componentes ADOTable, essa pratica que utilizo é a mais indicada!??


alguem sabe o que é esse providerflags ??

[]s


Fernando_cunha
   - 05 jan 2006

como configuro os providers flags em tempo de execucao??

[]s


Martins
   - 05 jan 2006


Citação:
como configuro os providers flags em tempo de execucao??

[]s


Não me lembro de ter mexido com isso antes, mas acho q se vc fizer assim deve funcionar.
#Código



TabelaCampo.ProviderFlags:= [pfInUpdate,pfInWhere];



Só minha humilde opnião.

boa sorte


Fernando_cunha
   - 05 jan 2006

boa velhinhoooooo, vlwww
funcionou perfeitamente agora!!


abraçoss!


Martins
   - 05 jan 2006


Citação:
boa velhinhoooooo, vlwww
funcionou perfeitamente agora!!


abraçoss!



Blz, quer dizer q agora está funcionando certinho né? Qualquer coisa posta aqui novamente.


Fernando_cunha
   - 05 jan 2006

funciono sim, agradeço muito pela ajuda e atenção!!
vlwww


Rafael Gomes
   - 05 jan 2006

olá amigos,

continuo com o mesmo problema ...

estou usando adoquery, mesmo quando a tabela esta em modo de edicao e altero algo nos dbedits e mando postar da um erro

´a linha nao pode ser localizada para atualizacao. alguns valores podem ter sido alterados desde que ela foi lida pela ultima vez´

ah, o fernando_cunha ali emcima era eu ... é que eu usava o login de um colega aki do trabalho!!

to usando o seguinte codigo para setar os providers flags!!

#Código

procedure TFrmRE.ConfigProviderFlags;
var
x: integer;
begin
Dm.Qy1.FieldByName(´CodREInterno´).ProviderFlags:= [pfInUpdate, pfInWhere, pfInKey];
for x:= 1 to Dm.Qy1.FieldCount - 1 do
Dm.Qy1.Fields.Fields[x].ProviderFlags:= [pfInUpdate,pfInWhere];
end;