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.