Clipper On Line • Ver Tópico - LetoDb e Harbour, como usar.
Mudar para estilo Clássico
Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.
Postar uma resposta

LetoDb e Harbour, como usar.

15 Mai 2018 13:44

Ola!
Use as novas funções do harbour para trabalhar em rede.
hb_vf*
Código:
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.

15 Mai 2018 14:18

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:
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.

15 Mai 2018 14:39

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.

15 Mai 2018 15:00

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.

22 Out 2018 14:48

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:
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:
-otesteleto 
-compr=yes
-quiet
-lxhb
-lhbwin
-lhbct
-prgflag=-b               
-strip
-compr
rddleto.hbc
-iC:\letodb
TESTLETO.PRG


compilar.bat
Código:
@echo off
CLS
set path=C:\hb32\bin;C:\hb32   
CLS
HBMK2 TESTE.HBP


rddleto.hbc na pasta c:\dados
Código:
{win}incpaths=c:\letodb\include;
{win}libpaths=c:\letodb\lib;
{win}libs=rddleto


hbmk.hbm na pasta c:\dados
Código:
rddleto.hbc


testleto.prg na pasta c:\dados
Código:
//  #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.

22 Out 2018 18:27

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:
{win}libpaths=c:\letodb\lib;


O hbmk2 está procurando ai.

Saudações,
Itamar M. Lins Jr.

LetoDb e Harbour, como usar.

28 Out 2018 10:16

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:
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.

28 Out 2018 12:58

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:
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.

29 Out 2018 10:06

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.

29 Out 2018 17:33

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:
      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.

29 Out 2018 18:10

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.

30 Out 2018 11:05

Para compilar o LtoDBf, use Hbmk2 letodb.hbp. Será gerado o executável na pasta bin.

LetoDb e Harbour, como usar.

21 Nov 2018 09:11

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:
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:
procedure dbxput_server(cField, xValor)
do while !dbrlock()
enddo
field->&cField := xValor
dbunlockall()
return


Função de update
Código:
procedure update_dbf
dbcommitall()
return


Amostragem simples
Código:
@ 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.

21 Nov 2018 11:49

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:
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.

21 Nov 2018 12:17

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.
Postar uma resposta