Estou estudando bastante a forma de se gerar Ids para as tabelas de forma automática, no VFP. Tomemos por base este codigo abaixo que vem como exemplo no VFP. Em uma máquina, trabalhando sozinha, funciona mil maravilhas, mas se a tabela estiver buferizada e dentro de uma transação, em um ambiente de rede, o segundo e o terceiro usuário tem problemas, pois o unlock só é executado para os outros usuários da rede, quando é emitido um End Trasaction ou um RollBack. Fiz vários testes e colocando no DEBUG descobri isto.
Mas veja só percebi o erro em um processo de lançamento de itens em uma nota fiscal, com cerca de 30 itens, e outro usuário fazendo a mesma coisa, ficava parada esperando o primeiro usuário terminar todo o processo para iniciar o seu. Agora imagine que este processamento alimente várias outras tabelas com um sem número de atualizações, e que o end transaction / rollback demore a ser emitido. Isto deixa o outro usuário impaciente.
Em alguns casos, o unlock só foi emitido após o fechamento do arquivo no primeiro usuáro.
Alguém já se deparou com este problema ?
Eu contornei isto criando uma outra seção de dados Nesta Stored Procedure, e retornando a seção de dados anterior antes de sair da SP. Mas teve um efeito colateral : Alguns controles com combos / grids, ligados a cursores se perdem e emitem a seguinte Mensagem : "Cannot Access table", como se o cursor não estivesse aberto, mas olho no Debug e ele esta la. Vc ignora a mensagem e tudo funciona normalmente.
Detalhe : Nestes forms eu utilizo uma Private DataSession.
FUNCTION NewID(tcAlias)
LOCAL lcAlias, ;
lnID, ;
lcOldReprocess, ;
lnOldArea
lnOldArea = SELECT()
IF PARAMETERS() < 1
lcAlias = UPPER(ALIAS())
ELSE
lcAlias = UPPER(tcAlias)
ENDIF
lcOldReprocess = SET('REPROCESS')
SET REPROCESS TO AUTOMATIC
IF !USED("IDS")
USE newid!ids IN 0
ENDIF
SELECT ids
IF SEEK(lcAlias, "Ids", "table")
IF RLOCK()
lnID = ids.nextid
REPLACE ids.nextid WITH ids.nextid + 1
UNLOCK
ENDIF
ENDIF
SELECT (lnOldArea)
SET REPROCESS TO lcOldReprocess
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