****************************************** FUNCTION _st_Gw_GeraId (tcCampo) LOCAL lnId,lcArq,lcTabela,lnRepro,llBuff LOCAL loSession,lnOldSession,lnIdSession,lcOldError m.lcOldError = ON("ERROR") m.lnOldSession = SET("Datasession") m.loSession = CREATEOBJECT("Session") m.lnIdSession = loSession.DataSessionId m.lcTabela = ALIAS() ON ERROR DO _geraId_error WITH ERROR() SET DATASESSION TO m.lnIdSession && para fugir a possiveis transações que estejam pendentes. m.lcArq = "gw_gera_id" m.lnId = -1 m.tcCampo = UPPER(m.tcCampo) m.lnRepro = SET("Reprocess") SET REPROCESS TO 5 SECONDS && espera no máximo por 5 segundos para travar um registro. IF !USED(m.lcArq) USE (lcArq) IN 0 SHARED && a linha do erro gerada pela dll é esta. ENDIF SELECT (lcArq) GO TOP IN (lcArq) LOCATE FOR ALLTRIM(&lcArq..pk) == ALLTRIM(m.tcCampo) IF NOT FOUND() INSERT INTO (lcArq) (pk,tabela) VALUES (m.tcCampo,m.lcTabela) LOCATE FOR ALLTRIM(&lcArq..pk) == ALLTRIM(m.tcCampo) ENDIF IF !RLOCK(lcArq) ERROR [Registro travado por outro usuário, não permitindo a geração da Chave primária],[Informe ao suporte] SET REPROCESS TO lnRepro RETURN -1 ENDIF m.lnId = &lcArq..nextval REPLACE &lcArq..nextval WITH &lcArq..nextval + 1 UNLOCK IN (lcArq) USE IN (lcArq) SET REPROCESS TO m.lnRepro SET DATASESSION TO m.lnOldSession RELEASE loSession IF NOT EMPTY(m.lcTabela) SELECT (lcTabela) ENDIF ON ERROR &lcOldError RETURN lnId ENDFUNC PROCEDURE _geraId_error LPARAMETERS lnErro LOCAL lcMensagem m.lcMensagem = CHR(13)+[Stored Procedure _st_Gw_GeraId ] + CHR(13) +; [Erro : ] + PADL( ERROR() ,4,[0]) + CHR(13) +; [Linha : ] + PADL( LINENO(),4,[0]) + CHR(13) +; MESSAGE()+ CHR(13)+; DTOC(DATE()) + " " + TIME() + CHR(13) +; ALIAS()+ CHR(13) STRTOFILE( lcMensagem,[geraid.log],1 ) ENDPROCMas se ao faze a atualização o usuario volta para o Windows e Entra no aplicativo o Erro não acontece. Outra coisa fiz vários formulários que utilizam esta SP, de forma sequencial e ela não apresenta erro nos mesmos equipamentos.