Página 12 de 16

LetoDb e Harbour, como usar.

Enviado: 15 Mai 2018 13:44
por Itamar M. Lins Jr.
Ola!
Use as novas funções do harbour para trabalhar em rede.
hb_vf*

Código: Selecionar todos

hbmk2 -find hb_vf*
Núcleo Harbour (instalado):
   hb_socketRecvFrom()
   hb_vfAttrGet()
   hb_vfAttrSet()
   hb_vfClose()
   hb_vfCommit()
   hb_vfConfig()
   hb_vfCopyFile()
   hb_vfDirectory()
   hb_vfDirExists()
   hb_vfDirMake()
   hb_vfDirRemove()
   hb_vfDirSpace()
   hb_vfEof()
   hb_vfErase()
   hb_vfExists()
   hb_vfFlush()
   hb_vfHandle()
   hb_vfLink()
   hb_vfLinkRead()
   hb_vfLinkSym()
   hb_vfLoad()
   hb_vfLock()
   hb_vfLockTest()
   hb_vfMoveFile()
   hb_vfOpen()
   hb_vfRead()
   hb_vfReadAt()
   hb_vfReadLen()
   hb_vfRename()
   hb_vfSeek()
   hb_vfSize()
   hb_vfTempFile()
   hb_vfTimeGet()
   hb_vfTimeSet()
   hb_vfTrunc()
   hb_vfUnlock()
   hb_vfWrite()
   hb_vfWriteAt()
   sx_VFGet()
Saudações,
Itamar M. Lins Jr.

LetoDb e Harbour, como usar.

Enviado: 15 Mai 2018 14:18
por Itamar M. Lins Jr.
Ola!
você tá querendo gerar um arquivo no servidor letodb ? é isso ?
Eu entendi que ele está querendo imprimir no servidor ou em algum lugar via direcionamento.

Código: Selecionar todos

cArq := "\\192..."
set printer to cArq
Isso não é erro do letodbf e ele também não faz isso, é preciso usar as funções hb_VF* do Harbour com as devidas permissões etc...
Melhor usar o servidor de impressão do windows mesmo na minha opnião.
Porque tem o leto_fcreate, etc... e não tem o leto_set_printer_to...? não tem necessidade nenhuma... basta gerar em qualquer maquina e jogar no gerenciador de impressão via printfileraw() por exemplo.

Bemmmm, foi isso que entendi até agora.(salvo engano)

Saudações,
Itamar M. Lins Jr.

LetoDb e Harbour, como usar.

Enviado: 15 Mai 2018 14:39
por vcatafesta
Olá,

Pessoal, o erro somente ocorre no ambiente Leto.
Olá, já verificou as permissões na pasta ?
sim, todas as permissões OK, inclusive as tabelas e índices são criados normalmente no
servidor.
Deixa eu entender isso, você tá querendo gerar um arquivo no servidor letodb ? é isso ?
Sim, ao criar arquivo no servidor Leto o erro é gerado.
Não precisa do Letodbf para pegar o erro.
Claro que não! o erro somente ocorre ao tentar criar o arquivo no servidor. Ao gerar arquivo localmente o erro não ocorre.
Isso não é erro do letodbf e ele também não faz isso, é preciso usar as funções hb_VF* do Harbour com as devidas permissões etc...
Ok. Vou tentar com as funcões hb_vf*

Mas não deixa de ser um erro!

LetoDb e Harbour, como usar.

Enviado: 15 Mai 2018 15:00
por asimoes
Olá,

Você pode criar uma função de usuário pra ser usado pelo letodb pra fazer o que você quer, dá uma olhada em letoudf.prg

LetoDb e Harbour, como usar.

Enviado: 22 Out 2018 14:48
por porter
Olá pessoal,
Estou tentando executar o exemplo desse tópico para entender como funciona o letodb, mas está dando erro de compilação, dentro da pasta c:\letodb,
tenho os seguintes arquivos: Changelog, letocdp.ch, letocl.dll, letodb.exe, letodb.ini, letodb.log, libleto.a, librddleto.a, rddleto.ch.
executei o comando: net start letodb_service
O serviço LetoDB Service foi iniciado com êxito.

cannot find -lrddleto
collect2.exe error: ld returned 1 exit status
Erro de compilação: hbmk2[TESTE]: Erro: Executando linkeditor .1

letodb.ini na pasta c:\letodb

Código: Selecionar todos

Port = 2812              
Logfile = "letodb.log"   
DEFAULT_DRIVER = CDX     
DATAPATH = c:\dados\
ENABLEFILEFUNC = 1
CRYPT_TRAFFIC = 0
PASS_FOR_LOGIN = 0
PASS_FOR_MANAGE = 0
PASS_FOR_DATA = 0
Share_Tables  = 0
Cache_Records = 50
[DATABASE]
DataPath = c:\dados\
Driver = CDX
teste.hbp na pasta c:\dados

Código: Selecionar todos

-otesteleto  
-compr=yes
-quiet
-lxhb
-lhbwin
-lhbct
-prgflag=-b                
-strip
-compr
rddleto.hbc
-iC:\letodb
TESTLETO.PRG
compilar.bat

Código: Selecionar todos

@echo off
CLS
set path=C:\hb32\bin;C:\hb32    
CLS
HBMK2 TESTE.HBP
rddleto.hbc na pasta c:\dados

Código: Selecionar todos

{win}incpaths=c:\letodb\include;
{win}libpaths=c:\letodb\lib;
{win}libs=rddleto
hbmk.hbm na pasta c:\dados

Código: Selecionar todos

rddleto.hbc
testleto.prg na pasta c:\dados

Código: Selecionar todos

//  #require "sddodbc" //opcional se for usar MySql com LetoDb
//	#require "sddfb"  //opcional se for usar Firebird com Letodb
	#include "rddleto.ch"
	 
  	REQUEST DBFCDX, DBFFPT, DBFDBT, LETO
  	REQUEST HB_LANG_PT, HB_CODEPAGE_PTISO, HB_CODEPAGE_PT850
  	 
  	REQUEST  SQLMIX, SDDODBC //opcional se for usar MySQL ou Firebird etc...
  	 
  	Function Main
  	Local cPATH := "//localhost:2812/" //não precisa informar o caminho dos DBF´s porque já foi informado(configurado) no arquivo leotdb.ini
	
     REQUEST LETO
     RDDSETDEFAULT("LETO")
  	 
  	//Conectando com o servidor LetoDb.
  	 
  	      nConect := leto_Connect( cPath)
  	      IF nConect == -1
  	          nRes := leto_Connect_Err()
  	         IF nRes == LETO_ERR_LOGIN
  	            alert( "Falha ao Logar" )
  	         ELSEIF nRes == LETO_ERR_RECV
  	           alert( "Error ao conectar" )
  	         ELSEIF nRes == LETO_ERR_SEND
  	            alert( "Erro de envio" )
  	         ELSE
  	            alert( "Não connectado ao servidor: " + cPath )
  	         ENDIF
  	         Return .F.
  	      ENDIF
  	 
  	cIndex  := cPATH+"PRODUTOS.cdx"
  	 
  	cDbf := cPATH+"PRODUTOS.dbf"
  	 
  	DbUseArea(.t.,'LETO',"PROD",.T.,.F.,'PTISO')
  	If leto_file(cIndex)
  	   DBSETINDEX( cIndex )
  	Else
* 	   index on ...//seu código
* 	   index on ... //seu código
       index on codmercad to codigo
  	EndIf
	return
Harbour 3.2.0(dev)

LetoDb e Harbour, como usar.

Enviado: 22 Out 2018 18:27
por Itamar M. Lins Jr.
Ola!
Eu não uso "set PATH" mais, nem olho mais isso. o HBMK2 faz tudo!
Se vc informa que o arquivo a biblioteca está na pasta. c:\letodb\lib ? o hbmk2 vai procurar lá.
Mas pelo que vi não tens a tal pasta está tudo dentro do c:\letodb. Correto ? basta corrigir um dos dois.

Código: Selecionar todos

{win}libpaths=c:\letodb\lib;
O hbmk2 está procurando ai.

Saudações,
Itamar M. Lins Jr.

LetoDb e Harbour, como usar.

Enviado: 28 Out 2018 10:16
por porter
Bom dia Itamar,
Estou abrindo arquivo compartilhado conforme essa rotina, gostaria de saber se para abrir os índices, somente
funciona com o DBSETINDEX ou com o SET INDEX também da certo, com o SET INDEX está dando erro: Error LETO/1003 Open error: c:\dados\cIndex2.
Se conseguir abrir os índices com SET INDEX, não preciso mudar no sistema, outra dúvida, os índices tem que ser recriados ?

Código: Selecionar todos

REQUEST LETO            
RDDSETDEFAULT("LETO")
cPATH     := "//localhost:2812/"
cIndex1   := cPATH + "codigo.cdx"
cIndex2   := cPATH + "desc.cdx"	
USE (cPath+"PRODUTOS") SHARED
SET INDEX TO cIndex2,cIndex1
Harbour 3.2.0(dev)

LetoDb e Harbour, como usar.

Enviado: 28 Out 2018 12:58
por Itamar M. Lins Jr.
Ola!
Oxi ??? e precisa de vários CDX's para um único DBF ? nunca vi.
Geralmente usamos TAG x, TAG y... o contrário, tudo dentro de um único CDX, vários INDICES dentro de 1 CDX.
Não precisa desse cPATH ai também não.
LOGOU/Conectou no LETODBf, o resto é como sempre usamos.

Código: Selecionar todos

use produtos.dbf new shared
set index to ... // com "SET AUTOPEN ON", nem precisa disso o tal set index...
Saudações,
Itamar M. Lins Jr.

LetoDb e Harbour, como usar.

Enviado: 29 Out 2018 10:06
por porter
Bom dia Itamar,
Estou tentando adaptar ao sistema, o exemplo do início desse tópico, compilei e executou normalmente,
se não usar o cPath, dá erro quando for abrir o arquivo: Error LETO/1021 Data Type Error: PRODUTOS.DBF,
estou conectando o LetoDb, não estou usando TAGS, crio vários CDX para o arquivo e abro com SET INDEX.

Harbour(3.2.0)dev
em modo console

LetoDb e Harbour, como usar.

Enviado: 29 Out 2018 17:33
por Itamar M. Lins Jr.
Ola!
Olha eu estou usando o LetoDBf. Versão do GIT 2018-10-10 11:21. Harbour 3.4 GCC 7.3
É bom identificar qual LetoDB está usando versão etc...
Porque se der erro será sempre a que está no GIT que ele vai corrigir.
Vc pode postar seu código para tetarmos executar aqui, para ver se é um BUG e caso for um BUG, reportarmos ao Elch.
Precisa postar um exemplo enxuto que demostre o problema.

Eu uso assim:

Código: Selecionar todos

      nConect := leto_Connect( cPath)
Esse post é velho de 2014, não uso mais o LetoDB, uso agora o LetoDBf.
Depois que conectar no LetoDBf, não precisa do: cPATH:="//192.168...:2812/".
Basta "use xyz.dbf"

Saudações,
Itamar M. Lins Jr.

LetoDb e Harbour, como usar.

Enviado: 29 Out 2018 18:10
por porter
Olá Itamar,
Resolvi fazer download do LetoDBF pelo GIT, porque pelo que li no fórum, está mais atualizado, então descompactei
e instalei o LetoDBF, eu até havia conseguido compilar o LetoDB, mas o LetoDBF, não estou conseguindo
compilar, o procedimento para compilar o LetoDBF é o mesmo do LetoDB, são os mesmos arquivos usados no LetoDB ?

Obrigado.

LetoDb e Harbour, como usar.

Enviado: 30 Out 2018 11:05
por Jairo Maia
Para compilar o LtoDBf, use Hbmk2 letodb.hbp. Será gerado o executável na pasta bin.

LetoDb e Harbour, como usar.

Enviado: 21 Nov 2018 10:11
por bwr2018
Bom dia, sou novo aqui no forum perdoem se estou postando algo de forma errada. Estou com o seguinte problema:
1 - Eu consigo me conectar com o letodb.
2 - Eu consigo me conectar com o banco de dados na rede.
3 - Eu consigo manipular os campos do banco na rede.
4 - O banco de dados da rede é atualizado com dbcommitall().

Tudo parece perfeito, mas as maquinas tanto a servidora quanto as estações não me mostram os valores atualizados na tela rsrs.
Segue as funções de conexão, gravação, update e amostragem.

Função de conexão

Código: Selecionar todos

procedure connect_server
local iSecs2
local iFalha := 0
local iSecs1 := abs( seconds() )
do while abs( seconds() - iSecs1 ) < 300
   //se conseguimos conectar
   if leto_Connect( "//192.168.0.1:2812/" ) <> -1
      //se enxerguei o banco vamos tentar nos conectar
      if leto_file( FILE_SERVER )
         //vamos dizer ao programa que estamos conectado
         bConected := .t.
         //seleciono a area de trabalho com numero 6
         select 6
         //e vamos abrir o banco de dados do servidor no modo compartilhado
         USE FILE_SERVER SHARED NEW ALIAS LAN
         //se chegamos até aqui, se não houve erro na abertura do arquivo só resta sair do loop
         if !neterr() .and. !empty( alias() )
            exit
         else
            ? "Erro ao abrir banco de dados"
            inkey(0)
            quit
         endif
      //se não conseguimos
      else
         //vamos dizer ao programa que ainda não nos conectamos
         //mostramos na tela que estamos tentando
         ? "Tentativa de conexao com o banco de dados ",alltrim(str(++iFalha))," -> falha"
         ? "Proxima tentativa em 1 minuto"
         ? "Procurando...",FILE_SERVER
         bConected := .f.
      endif
   //se não enxerguei o banco
   else
      //mostramos na tela que estamos tentando
      ? "Tentativa de conexao com o servidor ",alltrim(str(++iFalha))," -> falha"
      ? "Proxima tentativa em 1 minuto"
   endif
   if abs( seconds() - iSecs1 ) < 300
      //aguardamos 1 minuto aqui
      iSecs2 := abs( seconds() )
      do while abs( seconds() - iSecs2 ) < 60
         if inkey() == 27
            quit
         endif
      enddo
   else
      exit
   endif
enddo
//se ficamos aqui tentando por mais de 5 minutos
//e não conseguimos nos conectar 
if abs( seconds() - iSecs1 ) >= 300
   ? "Fim das tentativas inciando local..."
   //então dizemos ao programa que não conseguimos portanto tudo sera local
   bConected := .f.
   inkey(5)
endif
return
Função de gravação

Código: Selecionar todos

procedure dbxput_server(cField, xValor)
do while !dbrlock()
enddo
field->&cField := xValor
dbunlockall()
return
Função de update

Código: Selecionar todos

procedure update_dbf
dbcommitall()
return
Amostragem simples

Código: Selecionar todos

@ 10,10 say "INCREMENTO REG 1: "+alltrim(str(LAN->REG1))
@ 11,10 say "INCREMENTO REG 2: "+alltrim(str(LAN->REG2))
@ 12,10 say "INCREMENTO REG 3: "+alltrim(str(LAN->REG3))
@ 13,10 say "INCREMENTO REG 4: "+alltrim(str(LAN->REG4))
@ 14,10 say "INCREMENTO REG 5: "+alltrim(str(LAN->REG5))
@ 15,10 say "INCREMENTO REG 6: "+alltrim(str(LAN->REG6))
@ 16,10 say "INCREMENTO REG 7: "+alltrim(str(LAN->REG7))
Agora o mais intrigante de tudo isso, é que se eu ficar abrindo e fechando o banco ai sim eu consigo os valores atualizados.
Meu conhecimento é bem raso sobre banco de dados. Mas o que da entender é que o programa só mostra os valores de incremento da própria estação e não o que realmente está gravado no banco de dados do servidor.
Enfim não tenho mais para onde correr rsrs, então recorri ao forum. Agradeço desde já aqueles que puderem me ajudar nessa questão.

LetoDb e Harbour, como usar.

Enviado: 21 Nov 2018 12:49
por Jairo Maia
Olá bwr2018,

Seja bem vindo ao fórum.

Não tenho esse problema, inclusive, se alguma estação estiver aberta com o TBrowse no arquivo clientes por exemplo, e alguma estação cadastrar algum cliente, meu TBrowse faz um refresh a cada 15 segundos se estiver parado, e já aparece o novo cadastro na tela de todas estações.

Como você disse que após algumas tentativas consegue ver os dados atualizados, uma pergunta: Você está encerrando o LetoDBf ao encerrar a aplicação? Não sei se é o caso, mas apenas para verificar se pode ser isso, coloque em qualquer arquivo .PRG a função EXIT PROCEDURE, e se já existir, acrescente a desconexão do LetoDBF nela. Exemplo:

Código: Selecionar todos

Exit Func Encerrar()  // chamada automaticamente quando o sistema é fechado.
 
 Leto_DisConnect()    // desconecta a conexão LetoDBf (Local ou não)...
 
Return Nil
Isso é a única coisa que me ocorre no momento.

Isso não quer dizer que tenha que fechar o aplicativo para ver as atualizações, isso significa apenas que não haverá conflito de conexões do Leto.

LetoDb e Harbour, como usar.

Enviado: 21 Nov 2018 13:17
por Jairo Maia
bwr2018, veja tambem se isso ajuda:

Acrescente em seu arquivo letodb.ini o comando: HardCommit = 1, e reinicie o serviço LetoDbf Service para isso ter efeito.

Ativando esse comando (colocando 1 ao invés de deixar zero - padrão) fará com que os dados sejam salvos imediatamente em disco, ignorando o cache do sistema operacional. Pode ser que ajude.
HardCommit = 0 - if 0, SET HARDCOMMIT OFF, this is now DEFAULT.
It is recommended for UNSTABLE running server to set it to <1>,
which means that each change at data tables are immedeate written to
harddrive bypassing the OS cache.