Tem alguma necessidade de usar Bookmark no loop?
07/06/2008
0
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
Posts
07/06/2008
Emerson Nascimento
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?
07/06/2008
Adriano_servitec
07/06/2008
Emerson Nascimento
é 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.
07/06/2008
Adriano_servitec
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.
08/06/2008
Paullsoftware
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!
08/06/2008
Adriano_servitec
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.
09/06/2008
Eniorm
09/06/2008
Brunodsr
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.
09/06/2008
Eniorm
Clique aqui para fazer login e interagir na Comunidade :)