Abertura de arquivo em rede

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Abertura de arquivo em rede

Mensagem 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.
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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()
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem por sygecom »

Beleza, qualquer coisa prende o grito....
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem por Netavin »

...amigo Leonardo.

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

...
... Netavin.
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem por Netavin »

... valeu Syge !
Faltou mais atenção minha. :%
Vou voltar à prancheta e retorno, dessa vez, com boas novas.

[]´s
Netavin
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Re: ABERTURA DE ARQUIVO EM REDE

Mensagem 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.
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
Responder