Meu for não funciona
Meu for não funciona, porque não consegui usar a variável ´i´ para apontar os registros que seriam alterados. Podem me dar uma ajuda? Abaixo meu FOR:
for i := 0 to Pred(dbgTitulos.SelectedRows.Count) do begin dtsTitulos.DataSet.Edit; dtsTitulos.DataSet.FieldByName(´LIDA´).AsString := ´S´; dtsTitulos.DataSet.Post; (dtsTitulos.DataSet as TOracleDataSet).Session.Commit; (dtsTitulos.DataSet as TOracleDataSet).RefreshRecord; if treMensagens.Selected.Text = Mens(strNovas) then if treMensagens.Selected.Parent.Text = Mens(strRecebidas) then AbreQry(qryRecebidasNovas) else AbreQry(qryEnviadasNovas) else if treMensagens.Selected.Text = Mens(strExcluidas) then if treMensagens.Selected.Parent.Text = Mens(strEnviadas) then AbreQry(qryEnviadasExcluidas) else AbreQry(qryRecebidasExcluidas); end;
Paulo
Curtidas 0
Respostas
Acacio
23/06/2009
Aonde tais tentando usaro ´I´ no teu for.
GOSTEI 0
Paulo
23/06/2009
Do jeito que tá, só o primeiro registro é atualizado. Se eu tiver 10 registros, o FOR corre os 10, mas somente 1 é atualizado. Imagino, porque não tem uma referência que é feita pela variável ´i´. Agora onde usar é que eu não sei, esta é a razão do post.
GOSTEI 0
Paulo
23/06/2009
O que passa é que o meu for executa tantas vezes, quanto for o numero de registros no grid, mas ele não caminha pelo grid, ou seja, ele fica sempre no primeiro registro.
GOSTEI 0
.lg.
23/06/2009
Você quer correr todos os registros ou apenas os selecionados mesmo!?
Pelo que entendi vendo o código... você pode correr todos os registros e usar somente os que você quiser. Tudo é possível. So é complidado de se obter. No seu caso... valide somente as colunas que estiverem selecionadas. Assim ele varre por apenas as células que você quiser.
.LG.
Pelo que entendi vendo o código... você pode correr todos os registros e usar somente os que você quiser. Tudo é possível. So é complidado de se obter. No seu caso... valide somente as colunas que estiverem selecionadas. Assim ele varre por apenas as células que você quiser.
.LG.
GOSTEI 0
Paulo
23/06/2009
Gostaria de editar somente os selecionados. É isso que não estou conseguindo fazer. Já coloquei bookmark, mas dá erro de list index out of bound. Como faço isso então?
GOSTEI 0
Uasan
23/06/2009
Bom Dia,
Pelo que estoiu vendo no seu for não tem next, ou seja ele sempre fica no primeiro registro.
Não sei se funciona mas tente assim no total de registro.
[]´s
Pelo que estoiu vendo no seu for não tem next, ou seja ele sempre fica no primeiro registro.
Não sei se funciona mas tente assim no total de registro.
var Proximo:integer; begin Proximo := Pred(dbgTitulos.SelectedRows.Count); for i:=0 to proximo do begin .. .. .. seu codigo. .. .. proximo := proximo +1; end;
[]´s
GOSTEI 0
Uasan
23/06/2009
Ops...
Esquece o codigo acima viajei somente tente:
dtsTitulos.next;
[]´s
Esquece o codigo acima viajei somente tente:
dtsTitulos.next;
[]´s
GOSTEI 0
Paulo
23/06/2009
Já fiz assim, e ele atualiza dois registros e depois ele não atualiza mais nada. Debuguei e percebi que ele permanece no mesmo registro até o fim do for. É simples, mas não estou conseguindo.
GOSTEI 0
Weber
23/06/2009
while not dbgTitulos.Eof do begin dtsTitulos.DataSet.Edit; dtsTitulos.DataSet.FieldByName(´LIDA´).AsString := ´S´; dtsTitulos.DataSet.Post; (dtsTitulos.DataSet as TOracleDataSet).Session.Commit; (dtsTitulos.DataSet as TOracleDataSet).RefreshRecord; if treMensagens.Selected.Text = Mens(strNovas) then if treMensagens.Selected.Parent.Text = Mens(strRecebidas) then AbreQry(qryRecebidasNovas) else AbreQry(qryEnviadasNovas) else if treMensagens.Selected.Text = Mens(strExcluidas) then if treMensagens.Selected.Parent.Text = Mens(strEnviadas) then AbreQry(qryEnviadasExcluidas) else AbreQry(qryRecebidasExcluidas); dbgTitulos.Next; end;
GOSTEI 0
Paulo
23/06/2009
Olá Weber, valeu, mas while não vai funcionar. O while vai atualizar todos os dados e não somente os marcados no grid. Eu fiz usando bookmark e funcionou. Mas está agora dando um erro de List Index Out of Bounds. O meu código segue abaixo:
procedure TfrmMensagensUsuarios.btnLidaClick(Sender: TObject); var i: Integer; s: String; ABookMarkList: TBookMarkList; begin if not Assigned(dtsTitulos.DataSet) then exit; ABookMarkList := dbgTitulos.SelectedRows; for i := 0 to Pred(ABookMarkList.Count) do begin //Na segunda passagem do loop, dá o erro. dtsTitulos.DataSet.Bookmark := ABookMarkList[i]; dtsTitulos.DataSet.Edit; dtsTitulos.DataSet.FieldByName(´LIDA´).AsString := ´S´; dtsTitulos.DataSet.Post; (dtsTitulos.DataSet as TOracleDataSet).Session.Commit; (dtsTitulos.DataSet as TOracleDataSet).RefreshRecord; if treMensagens.Selected.Text = Mens(strNovas) then if treMensagens.Selected.Parent.Text = Mens(strRecebidas) then AbreQry(qryRecebidasNovas) else AbreQry(qryEnviadasNovas) else if treMensagens.Selected.Text = Mens(strExcluidas) then if treMensagens.Selected.Parent.Text = Mens(strEnviadas) then AbreQry(qryEnviadasExcluidas) else AbreQry(qryRecebidasExcluidas); end; dtsTitulos.DataSet.FreeBookmark(ABookMarkList); end;
GOSTEI 0
Paulo
23/06/2009
O meu Count(ABookMarkList.Count) está vindo zero. Alguém tem idéia do que pode ser?
GOSTEI 0
Paulo
23/06/2009
Consegui conforme o codigo abaixo.
Porem o segundo FOR creio não ser necessário, mas não consegui nada sem ele também. Está dando erro de Access Violation. Agora não sei se é por causa disso, pois ontem eu testando estava dando muitos desses erros, mas não consegui detectar onde era o erro. Hoje deu, parou e voltou a dar, coincidentemente ou não, após eu ter mudado o código para o que está acima. Foi necessário colocar o FIRST, pois a lista vinha bagunçada, ou seja, o cursor para no último registro sempre, mas eu não sei porque. Coloquei o First e agora faz o que eu quero. Abaixo as procedure e function, AbreQuery e Mens, se alguém puder e quiser analisar esse Access Violation. Agradeço desde então.
Procedure AbreQuery
Function Mens
procedure TfrmMensagensUsuarios.btnLidaClick(Sender: TObject); var i: Integer; //s: String; ABookMarkList: TBookMarkList; ABookMarkStr: TBookmarkStr; begin if not Assigned(dtsTitulos.DataSet) then exit; //ABookMarkStr := dtsTitulos.DataSet.BookMark; ABookMarkList := dbgTitulos.SelectedRows; dtsTitulos.DataSet.First; for i := 0 to Pred(ABookMarkList.Count) do begin dtsTitulos.DataSet.Bookmark := ABookMarkList[i]; dtsTitulos.DataSet.Edit; dtsTitulos.DataSet.FieldByName(´LIDA´).AsString := ´S´; dtsTitulos.DataSet.Post; (dtsTitulos.DataSet as TOracleDataSet).Session.Commit; (dtsTitulos.DataSet as TOracleDataSet).RefreshRecord; end; dtsTitulos.DataSet.First; for i := 0 to Pred(dbgTitulos.SelectedRows.Count) do begin if treMensagens.Selected.Text = Mens(strNovas) then if treMensagens.Selected.Parent.Text = Mens(strRecebidas) then AbreQry(qryRecebidasNovas) else AbreQry(qryEnviadasNovas) else if treMensagens.Selected.Text = Mens(strExcluidas) then if treMensagens.Selected.Parent.Text = Mens(strEnviadas) then AbreQry(qryEnviadasExcluidas) else AbreQry(qryRecebidasExcluidas); end; dtsTitulos.DataSet.FreeBookmark(ABookMarkList); end;
Porem o segundo FOR creio não ser necessário, mas não consegui nada sem ele também. Está dando erro de Access Violation. Agora não sei se é por causa disso, pois ontem eu testando estava dando muitos desses erros, mas não consegui detectar onde era o erro. Hoje deu, parou e voltou a dar, coincidentemente ou não, após eu ter mudado o código para o que está acima. Foi necessário colocar o FIRST, pois a lista vinha bagunçada, ou seja, o cursor para no último registro sempre, mas eu não sei porque. Coloquei o First e agora faz o que eu quero. Abaixo as procedure e function, AbreQuery e Mens, se alguém puder e quiser analisar esse Access Violation. Agradeço desde então.
Procedure AbreQuery
procedure TfrmMensagensUsuarios.AbreQry(qry: TOracleDataSet); begin dtsTitulos.DataSet := qry; if qry.Active then qry.Refresh else qry.Open; end;
Function Mens
function mens; external ´drpmsg.dll´ name ´mens´;
GOSTEI 0
Weber
23/06/2009
No lugar de dbgTitulos.SelectedRows.Count use dbgTitulos.SelectedRows.Count -1
GOSTEI 0
Paulo
23/06/2009
o PRED(Predecessor) já faz isso.
isto
é a mesma coisa que isso
E conforme meu último código, está funcionando. O que passa é um Access Violation, que dá, mas após atualizar todas os registros marcados.
Mas acho que são alguns eventos que são disparados após ele atualizar tudo.
isto
dbgTitulos.SelectedRows.Count -1
é a mesma coisa que isso
Pred(dbgTitulos.SelectedRows.Count)
E conforme meu último código, está funcionando. O que passa é um Access Violation, que dá, mas após atualizar todas os registros marcados.
Mas acho que são alguns eventos que são disparados após ele atualizar tudo.
GOSTEI 0
Paulo
23/06/2009
Resolvido. O problema de Access Violation se dava nesta linha.
Comentei a linha e está funcionando.
dtsTitulos.DataSet.FreeBookmark(ABookMarkList);
Comentei a linha e está funcionando.
GOSTEI 0