Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Problemas no Exemplo do VFP em Rede
Message
General information
Forum:
Visual FoxPro
Category:
Databases,Tables, Views, Indexing and SQL syntax
Title:
Problemas no Exemplo do VFP em Rede
Miscellaneous
Thread ID:
00813668
Message ID:
00813668
Views:
31
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')
  
  *-- Lock until user presses Esc
  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
Next
Reply
Map
View

Click here to load this message in the networking platform