Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Erro em alguma máquinas.
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
COM/DCOM et OLE Automation
Titre:
Erro em alguma máquinas.
Divers
Thread ID:
00808799
Message ID:
00808799
Vues:
68
Eu construi uma pequena componente, compilado como dll, para acesso a dados Funciona em todas as máquinas aqui da nossa empresa, mas no cliente em que fui instalar acontece algo de doido :

Ele tem tres equipamentos :

No Primeiro funciona.
Nos outros dois, na primeira vez que instancio a dll, funciona perfeitamente. Mas se o usuário fizer novas atualizações dos dados, ele emite um erro, ao executar a Stored Procedure no DBC abaixo :
******************************************
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 )
		
ENDPROC 
Mas 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.

Alguém pode me ajudar com isto ?
Paulo Cesar Carneiro
desenvolvimento@controplan.com.br


"My God, what have we done?"
-- Capt. Robert Lewis, co-pilot of the Enola Gay, recalling the moment the atomic bomb exploded over Hiroshima

At 8:15 a.m. on August 6 1945
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform