Tem alguma necessidade de usar Bookmark no loop?
Pessoal tenho uma duvida, fiz assim o codigo, mais não sei qual é a real necessidade deste ponteiro
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.
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
Curtidas 0
Respostas
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?
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
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
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.
é 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
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
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
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
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
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.
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
07/06/2008
opa! realmente esclareceu minha dúvida, realmente é melhor usar o Bookmark
GOSTEI 0