Tem alguma necessidade de usar Bookmark no loop?

Delphi

07/06/2008

Pessoal tenho uma duvida, fiz assim o codigo, mais não sei qual é a real necessidade deste ponteiro

var
  Bookmark : TBookmark;
begin
  {Grava a tabela temporaria na tabela CadCheque_Terceiros}
      if STR_CHEQUETERCEIRO = ´S´ then
      Bookmark := cdsTempBancos.GetBookmark; {:Ponteiro - alocar memória e atribuir um valor}
      cdsTempBancos.DisableControls; {:Desativar exibição de registros de dados que controla}
      try {:Abre o Bloco Try/Except ou seja Tente ou abre uma exceção}
        try {::Abre o Bloco Try/Finnaly ou seja Tente ou Finalmente}
          cdsTempBancos.First; {:Ir para o primeiro registro na tabela temporaria}
          while not cdsTempBancos.Eof do {:Iterage através de cada registro na tabela }
          begin
            {:Transferindo os dados para o banco}
            if not cdsCadCheque_Terceiros.Active = True then
              cdsCadCheque_Terceiros.Active := True;
              cdsCadCheque_Terceiros.Append;
              cdsCadCheque_TerceirosNR_DOC.AsString          := cdsTempBancosnr_doc.AsString;
              cdsCadCheque_TerceirosCHEQUE_NR.AsString       := cdsTempBancoscheque_nr.AsString;
              cdsCadCheque_TerceirosVALOR_CHEQUE.AsCurrency  := cdsTempBancosvalor_cheque.AsCurrency;
              cdsCadCheque_TerceirosCOD_BANCO.AsString       := cdsTempBancoscod_banco.AsString;
              cdsCadCheque_TerceirosNOM_BANCO.AsString       := cdsTempBancosnom_banco.AsString;
              cdsCadCheque_TerceirosNR_C_C.AsString          := cdsTempBancosnr_c_c.AsString;
              cdsCadCheque_TerceirosAGENCIA.AsString         := cdsTempBancosagencia.AsString;
              cdsCadCheque_TerceirosNOME_TITULAR.AsString    := cdsTempBancosnome_titular.AsString;
              cdsCadCheque_TerceirosCPF_TITULAR.AsString     := cdsTempBancoscpf_titular.AsString;
              cdsCadCheque_TerceirosID_TITULAR.AsString      := cdsTempBancosid_titular.AsString;
              cdsCadCheque_TerceirosDATA_TRANS.AsDateTime    := Now;
              cdsCadCheque_TerceirosUSUARIO.AsString         := ´Teste´;
              cdsCadCheque_TerceirosHORA_TRANS.AsDateTime    := Time;
              cdsCadCheque_Terceiros.Post;
              cdsTempBancos.Next; //Proximo dado da tabela temporaria
          end; //final do loop
        finally {:Finalmente}
          cdsTempBancos.GotoBookmark(Bookmark);
          cdsTempBancos.EnableControls; {:Abre a exibição de registros de dados dos controles, se faz necessário ao final}
          cdsTempBancos.FreeBookmark(Bookmark);{:Limpa da memoria o ponteiro boockmark}
          {Grava a tabela temporaria na tabela CadCheque_Terceiros. Se torna necessário aqui
           para que quando não tiver movimento na tabela temporaria não aplicar o método
           applyUpdates e gerar um erro}
          if STR_CHEQUETERCEIRO = ´S´ then
             {:Grava no banco de dados}
             cdsCadCheque_Terceiros.ApplyUpdates(0);
             {:Limpa toda tabela que esta em memoria}
             (dsTempBancos.DataSet as TClientDataSet).CancelUpdates;
          {:Fecha todos Botões}
           btnInsere.Enabled   := False;
           btnExcluir.Enabled  := False;
           btnAlterar.Enabled  := False;
           btnGravar.Enabled   := False;
           btnCancelar.Enabled := False;
           b_first.Enabled := False;
           b_prior.Enabled := False;
           b_next.Enabled  := False;
           b_last.Enabled  := False;
        end; {:Final do bloco try/finally}
      except
          raise Exception.Create(´Problemas na transação dos dados, o processo não foi incluído no banco.´);
          Exit;
      end; {:Final do bloco try/except}


Então estou na duvida, se é realmente necessário o uso do bookmark, segundo o livro da borland que eu tenho aqui isso se faz necessário, mais testei sem o bookmark e funciona tambem.


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

07/06/2008

esse bookmark faz com que o ponteiro do registro retorne à posição que se encontrava ANTES de iniciar o loop.

assim:
suponhamos que você está no registro 15.
ele guarda essa posição.
o first vai para o registro 1.
o loop varre os registros até o fim da tabela
e finalmente, retorna para o registro ´original´ - no caso, o 15.

entendeu?


GOSTEI 0
Adriano_servitec

Adriano_servitec

07/06/2008

esse bookmark faz com que o ponteiro do registro retorne à posição que se encontrava ANTES de iniciar o loop. assim: suponhamos que você está no registro 15. ele guarda essa posição. o first vai para o registro 1. o loop varre os registros até o fim da tabela e finalmente, retorna para o registro ´original´ - no caso, o 15. entendeu?
Então com o bookmark se torna mais seguro e desta forma evita de se perder o ponteiro no loop é isso?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

07/06/2008

no seu caso, é somente para voltar para o registro que estava posicionado antes de iniciar o processo.

é para ´estética´.

imagine que você está visualizando uma grade que contém 200 registros, onde a área de rolagem é de apenas 20 registros.
você está com o ponteiro no registro 8 e inicia o processo. não seria esquisito que, ao terminar o processo, você estivesse vendo o último registro da grade; o registro 200, sendo que você estava no registro 8?
para que esse inconveniente não aconteça, o ponteiro é guardado e depois do loop ter sido processado, ele é recuperado e retorna para o registro 8, no caso.


GOSTEI 0
Adriano_servitec

Adriano_servitec

07/06/2008

no seu caso, é somente para voltar para o registro que estava posicionado antes de iniciar o processo. é para ´estética´. imagine que você está visualizando uma grade que contém 200 registros, onde a área de rolagem é de apenas 20 registros. você está com o ponteiro no registro 8 e inicia o processo. não seria esquisito que, ao terminar o processo, você estivesse vendo o último registro da grade; o registro 200, sendo que você estava no registro 8? para que esse inconveniente não aconteça, o ponteiro é guardado e depois do loop ter sido processado, ele é recuperado e retorna para o registro 8, no caso.
A sim agora entendi, muito obrigado amigo.

Agora aproveitando o bonde, eu nunca entendi uma coisa, tipo Inserir, Gravar, Alterar e Deletar direito se ou faço num button ou se tenho que usar os eventos OnAfterInsert, onAfterPost, onAfterUpdate e onAfterDelete, ou seja é ali que eu tenho que fazer os códigos, pois não uso estes eventos e sim nos botões, ja vi programadores que usam estes eventos.


GOSTEI 0
Paullsoftware

Paullsoftware

07/06/2008

[quote:efdf094a06=´emerson.en´]no seu caso, é somente para voltar para o registro que estava posicionado antes de iniciar o processo. é para ´estética´. imagine que você está visualizando uma grade que contém 200 registros, onde a área de rolagem é de apenas 20 registros. você está com o ponteiro no registro 8 e inicia o processo. não seria esquisito que, ao terminar o processo, você estivesse vendo o último registro da grade; o registro 200, sendo que você estava no registro 8? para que esse inconveniente não aconteça, o ponteiro é guardado e depois do loop ter sido processado, ele é recuperado e retorna para o registro 8, no caso.
A sim agora entendi, muito obrigado amigo.

Agora aproveitando o bonde, eu nunca entendi uma coisa, tipo Inserir, Gravar, Alterar e Deletar direito se ou faço num button ou se tenho que usar os eventos OnAfterInsert, onAfterPost, onAfterUpdate e onAfterDelete, ou seja é ali que eu tenho que fazer os códigos, pois não uso estes eventos e sim nos botões, ja vi programadores que usam estes eventos.[/quote:efdf094a06]Bom dia amigo, os eventos sitados por você são usados para tratamento de transações e muitas vezes não podem ser desfeitas, pois, o eventos Affter (depois) que ocorrer a ação faça eles serão executado somente quando a ação já estiver sido realizada, tipo o uso do AffterPost dos ClientDataSets uso o clidigo simples:
[b:efdf094a06]TClienteDataSet(DataSet).ApplyUpdates(-1);[/b:efdf094a06] para aplicar os dados salvos em memória no banco e assim por diante!


GOSTEI 0
Adriano_servitec

Adriano_servitec

07/06/2008

[quote:11b30936e1=´Adriano_Servitec´][quote:11b30936e1=´emerson.en´]no seu caso, é somente para voltar para o registro que estava posicionado antes de iniciar o processo. é para ´estética´. imagine que você está visualizando uma grade que contém 200 registros, onde a área de rolagem é de apenas 20 registros. você está com o ponteiro no registro 8 e inicia o processo. não seria esquisito que, ao terminar o processo, você estivesse vendo o último registro da grade; o registro 200, sendo que você estava no registro 8? para que esse inconveniente não aconteça, o ponteiro é guardado e depois do loop ter sido processado, ele é recuperado e retorna para o registro 8, no caso.
A sim agora entendi, muito obrigado amigo.

Agora aproveitando o bonde, eu nunca entendi uma coisa, tipo Inserir, Gravar, Alterar e Deletar direito se ou faço num button ou se tenho que usar os eventos OnAfterInsert, onAfterPost, onAfterUpdate e onAfterDelete, ou seja é ali que eu tenho que fazer os códigos, pois não uso estes eventos e sim nos botões, ja vi programadores que usam estes eventos.[/quote:11b30936e1]Bom dia amigo, os eventos sitados por você são usados para tratamento de transações e muitas vezes não podem ser desfeitas, pois, o eventos Affter (depois) que ocorrer a ação faça eles serão executado somente quando a ação já estiver sido realizada, tipo o uso do AffterPost dos ClientDataSets uso o clidigo simples:
[b:11b30936e1]TClienteDataSet(DataSet).ApplyUpdates(-1);[/b:11b30936e1] para aplicar os dados salvos em memória no banco e assim por diante![/quote:11b30936e1]Obrigado paullsoftware, pela resposta, mais tipo assim não tem problema eu ficar usando apenas buttons para isso, é que eu aprendi desta forma e uso pouco estes eventos before(antes) after(depois) nos meus componentes.


GOSTEI 0
Eniorm

Eniorm

07/06/2008

o que é melhor? usar o Bookmark para retornar a posisão anterior ou armazenar o ´cod´ numa variável, e depois usar o Locate?


GOSTEI 0
Brunodsr

Brunodsr

07/06/2008

Bookmark.

O locate varre o dataset p/ achar o teu registro, enquanto o bookmark é um apontador para o teu registro (hash).

Considera o bookmark como um marcador de pagina mesmo:

É mais facil folear pagina à pagina para procurar a que vc quer ou marcar a sua página e ir direto prá ela qndo precisar?

Espero ter ajudado. Um abraço.


GOSTEI 0
Eniorm

Eniorm

07/06/2008

opa! realmente esclareceu minha dúvida, realmente é melhor usar o Bookmark


GOSTEI 0
POSTAR