04/01/2006

a linha nao pode ser localizada para atualizacao

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

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

post;


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


Fernando_cunha

Respostas

04/01/2006

Rômulo Barros

Explique-se melhor, cara ! :wink:


Responder Citar

04/01/2006

Fernando_cunha

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


Responder Citar

04/01/2006

Rômulo Barros

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:

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



Pronto, agora basta vc chamar esta procedure no evento [b:84e3f1eece]OnStateChange [/b:84e3f1eece]do [b:84e3f1eece]DataSource [/b:84e3f1eece]que está ligado ao seu dataset.


Responder Citar

04/01/2006

Fernando_cunha

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

[]s

obrigado pela ajuda!!


Responder Citar

04/01/2006

Rômulo Barros

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 [b:fdbd41766a]ADO[/b:fdbd41766a]. 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 !


Responder Citar

04/01/2006

Fernando_cunha

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

[]s


Responder Citar

04/01/2006

Fernando_cunha

amigo ...

coloquei o seguinte codigo dentro da procedure controlabotoes()

  if dm.tb1.State in [dsBrowse&93; then ShowMessage(´Browse´);
  if dm.tb1.State in &91;dsEdit&93; then ShowMessage(´Edit´);
  if dm.tb1.State in &91;dsInsert&93; then ShowMessage(´dsInsert´);
  if dm.tb1.State in &91;dsSetKey&93; 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


Responder Citar

04/01/2006

Martins

[quote:c35b950972=´Rômulo Barros´]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:

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



Pronto, agora basta vc chamar esta procedure no evento [b:c35b950972]OnStateChange [/b:c35b950972]do [b:c35b950972]DataSource [/b:c35b950972]que está ligado ao seu dataset.[/quote:c35b950972]


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

   botaoAppend.Enabled := DataSet.State In [dsBrowse&93;;
   botaoEdit.Enabled := ((DataSet.State In &91;dsBrowse&93; )And Not (DataSet.isEmpty));
   botaoPost.Enabled := DataSet.State In &91;dsInsert,dsEdit&93;;
   botaoCancel.Enabled := DataSet.State In &91;dsInsert,dsEdit&93;;
   botaoDelete.Enabled := ( (DataSet.State In &91;dsBrowse&93;) 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!


Responder Citar

04/01/2006

Rômulo Barros

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:

[color=blue:8d6241d154][b:8d6241d154]DataSet Not In Insert or Edit Mode ( algo assim )[/b:8d6241d154][/color:8d6241d154]
No seu caso, acho que vc terá que configurar os [b:8d6241d154]ProviderFlags[/b:8d6241d154] 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: [b:8d6241d154]Unable to Find Record. No key Specify[/b:8d6241d154]

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.

[color=blue:8d6241d154][b:8d6241d154]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. [/b:8d6241d154][/color:8d6241d154]

:wink: [color=red:8d6241d154]Boa Sorte ![/color:8d6241d154]


Responder Citar

04/01/2006

Fernando_cunha

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

[b:ec99a98c00]codigo no evento form create do form que inicializa a tabela!![/b:ec99a98c00]

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;



[b:ec99a98c00]procedures dos botoes ...[/b:ec99a98c00]

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

procedure TFrmCadastroRE.ControlaBotoes(Sender: TObject);
var
  x: integer;
begin
  if dm.tb1.State in [dsBrowse&93; then ShowMessage(´Browse´);
  if dm.tb1.State in &91;dsEdit&93; then ShowMessage(´Edit´);
  if dm.tb1.State in &91;dsInsert&93; then ShowMessage(´dsInsert´);
  if dm.tb1.State in &91;dsSetKey&93; then ShowMessage(´dsSetKey´);

  {Botaonovo.Enabled:= Dm.Ds1.State in &91;DsBrowse&93;;
  BotaoPost.Enabled:= Dm.Ds1.State in &91;DsEdit,DsInsert&93;;}


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


Responder Citar

04/01/2006

Rômulo Barros

[b:fb49971d75]Concluindo:[/b:fb49971d75] 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: [b:fb49971d75]DataSet Not In Insert or Edit Mode ( algo assim ) [/b:fb49971d75]

Boa Sorte !


Responder Citar

04/01/2006

Fernando_cunha

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

[]s


Responder Citar

04/01/2006

Martins

Quais são seus componentes DataWare?

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


Responder Citar

04/01/2006

Fernando_cunha

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


Responder Citar

05/01/2006

Fernando_cunha

como configuro os providers flags em tempo de execucao??

[]s


Responder Citar