FUNCTION _st_Gw_GeraId (tcCampo) LOCAL lnId,lcArq,lcTabela,lnRepro,llBuff LOCAL loSession,lnOldSession,lnIdSession m.lnOldSession = SET("Datasession") && salvando a DataSession Atual m.loSession = CREATEOBJECT("Session") && cria um objeto Session m.lnIdSession = loSession.DataSessionId && Pega a SessionId do objedto SET DATASESSION TO m.lnIdSession && Muda para a nova datasession para não sofrer com as Transações. m.lcTabela = ALIAS() 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 (m.lcArq) IN 0 SHARED 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) && criar uma rotina para possivel erro. ERROR [Registro travado por outro usuário, não permitindo a geração da Chave primária],[Informe a controplan] SET REPROCESS TO lnRepro RETURN -1 ENDIF m.lnId = &lcArq..nextval REPLACE &lcArq..nextval WITH &lcArq..nextval + 1 UNLOCK IN (lcArq) USE IN (lcArq) *** restaura o ambiente anterior *** SET REPROCESS TO m.lnRepro SET DATASESSION TO m.lnOldSession RELEASE loSession IF NOT EMPTY(m.lcTabela) SELECT (lcTabela) ENDIF RETURN lnId ENDFUNC