Página 1 de 1

Abertura de arquivos

Enviado: 05 Abr 2009 20:42
por Josmar dos Santos
Alguém poderia me dizer como faço para que dois ou mais usuários não acesse um arquivo ao mesmo tempo (clientes.dbf), pois estou tendo muitos problemas em relação a isso. Quando dois usuários ou mais acessam esses arquivos ao mesmo tempo, está travando o mesmo. Eu vou colocar a rotina aqui para os colegas olharem e se alguem tiver alguma dica ficaria muito feliz. A ideia e emitir uma mensagem quando o arquivo estiver sendo usado.
Não é necessário ser igual, talvez os colegas podem ter alguma ideia melhor. O programa roda em rede e é em NTX.

Código: Selecionar todos

SELE 1
IF !USEREDE( "ALUNOS", .F., 10 )
   BEEP()
   MENSAGEM( "O arquivo ALUNOS n„o est  dispon¡vel", 3 )
   RETURN
ELSE
   SET INDEX TO ALUNO001, ALUNO002, ALUNO003, ALUNO004
ENDIF
IF !REDE_CONTROLE()
   BEEP()
   MENSAGEM( "O arquivo OFIC.RED n„o est  dispon¡vel", 3 )
   RETURN
ENDIF
SELE ALUNOS  


FUNCTION USEREDE( ARQ, EXUSE, TEMPO )
PRIVATE SEMPRE
SEMPRE := ( TEMPO = 0 )
MENSAGEM( "Aguarde tentativa de acesso aos arquivos" )
WHILE ( SEMPRE .OR. TEMPO > 0 )
   IF EXUSE
      USE &ARQ EXCLUSIVE
      //
      // -> Uso exclusivo
   ELSE
      USE &ARQ 
      //
      // -> Uso compartilhado
   ENDIF
   IF !NETERR()
      RETURN .T.
   ENDIF
   IF INKEY( 1 ) = T_ESC
      EXIT
   ENDIF
   TEMPO--
ENDDO
RETURN .F.


FUNCTION REDE_CONTROLE
SELE 100
IF USEREDE( "OFIC.RED", .T., 2 )
   ZAP
   INDEX ON DADOS TO OFIC.RNX
   USE
ENDIF
IF !USEREDE( "OFIC.RED", .F., 10 )
   RETURN .F.
ELSE
   SET INDEX TO OFIC.RNX
ENDIF
RETURN .T.



Abertura de arquivos

Enviado: 06 Abr 2009 07:38
por Pablo César
Quando estamos utilizando um sistema em rede, se faz necessário compartilhar os arquivos. Não é uma boa prática a exclusividade de uso dos dbfs, a menos que seja extremamente necessário. Pelo código postado, o que eu noto você está tratando para que seja utilizado de forma compartilhada (o segundo parametro do seu USEREDE demostra que está com .F. para modo exclusivo. Só que não entendo a finalidade da função REDE_CONTROLE, poderia explicar a finalidade dela ?

Note que a chamada dessa função após abertura de USEREDE("ALUNOS"... você está chamando o REDE_CONTROLE para abrir 1º em modo exclusivo o OFIC.RED para ser zapeado e depois abre em modo compartilhado. Por quê isso ? O erro está aí... É preferível que cada estação crie seu próprio OFIC.RED no local, isto é em cada estação para que cada um não interfira no outro, não sei se é isso a sua intenção. Portanto não vejo necessidade de você limitar o acesso aos arquivos do seu sistema. Veja que isso irá se tornar muito desagradável para o usuário quando vários tiverem intenção de trabalhar com ele. Mas se for uma determinada rotina, por exemplo de manutenção de arquivos ou algo assim, você pode criar um arquivo quando estes estejam sendo usados e apagá-lo ninguém estiver usando. Isso irá mostrar que o arquivo está sendo usado por alguém quando você verificar a existência de aquele arquivo. Ou tentar fazer abrir um determinado dbf em modo exclusivo e se der erro através do NETERR() dar a mensagem que está sendo usado.

Re: Abertura de arquivos

Enviado: 07 Abr 2009 19:34
por Josmar dos Santos
Ola Pablo, orbrigado por responder o meu tópico. E o seguinte: Eu não sei fazer essa rotina, apesar de eu mexer ao bom tempo com Clipper, não sou profissional no ramo. Te confesso que ainda estou aprendendo conforme tenho tempo. Como vc ja deve ter notado, essa rotina é do Miro3. Eu peguei de um programa gerado por ele. Estou estudando o NG do Clipper, mas isso a gente não aprende do dia por outro. Gostaria muito se possível q vc postasse um exemplo para mim poder estudar. Gostaria de um exemplo bem prático e objetivo e que também me explicasse a diferença dessas três funçôes do Clipper.
FLOCK(), RLOCK() E NETERR(). Vi isso no NG, mas me pareceu muito confuso.
Sem mais obrigado
Josmar
:-´

Abertura de arquivos

Enviado: 08 Abr 2009 09:35
por Pablo César
Pablo César escreveu:Só que não entendo a finalidade da função REDE_CONTROLE, poderia explicar a finalidade dela ?..//.. Note que a chamada dessa função após abertura de USEREDE("ALUNOS"... você está chamando o REDE_CONTROLE para abrir 1º em modo exclusivo o OFIC.RED para ser zapeado e depois abre em modo compartilhado. Por quê isso ?
Josmar escreveu:Eu não sei fazer essa rotina, apesar de eu mexer ao bom tempo com Clipper, não sou profissional no ramo. Te confesso que ainda estou aprendendo conforme tenho tempo. Como vc ja deve ter notado, essa rotina é do Miro3. Eu peguei de um programa gerado por ele.
Ahh sim, pensei que você tinha esse código e quisesse fazer funcionar.
Gostaria de um exemplo bem prático e objetivo e que também me explicasse a diferença dessas três funçôes do Clipper. FLOCK(), RLOCK() E NETERR()
Exemplo tem aos montes, tem que nos dizer o que você não entende. Veja este exemplos, leia com calma (está em português) e se tiver dúvidas, poste sua mensagem que iremos te explicar:

http://suporte.lbr.com.br/cd/estudos/cl ... tupnet.prg
http://www.susviela.hpg.ig.com.br/hb/cl ... coeshz.htm

Olhe esta apostila de Clipper: http://pub.buzinello.com/xbase/clipper/ ... uncoes.zip

Re: Abertura de arquivos

Enviado: 09 Abr 2009 18:32
por Josmar dos Santos
Ok...Pablo, ja baixei e ja estou estudando...por enquanto, orbrigado
Josmar
:{

Re: Abertura de arquivos

Enviado: 11 Abr 2009 14:21
por sygecom
Olá Josmar,
O Negocio esta em abrir os DBF em SHARED, aquele exemplo que te mandei pelo MSN baseado no seu exemplo tem que funcionar, post os codigos que deu o erro depois que mudou para Shared. Lembor que você tinha comentado que dava erro no dbseek, eu a risco a dizer que talvez você esteja bloqueando o registro ou arquivo para poder usar o dbseek() e isso pode ser um dos problemas que tera que mudar no seu sistema.

Re: Abertura de arquivos

Enviado: 14 Abr 2009 14:49
por Josmar dos Santos
Leonardo, mas eu coloquei esse comando shared no local q vc mencionou, mas te pergunto, onde estaria esse erro ? pois tuudo q tenho em mão é isso q está aí.
Vc pediu para fazer essa alteração:

Código: Selecionar todos

FUNCTION USEREDE( ARQ, EXUSE, TEMPO )
PRIVATE SEMPRE
SEMPRE := ( TEMPO = 0 )
MENSAGEM( "Aguarde tentativa de acesso aos arquivos" )
WHILE ( SEMPRE .OR. TEMPO > 0 )
   IF EXUSE
      USE &ARQ EXCLUSIVE
      //
      // -> Uso exclusivo
   ELSE
      USE &ARQ SHARED NEW // Mudança feita e gerou o erro na abertura de aquivo
do dbseek .
      //
      // -> Uso compartilhado
   ENDIF
   IF !NETERR()
      RETURN .T.
   ENDIF
   IF INKEY( 1 ) = T_ESC
      EXIT
   ENDIF
   TEMPO--
ENDDO
RETURN .F.
 
Abertura de aquivos

Código: Selecionar todos

 SELE 1
IF !USEREDE( "ALUNOS", .F., 10 )
   BEEP()
   MENSAGEM( "O arquivo ALUNOS n„o est  dispon¡vel", 3 )
   RETURN
ELSE
   SET INDEX TO ALUNO001, ALUNO002, ALUNO003, ALUNO004
ENDIF
sem mais ...um abraço

Re: Abertura de arquivos

Enviado: 15 Abr 2009 12:28
por sygecom
Olá Josmar,
Você tinha comentado que depois que adicionou o SAHRED no comando USE , passou a dar erro no DBSEEK, gostaria de ver o codigo que esta usando o DBSEEK e o erro que esta dando para poder tentar melhor lhe ajudar nessa questão de compartilhamento.
As funções que esta usando eu já tinha visto.

Re: Abertura de arquivos

Enviado: 15 Abr 2009 20:25
por labaroazul
Usa as seguintes funções:

Código: Selecionar todos

*****************************************************************************
*                                                                           *
*                FUNCOES PARA MANIPULACAO DE REGISTROS EM REDE              *
*                                                                           *
*****************************************************************************

* VERIFICA SE O REGISTRO JA EXISTE
FUNCTION TEM(nAREA, nINDICE, cCHAVE)
SELECT(nAREA)
SET ORDER TO nINDICE
IF DBSEEK(cCHAVE) = .T.
    ALERT("REGISTRO JA CADASTRADO!",{"OK"},"W+/N")
    RETURN(.T.)
ELSE
    RETURN(.F.)
ENDIF

* ABRE BASES DE DADOS EM AMBIENTE DE REDE
FUNCTION ABRE(cARQUIVO, nTEMPO, cMODO)
DO WHILE nTEMPO > 0
    IF cMODO = "C"
        USE &cARQUIVO SHARED
    ELSE
        USE &cARQUIVO EXCLUSIVE
    ENDIF
    IF NETERR()
        nTEMPO = nTEMPO - 0.5
        INKEY(0.5)
    ELSE
        RETURN(.T.)
    ENDIF
ENDDO
RETURN(.F.)

* BLOQUEIA REGISTROS EM AMBIENTE DE REDE
FUNCTION BLOQUEIA(nTEMPO)
DO WHILE nTEMPO > 0
    IF RLOCK()
        RETURN(.T.)
    ENDIF
    nTEMPO = nTEMPO - 0.5
    INKEY(0.5)
ENDDO
RETURN(.F.)

* TESTA SE E POSSIVEL INCLUIR REGISTROS EM UM DBF EM REDE
FUNCTION INCLUI(nTEMPO)
DO WHILE nTEMPO > 0
    APPEND BLANK
    IF NETERR()
        nTEMPO = nTEMPO - 0.5
        INKEY(0.5)
    ELSE
        RETURN(.T.)
    ENDIF
ENDDO
RETURN(.F.)

* BLOQUEIA UMA BASE DE DADOS INTEIRA EM AMBIENTE REDE
FUNCTION MULTI_LOCK(cARQUIVO, nREG)
IF nREG = 0
    SEEK cARQUIVO
ELSE
    SEEK cARQUIVO + "00000"
ENDIF
IF .NOT. EOF()
    RETURN(.F.)
ENDIF
SEEK cARQUIVO + STRZERO(nREG,5,0)
IF .NOT. EOF()
    RETURN(.F.)
ENDIF
IF .NOT. INCLUI(5)
    RETURN(.F.)
ELSE
    REPLACE NOME_BLQ WITH cARQUIVO,;
            REG_BLQ WITH nREG
    COMMIT
    nREG = RECNO()
    SEEK cARQUIVO + STRZERO(nREG,5,0)
    IF nREG # RECNO()
        GOTO nREG
        DELETE
        UNLOCK
        RETURN(.F.)
    ENDIF
    UNLOCK
ENDIF
RETURN(.T.)

* DESBLOQUEIA UMA BASE DE DADOS INTEIRA EM AMBIENTE DE REDE
FUNCTION ML_UNLOCK(cARQUIVO, nREG)
SEEK cARQUIVO + STRZERO(nREG,5,0)
IF .NOT. BLOQUEIA(5)
    RETURN(.F.)
ELSE
    DELETE
    COMMIT
    UNLOCK
ENDIF
RETURN(.T.)
Daí, para abrir um arquivo de dados, você faz o seguinte:
SELECT 1
IF .NOT. ABRE("ESCOLAS.DBF", 5,"C")
ALERT("ARQUIVO ESCOLAS.DBF INDISPONIVEL NO MOMENTO! ",{"OK"},"W+/N")
SET COLOR TO
CLEAR SCREEN
SET CURSOR ON
RETURN
ENDIF
Note que, na função ABRE("ESCOLAS.DBF",5,"C"), "ESCOLAS.DBF" é o nome do arquivo, 5 é o tempo em segundos que o programa deve esperar para testar se pode abrir e "C" quer dizer "COMPARTILHADO". Substitua o "C" por "E" quando quiser abrir em modo Exclusivo!

Antes de incluir um novo registro na base de dados já aberta, use:
SELECT 1
IF .NOT. INCLUI(5)
ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"W+/N")
EXIT
ELSE
(...)

Onde INCLUI(5) chama a função inclui e pergunta o tempo que o sistema deve testar (5).

Antes de altear ou excluir um registro da base de dados já aberta, use:
IF .NOT. BLOQUEIA(5)
ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"W+/N")
ELSE

O funcionamento de Bloqueia(5) é identico ao de Inclui(5)!

Bem... E, para exemplificar o que eu disse em "partes", abaixo envio uma das telas básicas de um sistema de controle de escolas que eu fiz. Espero que o estudo desse código elucide alguma coisa...

Código: Selecionar todos

SELECT 1
IF .NOT. ABRE("ESCOLAS.DBF", 5,"C")
    ALERT("ARQUIVO ESCOLAS.DBF INDISPONIVEL NO MOMENTO! ",{"OK"},"W+/N")
    SET COLOR TO
    CLEAR SCREEN
    SET CURSOR ON
    RETURN
ENDIF
SET INDEX TO ESC0001.CDX, ESC0002.CDX
cRECARREGAR = "SIM"
nINDICE = 1
DO WHILE .T.
    SET CURSOR OFF
    SET COLOR TO W+/N
    CLEAR SCREEN
    @ 00,00 SAY "ESCOLAS"
    @ 24,00 SAY "<ESC>SAIR <F5>INCLUIR <F6>ALTERAR <F7>CONSULTAR <F8>EXCLUIR <F9>LOCALIZAR"
    SELECT 1
    SET ORDER TO nINDICE
    IF RECCOUNT() > 0
        GOTO TOP
    ENDIF
    @ 01,00 TO 23,79
    DBEDIT(02,01,22,77,,"EDESCOLAS")
    IF cRECARREGAR = "NAO"
        EXIT
    ELSEIF cRECARREGAR = "SIM"
        LOOP
    ENDIF
ENDDO
SET COLOR TO
CLEAR SCREEN
CLEAR TYPEAHEAD
CLOSE DATA
SET CURSOR OFF
RETURN

FUNCTION EDESCOLAS(nMODO, nPOSICAO)
LOCAL nRETORNO := 2
IF nMODO > 0 .AND. nMODO < 4
    TONE(1000)
ENDIF
RESTSCREEN(ROW(),01,ROW(),77,TRANSF(SAVESCREEN(ROW(),01,ROW(),77),;
REPLICATE("X"+CHR(112),2*77)))
INKEY(0)
KEYBOARD CHR(LASTKEY())
IF LASTKEY() = 27
    CLEAR TYPEAHEAD
    cRECARREGAR = "NAO"
    nRETORNO = 0
ELSEIF LASTKEY() = 13
    cRECARREGAR = "SIM"
    nRETORNO = 0
ELSEIF LASTKEY() = -4
    DO WHILE .T.
        CLEAR TYPEAHEAD
        cCIE = SPACE(10)
        cNOME = SPACE(50)
        cENDERECO = SPACE(50)
        cBAIRRO = SPACE(40)
        cCEP = SPACE(10)
        cCIDADE = SPACE(50)
        cUF = SPACE(02)
        cTEL = SPACE(50)
        cFAX = SPACE(50)
        cEMAIL = SPACE(50)
        cCRIACAO = SPACE(50)
        cINSTALACAO = SPACE(50)
        cENSINO01 = SPACE(01)
        cENSINO02 = SPACE(01)
        cENSINO03 = SPACE(01)
        cENSINO04 = SPACE(01)
        cENSINO05 = SPACE(01)
        cENSINO06 = SPACE(01)
        cENSINO07 = SPACE(01)
        cENSINO08 = SPACE(01)
        cENSINO09 = SPACE(01)
        cENSINO10 = SPACE(01)
        cENSINO11 = SPACE(01)
        cENSINO12 = SPACE(01)
        cENSINO13 = SPACE(01)
        cENSINO14 = SPACE(01)
        cENSINO15 = SPACE(01)
        cENSINO16 = SPACE(01)
        SET COLOR TO W+/N,W+/N
        CLEAR SCREEN
        @ 00,00 SAY "ESCOLAS - CADASTRO"
        @ 24,01 SAY "<ESC> SAIR"
        @ 01,00 CLEAR TO 23,79
        @ 01,00 TO 23,79
        SET CURSOR ON
        @ 01,00 SAY ""
        @ PULAR("G",1),01 SAY "CIE:" GET cCIE PICTURE "@!" VALID((LEN(ALLTRIM(cCIE)) > 0) .AND. (TEM(1,1,cCIE) = .F.)) SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "NOME:" GET cNOME PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "ENDERECO:"  GET cENDERECO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "BAIRRO:" GET cBAIRRO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),50 SAY "CEP:" GET cCEP PICTURE "99.999-999" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "CIDADE:" GET cCIDADE PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),60 SAY "UF:" GET cUF PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "TEL:" GET cTEL PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "FAX:" GET cFAX PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "E-MAIL:" GET cEMAIL PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "CRIACAO:" GET cCRIACAO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "INSTALACAO:" GET cINSTALACAO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),00 SAY ""
        @ PULAR("G",1),01 TO PULAR("G",1),78
        @ PULAR("G",-1),03 SAY "TIPOS DE ENSINO OFERECIDOS PELO ESTABELECIMENTO"
        @ PULAR("G",1),01 SAY "01 ENSINO FUNDAMENTAL DE 8 ANOS....." GET cENSINO01 PICTURE "@!" VALID(cENSINO01$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "09 EDUCACAO ESPECIAL - DM..........." GET cENSINO09 PICTURE "@!" VALID(cENSINO09$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "02 ENSINO MEDIO....................." GET cENSINO02 PICTURE "@!" VALID(cENSINO02$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "10 EDUCACAO ESPECIAL - DV..........." GET cENSINO10 PICTURE "@!" VALID(cENSINO10$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "03 EJA CICLO I (ENSINO FUNDAMENTAL)." GET cENSINO03 PICTURE "@!" VALID(cENSINO03$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "11 ................................." GET cENSINO11 PICTURE "@!" VALID(cENSINO11$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "04 EJA CICLO II (ENSINO FUNDAMENTAL)" GET cENSINO04 PICTURE "@!" VALID(cENSINO04$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "12 ................................." GET cENSINO12 PICTURE "@!" VALID(cENSINO12$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "05 EJA ENSINO MEDIO................." GET cENSINO05 PICTURE "@!" VALID(cENSINO05$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "13 CURSO NORMAL....................." GET cENSINO13 PICTURE "@!" VALID(cENSINO13$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "06 EDUCACAO INFANTIL................" GET cENSINO06 PICTURE "@!" VALID(cENSINO06$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "14 ENSINO FUNDAMENTAL DE 9 ANOS....." GET cENSINO14 PICTURE "@!" VALID(cENSINO14$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "07 EDUCACAO ESPECIAL - DA..........." GET cENSINO07 PICTURE "@!" VALID(cENSINO07$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "15 CEL - CENTRO DE ENSINO DE LINGUAS" GET cENSINO15 PICTURE "@!" VALID(cENSINO15$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",1),01 SAY "08 EDUCACAO ESPECIAL - DF..........." GET cENSINO08 PICTURE "@!" VALID(cENSINO08$" X") SEND COLORSPEC := "W+/N,N/W"
        @ PULAR("G",0),40 SAY "16 EDUCACAO ESPECIAL (DMU).........." GET cENSINO16 PICTURE "@!" VALID(cENSINO16$" X") SEND COLORSPEC := "W+/N,N/W"
        READ
        IF LASTKEY() = 27
            EXIT
        ENDIF
        nSALVAR = ALERT("SALVAR AS INFORMACOES?",{"SIM","NAO"},"W+/N")
        IF (nSALVAR = 0) .OR. (nSALVAR = 2)
            EXIT
        ELSEIF nSALVAR = 1
            SELECT 1
            IF .NOT. INCLUI(5)
                ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"W+/N")
                EXIT
            ELSE
                REPLACE CIE WITH cCIE,;
                        NOME WITH cNOME,;
                        ENDERECO WITH cENDERECO,;
                        BAIRRO WITH cBAIRRO,;
                        CEP WITH cCEP,;
                        CIDADE WITH cCIDADE,;
                        UF WITH cUF,;
                        TEL WITH cTEL,;
                        FAX WITH cFAX,;
                        EMAIL WITH cEMAIL,;
                        CRIACAO WITH cCRIACAO,;
                        INSTALACAO WITH cINSTALACAO,;
                        ENSINO01 WITH cENSINO01,;
                        ENSINO02 WITH cENSINO02,;
                        ENSINO03 WITH cENSINO03,;
                        ENSINO04 WITH cENSINO04,;
                        ENSINO05 WITH cENSINO05,;
                        ENSINO06 WITH cENSINO06,;
                        ENSINO07 WITH cENSINO07,;
                        ENSINO08 WITH cENSINO08,;
                        ENSINO09 WITH cENSINO09,;
                        ENSINO10 WITH cENSINO10,;
                        ENSINO11 WITH cENSINO11,;
                        ENSINO12 WITH cENSINO12,;
                        ENSINO13 WITH cENSINO13,;
                        ENSINO14 WITH cENSINO14,;
                        ENSINO15 WITH cENSINO15,;
                        ENSINO16 WITH cENSINO16
                DBUNLOCK()
                DBCOMMIT()
            ENDIF
        ENDIF
        EXIT
    ENDDO
    cRECARREGAR = "SIM"
    nRETORNO = 0
ELSEIF LASTKEY() = -5
    CLEAR TYPEAHEAD
    IF .NOT. BLOQUEIA(5)
        ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"W+/N")
    ELSE
        DO WHILE .T.
            CLEAR TYPEAHEAD
            SET COLOR TO W+/N,W+/N
            CLEAR SCREEN
            @ 00,00 SAY "ESCOLAS - ALTERACAO"
            @ 24,01 SAY "<ESC> SAIR"
            @ 01,00 TO 23,79
            @ 01,00 SAY ""
            SELECT 1
            SET CURSOR ON
            @ PULAR("G",1),01 SAY "CIE:" + CIE
            @ PULAR("G",1),01 SAY "NOME:" GET NOME PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "ENDERECO:"  GET ENDERECO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "BAIRRO:" GET BAIRRO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),50 SAY "CEP:" GET CEP PICTURE "99.999-999" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "CIDADE:" GET CIDADE PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),60 SAY "UF:" GET UF PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "TEL:" GET TEL PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "FAX:" GET FAX PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "E-MAIL:" GET EMAIL PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "CRIACAO:" GET CRIACAO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "INSTALACAO:" GET INSTALACAO PICTURE "@!" SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY ""
            @ PULAR("G",1),01 TO PULAR("G",1),78
            @ PULAR("G",-1),03 SAY "TIPOS DE ENSINO OFERECIDOS PELO ESTABELECIMENTO"
            @ PULAR("G",1),01 SAY "01 ENSINO FUNDAMENTAL DE 8 ANOS....." GET ENSINO01 PICTURE "@!" VALID(ENSINO01$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "09 EDUCACAO ESPECIAL - DM..........." GET ENSINO09 PICTURE "@!" VALID(ENSINO09$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "02 ENSINO MEDIO....................." GET ENSINO02 PICTURE "@!" VALID(ENSINO02$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "10 EDUCACAO ESPECIAL - DV..........." GET ENSINO10 PICTURE "@!" VALID(ENSINO10$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "03 EJA CICLO I (ENSINO FUNDAMENTAL)." GET ENSINO03 PICTURE "@!" VALID(ENSINO03$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "11 ................................." GET ENSINO11 PICTURE "@!" VALID(ENSINO11$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "04 EJA CICLO II (ENSINO FUNDAMENTAL)" GET ENSINO04 PICTURE "@!" VALID(ENSINO04$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "12 ................................." GET ENSINO12 PICTURE "@!" VALID(ENSINO12$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "05 EJA ENSINO MEDIO................." GET ENSINO05 PICTURE "@!" VALID(ENSINO05$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "13 CURSO NORMAL....................." GET ENSINO13 PICTURE "@!" VALID(ENSINO13$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "06 EDUCACAO INFANTIL................" GET ENSINO06 PICTURE "@!" VALID(ENSINO06$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "14 ENSINO FUNDAMENTAL DE 9 ANOS....." GET ENSINO14 PICTURE "@!" VALID(ENSINO14$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "07 EDUCACAO ESPECIAL - DA..........." GET ENSINO07 PICTURE "@!" VALID(ENSINO07$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "15 CEL - CENTRO DE ENSINO DE LINGUAS" GET ENSINO15 PICTURE "@!" VALID(ENSINO15$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",1),01 SAY "08 EDUCACAO ESPECIAL - DF..........." GET ENSINO08 PICTURE "@!" VALID(ENSINO08$" X") SEND COLORSPEC := "W+/N,N/W"
            @ PULAR("G",0),40 SAY "16 EDUCACAO ESPECIAL (DMU).........." GET ENSINO16 PICTURE "@!" VALID(ENSINO16$" X") SEND COLORSPEC := "W+/N,N/W"
            READ
            IF LASTKEY() = 27
                EXIT
            ENDIF
            nSALVAR = ALERT("SALVAR AS INFORMACOES?",{"SIM","NAO"},"W+/N")
            IF (nSALVAR = 0) .OR. (nSALVAR = 2)
                EXIT
            ELSEIF nSALVAR = 1
                DBUNLOCK()
                DBCOMMIT()
            ENDIF
            EXIT
        ENDDO
    ENDIF
    cRECARREGAR = "SIM"
    nRETORNO = 0
ELSEIF LASTKEY() = -6
    CLEAR TYPEAHEAD
    DO WHILE .T.
        SET COLOR TO W+/N,W+/N
        CLEAR SCREEN
        @ 00,00 SAY "ESCOLAS - CONSULTA"
        @ 24,01 SAY "<ESC>SAIR"
        @ 01,00 TO 23,79
        @ 01,00 SAY ""
        SELECT 1
        @ PULAR("S",1),01 SAY "CIE:" + CIE
        @ PULAR("S",1),01 SAY "NOME:" + NOME
        @ PULAR("S",1),01 SAY "ENDERECO:" + ENDERECO
        @ PULAR("S",1),01 SAY "BAIRRO:" + BAIRRO
        @ PULAR("S",0),50 SAY "CEP:" + CEP
        @ PULAR("S",1),01 SAY "CIDADE:" + CIDADE
        @ PULAR("S",0),60 SAY "UF:" + UF
        @ PULAR("S",1),01 SAY "TEL:" + TEL
        @ PULAR("S",1),01 SAY "FAX:" + FAX
        @ PULAR("S",1),01 SAY "E-MAIL:" + EMAIL
        @ PULAR("S",1),01 SAY "CRIACAO:" + CRIACAO
        @ PULAR("S",1),01 SAY "INSTALACAO:" + INSTALACAO
        @ PULAR("S",1),01 SAY ""
        @ PULAR("S",1),01 TO PULAR("G",1),78
        @ PULAR("S",-1),03 SAY "TIPOS DE ENSINO OFERECIDOS PELO ESTABELECIMENTO"
        @ PULAR("S",1),01 SAY "01 ENSINO FUNDAMENTAL DE 8 ANOS....." + ENSINO01
        @ PULAR("S",0),40 SAY "09 EDUCACAO ESPECIAL - DM..........." + ENSINO09
        @ PULAR("S",1),01 SAY "02 ENSINO MEDIO....................." + ENSINO02
        @ PULAR("S",0),40 SAY "10 EDUCACAO ESPECIAL - DV..........." + ENSINO10
        @ PULAR("S",1),01 SAY "03 EJA CICLO I (ENSINO FUNDAMENTAL)." + ENSINO03
        @ PULAR("S",0),40 SAY "11 ................................." + ENSINO11
        @ PULAR("S",1),01 SAY "04 EJA CICLO II (ENSINO FUNDAMENTAL)" + ENSINO04
        @ PULAR("S",0),40 SAY "12 ................................." + ENSINO12
        @ PULAR("S",1),01 SAY "05 EJA ENSINO MEDIO................." + ENSINO05
        @ PULAR("S",0),40 SAY "13 CURSO NORMAL....................." + ENSINO13
        @ PULAR("S",1),01 SAY "06 EDUCACAO INFANTIL................" + ENSINO06
        @ PULAR("S",0),40 SAY "14 ENSINO FUNDAMENTAL DE 9 ANOS....." + ENSINO14
        @ PULAR("S",1),01 SAY "07 EDUCACAO ESPECIAL - DA..........." + ENSINO07
        @ PULAR("S",0),40 SAY "15 CEL - CENTRO DE ENSINO DE LINGUAS" + ENSINO15
        @ PULAR("S",1),01 SAY "08 EDUCACAO ESPECIAL - DF..........." + ENSINO08
        @ PULAR("S",0),40 SAY "16 EDUCACAO ESPECIAL (DMU).........." + ENSINO16
        INKEY(3)
        IF LASTKEY() = 27
            EXIT
        ENDIF
    ENDDO
    cRECARREGAR = "SIM"
    nRETORNO = 0
ELSEIF LASTKEY() = -7
    CLEAR TYPEAHEAD
    cCIE = CIE
    nEXCLUIR = ALERT(ALLTRIM(CIE) + " - EXCLUIR ESTE REGISTRO?",{"SIM","NAO"},"W+/N")
    IF (nEXCLUIR = 0) .OR. (nEXCLUIR = 2)
        //NADA FAZ
    ELSEIF nEXCLUIR = 1
        SELECT 1
        IF .NOT. BLOQUEIA(5)
            ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"W+/N")
        ELSE
            DELETE
            DBUNLOCK()
            DBCOMMIT()
        ENDIF
    ENDIF
    cRECARREGAR = "SIM"
    nRETORNO = 0
ELSEIF LASTKEY() = -8
   CLEAR TYPEAHEAD
   tLOCTEL = SAVESCREEN(00,00,24,79)
   tLOCCOR = SETCOLOR()
   DO WHILE .T.
        SET CURSOR ON
        cPROCURARPOR = "1"
        cLOCALIZAR = SPACE(50)
        SET COLOR TO W+/N,W+/N
        @ 20,00 CLEAR TO 23,79
        @ 20,00 TO 23,79
        @ 21,02 SAY "1-CIE 2-NOME"
        @ 22,02 SAY "PROCURAR POR: "
        @ 22,16 GET cPROCURARPOR PICTURE "@!" VALID(cPROCURARPOR$"12") SEND COLORSPEC := "W+/N,N/W" 
        @ 22,18 GET cLOCALIZAR PICTURE "@!" SEND COLORSPEC := "W+/N,N/W" 
        READ
        IF LASTKEY() = 27
            cRECARREGAR = "SIM"
            nRETORNO = 0
            EXIT
        ENDIF
        IF LEN(TRIM(cLOCALIZAR)) = 0
            cRECARREGAR = "SIM"
            nRETORNO = 0
            EXIT
        ENDIF
        SELECT 1
        nINDICE = VAL(cPROCURARPOR)
        SET ORDER TO nINDICE
        IF DBSEEK(ALLTRIM(cLOCALIZAR),.T.)
            cRECARREGAR = "SIM"
            nRETORNO = 2
            EXIT
        ELSE
            ALERT("NENHUM REGISTRO ENCONTRADO!",{"OK"},"W+/N")
            cRECARREGAR = "SIM"
            nRETORNO = 0
            LOOP
        ENDIF
   ENDDO
   nINDICE = VAL(cPROCURARPOR)
   SET ORDER TO nINDICE
   SET CURSOR OFF
   SET COLOR TO tLOCCOR
   CLEAR SCREEN
   RESTSCREEN(00,00,24,79,tLOCTEL)
ELSEIF LASTKEY() = 19
   KEYBOARD CHR(26)
ELSEIF LASTKEY() = 4
   KEYBOARD CHR(2)
ENDIF
RETURN(nRETORNO)
E, só para esclarecer de onde tirei estas, funções: elas são do livro "CLIPPER EM REDE"! Só não me lembro o nome dos autores, em o nome da editora ou o ano de publicação... :%

Re: Abertura de arquivos

Enviado: 17 Abr 2009 15:11
por Josmar dos Santos
Ola caro colega Labaroazul, obrigado também pela sua colaboração....prometo que vou testa-lo tambem em meu sistema
Josmar
:)Pos

Re: Abertura de arquivos

Enviado: 12 Mai 2009 23:20
por billy1943
O problema não está na abertura de arquivos em modo exclusivo ou compartilhado, e sim no que pode acontecer quando dois ou mais operadores abrem um arquivo e fazem suas manutenções no mesmo;
Para isso eu coloquei um "semáforo" no arquivo, na forma de um campo numérico, com 6 posições, chamado por exemplo de NVEZES, no arquivo CLIENTES, de alias CLIE;

Toda vez que abro esse arquivo para alterações, uso os comandos:

CLIE->NVEZES ++
M->CONTAGEM := CLIE->NVEZES

Guardo o conteúdo do registro acessado em variáveis de memória e faço as edições nmormalmente.

Quando vou fazer a regravação do registro com as variáveis alteradas faço o teste:

IF M->CONTAGEM <> CLIE->NVEZES
MENSAGEM("REGISTRO ALTERADO POR OUTRO USUÁRIO. SUAS ALTERAÇÕES SERÃO PERDIDAS.")
LOOP
ENDIF

REPLACE ....

Abertura de arquivos

Enviado: 13 Mai 2009 08:34
por Pablo César
Bem vindo ao fórum Billy !
IF M->CONTAGEM <> CLIE->NVEZES
MENSAGEM("REGISTRO ALTERADO POR OUTRO USUÁRIO. SUAS ALTERAÇÕES SERÃO PERDIDAS.")
LOOP
ENDIF
Um tanto radical... na minha opinião a forma de abertura entre EXCLUSIVO e SHARED faz muita diferença num ambiente de rede. Talvez no seu exemplo, você poderia mostrar em tela o conteúdo do registro alterado pelo outro usuário, mostrando o nome inclusive. Mas na minha opinião deve se obedecer o critério de que o ultimo a alterar é o que fica valendo. Dessa forma você estaria tirando a possibilidade do ultimo alterar o registro. Como disse, seria interessante que mostrasse o nome do usuário que alterou o registro no momento que outro acesso logo após. Assim, qualquer diferença possa ser esclarecida entre as partes. Mas é fundamental fazer o tratamento de bloqueio de registro na hora de atualizar o BD e para isso o certo é estar em modo compartilhado. Agora se o sistema for mono usuário, daí até posso aceitar que seja em modo EXCLUSIVO ou até no momento que tenha que ser feito alguma manutenção esporádica do arquivo.

Re: Abertura de arquivos

Enviado: 18 Jun 2009 08:47
por Josmar dos Santos
Respondendo esse topico com muita demora, a sugestão do colega Labaroazul deu certo ! Não tive mais problemas
Obrigado a todos atenção !