FWTemporaryTable e RecLock

Olá, Estamos com um fonte onde implementamos o uso do fwtemporarytable e observamos que o reclock( 'tabela', .T. ) criava somente uma única linha independente do loop realizado, ou seja, ficávamos sempre com uma tabela de um único registro. Somente conseguimos sanar o problema voltando para o dbappend. Algo vivenciou isso?

Obs.: Exemplo anexo.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Bom dia Marcelo, o RecLock encapsula um DBAppend, como essa rotina foi criada, consegue colocar o fonte ou um exemplo?

Daniel, coloquei parte do código no anexo, grato!

Marcelo, parece estar correto, se você fizer um DBGoTop antes do DBEval, continua gerando esse problema? Depurando, ele entra na função IncTabTmp mais de uma vez?

Daniel, a função inctabtmp é chamada tantas vezes quantas linhas existirem na query de montagem. Mas valeu a dica, somente postei para ver se alguém já tinha visto essa situação. Grato pelo apoio.

Tenho várias rotinas que fazem isso, e o reclock funciona corretamente, gerando novas linhas. Posta seu fonte

Luiz, anexei parte do fonte como exemplo. Grato!

Estava olhando seu código e por que você não segue um modelo tipo assim:


RecLock(Tabela_Temporaria, .T.)
Tabela_Temporaria.CAMPO := Valor que voce quiser
msUnlock()

Ai voce roda isso em um While enquanto o alias não chegar ao fim, usando a EOF(), assim: !(ALIAS)->(EOF())

Patrick, ele chama a função dentro de um DBEval, esse cara acaba sendo o responsável pelo while

Nunca usei, mas bom, se não tiver melhoria de performance, eu faria assim.

Observamos que a situação ocorre dentro de um dbeval, se utilizarmos um do while esta não ocorre. A alternativa encontrada foi: usar o dbeval mas com dbappend e dbcommit ou usar a reclock dentro de um do while.

Marcelo, o DBEval trabalha com bloco de código, que salva toda a sua stack de execução, com isso, ele pode estar interferindo em algum controle de variável/semáforo. Se a sua tabela origem for um valor presente no banco de dados, recomendo não utilizar nenhum dos dois métodos citado, utiliza na verdade um insert into, com uma performance muito melhor, pois o próprio banco de dados que resolve isso.

Acredito que está faltando o MsUnlock(): https://tdn.totvs.com/pages/viewpage.action?pageId=24347005

Outra modo que você pode fazer preencher essa tabela é utilizar SQLToTrb(): https://aprendendoadvpl.files.wordpress.com/2008/09/advpl-advpl-avanc3a7ado-rev01.pdf