A seguir tenho um código de uma store procedure, que fica dentro do DBC, gerando chaves primárias para minhas tabelas. Funciona muito bem quando dentro do VFP, com mono usuário.
Tive observando que quando esta em rede, ele tem um problema : Quando o campo pesquisado não esta na tabela g2_gera_id, ele da um append blank ( que troquei para insert into ), nesta tabela. Quando faz isto é gerado um erro no segundo usuário dizendo que o arquivo esta sendo utilizado por outro usuário.
Já acompanhei este códgio no DEBUG,e na janela do DataSession ele fecha o arquivo. Mas mesmo assim ele diz para o outro usuário que o arquivo esta sendo usado.
Utilizando componentes COM, ele gera o mesmo erro.
Esta Procedure esta no Default Value do campo que quero cherar um ID Automático : _st_gw_geraId( "id_produto" )
Sera que existe algum erro neste código que eu não estou vendo ?
A tabela GW_GERA_ID Tem a seguinte estrutura :
pk C 20 ( Chave Primária )
nextval I ( Default Value = 1 )
Tabela C 20
FUNCTION _st_Gw_GeraId (tcCampo)
LOCAL lnId,lcArq,lcTabela,lnRepro,llBuff
lcTabela = ALIAS()
lcArq = "gw_gera_id"
lnId = -1
tcCampo = UPPER(tcCampo)
lnRepro = SET("Reprocess")
SET REPROCESS TO 5 SECONDS
IF !USED(lcArq)
USE (lcArq) IN 0 SHARED
ENDIF
SELECT (lcArq)
GO TOP IN (lcArq)
LOCATE FOR ALLTRIM(&lcArq..pk) == ALLTRIM(tcCampo)
IF NOT FOUND()
INSERT INTO (lcArq) (pk,tabela) VALUES (tcCampo,lcTabela)
LOCATE FOR ALLTRIM(&lcArq..pk) == ALLTRIM(tcCampo)
ENDIF
IF !RLOCK(lcArq)
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
lnId = &lcArq..nextval
REPLACE &lcArq..nextval WITH &lcArq..nextval + 1
UNLOCK IN (lcArq)
USE IN (lcArq)
SELECT (lcTabela)
SET REPROCESS TO lnRepro
RETURN lnId
ENDFUNC
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