Página 1 de 1

Abertura de arquivo em rede

Enviado: 10 Mar 2009 10:24
por Netavin
Bom dia amigos !
Estou tentando adaptar um função de abertura de arquivo em rede, de um exemplo que está no link
http://www.geocities.com/Area51/Lair/51 ... #exemplo13.
A função é a "NetUse".
Porém ao compilar com hbmake, ocorre a seguinte mensagem: "syntax error at ´NSECONDS´ "
A tempos venho tentando alterar meu programa para abertura em rede, mas não estou tendo sucesso. Consigo abrir em outro terminal desde que
o "DBF" não esteja em uso em outro computador. Estou usando atualmente esta codificação para abrir em rede:
USE DBF ALIAS cDBF SHARED NEW EXCLUSIVE
IF !NETERR()
IF !FILE("INDICE.NTX")
INDEX ON "TAL" TO INDICE
ENDIF
ELSE
NETMSG() // Informo que o Arquivo está em uso no momento.
CLOSE DATA
RETURN .F.
ENDIF
SET INDEX TO INDICE
DBGOTOP()
...
Se alguem puder me ajudar ...

Muito obrigado !!

[]´s
Netavin

Em tempo: Moderador, desculpe-me ! Não consigo identar o código.

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 10:47
por sygecom
Olá Netavin,
Primeiro você não prescisa de uma função pronto para abrir seus DBF em rede, tudo que você prescisa é mudar seu codigo fonte unsado conforme exemplo abaixo:

Código: Selecionar todos

USE DBF ALIAS cDBF SHARED NEW
IF !FILE("INDICE.NTX")
    INDEX ON "TAL" TO INDICE
ELSE
    SET INDEX TO INDICE
ENDIF
Sempre que houver EXCLUSIVE no junto com o comando USE seu DBF sera aberto como exclusivo, não deixando outras estações abrir o mesmo DBF.
Agora, se você já deseja implantar uma função de abertura de DBF que é o ideal por questão de facilidade, você pode tentar a que estou usando abaixo:
*IF Use_Arq("AGENDA",,.T.,.F.,.F.)=.F. // COMPARTILHADO
* Return
*ENDIF

*IF Use_Arq("AGENDA",,.T.,.T.,.F.)=.F. // SOMENTE LEITURA
* Return
*ENDIF

*IF Use_Arq("AGENDA",,.F.,.F.,.T.)=.F. // TEMPORARIO
* Return
*ENDIF

*IF Use_Arq("AGENDA",,.F.,.F.,.F.)=.F. // EXCLUSIVO
* Return
*ENDIF

Código: Selecionar todos

FUNCTION Use_Arq(cArquivo,cAlias,iShared,iLeitura,iTemp)
//--> cArquivo : Nome do Arquivo
//--> cAlias   : Nome do Apelido
//--> iShared  : .f. Exclusivo ou .t. Compartilhado
//--> iLeitura : .t. só Leitura ou .f. Leitura e Gravação
//--> iTemp    : .t. usa uma tabela temporaria ou .f. abre uma tabela normal
local lReturn  := .F.
Local cDriver  := "DBFCDX"
DEFAULT  iShared  TO  .F.
DEFAULT  iLeitura TO  .F.
DEFAULT  cAlias   TO cArquivo

do while .t.
   HW_Atualiza_Dialogo("Abrindo a Tabela: " + cArquivo)
   IF SELECT(cAlias)=0
      TRY
         DBSELECTAREA(0) // SELECIONA A PROXIMA AREA LIVRE
         DbUseArea(.t.,cDriver,cArquivo,cAlias,iShared,iLeitura,,)
      catch e
         vResp := MsgRetryCancel( "Erro ao Tentar Abrir a Tabela: " + cArquivo + ", Favor revisar a conexão com o Servidor !","Aviso do Sistema")
         IF vRESP=4
            loop
         ELSE
            Return .f.
         endif
      END
      IF NetErr()
         vRESP := MsgRetryCancel( "Sistema em Uso em Modo Exclusivo por Outra Estação no Momento !","Aviso do Sistema"  )
         IF vRESP=4
            loop
         ELSE
            Return .f.
         endif
      else
         IF File(cArquivo+".cdx")
            DBSETINDEX(cArquivo)
         endif
         SELECT(cAlias)
         Return .t.
      endif
   ELSE
      SELECT(cAlias)
      USE
      LOOP
   ENDIF
enddo
Return lReturn
Agora se você tiver usando CDX com SET AUTOPEN ON é só comentar a linha onde tem o DBSETINDEX()

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 11:06
por Netavin
"Leo" , obrigado pela atenção !
...estou usando NTX. Vou fazer a alteração neste quesito e realizar os testes; e já que dei inicio a essa questão, irei até o final para solucionar de vez essa minha dificuldade em trabalhar em rede... com a ajuda dos amigos, claro.

Forte abraço !

Netavin

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 11:07
por sygecom
Beleza, qualquer coisa prende o grito....

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 12:15
por Netavin
...amigo Leonardo.

ocorre o seguinte ao compilar: Syntax error at "iLeitura"
Syntax error at "cAlias"

...
... Netavin.

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 12:18
por sygecom
Você esta usando exatamenete como postei ou mudou algo ? se mudou post como ficou a função de abertura e como esta chamando ela em sua app.

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 12:35
por Netavin
...estou chamando assim:
/* >>>>>>> InclusÆo <<<<<<< */

Function Ag_incl()

Local Qtd, SavOrd
Use_Arq(cArquivo,cAlias,iShared,iLeitura,iTemp)
IF !FILE("ORDE.NTX")
INDEX ON ORDE TO ORDE
ENDIF
IF !FILE("FONO.NTX")
INDEX ON NOME TO FONO
ENDIF
SET INDEX TO ORDE, FONO
DBSETORDER(1)
DBGOTOP()

... to indo pegar um rango e volto daqui nadinha...

[]´s

Netavin

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 12:57
por sygecom
Olá Netavin,
Olhe os exemplos de uso que postei acima da função:
ex:
Vamos supor que temos um DBF que se chama AGENDA.DBF e dois indice um com nome de AGENDA1.NTX e outro com nome de AGENDA2.NTX, então a abertura ficaria assim:

Ex: PARA ABRIR O DBF EM MODO COMPARTILHADO

Código: Selecionar todos

IF Use_Arq("AGENDA",,.T.,.F.)=.F. // PARA ABRIR O DBF EM MODO COMPARTILHADO
 Return
ENDIF
IF !FILE("AGENDA1.NTX")
   INDEX ON NOME TO AGENDA1
ENDIF
IF !FILE("AGENDA2.NTX")
   INDEX ON COD TO AGENDA2
ENDIF
SET INDEX TO AGENDA1,AGENDA2
Ex: PARA ABRIR O DBF EM MODO DE SOMENTE LEITURA

Código: Selecionar todos

IF Use_Arq("AGENDA",,.T.,.T.)=.F. // PARA ABRIR O DBF EM MODO DE SOMENTE LEITURA
 Return
ENDIF
IF !FILE("AGENDA1.NTX")
   INDEX ON NOME TO AGENDA1
ENDIF
IF !FILE("AGENDA2.NTX")
   INDEX ON COD TO AGENDA2
ENDIF
SET INDEX TO AGENDA1,AGENDA2
Ex: PARA ABRIR O DBF EM MODO EXCLUSIVO(Somente um usuario de cada vez)

Código: Selecionar todos

IF Use_Arq("AGENDA",,.F.,.F.)=.F. // PARA ABRIR O DBF EM MODO EXCLUSIVO(Somente um usuario de cada vez)
 Return
ENDIF
IF !FILE("AGENDA1.NTX")
   INDEX ON NOME TO AGENDA1
ENDIF
IF !FILE("AGENDA2.NTX")
   INDEX ON COD TO AGENDA2
ENDIF
SET INDEX TO AGENDA1,AGENDA2
E como você usa NTX, mudei a função para melhor lhe servir conforme abaixo:

Código: Selecionar todos

    FUNCTION Use_Arq(cArquivo,cAlias,iShared,iLeitura)
    //--> cArquivo : Nome do Arquivo
    //--> cAlias   : Nome do Apelido
    //--> iShared  : .f. Exclusivo ou .t. Compartilhado
    //--> iLeitura : .t. só Leitura ou .f. Leitura e Gravação
    local lReturn  := .F.
    Local cDriver  := "DBFNTX"
    DEFAULT  iShared  TO  .F.
    DEFAULT  iLeitura TO  .F.
    DEFAULT  cAlias   TO cArquivo

    do while .t.
       IF SELECT(cAlias)=0
          TRY
             DBSELECTAREA(0) // SELECIONA A PROXIMA AREA LIVRE
             DbUseArea(.t.,cDriver,cArquivo,cAlias,iShared,iLeitura,,)
          catch e
             vResp := Alert( "Erro ao Tentar Abrir a Tabela: " + cArquivo + ", Favor revisar, Deseja Repetir ?",{ "Sim", "Não" })
             IF vRESP=0
                loop
             ELSE
                Return .f.
             endif
          END
          IF NetErr()
             vResp := Alert( "Erro ao Tentar Abrir a Tabela: " + cArquivo + ", Favor revisar, Deseja Repetir ?",{ "Sim", "Não" })
             IF vRESP=0
                loop
             ELSE
                Return .f.
             endif
          else
             SELECT(cAlias)
             Return .t.
          endif
       ELSE
          SELECT(cAlias)
          USE
          LOOP
       ENDIF
    enddo
    Return lReturn

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 13:17
por Netavin
... valeu Syge !
Faltou mais atenção minha. :%
Vou voltar à prancheta e retorno, dessa vez, com boas novas.

[]´s
Netavin

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 10 Mar 2009 13:45
por Netavin
... Sygecom. Se matou passarinho quando criança ... agora vai pagar esses pecados.

Amigo, veja como estou fazendo, e ainda continua aqueles problemas (ocorre o seguinte ao compilar: Syntax error at "iLeitura"
Syntax error at "cAlias" / Syntax error at "iShared".

Código: Selecionar todos

/* >>>>>>>  InclusÆo  <<<<<<< */
Function Ag_incl()
Local Qtd, SavOrd
IF Use_Arq("CAFONE",,.F.,.F.)=.F. // ABRE O DBF EM MODO EXCLUSIVO(Somente 1 usuario de cada vez)
    RETURN
ENDIF
IF !FILE("ORDE.NTX")
    INDEX ON ORDE TO ORDE
ENDIF
IF !FILE("FONO.NTX")
    INDEX ON NOME TO FONO
ENDIF
SET INDEX TO ORDE, FONO
DBSETORDER(1)
DBGOTOP()

...
//******************************************************//
    FUNCTION Use_Arq(CAFONE,AGENDA,.F.)
//******************************************************//
    local lReturn  := .F.
    Local cDriver  := "DBFNTX"
    DEFAULT  iShared  TO  .F.
    DEFAULT  iLeitura TO  .F.
    DEFAULT  cAlias   TO cArquivo

    do while .t.
       IF SELECT(cAlias)=0
          TRY
             DBSELECTAREA(0) // SELECIONA A PROXIMA AREA LIVRE
             DbUseArea(.t.,cDriver,cArquivo,cAlias,iShared,iLeitura,,)
          catch e
             vResp := Alert( "Erro ao Tentar Abrir a Tabela: " + cArquivo + ", Favor revisar,Deseja Repetir ?",{ "Sim", "NÆo" })
             IF vRESP=0
                loop
             ELSE
                Return .f.
             endif
          END
          IF NetErr()
             vResp := Alert( "Erro ao Tentar Abrir a Tabela: " + cArquivo + ", Favor revisar,Deseja Repetir ?",{ "Sim", "NÆo" })
             IF vRESP=0
                loop
             ELSE
                Return .f.
             endif
          else
             SELECT(cAlias)
             Return .t.
          endif
       ELSE
          SELECT(cAlias)
          USE
          LOOP
       ENDIF
    enddo
    Return lReturn
...
[]´s

Netavin....

-----------------------------------
Nota da Moderação(Sygecom):Topico editado para colocar a TAG [ CODE ]
Veja como adicionar a TAG [ CODE ]
faq.php?mode=bbcode#f21

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 11 Mar 2009 21:52
por Netavin
Boa noite amigos !
Valeu Sygecom !!! ... com um pouco mais de atenção e estudo, consegui decifrar suas explicações. Tudo certo agora.
Obrigado e me desculpe !! :xau

[]´s
Neetavin

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 11 Mar 2009 22:25
por sygecom
Puxa, eu não tinha visto seu post anterior, me passou despercebido, mas menos mal que ja resolveu tudo por ai !!!
Um detalhe que esqueci me mencionar foi que teria que ter o #INCLUDE "COMMON.CH" no inicio do .PRG por causa dos DEFAULT, mas agora já é tarde pra avisar.
Qualquer coisa prende o grito...

Re: ABERTURA DE ARQUIVO EM REDE

Enviado: 12 Mar 2009 09:44
por jamazevedo
Você escreveu a seguinte função:

Código: Selecionar todos

//******************************************************//
    FUNCTION Use_Arq(CAFONE,AGENDA,.F.)
//******************************************************//
    local lReturn  := .F.
    Local cDriver  := "DBFNTX"
    DEFAULT  iShared  TO  .F.
    DEFAULT  iLeitura TO  .F.
    DEFAULT  cAlias   TO cArquivo

    do while .t.
    ...
Acredito que deveria ficar assim:

Código: Selecionar todos

//******************************************************//
    FUNCTION Use_Arq(CAFONE,AGENDA , iSHARED , iLEITURA , cALIAS )
//******************************************************//
    local lReturn  := .F.
    Local cDriver  := "DBFNTX"
    DEFAULT  iShared  TO  .F.
    DEFAULT  iLeitura TO  .F.
    DEFAULT  cAlias   TO cArquivo

    do while .t.
    ...
Porque as variáveis iShared, iLeitura e cAlias, se não analisei de forma errada, devem vir da função que as chamou.