Estou tendo problemas usando o LetoDB(fork) nos módulos do Sistema. O que acontece é que não consigo abrir o módulo X se o Y estiver aberto(da erro de abertura de tabela, mesmo elas estando em modo compartilhado), mas se eu abrir o Y primeiro, eu consigo abrir o X. Sem o uso do LetoDb(fork) os módulos do sistema funcionam perfeitamente executando ao mesmo tempo.
Segue abaixo as funções usadas para fazer o controle das tabelas:
// ===============================================================
FUNCTION RdRec()
// ===============================================================
DO WHILE 1 = 1
IF REC_LOCK(5)
ARQLOCOK = 'T'
RETURN(.T.)
ELSE
ARQLOCOK = 'F'
OK = ' '
STORE VAL(SUBSTR(TIME(),7,2)) TO TIMEANT
IF TIMEANT >= 39
TIMEANT = TIMEANT - 40
ELSE
TIMEANT = TIMEANT + 20
ENDIF
DO WHILE 1 = 1
OPCAO:=MsgYesNo('Registro em USO. Tentar novamente ?')
DO CASE
CASE OPCAO==2
*.OR. VAL(SUBSTR(TIME(),7,2)) = TIMEANT
OK = 'N'
EXIT
CASE OPCAO==1
OK = 'S'
EXIT
CASE OPCAO # 0
ENDCASE
ENDDO
IF OK = 'S'
LOOP
ELSE
RETURN(.F.)
ENDIF
ENDIF
ENDDO
RETURN
// ===============================================================
FUNCTION RDADD()
// ===============================================================
// LOCK-ADD
DO WHILE 1 = 1
IF ADD_REC(5)
ARQLOCOK = 'T'
RETURN(.T.)
ELSE
ARQLOCOK = 'F'
OK = ' '
STORE VAL(SUBSTR(TIME(),7,2)) TO TIMEANT
IF TIMEANT >= 39
TIMEANT = TIMEANT - 40
ELSE
TIMEANT = TIMEANT + 20
ENDIF
DO WHILE 1 = 1
OPCAO:=MsgYesNo('Registro em USO. Tentar novamente ?')
DO CASE
CASE OPCAO==2
OK = 'N'
EXIT
CASE OPCAO==1
OK = 'S'
EXIT
CASE OPCAO # 0
ENDCASE
ENDDO
IF OK = 'S'
LOOP
ELSE
RETURN(.F.)
ENDIF
ENDIF
ENDDO
RETURN
// ===============================================================
FUNCTION RDUSE()
// ===============================================================
// LOCK-USE
DO WHILE 1 = 1
cor := setcolor()
//@ 24,01 SAY 'A b r i n d o ... '+ARQALIAS
IF NET_USE("&ARQ",.F.,5)
DO CASE
CASE ARQNIND = 0
*
CASE ARQNIND = 1
SET INDEX TO (ARQ1)
CASE ARQNIND = 2
SET INDEX TO (ARQ1),(ARQ2)
CASE ARQNIND = 3
SET INDEX TO (ARQ1),(ARQ2),(ARQ3)
CASE ARQNIND = 4
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4)
CASE ARQNIND = 5
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5)
CASE ARQNIND = 6
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5),(ARQ6)
CASE ARQNIND = 7
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5),(ARQ6),(ARQ7)
CASE ARQNIND = 8
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5),(ARQ6),(ARQ7),(ARQ8)
CASE ARQNIND = 9
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5),(ARQ6),(ARQ7),(ARQ8),(ARQ9)
OTHERWISE
MsgInfo('+>+>+>+>+>+ E R R O = ARQNIND ERRADO')
ENDCASE
ARQLOCOK = 'T'
GOTO TOP
RETURN
ELSE
ARQLOCOK = 'F'
OK = ' '
STORE VAL(SUBSTR(TIME(),7,2)) TO TIMEANT
IF TIMEANT >= 39
TIMEANT = TIMEANT - 40
ELSE
TIMEANT = TIMEANT + 20
ENDIF
DO WHILE 1 = 1
OPCAO:=MsgYesNo('Registro em USO. Tentar novamente ?')
DO CASE
CASE OPCAO==2
OK = 'N'
EXIT
CASE OPCAO==1
OK = 'S'
EXIT
CASE OPCAO # 0
ENDCASE
ENDDO
IF OK = 'S'
LOOP
ELSE
EXIT
ENDIF
ENDIF
ENDDO
RETURN
// ===============================================================
FUNCTION RDFIL()
// ===============================================================
/*
** Não foi necessário modificar nada nessa função.
**
*/
// LOCK-FIL
DO WHILE 1 = 1
IF FIL_LOCK(5)
ARQLOCOK = 'T'
EXIT
ELSE
ARQLOCOK = 'F'
OK = ' '
STORE VAL(SUBSTR(TIME(),7,2)) TO TIMEANT
IF TIMEANT >= 39
TIMEANT = TIMEANT - 40
ELSE
TIMEANT = TIMEANT + 20
ENDIF
DO WHILE 1 = 1
OPCAO:=MsgYesNo('Registro em USO. Tentar novamente ?')
DO CASE
CASE OPCAO==2 .OR. VAL(SUBSTR(TIME(),7,2)) = TIMEANT
OK = 'N'
EXIT
CASE OPCAO==1
OK = 'S'
EXIT
CASE OPCAO # 0
ENDCASE
ENDDO
IF OK = 'S'
LOOP
ELSE
EXIT
ENDIF
ENDIF
ENDDO
RETURN
// ===============================================================
FUNCTION RDEXC()
// ===============================================================
// LOCK-EXC
DO WHILE 1 = 1
IF .NOT. leto_File(TRIM(ARQ)+'.DBF') // file(cFile) -> leto_File(cFile)
MsgInfo('ARQUIVO ['+ARQ+'.DBF] NAO EXISTE !!')
INKEY(5)
ARQLOCOK='F'
RETURN
ENDIF
USE (ARQ) EXCLUSIVE ALIAS &ARQALIAS
XX=1
DO WHIL XX <= ARQNIND
XXX=SUBS(STR(XX,1),1,1)
INDICE = ARQ&XXX
tipo_ext = indexext()
IF .NOT. leto_File(TRIM(INDICE)+trim(tipo_ext))
MsgInfo('ARQUIVO ['+INDICE +tipo_ext + '] NAO EXISTE !!')
INKEY(5)
ARQLOCOK='F'
RETURN
ENDIF
XX=XX+1
EXIT
ENDDO
IF NET_USE("&ARQ",.T.,5)
DO CASE
CASE ARQNIND = 0
*
CASE ARQNIND = 1
SET INDEX TO (ARQ1)
CASE ARQNIND = 2
SET INDEX TO (ARQ1),(ARQ2)
CASE ARQNIND = 3
SET INDEX TO (ARQ1),(ARQ2),(ARQ3)
CASE ARQNIND = 4
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4)
CASE ARQNIND = 5
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5)
CASE ARQNIND = 6
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5),(ARQ6)
CASE ARQNIND = 7
SET INDEX TO (ARQ1),(ARQ2),(ARQ3),(ARQ4),(ARQ5),(ARQ6),(ARQ7)
OTHERWISE
MsgInfo('+>+>+>+>+>+ E R R O = ARQNIND ERRADO')
ENDCASE
ARQLOCOK = 'T'
GOTO TOP
EXIT
ELSE
ARQLOCOK = 'F'
OK = ' '
STORE VAL(SUBSTR(TIME(),7,2)) TO TIMEANT
IF TIMEANT >= 39
TIMEANT = TIMEANT - 40
ELSE
TIMEANT = TIMEANT + 20
ENDIF
DO WHILE 1 = 1
OPCAO:=MsgYesNo('Registro em USO. Tentar novamente ?')
DO CASE
CASE OPCAO==2
OK = 'N'
EXIT
CASE OPCAO==1
OK = 'S'
EXIT
ENDCASE
ENDDO
IF OK = 'S'
LOOP
ELSE
EXIT
ENDIF
ENDIF
ENDDO
RETURN
// ===============================================================
FUNCTION NET_USE()
// ===============================================================
PARAMETERS file, ex_use, wait
PRIVATE forever
forever = (wait = 0)
WHILE (forever .OR. wait > 0)
IF ex_use // Exclusive.
USE (file) EXCLUSIVE ALIAS &ARQALIAS
// ALERT("ALIA CRIADO -> " + ARQALIAS)
ELSE
USE (file) ALIAS &ARQALIAS // Shared.
// ALERT("ALIA CRIADO -> " + ARQALIAS)
ENDIF
IF ! NetErr() .AND. ! EMPTY(ALIAS())
return .t.
ELSE
alert("Erro ao abrir tabela.")
QUIT
ENDIF
INKEY(1)
wait = wait - 1
ENDDO
RETURN (.F.) // USE fails.
// ===============================================================
FUNCTION FIL_LOCK()
// ===============================================================
PARAMETERS wait
PRIVATE forever
IF FLOCK()
RETURN (.T.) && locked
ENDIF
forever = (wait = 0)
DO WHILE (forever .OR. wait > 0)
INKEY(.5) && wait 1/2 second
wait = wait - .5
IF FLOCK()
RETURN (.T.) && locked
ENDIF
ENDDO
RETURN (.F.) && not locked
// ===============================================================
FUNCTION REC_LOCK()
// ===============================================================
PARAMETERS wait
PRIVATE forever
IF RLOCK()
RETURN (.T.) && locked
ENDIF
forever = (wait = 0)
DO WHILE (forever .OR. wait > 0)
IF RLOCK()
RETURN (.T.) && locked
ENDIF
INKEY(.5) && wait 1/2 second
wait = wait - .5
ENDDO
RETURN (.F.) && not locked
// ===============================================================
FUNCTION ADD_REC()
// ===============================================================
PARAMETERS wait
PRIVATE forever,ord_ind
ord_ind = iif(indexord()=0,0,indexord())
set order to 0
APPEND BLANK
set order to (ord_ind)
IF .NOT. NETERR()
RETURN (.T.)
ENDIF
forever = (wait = 0)
DO WHILE (forever .OR. wait > 0)
APPEND BLANK
IF .NOT. NETERR()
RETURN .T.
ENDIF
INKEY(.5) && wait 1/2 second
wait = wait - .5
ENDDO
RETURN (.F.) && not locked
Atenciosamente,
Cisino Junior.