Dúvida sobre uso de DBFs em rede

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Dúvida sobre uso de DBFs em rede

Mensagem por Mario Mesquita »

Bom dia, amigos!

Ainda uso DBFs nos meus programas e ando procurando uma forma de dispensar o uso daquele caminho usando as letras de drive remoto ao configurar a rede no Windows (Z:, F:, etc.).

Mas olhando a documentação que tenho do Harbour e da HMG, parece que não tem como usar o caminho dos arquivos diretamente ("\\computador\drive\pasta").

É isso mesmo, pessoal? Não tem como chamar o arquivo sem usar aquelas letrinhas, que engessam o sistema e causam alguma confusão pois pode-se atribuir letras diferentes em cada máquina da rede.

Incrível se for assim, pois pode-se acessar as impressoras de rede, por exemplo usando "\\computador\impressora\"...

Não tem como fazer do modo que desejo?

Desde já, agradeço qualquer dica.

Abraço,
Mario.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Dúvida sobre uso de DBFs em rede

Mensagem por Pablo César »

Oi Mário, você tentou fazer isto:

cDbf:="\\computador\drive\pasta\clientes.dbf"
Use (cDbf)

Porque tenho impressãoq ue deve funcionar. Em Clipper, você fazia assim ?

Com NETIO_CONNECT sei que dá pra usar IP.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Cavalo Marinho
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 01 Ago 2009 10:01
Localização: Aracaju/Se

Dúvida sobre uso de DBFs em rede

Mensagem por Cavalo Marinho »

Boa noite Mario
Use o letodb, assim você tem o servidor de banco de dados utilizando a mesma estrutura dos seus dbfs e cdx e não atem este problema de letra como você relatou, sem contar que tem até controle de transações.
vale a pena dar uma olhada.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Dúvida sobre uso de DBFs em rede

Mensagem por Mario Mesquita »

Boa tarde, amigos!

Pablo, nunca usei a abertura desse modo, funciona mesmo? Se for assim, posso capturar o caminho de rede e abrir as tabelas sem a famigerada letrinha do drive de rede.

Vou testar, vale a tentativa.

O uso com IP, tb nunca tentei. Mas acho que é um processo mais complicado, nunca se sabe como os clientes gerenciam suas intranets...


Cavalo Marinho, o LetoDb não roda só em Xharbour? Eu uso HMG com Harbour.

Se roda, funciona direitinho? Vc usa? Se for bom de usar, seria uma boa alternativa enquanto não migro pra SQL, uma coisa que quero fazer no futuro. Apesar de que não vejo muita vantagem de SQL em bases de pequeno porte.

Obrigado pelas dicas, volto pra dizer como resolvi a questão.

Abraço a vocês,
Mario,
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Dúvida sobre uso de DBFs em rede

Mensagem por MSDN »

Amigo, um pequeno exemplo do que vc solicitou :

Set Default To '\\10.75.120.15\sistema\tabelas\'
- Fica como padrão para todo o sistema

Ou

public path_dbf_1 := '\\10.75.120.15\sistema\tabelas\'
public path_dbf_2 := '\\10.75.130.50\migracao\dados\'
- Atribuir o caminho das tabelas em variáveis públicas

Abraços
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Dúvida sobre uso de DBFs em rede

Mensagem por Mario Mesquita »

Bom dia, amigos.

Informo que segui a dica do Pablo e num teste de migração funcionou o uso do "\\computador\pasta". Porém tentando usar em outra operação, notei que tentando configurar o próprio computador que faz o papel do servidor não aceita diretamente essa forma, colocando o "C:\pasta\" mesmo pegando o caminho de rede, isso usando a função GETFOLDER(). Mas acho que dando o comando direto deve funcionar. Ainda vou fazer mais testes.

E usando o I.P. como sugere o MSDN? Roda certinho mesmo? É uma ideia também... E fazendo assim pelo SET DEFAULT, nem se precisa trocar os USEs dando-lhes o caminho, não é? Ele assume a pasta da maquina como o local das tabelas, certo?

E o LetoDb? Alguém usa? Funciona bem, tem vantagens?

Desde já agradeço e desejo boa semana santa a todos.

Mario.
yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

Dúvida sobre uso de DBFs em rede

Mensagem por yugi386 »

O LetoDb ajuda muito sim. A única ressalva é que ele não trabalha com multi-Thread.

Exemplo de uso:

Código: Selecionar todos

/*
Para compilar use:  hbmk2 t -lleto -lrddleto
Obs: a tabela [banco.dbf] deve estar no diretório do servidor letodb ou no path definido no arquivo letodb.ini
*/

func main()

	Local cServer := "//127.0.0.1"  // endereço do servidor(pode ser um NO-IP ou algum outro DNS)
	Local cPorta  := ":2812/"  // essa porta deve esta liberado no modem do servidor
	private cPath := cServer + cPorta	 

	//dbcriar()
	REQUEST LETO
	RDDSETDEFAULT( "LETO" )
	leto_disconnect()

	IF ( leto_Connect( cServer+cPorta ) ) == -1
	     alert("Não foi possivel conectar ao Servidor")
	     quit
    endif

	cls
	
	use (cPath+"banco.dbf") exclusive	// acessando a tabela via leto em modo exclusivo
		do while flock() == .f.
			inkey(0.01)
		enddo
		zap
		unlock
	close
	
	gravar()	// gravando na tabela com LETODB

	leto_disconnect()

return nil

// =========================================================
function dbcriar()

	aDbf := {}
	AADD(aDbf, { "c1", "C", 20, 0 })
	AADD(aDbf, { "c2", "C", 20, 0 })
	AADD(aDbf, { "c3", "C", 20, 0 })
	DBCREATE("banco", aDbf) 

return nil

// =========================================================
function gravar()
	use (cPath+"banco.dbf") shared new	// acessando a tabela via letodb em modo shared

	for ct:= 1 to 10000
		do while flock() = .f.
			inkey(0.01)
		enddo
			append blank
			replace c1 with "a" + str(ct,10)
			replace c2 with "b" + str(ct,10)
			replace c3 with "c" + str(ct,10)
		unlock

		if ct % 1000 == 0
			@10,10 say lastrec()
		endif
	next

	cls
	go top
	if flock()
		browse(01,01,24,79)
		unlock
	endif
	close

return nil
abs,

Yugi
Avatar do usuário
Cavalo Marinho
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 01 Ago 2009 10:01
Localização: Aracaju/Se

Dúvida sobre uso de DBFs em rede

Mensagem por Cavalo Marinho »

Boa tarde
Sim, funciona e direitinho, ainda mais fiz o seguinte, num arquivo de configuração instanciei um variável chamada cConecta que tem o ip:porta (192.168.1.100:2812) se esta variável estiver preenchida eu faço o request para leto, se tiver vazia eu faço para CDX, pois tenho cliente que usa servidor linux e não conseguir ainda compilar o letodb para rodar em linux, mas eu chego lá, as vantagens são muitas: roda no servidor ou seja mesmo que uma estação saia da rede não corrompe os índices, tem controle de transação com commit e roolbak, agora tem macetes, por exemplo: você tem que liberar no firewall do servidor a porta, se não as estações não acessam o banco, aprendi isso no grito, com a configuração da variável cConecta eu posso rodar tanto com letodb como com rdd cdx normal, isso é bom para testar, já que com cdx tenho muito mais experiencia.
qualquer duvida e só falar, se eu souber ajudarei.
suporte@cavalomarinhoinformatica.com.br
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Dúvida sobre uso de DBFs em rede

Mensagem por Mario Mesquita »

Bom dia, amigos.

Obrigado pelas dicas sobre o LetoDb. Sei que tem um tópico só pra ele em Banco de Dados. Vou dar uma nova olhada lá.

Mas parece que não é muito complicado pra instalar e administrar. Meu uso deve ser quase todo em ambiente intranet. Ele pode usar um servidor remoto via IP não é? Legal isso, pode ser útil no futuro.

E para suporte remoto, é tranquilo? Hoje em dia, isso é fundamental para atender clientes distantes da sua base.

No tópico do LetoDb tem a orientação como preparar os sistemas para usá-lo ou tem alguma documentação para orientar o programador?

Abraço,
Mario.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Dúvida sobre uso de DBFs em rede

Mensagem por Mario Mesquita »

Boa tarde, amigos.

Upei o tópico pois estou instalando o programa em um servidor dedicado e agora as dicas dos colegas estão me valendo para configurar o acesso.

Criada a pasta, compartilhada, tudo instalado. Criado atalho, não funciona. ERROR 2, ou seja, não localizou as tabelas.

Aí pelo Windows Explorer, clico no aplicativo: Abre e roda, abrindo as tabelas.

Cravei o caminho no SET PATH: Abrindo as tabelas, fiz uma migração de dados, e indexei, funcionou. Uma consulta com Grid, ok... Mais testes virão.

Mas ficou um problema: Como deixar o caminho de rede em algo que possa pegar ao partir com o programa? Tenho uma tabela de parâmetros, mas se tentar abrir direto vai dar o ERROR 2. Pensei em uma variável armazenada em um .DAT, mas creio que de novo ele não vai localizar.

Então, pensei em pegar uma variável de ambiente, em um .INI, .SYS ou .NT para buscar o atalho do servidor, pois assim mantenho o programa flexível, senão eu teria que compilar toda hora o programa de acordo com o cliente e seu mapeamento.

Alguém já fez isso? tem como pegar uma variavél tipo o "SET CLIPPER=F235" no AUTOEXEC do CA-Clipper?

Desde já agradeço a ajuda.

Saudações,
Mario.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Dúvida sobre uso de DBFs em rede

Mensagem por asimoes »

As variáveis você pode por em um arquivo ini no servidor e ler o ini, por exemplo o nome do computador servidor e porta de acesso.

Código: Selecionar todos


#include "rddleto.ch"

cIpAddServer  :=Obter_Ip_Maquina("pc-servidor")
cPortaServer  :=2812
nVezes:=1

cServidorDB:='//'+cIpAddServer+':'+cPortaServer+hb_PS()

DO WHILE Leto_Connect( cServidorDB ) == -1
     nRes := leto_Connect_Err()
     IF nVezes > 3
        Alert("Não foi possível conectar no servidor: "+cServidorDB)
       quit
     ENDIF
     nRes := leto_Connect_Err()
     IF nRes == LETO_ERR_LOGIN
        Alert("Falha no login")
        quit
     ELSEIF nRes == LETO_ERR_RECV
        Alert("Erro no servidor")
        quit
     ELSEIF nRes == LETO_ERR_SEND
        Alert("Erro de transmisão")
        quit
     ELSE
        Alert("Sem conexão com o servidor")
        quit
     ENDIF
     nVezes++
    Inkey(1)
  ENDDO

FUNCTION Obter_Ip_Maquina(cMaquina)
LOCAL aHosts := {}, cIp := "127.0.0.1", I
   hb_Default(@cMaquina, "")
   Try
      hb_InetInit()
      aHosts := hb_InetGetHosts( cMaquina )
      IF aHosts == NIL
         aHosts := hb_InetGetAlias( cMaquina )
      ENDIF
      IF Empty(aHosts)
         aHosts := hb_InetGetAlias( cMaquina )
      ENDIF
      FOR I:=1 TO Len(aHosts)
         cIp := aHosts[I]
      NEXT
      aHostIp := aHosts
      HB_InetCleanup()
   End
RETURN cIp
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Dúvida sobre uso de DBFs em rede

Mensagem por Mario Mesquita »

Bom dia, pessoal!

Asimoes, eu não uso o LetoDb ainda. Mas o ini estaria definido dentro do .CH? Eu uso os .DBFs do modo tradicional.

Aliás, ontem alguns problemas:

Em alguns momentos, o programa não quis abrir as tabelas acusando um DOS ERROR 2. Ora, mas os arquivos existem, claro. Só se ele não consegue acessar o servidor e ele procura as tabelas na maquina local.

Eu usei o SET PATH assim: SET PATH TO \\servidor\pasta. Seria recomendável usar o SET DEFAULT tb?

Para abrir as tabelas, uso assim:

Código: Selecionar todos

DBUSEAREA( .T., "DBFCDX", "BANCOS",,  .T. )
SET INDEX TO BANCOS                   
Li que tem um SET EXCLUSIVE on, que por default as tabelas abrem em modo exclusivo e não shared. Isso pode afetar algo, mesmo abrido tudo como acima?

Meu receio é ter alguma incompatibilidade na rede, pois o servidor usa Windows 7 64 bits e as máquinas da rede são antigas com XP. Pra piorar, colocaram uma senha de acesso ao servidor que vc tem que dar ao clicar no ícone do sistema na primeira vez no dia. Será que esse Id/Senha não pode ser ativada pelo sistema ou em um .BAT, ou .INI?

Pergunta besta: Como velo clipperiro, eu coloco o .EXE na maquina servidora e nas outras atalho para esse .EXE. Seria melhor colocar uma cópia do .EXE em cada máquina usuária e aí sim, um arquivo tipo .INI que configura o acesso ao servidor?

Mais de vinte anos depois, nunca imaginei que voltaria a me preocupar com uso de tabelas em rede. Mas sim, estou preocupado pois tenho que substituir um programa em clipper por um que rode em Win 64, pois mais adiante vão trocar todas as máquinas e nem adiantar pedir Win 32 pois eles alegam que compram as maquinas prontas e isso faz com que a máquina perca a garantia...

Desde já agradeço qualquer ajuda.

Saudações,
Mario
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Dúvida sobre uso de DBFs em rede

Mensagem por asimoes »

Uma correção do meu post:

cServidorDB:='//'+cIpAddServer+':'+cPortaServer+hb_PS()

O correto é:

cServidorDB:='//'+cIpAddServer+':'+cPortaServer+"/"
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Dúvida sobre uso de DBFs em rede

Mensagem por Paulao »

Respondendo a pergunta do Mario Mesquita sobre o autoexec é fácil

Coloque no autoexec esta linha

Código: Selecionar todos

Set oCaminhoDbfs = Z:\pasta do sitema\pasta do arquivo\

no seu sistema coloque

public setcaminho := alltrim(getenv("oCaminhoDbfs"))

Você também pode colocar no autoexec uma variável para identificar o terminal

Set Maq = MAQ01

No sistema capture esta variável

Public Terminal := alltrim(getenv("Maq"))
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Dúvida sobre uso de DBFs em rede

Mensagem por asimoes »

O ideal é construir um acesso aos dbfs de forma segura, que não permita um usuário espertinho acessar a pasta de dados.

Tem 2 opções:

hbnetio
e
letodb

Ambos tem controle de acesso aos dbf´s com senha
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder