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