Fórum Tem alguma necessidade de usar Bookmark no loop? #359641
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
Curtir tópico
+ 0Posts
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?
Gostei + 0
07/06/2008
Adriano_servitec
Gostei + 0
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.
Gostei + 0
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.
Gostei + 0
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!
Gostei + 0
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.
Gostei + 0
09/06/2008
Eniorm
Gostei + 0
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.
Gostei + 0
09/06/2008
Eniorm
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)