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
sei la, deem uma força ai please!!
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
Curtidas 0
Respostas
Rômulo Barros
04/01/2006
Explique-se melhor, cara ! :wink:
GOSTEI 0
Fernando_cunha
04/01/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
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
GOSTEI 0
Rômulo Barros
04/01/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:
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.
Tenho o seguinte método:
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 [b:84e3f1eece]OnStateChange [/b:84e3f1eece]do [b:84e3f1eece]DataSource [/b:84e3f1eece]que está ligado ao seu dataset.
GOSTEI 0
Fernando_cunha
04/01/2006
me sugeriram tbm trocar a propriedade cursorlocation para clUseServer, tem algum fundamento??
[]s
obrigado pela ajuda!!
[]s
obrigado pela ajuda!!
GOSTEI 0
Rômulo Barros
04/01/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 [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 !
GOSTEI 0
Fernando_cunha
04/01/2006
tem como eu jogar num showmessage o estado da tabela em determnado instante??
[]s
[]s
GOSTEI 0
Fernando_cunha
04/01/2006
amigo ...
coloquei o seguinte codigo dentro da procedure controlabotoes()
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
coloquei o seguinte codigo dentro da procedure controlabotoes()
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
GOSTEI 0
Martins
04/01/2006
[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:
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.
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!
Tenho o seguinte método:
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 [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]; 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!
GOSTEI 0
Rômulo Barros
04/01/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:
[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]
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]
GOSTEI 0
Fernando_cunha
04/01/2006
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]
[b:ec99a98c00]procedures dos botoes ...[/b:ec99a98c00]
procedure controlabotes que estou usando unica e exclusivamente para mostrar o modo em que a tabela esta
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
[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] 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
GOSTEI 0
Rômulo Barros
04/01/2006
[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 !
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 !
GOSTEI 0
Fernando_cunha
04/01/2006
ai é que esta o problema romulo, a tabela esta em modo de edicao ..
nao deveria dar nenhum erro
ou deveria??
boas ferias!!
[]s
nao deveria dar nenhum erro
ou deveria??
boas ferias!!
[]s
GOSTEI 0
Martins
04/01/2006
Quais são seus componentes DataWare?
vc está usando Query, Table, ADOQuery, ClientDataSet?
vc está usando Query, Table, ADOQuery, ClientDataSet?
GOSTEI 0
Fernando_cunha
04/01/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
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
GOSTEI 0
Fernando_cunha
04/01/2006
como configuro os providers flags em tempo de execucao??
[]s
[]s
GOSTEI 0
Martins
04/01/2006
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.
TabelaCampo.ProviderFlags:= [pfInUpdate,pfInWhere];
Só minha humilde opnião.
boa sorte
GOSTEI 0
Fernando_cunha
04/01/2006
boa velhinhoooooo, vlwww
funcionou perfeitamente agora!!
abraçoss!
funcionou perfeitamente agora!!
abraçoss!
GOSTEI 0
Martins
04/01/2006
boa velhinhoooooo, vlwww
funcionou perfeitamente agora!!
abraçoss!
Blz, quer dizer q agora está funcionando certinho né? Qualquer coisa posta aqui novamente.
GOSTEI 0
Fernando_cunha
04/01/2006
funciono sim, agradeço muito pela ajuda e atenção!!
vlwww
vlwww
GOSTEI 0
Rafael Gomes
04/01/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!!
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!!
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;
GOSTEI 0
Fernando_cunha
04/01/2006
só para lembrar, estou usando ADO MySQL 5.0 ... e o ODBC para conexao!!!
[]ss
[]ss
GOSTEI 0
Michael
04/01/2006
O erro está nesta linha:
Vc *não* deve setar os campos que não são chaves primárias para [b:a713982001]pfInWhere[/b:a713982001], pq desta forma vc instrui o [b:a713982001]DataSetProvider [/b:a713982001]a colocá-los na cláusula [b:a713982001]WHERE [/b:a713982001]de comandos SQL como [b:a713982001]INSERT[/b:a713982001] e [b:a713982001]UPDATE[/b:a713982001].
Veja uma explicação melhor disto [url=http://forum.devmedia.com.br/viewtopic.php?t=72291&highlight=&sid=af5d7acd15928edf1796aff6716b7066]neste outro post[/url].
[]´s
Dm.Qy1.Fields.Fields[x].ProviderFlags:= [pfInUpdate,pfInWhere];
Vc *não* deve setar os campos que não são chaves primárias para [b:a713982001]pfInWhere[/b:a713982001], pq desta forma vc instrui o [b:a713982001]DataSetProvider [/b:a713982001]a colocá-los na cláusula [b:a713982001]WHERE [/b:a713982001]de comandos SQL como [b:a713982001]INSERT[/b:a713982001] e [b:a713982001]UPDATE[/b:a713982001].
Veja uma explicação melhor disto [url=http://forum.devmedia.com.br/viewtopic.php?t=72291&highlight=&sid=af5d7acd15928edf1796aff6716b7066]neste outro post[/url].
[]´s
GOSTEI 0
Fernando_cunha
04/01/2006
o campo que é chave primaria ficaria assim entao?
e os demais campos!? como devem ficar??
continua dando o erro =/
Dm.Qy1.FieldByName(´CodREInterno´).ProviderFlags:= [pfInWhere, pfInKey];
e os demais campos!? como devem ficar??
continua dando o erro =/
GOSTEI 0
Fernando_cunha
04/01/2006
up no topico ...
o erro persiste!!
:cry:
o erro persiste!!
:cry:
GOSTEI 0