Fórum Meu for não funciona #371525

23/06/2009

0

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

Paulo

Responder

Posts

23/06/2009

Acacio

Aonde tais tentando usaro ´I´ no teu for.


Responder

Gostei + 0

24/06/2009

Paulo

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.


Responder

Gostei + 0

24/06/2009

Paulo

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.


Responder

Gostei + 0

24/06/2009

.lg.

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.


Responder

Gostei + 0

24/06/2009

Paulo

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?


Responder

Gostei + 0

24/06/2009

Uasan

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.

var
Proximo:integer;
begin
Proximo := Pred(dbgTitulos.SelectedRows.Count);

for i:=0 to proximo do
begin
..
..
..
seu codigo.
..
..
proximo := proximo +1;
end;


[]´s


Responder

Gostei + 0

24/06/2009

Uasan

Ops...

Esquece o codigo acima viajei somente tente:

dtsTitulos.next;

[]´s


Responder

Gostei + 0

24/06/2009

Paulo

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.


Responder

Gostei + 0

25/06/2009

Weber

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;



Responder

Gostei + 0

25/06/2009

Paulo

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;



Responder

Gostei + 0

25/06/2009

Paulo

O meu Count(ABookMarkList.Count) está vindo zero. Alguém tem idéia do que pode ser?


Responder

Gostei + 0

25/06/2009

Paulo

Consegui conforme o codigo abaixo.
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´;



Responder

Gostei + 0

25/06/2009

Weber

No lugar de dbgTitulos.SelectedRows.Count use dbgTitulos.SelectedRows.Count -1


Responder

Gostei + 0

25/06/2009

Paulo

o PRED(Predecessor) já faz isso.
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.


Responder

Gostei + 0

26/06/2009

Paulo

Resolvido. O problema de Access Violation se dava nesta linha.
dtsTitulos.DataSet.FreeBookmark(ABookMarkList);

Comentei a linha e está funcionando.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar