Tem alguma necessidade de usar Bookmark no loop?

07/06/2008

0

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

Responder

Posts

07/06/2008

Emerson Nascimento

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?


Responder

07/06/2008

Adriano_servitec

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?


Responder

07/06/2008

Emerson Nascimento

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.


Responder

07/06/2008

Adriano_servitec

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.


Responder

08/06/2008

Paullsoftware

[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!


Responder

08/06/2008

Adriano_servitec

[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.


Responder

09/06/2008

Eniorm

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


Responder

09/06/2008

Brunodsr

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.


Responder

09/06/2008

Eniorm

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


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar