Clipper On Line • Ver Tópico - LetoDBf (fork) -> LetoDb com espinafre
Página 1 de 13

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Fev 2017 15:36
por Itamar M. Lins Jr.
Ola!
Mudei para o LETODBf um fork que o Rolf "Elch" fez do LetoDb(Alexander Kresin).
Estou gostando, ele corrigiu os erros do LETODB e aprimorou os comandos, adicionou mais opções.
Agora com o LetoDBf a conexão está mais rápida, pois ele chama 2 processo simultâneos no servidor na mesma conexão.
Esta funcionando com CDX/NTX...
Explicações "melhores" em inglês no readme.txt
https://github.com/elchs/LetoDBf

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Fev 2017 16:25
por Itamar M. Lins Jr.
Ola!
Na época que comecei a usar não tinha NetIO.
Mas mesmo assim o NetIO não faz a mesma coisa que o LetoDB faz. O NetIO não tinha o conceito na época de:
leto_connect( "\\loja2.ddns.net:2812\")
use clientes new shared
browse()

Tem umas diferenças que o Przmek explicou, o NetIO é mais para redes LOCAIS e não tinha o tal "transaction" e outros recursos do LetoDb.
Comparing HBNETIO with LetoDB does not make sense. HBNETIO for file IO
operations is only network redirector which uses TCP connections to
replace different native system network redirectors. It give some small
speed improvement (i.e. 20-30%) but the main goal is resolving problems
with local caches and incompatible locking which break concurrent file
access when different OS-es are used on client stations or some of them
use danger "speedup" mechanism like opportunistic locking or some others
does not have native network redirectors which allow to connect to the
server.
Nothing more. Pure HBNETIO file access does not reduce network
traffic. Only RPC in HBNETIO can noticeable reduce it and this will
give the best speed results but user has to add to the server code
for all time consuming operations he wants to optimize.

best regards,
Przemek


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Fev 2017 16:34
por Itamar M. Lins Jr.
Ola!
Algumas comparações do ADS com o LetoDBf.
https://groups.google.com/forum/#!topic/harbour-users/hxyjdpmMCNY

Com LetoDbf:
The two lines above indicate the timing to delete the 1,010 attribute tags that were created in the previous process. For LetoDBF the process took 22 seconds more or less.

Com ADS:
The attribute tag deletion process under ADS took 4 minutes and 1 second, more or less.


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Fev 2017 22:01
por fladimir
Agora pq não ajeitaram o projeto original? Meu receio é virar tipo q nem as libs gráficas... varias... e no caso das libs gráficas o esforço poderia ter sido concentrado em uma no maximo 2.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Fev 2017 22:41
por cl@udio
Boa noite
Me fiz a mesma pergunta fladimir.
Por isso que os projetos deixam de crescer.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 21 Fev 2017 09:55
por Itamar M. Lins Jr.
Ola!
Segundo Elch, não quis mexer nos códigos de compatibilidade, que tem no original, compatibilidade com o xHarbour principalmente.
O LetodbF não roda no xHarbour por exemplo e versões velhas do Harbour.
The cause of this fork was to get the freedom of removing over many years accumulated legacy technics, and to continue, to...
Mais em:
https://github.com/elchs/LetoDBf/blob/master/README.md

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 21 Fev 2017 11:56
por fladimir
Realmente é um ótimo argumento

Agora esse novo fork pode desancar pq não fica preso as compatibilizações.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Mar 2017 00:11
por fladimir
Baixei do git e fui testar mas pelo q entendi tem BAT pra MSVC e BCC... como faço em MinGW?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Mar 2017 00:13
por fladimir
Desculpem... esqueçam o q falei tem os HBP na pasta... to dormindo na frente do computador... kkkk

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 14 Mar 2017 23:15
por Nascimento
uma das primeiras duvidas é a abertura e criação dos indices atualmente tenho uma função que faz isso vou colocar um trecho aqui , original
a duvida é como seria no Letodb


// chamada da net_use()
  *                dbf    alias   indice
   if (!net_use("MCOCUP", "MCO","MCOCUP"))
      quit
   endif

**********************************************************
function Net_use
   parameters lfile, lalias, lindex, lexcl, lretry
   private lforever, v_arq,nomearq
   lretry:= iif(Type("lretry") != "N", 500, lretry)
   lexcl:= iif(Type("lexcl") != "L", .F., lexcl)
   lforever:= lretry == 0
   v_arq:= lfile + ".dbf"
   do while (lretry > 0 .or. lforever)
      if (lexcl)
         use (lfile) alias (lalias) new exclusive
      else
         use (lfile) alias (lalias) new
      endif
      if (used())
         exit
      endif
      if (mens(24, 11, "Arquivo nao liberado... AGUARDE ", 1) == 27)
         exit
      endif
      lretry:= lretry - 1
   enddo
   if (used())
      if (lindex = p_bancos+"MCOCUP")       
         if (!file(p_bancos+"MCOCUP.CDX"))
            nomearq:= lindex
*            Criando arquivo de indice     
            index on sui tag sui to (lindex) 
            set index to (lindex)
         else
            set index to (lindex)
         endif
      endif
endif
*************************************
             

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Mar 2017 09:25
por Itamar M. Lins Jr.
Ola!
Isso não muda. Continua da mesma forma.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Mar 2017 10:48
por Nascimento
na chamada nao tem que dizer onde ta o letodb?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Mar 2017 18:05
por fladimir
Se não testei errado... kkk, não, vc apenas define pra conectar em tal lugar e o path

Depois Use normal etc.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 17 Mar 2017 17:01
por Itamar M. Lins Jr.
Ola!
Antes de suas funções, basta setar o AMBIENTE.
RDDSETDEFAULT("LETO")
leto_Connect( '//localhost:2812/' ) // ou o IP onde está os DBF´s  com o LETO 192.168.10.10 por exemplo, no lugar de localhost.

...Aqui suas funções.


Se quer ver as coisas(arquivos) que estão lá no servidor use as funções "NOVAS" do LETO para isso.
LETO_FILE()
LETO_DIRECTORY... em muitas outras, mas o básico você não mexe.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 19 Mar 2017 11:02
por Nascimento
então pelo que compreendi fica exatamente dessa forma


RDDSETDEFAULT("LETO")
leto_Connect( '//localhost:2812/' ) // ou o IP onde está os DBF´s  com o LETO 192.168.10.10 por exemplo, no lugar de localhost.

// chamada da net_use()
  *                dbf    alias   indice
   if (!net_use("MCOCUP", "MCO","MCOCUP"))
      quit
   endif

**********************************************************
function Net_use
   parameters lfile, lalias, lindex, lexcl, lretry
   private lforever, v_arq,nomearq
   lretry:= iif(Type("lretry") != "N", 500, lretry)
   lexcl:= iif(Type("lexcl") != "L", .F., lexcl)
   lforever:= lretry == 0
   v_arq:= lfile + ".dbf"
   do while (lretry > 0 .or. lforever)
      if (lexcl)
         use (lfile) alias (lalias) new exclusive
      else
         use (lfile) alias (lalias) new
      endif
      if (used())
         exit
      endif
      if (mens(24, 11, "Arquivo nao liberado... AGUARDE ", 1) == 27)
         exit
      endif
      lretry:= lretry - 1
   enddo
   if (used())
      if (lindex = p_bancos+"MCOCUP")       
         if (!file(p_bancos+"MCOCUP.CDX"))
            nomearq:= lindex
*            Criando arquivo de indice     
            index on sui tag sui to (lindex) 
            set index to (lindex)
         else
            set index to (lindex)
         endif
      endif
endif
*************************************

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Mar 2017 10:57
por Itamar M. Lins Jr.
Ola!
Sim.
Tem que checar se conectou ou não.
Não quis colocar. Fiz da maneira mais simples, mas pode ter senha, e outras coisas na configuração do LetoDb.
É muito simples mesmo.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Mai 2017 11:47
por jrarcanjo
ola por gentileza..

ja tentei usar a LETO COM SENHA, fiz a configuração como do INI como indicado, mas quando tento conectar usando senha não conecta..

alguem pode dar uma esclarecida..

sem senha funciona perfeitamente ( em redes e tudo mais)..

obrigado...

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 26 Jun 2017 13:38
por Cisino Junior
Boa tarde, eu li o Readme.txt, mas ainda está meio confuso como criar o executável e a lib, alguém poderia me ajudar, por favor? Preciso muito implementar o uso do letodbf no sistema.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 14:55
por Itamar M. Lins Jr.
Ola!
Será mais fácil postar onde parou. Para sabermos como ajudar.
Seja mais específico.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 15:12
por Cisino Junior
Itamar M. Lins Jr. escreveu:Ola!
Será mais fácil postar onde parou. Para sabermos como ajudar.
Seja mais específico.

Saudações,
Itamar M. Lins Jr.


Olá, Itamar M. Lins Jr. Boa tarde!
Eu parei literalmente no começo, não consegui entender como compilar usando o hbmk2, estou tentando pelo arquivo make_b32.bat, fiz as alterações de PATH e nada também. Eu utilizo o HMG 3.4.3, já tentei compilar o projeto letodb.hbp mas da erro, pois não tenho a lib necessária também. Ou seja, estou nadando na lava rsrsrs Peço até desculpas ao fórum, pois confesso que estou acostumado a desenvolver em Java e nunca precisei me preocupar com esse tipo de coisas, mas agora as coisas mudaram e estou aqui para aprender, e esse fórum já me ensinou muito!

Error ao tentar construir o harbour utilizando o win-make install:


C:\Users\legna\Documents\GitHub\core>win-make install
! Building Harbour 3.2.0dev from source - http://harbour-project.org
! MAKE: win-make 4.1 sh.exe install
! HB_HOST_PLAT: win (x86_64) HB_SHELL: nt
config/global.mk:1280: *** ! HB_COMPILER not set, could not autodetect. Stop.

Erro ao tentar compilar pela ide do hmg 3.4.3, acredito que esse erro seja por não encontrar a lib rddleto

Harbour 3.2.0dev (r1601151502)
Copyright (c) 1999-2015, http://harbour-project.org/
C:/Users/legna/AppData/Local/Temp/hbmk_a9p55m.dir/rddsys.o:rddsys.c:(.data+0x88): undefined reference to `HB_FUN_LETO_LOOKERROR'
C:/Users/legna/AppData/Local/Temp/hbmk_a9p55m.dir/rddsys.o:rddsys.c:(.data+0x98): undefined reference to `HB_FUN_LETORDD'
C:/Users/legna/AppData/Local/Temp/hbmk_a9p55m.dir/rddsys.o:rddsys.c:(.data+0xa8): undefined reference to `HB_FUN_LETO_UDF'
collect2.exe: error: ld returned 1 exit status
hbmk2[rddleto]: Erro: Executando linkeditor. 1
gcc.exe C:/Users/legna/AppData/Local/Temp/hbmk_a9p55m.dir/rddsys.o C:/Users/legna/AppData/Local/Temp/hbmk_a9p55m.dir/hbmk_u8lfye.o C:/Users/legna/Documents/GitHub/LetoDBf/_temp.o -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbmysql -lmysql -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lsddmy -lhbodbc -lodbc32 -lhbhpdf -lhbfimage -lhbpgsql -lhbnetio -lxhb -lpng -llibhpdf -lhbvpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -orddleto.exe -LC:/HMG.3.4.3/harbour/lib/win/mingw -LC:/HMG.3.4.3/lib

hbmk2: Erro: Referenciado, faltando, mas fun‡äes desconhecida(s):
LETO_LOOKERROR(), LETORDD(), LETO_UDF()

Agredeço muito a quem puder ajudar.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 15:32
por Cisino Junior
Boa tarde!
Consegui compilar as libs usando o make_b32.bat, mas não foi criado o executável. T_T :(

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 15:45
por Itamar M. Lins Jr.
Ola!
https://github.com/elchs/LetoDBf
O LetoDBf você baixa do GIT.
\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]> dir *.hbp

   Diretório: C:\Users\Itamar\Documents\GitHub\letodbf\LetoDBf

ode                LastWriteTime     Length Name
---                -------------     ------ ----
a---          05/01/17     16:57       1763 letodb.hbp
a---          04/01/17     10:48       1843 letodbaddon.hbp
a---          05/01/17     16:57       1755 letodbsvc.hbp
a---          04/01/17     10:48       1439 letodebug.hbp
a---          19/12/16     09:55        836 rddleto.hbp
a---          19/12/16     09:55       1474 rddletoaddon.hbp
a---          09/06/17     18:28       1023 rddletodebug.hbp

\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]>

Agora é só usar o hbmk2.
~\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]> hbmk2 .\letodbsvc.hbp
~\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]> hbmk2 .\rddleto.hbp
hbmk2: Harbour: Compilando módulos...
hbmk2: Compilando...
../../../../source/client/leto1.c: In function 'letoPutValue':
../../../../source/client/leto1.c:1594:7: warning: this statement may fall throu
gh [-Wimplicit-fallthrough=]
       {
       ^
../../../../source/client/leto1.c:1624:7: note: here
       case HB_FT_TIMESTAMP:
       ^~~~
../../../../source/client/leto1.c: In function 'letoGetValue':
../../../../source/client/leto1.c:1179:12: warning: this statement may fall thro
ugh [-Wimplicit-fallthrough=]
          if( pField->uiLen == 4 )
            ^
../../../../source/client/leto1.c:1189:7: note: here
       case HB_FT_MODTIME:
       ^~~~
hbmk2: Criando biblioteca estática... lib\librddleto.a

Está dando até uns avisos agora, com essa versão do GIT.
Vai criar dois diretórios, BIN e LIB, com os arquivos dentro.
É só usar.
~\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]> dir lib

    Diretório: C:\Users\Itamar\Documents\GitHub\letodbf\LetoDBf\lib

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---          27/06/17     15:43     328304 librddleto.a

~\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]> dir bin

    Diretório: C:\Users\Itamar\Documents\GitHub\letodbf\LetoDBf\bin

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---          20/02/17     15:19    2198528 console.exe
-a---          09/01/17     12:42        230 leto.sh
-a---          27/06/17     15:42    1840640 letodb.exe
-a---          27/06/17     15:02        837 letodb.ini

~\Documents\GitHub\letodbf\LetoDBf [master = +3 ~0 -0 !]>


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 15:55
por Itamar M. Lins Jr.
Ola!
Eu utilizo o HMG 3.4.3, já tentei compilar o projeto letodb.hbp mas da erro, pois não tenho a lib necessária também.

Eu não uso o HMG. Use o Harbour 3.4 do Viktor será mais fácil para todos.
Quando vc diz que usa o HMG, não sei qual harbour está usando, nem a versão do MINGW. Se está usando o BCC 5x não vai compilar o LetoDBf. Atualize suas ferramentas se for o caso.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 16:13
por Cisino Junior
Itamar M. Lins Jr. escreveu:Quando vc diz que usa o HMG, não sei qual harbour está usando, nem a versão do MINGW. Se está usando o BCC 5x não vai compilar o LetoDBf. Atualize suas ferramentas se for o caso.


Olá Itamar, eu consegui compilar os arquivos .lib usando o arquivo make_b32.bat, o que eu preciso agora é o letodb.exe que ainda não consegui compila- lo usando a ferramenta abaixo, de qualquer jeito vou pesquisar sobre o Harbour 3.4. Obrigado!

Estou utilizando as ferramentas disponibilizadas aqui -> http://www.hmgforum.com/app.php/page/download?sid=b6f88cd24dd413c42a9736bf69e13b76

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 16:23
por Cisino Junior
Cisino Junior escreveu:Estou utilizando as ferramentas disponibilizadas aqui -> http://www.hmgforum.com/app.php/page/do ... bf69e13b76


EDIT: Itamar, desculpe o incomodo. Essa ferramenta citada já possui o hbmk2, e ao abrir o projeto do letodb.hbp me retorna o seguinte erro:
Harbour 3.2.0dev (r1601151502)
Copyright (c) 1999-2015, http://harbour-project.org/
C:/Users/legna/Documents/GitHub/LetoDBf/lib/rddleto.lib: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status
hbmk2[letodb]: Erro: Executando linkeditor. 1
gcc.exe C:/Users/legna/AppData/Local/Temp/hbmk_nrnud9.dir/server.o C:/Users/legna/AppData/Local/Temp/hbmk_nrnud9.dir/common.o C:/Users/legna/AppData/Local/Temp/hbmk_nrnud9.dir/errorsys.o C:/Users/legna/AppData/Local/Temp/hbmk_nrnud9.dir/hbmk_4bxq2p.o C:/Users/legna/Documents/GitHub/LetoDBf/_temp.o    -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbmysql -lmysql -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lsddmy -lhbodbc -lodbc32 -lhbhpdf -lhbfimage -lhbpgsql -lhbnetio -lxhb -lpng -llibhpdf -lhbvpdf -lhbzebra -lrddleto -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib   -Wl,--end-group -oletodb.exe  -LC:/HMG.3.4.3/harbour/lib/win/mingw -LC:/HMG.3.4.3/lib -LC:/Users/legna/Documents/GitHub/LetoDBf/lib

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 16:36
por Itamar M. Lins Jr.
Ola!
Vai devagar ai.
Vc conseguiu compilar o leto a partir dos fontes ?
Na tela que está postando o letodb já está compilado.
Você sabe a diferença entre uma biblioteca compilada com o BCC e outra compilada com MINGW ?
Esse make_b32.bat que vc usou vc sabe o que é ? agora coloca outra tela que usa o MINGW.
rddleto.lib: file not recognized: File format not recognized


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 16:51
por Cisino Junior
Oi, eu consegui compilar a rddleto.lib pelo arquivo make_b32.bat, o letodb.exe não foi criado ao executar esse bat, só as libs. E sinceramente, eu não sei a diferança entre uma lib compilada com BCC ou MINGW.

Pelo o que sei o arquivo make_b32.bat abaixo é um script que executa comandos/programas no prompt de comando, pelo o que entendi. Ou entendi errado?
Nesse script ele executa o software make que fica se encontra no diretório C:\BORLAND\BCC55\Bin, o qual compila as libs. Ok... Mas para criar o letodb.exe eu não posso usar o BCC, até aqui eu entendi. Eu não entendi é como compilar usando o hbmk2, ou como configurar o hbmk2 para usa-lo.

Bom, desculpe minha ignorância nesse assunto. Estou aqui tetando aprender, desculpem qualquer incomodo, mas isso ainda ta bem confuso na minha cabeça.

rem SET PATH=C:\BORLAND\BCC55\Bin;C:\HMG.3.4.3\HARBOUR\bin
rem SET HB_PATH=C:\HMG.3.4.3

SET PATH=C:\BORLAND\BCC55\Bin
SET HB_PATH=C:\HMG.3.4.3\HARBOUR

@echo off
if "%1" == "clean" goto CLEAN
if "%1" == "CLEAN" goto CLEAN

if not exist lib md lib
if not exist obj md obj
if not exist obj\b32 md obj\b32
:BUILD

make -l EXE_OBJ_DIR=obj\b32\bin OBJ_DIR=obj\b32 -f makefile.bc %1 %2 %3 > make_b32.log
if errorlevel 1 goto BUILD_ERR
copy lib\rddleto.lib %HB_PATH%\lib\rddleto.lib
:BUILD_OK

   goto EXIT

:BUILD_ERR

   notepad make_b32.log
   goto EXIT

:CLEAN
   del bin\*.exe
   del bin\*.tds
   del lib\*.lib
   del lib\*.bak
   del obj\b32\*.obj
   del obj\b32\*.c

   del make_b32.log

   goto EXIT

:EXIT


LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 17:01
por Itamar M. Lins Jr.
Ola!
Tem dois compiladores ai.
o hbmk2 vai procurar o Mingw, e você criou o letodb usando o BCC 5x.
BCC5x é um compilador antigo e o Mingw é o mais novo, eles são incompatíveis. Crie o letodb como eu postei
hbmk2 letodbsvc.hbp
Aqui cria o .EXE
hbmk2 rddleto.hbp
Aqui vai criar a lib.
Não use o make_b32.bat.
É porque na sua maquina tem dois compiladores apaque o BCC.
Esse HMG é BCC ou MINGW ? se for BCC, como está aparecendo nos avisos os arquivo (libs) do MINGW ?
Estude a diferença entre o BCC 5x e o MINGW, para escolher ou um ou outro.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 17:49
por Cisino Junior
Olá Itamar, o HMG 3.4.3 utiliza o MINGW, acabei de confirmar isso olhando a estrutura do diretório da IDE e compilando um projeto de exemplo aqui. O mesmo também possui o hbmk2. O harbour instalado junto a esta IDE é o Harbour 3.2.

Esse é o output de error do arquivo build.log quando tento compilar o letodb.hbp pela ide:
Harbour 3.2.0dev (r1601151502)
Copyright (c) 1999-2015, http://harbour-project.org/
C:/HMG.3.4.3/mingw/bin/../lib/gcc/i686-w64-mingw32/5.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lrddleto
collect2.exe: error: ld returned 1 exit status
hbmk2[letodb]: Erro: Executando linkeditor. 1
gcc.exe C:/Users/legna/AppData/Local/Temp/hbmk_7fynjx.dir/server.o C:/Users/legna/AppData/Local/Temp/hbmk_7fynjx.dir/common.o C:/Users/legna/AppData/Local/Temp/hbmk_7fynjx.dir/errorsys.o C:/Users/legna/AppData/Local/Temp/hbmk_7fynjx.dir/hbmk_knl4aw.o C:/Users/legna/Documents/GitHub/LetoDBf/_temp.o    -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbmysql -lmysql -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lsddmy -lhbodbc -lodbc32 -lhbhpdf -lhbfimage -lhbpgsql -lhbnetio -lxhb -lpng -llibhpdf -lhbvpdf -lhbzebra -lrddleto -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib   -Wl,--end-group -oletodb.exe  -LC:/HMG.3.4.3/harbour/lib/win/mingw -LC:/HMG.3.4.3/lib -LC:/Users/legna/Documents/GitHub/LetoDBf/lib



E esse é criado quando tento compilar o rddleto.hbp pela IDE:
Harbour 3.2.0dev (r1601151502)
Copyright (c) 1999-2015, http://harbour-project.org/
C:/Users/legna/AppData/Local/Temp/hbmk_wyn3fy.dir/rddsys.o:rddsys.c:(.data+0x88): undefined reference to `HB_FUN_LETO_LOOKERROR'
C:/Users/legna/AppData/Local/Temp/hbmk_wyn3fy.dir/rddsys.o:rddsys.c:(.data+0x98): undefined reference to `HB_FUN_LETORDD'
C:/Users/legna/AppData/Local/Temp/hbmk_wyn3fy.dir/rddsys.o:rddsys.c:(.data+0xa8): undefined reference to `HB_FUN_LETO_UDF'
collect2.exe: error: ld returned 1 exit status
hbmk2[rddleto]: Erro: Executando linkeditor. 1
gcc.exe C:/Users/legna/AppData/Local/Temp/hbmk_wyn3fy.dir/rddsys.o C:/Users/legna/AppData/Local/Temp/hbmk_wyn3fy.dir/hbmk_ti2hey.o C:/Users/legna/Documents/GitHub/LetoDBf/_temp.o    -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbmysql -lmysql -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lsddmy -lhbodbc -lodbc32 -lhbhpdf -lhbfimage -lhbpgsql -lhbnetio -lxhb -lpng -llibhpdf -lhbvpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib   -Wl,--end-group -orddleto.exe  -LC:/HMG.3.4.3/harbour/lib/win/mingw -LC:/HMG.3.4.3/lib

hbmk2: Erro: Referenciado, faltando, mas fun‡äes desconhecida(s):
       LETO_LOOKERROR(), LETORDD(), LETO_UDF()


LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 18:07
por Itamar M. Lins Jr.
Ola!
Compile da forma que estou indicando.
hbmk2 letodbsvc.hbp
Abra pela sua IDE este arquivo ai! compile e o outro para gerar a lib.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 18:49
por Itamar M. Lins Jr.
Ola!
Tem que liberar o harbour para trabalhar sozinho, fora dessa IDE.
Veja que pelo prompt o hbmk2 tem que ser enxergado.
Coloque no PATH o local onde está o harbour por exemplo xxx\bin\harbour.exe, hbmk2.exe etc, e o MINGW.
C:\devl\hwgui_svn\code\hwgui_2_19\hwgui>hbmk2 -build
Harbour 3.4.0dev (10178a85fb) (2017-05-31 23:29)
Copyright (c) 1999-2017, https://github.com/vszakats/harbour-core/

Harbour Build Info
---------------------------
Version: Harbour 3.4.0dev (10178a85fb) (2017-05-31 23:29)
Compiler: MinGW GNU C 7.1 (32-bit)
Platform: Windows 7 6.1 SP1
PCode version: 0.3
Commit info: 2017-05-31 23:29:02 +0000
Commit ID: 10178a85fbfcd410f8365decbbda22fa465f1eaf
Build options:
---------------------------

C:\devl\hwgui_svn\code\hwgui_2_19\hwgui>


Dessa forma que vc está tentando usar, está tudo empacotado dentro da IDE da HMG e eu não sei como funciona isso.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Jun 2017 23:30
por Cisino Junior
Itamar M. Lins Jr. escreveu:Ola!
Tem que liberar o harbour para trabalhar sozinho, fora dessa IDE.
Veja que pelo prompt o hbmk2 tem que ser enxergado.
Coloque no PATH o local onde está o harbour por exemplo xxx\bin\harbour.exe, hbmk2.exe etc, e o MINGW.


Boa noite Itamar, amanhã quando chegar no escritório irei tentar do jeito que você citou. Obrigado pela atenção e desculpe qualquer transtorno. Assim que eu tiver algum progresso retorno aqui.

Obrigado!!!

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 28 Jun 2017 00:16
por Cisino Junior
Boa noite Itamar!

Eu baixei o Mingw e fiz a instalação next>>next>>next... A mesma já adiciona o mingw ao PATH. Até aqui ok. Segui sua dica de instalar o harbour 3.4 mas ao tentar compila-lo recebo o seguinte erro:
Imagem

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 28 Jun 2017 01:08
por Cisino Junior
ITAMAR MEU QUERIDO. CONSEGUIIIIII!!!!

Perdi o sono por causa disso mas consegui, depois das suas inúmeras explicações e de ler muita documentação eu consegui criar a lib e o executável do servidor. Chegando ao estágio eu irei realizar alguns testes, espero consegui criar a conexão!

MUITO OBRIGADO!!!!!

Um grande abraço,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 29 Jun 2017 16:11
por Cisino Junior
Boa tarde!
Consegui compilar o leto e a lib e já consigo conectar a aplicação ao servidor(ainda estou tentando entender como acessar os dados, quais funções usar e o que modificar), mas eu gostaria de usar o letodbsvc. Eu compilei o letodbsvc mas não consigo instalar letodb install.

Isso é o que aparece no letodbf.log quando eu tento instalar:
06.29.2017 15:12:02       Error installing LetoDB service:          5


Já de partida, eu estou tendo problemas para compilar o utilitário manage.exe:
Harbour 3.2.0dev (r1601151502)
Copyright (c) 1999-2015, http://harbour-project.org/
Compiling 'manage.prg'...
manage.prg(48) Error F0029  Can't open #include file 'hwgui.ch'
hbmk2[manage]: Erro: Executando o compilador Harbour (interno): 1
(C:\HMG.3.4.3\HARBOUR\bin\harbour.exe) -n2 manage.prg -oC:\Users\legna\AppData\Local\Temp\hbmk_rv3xir.dir\ -iC:\HMG.3.4.3\HARBOUR\include

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Jun 2017 11:04
por Itamar M. Lins Jr.
Ola!
Tem que ter a permissão de administrador.

Clicar com botão direito no icone "prompt de comando" e escolher executar como administrador.
Vai rodar como serviço do windows, ele já instala e executa automaticamente.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Jul 2017 13:17
por Cisino Junior
Itamar M. Lins Jr. escreveu:Tem que ter a permissão de administrador.


Boa tarde, Itamar!
Não tinha nem imaginado que poderia ser isso, coisa tão boba e nem me passou pela cabeça!

Mais uma vez, muito obrigado pela ajuda!!!

Abraços.

Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Jul 2017 20:58
por Nascimento
bom ,nao sei se sou diferente dos demais hehehe, mais uso o harbour com minigui e configuro justamente como estava acostumado no clipper
e funciona sem problemas acabei de compilar tanto as libs como o .exe do leto

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Jul 2017 16:18
por Cisino Junior
Boa tarde amigos!
Configurei minha rede para acesso local de outro pc para o meu, testei e funciona super bem. Agora estou tentando com acesso remoto, fiz o cadastro no no-ip e as configurações no modem. Mas não funciona, retorna esse erro: 07.04.2017 16:14:10 ERROR hb_socketBind() port 2812 used -- often a short temporary problem

Agradeço quem puder ajudar.

Atenciosamente,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Jul 2017 14:57
por Cisino Junior
Boa tarde!
Estou tentando compilar o letodb para linux(Eu uso o ubuntu 16.04), mas não estou conseguindo. O harbour já está instalado o mingw também, mas quando tento compilar com o hbmk2 letodb.hbp retorna o seguinte erro:

Imagem

Agradeço desde já a quem puder ajudar
Atenciosamente,
Cisino junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 06 Jul 2017 13:03
por Itamar M. Lins Jr.
Ola!
Não está achando a pasta onde está as bibliotecas do Harbour.
Como está o PATH ai do Linux ?
Consegue compilar outros projetos .HBP ?

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 06 Jul 2017 17:02
por Cisino Junior
Boa tarde, Itamar!
Eu só consegui compilar a lib do letodb. Amanhã irei tentar novamente. Irei tentar instalar o harbour em outra máquina com ubuntu e tentar compilar o LetoDB. Como posso fazer para instalar o Harbour corretamente no ubuntu?

Atenciosamente,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 18 Jul 2017 14:31
por JAIR RANGEL
Olá, Pessoal!
Boa tarde.

Usando o letodb(fork) é possível limitar a apresentação dos registros? Hoje, eu uso o componente Browser na IDE. Mas ao carregar o form, o componente traz todos os registros para apresentação. Eu queria limitar a apresentação dos registros, afim de reduzir o tráfego da rede.
Talvez tenha que mudar do Browser para o Grid. Será que tem aglum comando do letodb(fork) para fazer isso?

Se alguém puder esclarecer, fico grato.

Abraços,

JAIR RANGEL

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 18 Jul 2017 19:37
por Itamar M. Lins Jr.
Ola!
Respondido em:
http://pctoledo.com.br/forum/viewtopic.php?f=4&t=18475

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 19 Jul 2017 10:41
por JAIR RANGEL
Obrigado!

Perfeito!

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Ago 2017 17:06
por Cisino Junior
Boa tarde!
Na última sexta tentei fazer uns testes com o LetoDBf rodando no ubuntu 16.04 e acessar pelo aplicativo no windows, mas ao executar o programa deu erro de abertura nas tabelas. Muitos de nossos clientes usam servidores GNU LINUX, como posso resolver esse problema?

Além disso, o sistema é dividido em módulos que usam as mesmas tabelas, com o uso do LetoDbf também encontro erros quando executo o módulo x e depois o y, nesse post eu explico melhor o que acontece e deixei tbm as rotinas que controlam o acesso aos dbfs -> http://www.pctoledo.com.br/forum/viewtopic.php?f=42&t=18516

Desde já agradeço quem puder ajudar, obrigado!

Atenciosamente,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Ago 2017 18:27
por Itamar M. Lins Jr.
Ola!
Se vc não colocar o programa para podermos testar, o erro e mandar para o Elch para ele poder resolver caso exista o problema mais tempo vamos perder.
Crie um programa, ai o menor possível que demonstre o problema, para que todos aqui do forum possam te ajudar.
Nesse programa, que demonstre o erro, vc cria a estrutura do DBF, abre o DBF e mostra como acontece o erro.
Mais ou menos nesses moldes ai em baixo.
/*
* This sample tests working with dbf files
* Just change the cPath value to that one you need.
*/

REQUEST LETO
REQUEST DBFCDX

#include "dbinfo.ch"

Function Main( cPath )
LOCAL aNames := { "Petr", "Ivan", "Alexander", "Pavel", "Alexey", "Elch", ;
                  "Konstantin", "Vladimir", "Nikolay", "Andrey", "Dmitry", "Sergey" }
LOCAL i, aStru, aServerDriver
LOCAL nPort := 2812
FIELD NAME, NUM, INFO, DINFO, MINFO, TINFO

   ALTD()
   SET DATE FORMAT "dd/mm/yy"

   IF Empty( cPath )
      //cPath := "//127.0.0.1:2812/"
      cPath := ""
      RDDSETDEFAULT( "DBFCDX" )
   ELSE
      cPath := "//" + cPath + IiF( ":" $ cPath, "", ":" + ALLTRIM( STR( nPort ) ) )
      cPath += Iif( Right(cPath,1) == "/", "", "/" )
      RDDSETDEFAULT( "LETO" )
   ENDIF

   IF dbCreate( cPath + "test1", { { "NAME",  "C", 10, 0 },;
                                   { "NUM" ,  "N",  4, 0 },;
                                   { "INFO",  "C", 32, 0 },;
                                   { "DINFO", "D",  8, 0 },;
                                   { "TINFO", "@",  8, 0 },;
                                   { "MINFO", "M", 10, 0 } } )
      ? "File has been created"
   ENDIF

   USE ( cPath + "test1" ) NEW
   IF ! NetErr() .AND. ! EMPTY( ALIAS() )
      ? "File has been opened"
   ELSE
      ? "ERROR opening database! -- press any key to quit"
      Inkey( 0 )
      QUIT
   ENDIF
   aStru := dbStruct()
   ? "Fields:", Len( aStru )
   FOR i := 1 TO Len( aStru )
      ? i, aStru[i,1], aStru[i,2], aStru[i,3], aStru[i,4]
   NEXT

   FOR i := 1 TO Len( aNames )
      APPEND BLANK
      REPLACE NAME  WITH aNames[ i ],;
              NUM   WITH i + 1000,;
              INFO  WITH "This is a record number " + Ltrim( Str( i ) ),;
              DINFO WITH Date() + i - 1,;
              TINFO WITH IIF( i == 6, HB_STRTOTS( "" ), hb_DToT( DATE() + i, TIME() ) ),;
              MINFO WITH aNames[ i ]
   NEXT
   ? LEN( aNames ), "Records has been added"
   INDEX ON NAME TAG NAME
   ? "INDEX KEY 1:", indexkey( 1 )
   INDEX ON STR( NUM, 4 ) TAG NUM
   ? "INDEX KEY 2:", indexkey( 2 )
   INDEX ON TINFO TAG TS
   ? "INDEX KEY 3:", indexkey( 3 )
   INDEX ON INFO TAG ASH
   ? "INDEX KEY 3:", indexkey( 4 )
   ? "File has been indexed, "
   ?? DBORDERINFO( DBOI_ORDERCOUNT )
   ?? " active orders "
   ?? Iif( DBORDERINFO( DBOI_ORDERCOUNT ) == 4, "- Ok","- Failure" )

   ?
   ? "Press any key to continue..."
   Inkey( 0 )

   i := RecCount()
   ? "Reccount ", i, Iif( i == Len( aNames ), "- Ok","- Failure" )

   DbSetOrder( 0 )
   GO TOP
   ? "go top   ", NUM, NAME, DINFO, Iif( NUM == 1001, "- Ok","- Failure" )
   REPLACE INFO WITH "First", MINFO WITH "First"

   DbGoTo( 5 )
   REPLACE INFO WITH ""
   
   GO BOTTOM
   ? "go bottom", NUM, NAME, DINFO, Iif( NUM == 1012, "- Ok","- Failure" )
   REPLACE INFO WITH "Last", MINFO WITH "Last"

   ?
   ? 'ordSetFocus( "NAME" )'
   ordSetFocus( "NAME" )
   GO TOP
   ? "go top   ", NUM, NAME, DINFO, Iif( NUM == 1003, "- Ok","- Failure" )

   SKIP
   ? "skip     ", NUM, NAME, DINFO, Iif( NUM == 1005, "- Ok","- Failure" )

   GO BOTTOM
   ? "go bottom", NUM, NAME, DINFO, Iif( NUM == 1008, "- Ok","- Failure" )

   SKIP -1
   ? "skip -1  ", NUM, NAME, DINFO, Iif( NUM == 1012, "- Ok","- Failure" )

   DbSetOrder( 4 )
   DBGOBOTTOM()
   DBSEEK( "", .T. )
   ? "DbSeek( '',.T. )      ", NUM, NAME, DINFO, Iif( NUM == 1005, "- Ok","- Failure" )
   DbSetOrder( 1 )

   DBGOBOTTOM()
   DBSEEK( "Petr", .F. )
   ? "DbSeek( 'Petr',.F. )  ", NUM, NAME, DINFO, Iif( NUM == 1001, "- Ok","- Failure" )

   DBGOBOTTOM()
   DBSEEK( "Petr", .T. )
   ? "DbSeek( 'Petr',.F. )  ", NUM, NAME, DINFO, Iif( NUM == 1001, "- Ok","- Failure" )

   DBGOBOTTOM()
   DBSEEK( "Pe", .T. )
   ? "DbSeek( 'Pe',.T. )    ", NUM, NAME, DINFO, Iif( NUM == 1001, "- Ok","- Failure" )

   DbSetOrder( 3 )
   DBGOBOTTOM()
   DBSeek( hb_DToT( DATE() + 5 ), .T. )
   ? "DbSeek( TS,.T. )      ", NUM, NAME, DINFO, Iif( NUM == 1005, "- Ok","- Failure" )

   DBGOBOTTOM()
   DBSeek( hb_DToT( DATE() + 5 ), .F. )
   ? "DbSeek( TS,.F. )      ", NUM, NAME, DINFO, Iif( EOF(), "- Ok","- Failure" )
   DbSetOrder( 1 )

   DBGOTOP()
   DBSEEK( "Sergey", .F. )
   ? "DbSeek( 'Sergey',.F. )", NUM, NAME, DINFO, Iif( NUM == 1012, "- Ok","- Failure" )

   DBGOTOP()
   DBSEEK( "Ser", .T. )
   ? "DbSeek( 'Sergey',.T. )", NUM, NAME, DINFO, Iif( NUM == 1012, "- Ok","- Failure" )

   DBGOTOP()
   DBSEEK( "Sergez", .F. )
   ? "DbSeek( 'Sergez',.F. )", NUM, NAME, DINFO, Iif( EOF(), "- Ok","- Failure" )

   SET FILTER TO NUM >= 1004 .AND. NUM <= 1010
   ?
   ? "SET FILTER TO NUM >= 1004 .AND. NUM <= 1010"
   GO TOP
   ? "go top   ", NUM, NAME, DINFO, Iif( NUM == 1005, "- Ok","- Failure" )

   SKIP
   ? "skip     ", NUM, NAME, DINFO, Iif( NUM == 1010, "- Ok","- Failure" )

   GO BOTTOM
   ? "go bottom", NUM, NAME, DINFO, Iif( NUM == 1008, "- Ok","- Failure" )

   SKIP -1
   ? "skip -1  ", NUM, NAME, DINFO, Iif( NUM == 1004, "- Ok","- Failure" )

   ? "Press any key to continue..."
   Inkey( 0 )

   ?
   ? "SET FILTER TO, SET ORDER TO 0"
   SET FILTER TO
   SET ORDER TO 0

   GO TOP
   ? "First record", Iif( ALLTRIM( INFO ) == "First" .AND. MINFO == "First", "- Ok","- Failure" )

   GO BOTTOM
   ? "Last record ", Iif( ALLTRIM( INFO ) == "Last" .AND. MINFO == "Last", "- Ok","- Failure" )

   ?
   ? 'ordSetFocus( "NUM" ), SET SCOPE TO "1009", "1011"'
   ordSetFocus( "NUM" )
   SET SCOPE TO "1009", "1011"

   GO TOP
   ? "go top", NUM, NAME, DINFO, Iif( NUM == 1009, "- Ok","- Failure" )

   SKIP
   ? "skip  ", NUM, NAME, DINFO, Iif( NUM == 1010, "- Ok","- Failure" )

   SKIP
   ? "skip  ", NUM, NAME, DINFO, Iif( NUM == 1011, "- Ok","- Failure" )

   SKIP
   ? "skip  ", NUM, NAME, DINFO, Iif( Eof(), "- Ok","- Failure" )

   dbCloseAll()

   ?
   ? "Press any key to continue..."
   Inkey( 0 )

   IF RDDSETDEFAULT() == "LETO"
      aServerDriver := leto_DbDriver()
   ENDIF
   IF "CDX" $ RDDSETDEFAULT() .OR. ( VALTYPE( aServerDriver ) == "A" .AND. "CDX" $ aServerDriver[ 1 ] )
      USE ( cPath + "test1" ) NEW
      i := 0
      ? "auto opened index Tags:"
      DO WHILE ! Empty( Ordkey( ++i ) )
         ? i, ordKey( i )
      ENDDO
      OrdSetFocus( 3 )
      OrdDestroy( "TS" )
      ? "Indexord after OrdDestroy():", INDEXORD(), IIF( INDEXORD() == 0, " - Ok", " - Failure" )
   ENDIF

   dbCloseAll()
   ?
   ? "dropping test DBF: "
   ?? Iif( DbDrop( cPath + "test1" ), "- Ok","- Failure" )

   ?
   ? "Press any key to finish ..."
   Inkey( 0 )

Return Nil



Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Ago 2017 21:34
por Cisino Junior
Itamar M. Lins Jr. escreveu:Ola!
Se vc não colocar o programa para podermos testar, o erro e mandar para o Elch para ele poder resolver caso exista o problema mais tempo vamos perder.
Crie um programa, ai o menor possível que demonstre o problema, para que todos aqui do forum possam te ajudar.
Nesse programa, que demonstre o erro, vc cria a estrutura do DBF, abre o DBF e mostra como acontece o erro.
Mais ou menos nesses moldes ai em baixo.


Boa noite, Itamar!
Amanhã irei compilar um programa para testar e mostrar o erro de abertura de tabelas acessando o letodb no servidor linux e posto aqui. Muito obrigado pela atenção!

Atenciosamente,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Ago 2017 14:07
por Cisino Junior
Boa tarde!!!
Caro Itamar, fiz o que me pediu e criei um programa bem básico para fazer testes. Ele conecta no leto, cria a tabela + cdx e abre a tabela, eu fiz usando a HMG IDE, para fazer um form e colocar um Browse mais rápido.

Hoje eu consegui fazer essas operações de criar o dbf+cdx e abrir o dbf usando o letodb no GNU/Linux Ubuntu como servidor e meu aplicativo no Windows 10(obviamente). Eu liberei acesso completo a pasta de dados usando o chmod 777, sei que não é o ideal, e também liberei a porta do LetoDBf no firewall do Ubuntu.

Infelizmente o erro de abertura nos módulos do sistema ainda persistem, mas hoje irei verificar as rotinas novamente.

Vou deixar em anexo o projeto já compilado com os códigos fontes abaixo:

Atenciosamente,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Ago 2017 17:55
por Itamar M. Lins Jr.
Ola!
Infelizmente o erro de abertura nos módulos do sistema ainda persistem,

Vc brigou com o comando "close database" ?
Está abrindo e fechando o sistema, indexando etc... sem fechar as tabelas.
Não use suas funções, RDUSE,RDREC,RD...
Não tenho Minigui, use console, diminua ai seu fonte está enorme.
Só tem aqui, na função listdata() isso:

  IF ARQLOCOK = 'F' ; dbCloseAll() ; RETURN ; ENDIF


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 16 Ago 2017 13:30
por Cisino Junior
Itamar M. Lins Jr. escreveu:Não use suas funções, RDUSE,RDREC,RD...


Olá Itamar, boa tarde!

Acredito que você não tenha entendido, ou, eu não soube me expressar muito bem.

Essas funções são funções usadas no nosso sistema, o qual estamos implementando o LetoDBf. Por esse motivo eu utilizei elas no exemplo em anexo, e funcionaram perfeitamente. O programa de exemplo verifica se existe a tabela no servidor LetoDBf(no ubuntu), se a tabela não existir, o programa cria a tabela no servidor e o arquivo de índice CDX, caso contrário, ele somente abre a tabela pois a mesma já existe.

O que não estou conseguindo entender é: "Por que esse exemplo que eu criei, seguindo o mesmo padrão de utilização dos DBFs que nosso Sistema utiliza, consegue abrir as tabelas no LetoDBf rodando no UBUNTU e nosso sistema não?"

Se possível, gostaria de conversar com você mais a fundo sobre o LetoDB, seja por email/whatsapp quando você puder.

Atenciosamente,
Cisino Junior.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Abr 2018 20:36
por asimoes
Alguém sabe como resolver problemas de conexão cliente/servidor (letodbf)

A situação é a seguinte:

Usuário entra na aplicação se conecta ao servidor letodbf e depois de algum tempo (no menu do sistema), não tenho essa informação, pode ser 1 hora, 2 horas...
Ao entrar em opção que faça acesso a uma tabela dá erro.

Essa situação é outra, o usuário já acessou a rotina, está com as tabelas abertas, depois algum tempo também não sei quanto tempo, ele resolver sair da rotina e ir para outra e acontece o erro: na saída da rotina tem um DbCloseAll()

Error LETO/1000 Erro de sintaxe
Called from ->DBCLOSEALL(0)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Abr 2018 06:22
por asimoes
Eu queria saber em que situação pode acontecer o erro:

Error LETO/1000 Erro de sintaxe
Called from ->DBCLOSEALL(0)

Estou usando LetoDbf, baixei os fontes tá atualizado (git pull) gerei a lib, bin o harbour para compilar 3.2 e gcc 7.30

No meu usuário o servidor windows 7 pro 32 e na estação onde ocorre o erro windows 7 pro 32

Uma rede simples somente 1 servidor e 3 estações.

Eu queria saber onde deve ser verificado alguma configuração do windows, porque o modelo para acesso as tabelas eu segui exemplos na pasta tests e também do que eu já tinha nas minhas pastas.

Alguém poderia passar alguma informação sobre esse problema ?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Abr 2018 11:13
por Itamar M. Lins Jr.
Ola!
Estou sem internet no momento. Agora estou em um cliente...
Bem, esse erro é na REDE. A rede caiu!
Tem que usar o comando "novo" reconnect que só tem no letodbf, nesta situação.
Eu não uso "reconnect" só pego esse erro quando uma filial sai do ar ou em uma rede interna quando desliga o HUB.
      LETO_RECONNECT( [ cAddress ], [ cUserName ], [ cPassword ],
                    [ nTimeOut ], [ nBufRefreshTime ], [ lZombieCheck ], [ nDelay ] )
                                                               ==> nConnection, -1 if failed
All param are optional! and same as LETO_CONNECT(), plus optional 7th param <nDelay> in unit seconds.
This will close a possible still alive or dead connection to server, and re-establish a new connection
to the same or even different server if <cAddress> is given. Except <cUserName> and <cPassword> all
params are filled in by setting of the old connection.
The full WA environment ( tables, index orders, filters, scope, relations, R|F-locks ) is restored
for the new connection.
If it is the same server, <nDelay> will be 1.0 second to let the server close the tables and remove
existing locks before try to establish a new connection, for different server no delay is needed.
<nDelay> should only needed to be manually set, if a connection is made to same server, but over
different network.


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Abr 2018 11:25
por asimoes
Obrigado Itamar pela informações.

Ontem eu fui no cliente e fiz umas alterações na configuração da placa de rede, uma delas foi forçar 100mbs full outra foi desligar o gerenciamento de energia das 3 estações + servidor, estou acompanhando, até agora está ok

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 07 Abr 2018 12:27
por asimoes
Itamar,

Pesquisando no fórum achei esse comentário seu sobre o Avast:

Bom, pela minha experiência com o avast, isso não adianta nada. Uso meus programas com Hwgui, desde muito tempo com o manifest, e o avast faz a checagem as vezes apaga o .exe outras não..., alias o avast apaga qualquer programa em qualquer linguagem, porque ele informa ao usuário que é suspeito e mostra a tela p/ usuário decidir se apaga ou não, e o usuário na maioria das vezes clica em apagar.
Outra dor de cabeça que tenho com o avast é o firewall de vez em quando ele derruba as conexões Letodb/TS porta 2812/3389, tenho que manter o firewall dele desligado, usando o nativo do windows mesmo.

Razão pela qual muitos preferem usar AVG, etc


No meu cliente o servidor e as 3 estações usam o Avast e eu tenho esse problema com queda de conexão, confirma pra mim se foi isso mesmo que você percebeu e qual foi a solução que você deu.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Abr 2018 16:40
por Itamar M. Lins Jr.
Ola!
Isso ocorria com o avast daquela época. Agora ele congela a aplicação checa e libera. Isso quando atualizo o .exe
Mas a parte de firewall não deu mais defeito. Desliga o firewall do avast e deixa o do windows mesmo.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Abr 2018 17:13
por asimoes
Itamar,

Era o Avast que estava derrubando a conexão e também congelando a aplicação.

Como a licença estava vencida, agora o antivirus é o norton antivirus plus.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 17 Abr 2018 16:48
por Itamar M. Lins Jr.
Ola!
Por essas e outras que adotarei o LINUX novamente... W10 tá de tirar o SONO.
Quantas horas perdemos nisso ? Quantos aborrecimentos... Agora a desonestidade tá fo***
Tô com problemas de todos os tipos aqui. Até virus ransomware está na porta 3389 do WTS... Só LINUX mesmo para evitar tanta doidice.
Fora a procura de uma linguagem visual no LINUX. :-(

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 17 Abr 2018 18:26
por asimoes
Fui obrigado a desativar o firewall inteligente do norton, kkkk
a mesma coisa do avast, congelando aplicação derrubando a conexão, esse firewall "inteligente" ta deixando a aplicação "burra" kkkk

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 17 Abr 2018 18:37
por Claudio Soto
Itamar M. Lins Jr. escreveu:Fora a procura de uma linguagem visual no LINUX. :-(

En mi humilde opinión el futuro está en el desarrollo de aplicaciones multiplayaforma en java ( Windows,Linux,iOS y Android ) con la lib GUI JavaFX o alguna otra similar haciendo un bridge con javascript/css/html.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 25 Abr 2018 17:48
por sambu
Hola, me presento.
Soy Roberto Sambuceti, Argentina

Probé de usar LETODB en una aplicación y estuvo inestable.
Por eso quiero probar con el fork Letodbf

Bajé‚ los fuentes de https://github.com/elchs/LetoDBf
Uso Harbour MiniGui 3.4.4

Al compilar obtengo este error:

C:\LetoDBf>\hmg.3.4.4\harbour\bin\hbmk2 rddleto.hbp -comp=mingw
source\client\rddsys.prg(172) Warning W0001 Ambiguous reference 'LETO_DEFAULT_PORT'

No code generated.
hbmk2[rddleto]: Error: Ejecutando compilador Harbour (interno): 1
(C:\hmg.3.4.4\harbour\bin\harbour.exe) -n1 source\client\rddsys.prg -n -w3 -q0 -es2 -gc3 -oC:\DOCUME1\Gonzalo1\CONFIG1\Temp\hbmk_3yblxb.dir\ -iC:\hmg.3.4.4\harbour\include -iinclude -isource\3rd\lz4\lib

Alguna idea de como solucionar?
Saludos,
Roberto

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 26 Abr 2018 19:33
por Itamar M. Lins Jr.
Ola!
Linha 172 rddsys.prg
   hb_default( @nPort, LETO_DEFAULT_PORT )  /* port to send the broadcast LETO_DEFAULT_PORT */


Arquivo rddleto.ch linha 54,55,56
#ifndef LETO_DEFAULT_PORT
   #define LETO_DEFAULT_PORT  2812
#endif

Provavelmente alguma mistura ai dos letos, [DB] e [DBf]

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Abr 2018 18:00
por sambu
Muchas gracias Itamar,

ese era el problema.
Mixtura entre ambos letos.
Saludos

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 31 Jul 2018 18:58
por jrarcanjo
ola amigos..

eu gostaria de saber se tem como usar a LetoDB com senha.

se alguem souber pode esclarecer como configurar.

ja tentei varias vezes mas não consegui.

se tem que criar alguem arquivo para armazenar as senhas, como seria este arquivo.

obrigado pela atenção.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 28 Ago 2018 19:55
por asimoes
Olá,

Saiu uma atualização hoje, corrigindo também "warnings" de compilação.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Ago 2018 18:21
por Itamar M. Lins Jr.
Ola!
O Letodb, está parado.
O LetoDbf do Elch que está ativo.
E quem estava fazendo atualizações era o Pavel Tsarenko no LetoDb; Se está atualizando eu não sei qual é o link. Posta ai por favor.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Ago 2018 18:27
por alxsts
Olá!
jrarcanjo escreveu:eu gostaria de saber se tem como usar a LetoDB com senha.
se alguem souber pode esclarecer como configurar.

Alguém se habilita?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Ago 2018 18:45
por Itamar M. Lins Jr.
Ola!
Tem que colocar aqui o tal "pequeno" exemplo para podermos testar.
Eu não uso com senha. Como ele está fazendo ? É só copiar e colar o código.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Ago 2018 18:59
por Itamar M. Lins Jr.
Ola!
Ele está explicando esse "negocio" de senha lá no Readme.txt
     4.3 Authentication

To turn authentication system on, aka to log into server with required username/ password,
you need to set one of the following letodb.ini parameters to 1:
Pass_for_Login, Pass_for_Manage, Pass_for_Data.
! Beforehand, you need to create at least one user with admin rights, because when authentication
system is active, only authenticated users with admin rights are able to add/ change users
and passwords.

To add a first user, you need to execute LETO_USERADD() one time, for example:
      LETO_USERADD( "admin", "secret:", "YYY" )
where "secret" is the password, and "YYY" is a 3 letter Y_es and N_o string,
which grants rights to; 'admin' 'manage' 'write access'.

You can also use the console program in utils/manager/console.prg to add/ delete users.
Look for section 8.1

To connect to a server with an authentication active with username and password, you must use
the LETO_CONNECT() function.


Lendo eu vi que existem 3 níveis de password.
Pass_for_Login, Pass_for_Manage, Pass_for_Data.

E por ai vai...
Para responder precisamos saber em que nível de dificuldade a pessoa está.

Credito que ele está querendo essa aqui:
      Pass_for_Data = 0        -    if 1, user authentication is necessary to have write access to the data;

Ai é necessário add o usuário via o gerenciador ou linha de comando.
To add a first user, you need to execute LETO_USERADD() one time, for example:
      LETO_USERADD( "admin", "secret:", "YYY" )
where "secret" is the password, and "YYY" is a 3 letter Y_es and N_o string,
which grants rights to; 'admin' 'manage' 'write access'.

You can also use the console program in utils/manager/console.prg to add/ delete users.
Look for section 8.1

To connect to a server with an authentication active with username and password, you must use
the LETO_CONNECT() function.


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 09 Out 2018 15:17
por asimoes
Boa tarde,

Atualizações hoje:

2018-10-09 11:25 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 29 Out 2018 09:30
por rubens
Bom dia...
Alguém teria o letodbf compilado para disponibilizar ?

Obrigado
Rubens

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 29 Out 2018 10:38
por rubens
Uso o BCC por causa da Minigui... e parece que tem alguns empecilhos em usar o BCC..
Por isso a solicitação do executável pronto... mas blz..

Rubens

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 29 Out 2018 20:43
por Jairo Maia
Rubens,

Não sei se é a última versão, é a que uso. Em anexo o executável.

PS: É de dezembro de 2017, e que uso atualmente:

letodb.rar
(679.8 KiB) Baixado 379 vezes

Esse é o LetoDBf, baixado do SVN e compilado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Out 2018 08:42
por porter
Olá Jairo, bom dia
Estou me familiarizando com o LetoDbf, pelo GitHub do Quintas, fiz o download, e verifiquei que existe uma pasta tests,
gostaria de saber se compilando os exemplos da pasta tests, seria um ponto de partida para entender o funcionamento do LetoDbf.
Obrigado.

Harbour 3.2.0(dev)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Out 2018 11:01
por Jairo Maia
Olá porter,

Eu consegui entender como usar o LetoDBf com esses exemplos postados pelo Toledo. Dê uma estudada no .Prg.

Nota: A conexão remota com o domínio pctoledo.noip.me não vai funcionar, ela funcionou na época e foi só para exemplo.

LetoTeste.rar
(1.01 MiB) Baixado 337 vezes

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Out 2018 17:48
por porter
Olá pessoal,
Quando tento inicializar o serviço LetoDbf, no log está retornando essa mensagem de erro, diz que letoudf.hrb não está presente em c:\letodbf\bin, como encontro esse arquivo, ele tem que ser copiado de algum lugar ou gerado, no letodb.ini já fiz a correção do DataPath apontando para \estoque, que é a pasta onde estão os arquivos DBF, se alguém puder me dar uma luz agradeço.

10.30.2018 17:29:56 UDF file: C:\LETODBF\bin\letoudf.hrb not present.
10.30.2018 17:29:56 INFO: LetoDBf Server 3.00, will run at port :2812 ( internal also used :2813 )
10.30.2018 17:29:56 INFO: DataPath=\estoque, ShareTables=0, NoSaveWA=1, max database=999
10.30.2018 17:29:56 INFO: LoginPassword=0, CacheRecords=21, LockExtended=0
10.30.2018 17:29:56 DEBUG second socket: 136 for errors established
10.30.2018 17:29:56 DEBUG thread3() with pipe handle: 144 started ..

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Out 2018 17:58
por Itamar M. Lins Jr.
Ola!
É um aviso. Eu não uso letoudf.hrb também.
Se der erro vai estar no arquivo .log posta ele e o letodb.ini

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Out 2018 18:19
por porter
boa tarde Itamar, obrigado por sua atenção.

C:\LetoDbf\bin\letodbf.log
10.30.2018 17:29:56       UDF file: C:\LETODBF\bin\letoudf.hrb not present.
10.30.2018 17:29:56 INFO: LetoDBf Server 3.00, will run at port :2812 ( internal also used :2813 )
10.30.2018 17:29:56 INFO: DataPath=\estoque, ShareTables=0, NoSaveWA=1, max database=999
10.30.2018 17:29:56 INFO: LoginPassword=0, CacheRecords=21, LockExtended=0
10.30.2018 17:29:56 DEBUG second socket: 136 for errors established
10.30.2018 17:29:56 DEBUG thread3() with pipe handle: 144 started ..


C:\LetoDbf\bin\letodb.ini
;Server = 192.168.2.47
;IP = 192.168.2.47
Port = 2812
DataPath = /estoque/
;LogPath = /tmp
Default_Driver = CDX
;Lock_Scheme = 6
;Memo_Type = FPT
Share_Tables = 0
No_Save_WA = 1
Lower_Path = 0
EnableFileFunc = 1
EnableAnyExt = 1
Allow_UDF = 1
Pass_for_Login = 0
Pass_for_Manage = 0
Pass_for_Data = 0
;Pass_File = leto_users
Cache_Records = 21
;Max_Vars_Number = 1000
;Max_Var_Size = 67108864
;Tables_Max  = 999
;Users_Max = 99
Debug = 1
Optimize = 1
;AutOrder = 0
;ForceOpt = 0
;TimeOut = 360
;Zombie_Check = 0
;Server_User = advantage
;Server_UID = 1000
;Server_GID = 4
;BC_Services = letodb;
;BC_Interface = eth2
;BC_Port = 2812
;SMB_SERVER = 1
DataBase = /
Backup = /tmp/backup
Mask = *.dbf,*.dbt,*.ntx
Lock = 1
Seconds = 30
Wait = 1
ArcCmd = tar -cvzf /tmp/backup/leto.tar.gz /tmp/backup/*

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Out 2018 20:25
por Itamar M. Lins Jr.
Ola!
Sim qual é o problema ?
Dá erro onde ?
Em todo caso, use /estoque. Não use /estoque/
Veja se é isso.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 31 Out 2018 09:29
por porter
Olá,

Sim qual é o problema ?
Dá erro onde ?
Em todo caso, use /estoque. Não use /estoque/


O LetoDb eu consigo iniciar, mas o LetoDbf, dá esse erro quando tento iniciar em serviços.
Em serviços tento iniciar o LetoDbf Service

O Windows não pôde iniciar o serviço LetoDBf Service em Computador local.
Erro:1053: O Serviço não respondeu à requisição de inicio ou controle em tempo hábil.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 31 Out 2018 10:01
por Itamar M. Lins Jr.
Ola!
Não está misturando os letos ai não ?
Tem que remover um com o comando do windows.
sc delete letodb_service

Se já tem um não vai rodar o outro, a porta TCP é a mesma. 2812 ai vai dar "PAU" mesmo.
O nome do serviço do LetoDb é "letodb_service" e do LetoDbf é "letodbf_service". Ou um ou outro os dois não vai não.
Para parar o serviço, ficar testando A ou B use:
net stop letodb_service ou net stop letodbf_service

Mas quando reiniciar a maquina o windows vai rodar eles e vai ter problemas com o "letodbf_service" rodadando na mesma porta 2812. Melhor remover com o comando "sc".
Lembrem-se que "letodbf install" "instala ele como serviço" e sempre que ligar o computador ele vai rodar. Só faz uma vez!

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 31 Out 2018 10:26
por Itamar M. Lins Jr.
Ola!
Teve essa pergunta para quem usa LINUX.
Infelizmente o erro de abertura nos módulos do sistema ainda persistem, mas hoje irei verificar as rotinas novamente.


Esse erro provavelmente é problema de nomes de DBF's com MAIÚSCULAS e minúsculas. Mudar tudo para minúsculas, inclusive dentro do PRG.
Não adianta o PRG abrir com "use CLIENTES.DBF" e o dbf ser clientes.dbf

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 31 Out 2018 12:35
por porter
Olá Itamar, obrigado por sua paciência e atenção

Agora deu certo, o LetoDbf Service está Iniciado
Em C:\LETODBF executei o hbmk2 letodbsvc.hbp e hbmk2 rddleto.hbp
Em C:\LETODBF\BIN letodb install,

Agora vou testar no sistema, com certeza terei que fazer muitos ajustes.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 31 Out 2018 13:47
por Itamar M. Lins Jr.
Ola!
Agora vou testar no sistema, com certeza terei que fazer muitos ajustes.

Faça seus testes e depois se puder informar os resultados, seremos gratos.
Não vai se arrepender. Eu já ia sair do DBF, parar de usar, mas ai com LetoDb tô aqui usando DBF e irei usar por um bom tempo.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 13:36
por rossine
Olá,

Compilei e executei o exemplo acima e achei bem interessante e também pelo fato de se ter que fazer pouca mudança no código que já uso para RDDCDX.

Me corrijam se eu estiver errado, mas pelo pouco que entendi, toda a manipulação do DBF ocorrem no servidor através do servidor do "LetoDBF" e com isto
o banco de dados danifica menos e os índices corrompem menos também quando ocorre por exemplo um pique de luz.
E parece que também à um ganho de velocidade na operações e outros benefícios tipo, acesso remoto/local via TcpIP, etc...

Seria isto ?

Obrigado,

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 15:04
por fladimir
Pessoal q esta testando, façam testes com Índices ADDITIVE MEMORY (temporários) e tais indices com clausulas FOR veja como se comporta se ocorre tudo ok...

Tipo :
DBUseArea( .T., 'LETO', 'Clientes', 'Clientes', .T.)
DBSetIndex('Clientes.CDX')
Index On Clientes->Campo  TAG Clientes1 to Clientes ADDITIVE MEMORY
Index On Clientes->Campo2 TAG Clientes2 to Clientes ADDITIVE MEMORY
Index On Clientes->Campo3 TAG Clientes3 to Clientes ADDITIVE MEMORY
Index On Clientes->Campo4 TAG Clientes4 to Clientes FOR  Clientes->Ativo == 'S'  ADDITIVE MEMORY


Eu não recordo agora como foi um teste q fiz e deu um erro, vou tentar simular novamente, mas como já tem colegas testando já façam testes tb com indices temporarios e vejam como se comportam, talvez já tenha solucionado o problema q tive ou eu q fiz errado.

Abraço.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 15:13
por Jairo Maia
Itamar M. Lins Jr. escreveu:Esse erro provavelmente é problema de nomes de DBF's com MAIÚSCULAS e minúsculas. Mudar tudo para minúsculas, inclusive dentro do PRG.
Itamar, não uso Linux, mas não seria apenas colocar no .INI do LetoDbf o comando: Lower_Path = 1?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 15:30
por rossine
Olá,

Rodando o exemplo postado, estou tentando acessar de 2 computadores e está ocorrendo o erro:

Error LETO/1006 Erro de abertura: nomes.cdx in use by other

Teria que configurar algo ?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 17:02
por porter
Olá,
Com o LetoDbf, se for abrir um arquivo, dessa forma:

USE C:\ESTOQUE\PRODUTOS.DBF EXCLUSIVE


erro: Error LETO/1001 Erro de abertura: \estoque\\produtos.dbf

Com o LetoDbf, como seria esse comando ?

Harbour 3.2.0 dev

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 18:41
por Jairo Maia
Porter, como está definido o comando DataPath = em seu arquivo letodb.ini?

Se estiver dessa forma DataPath = C:\ESTOQUE\, então apenas use:
USE PRODUTOS.DBF EXCLUSIVE

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 19:18
por porter
Olá Jairo,
Porter, como está definido o comando DataPath = em seu arquivo letodb.ini?
Se estiver dessa forma DataPath = C:\ESTOQUE\, então apenas use:


Estou tentando entender como abrir os arquivos com o LetoDBf, o DataPath está correto, DataPath= C:\ESTOQUE.
Eu uso arquivos temporários, esses arquivos existem tanto nas estações como no servidor, se abrir o arquivo dessa forma: USE PRODUTOS.DBF EXCLUSIVE,
como o sistema vai saber se é para abrir o arquivo que está no computador local no C:\ESTOQUE, ou é para abrir o arquivo que está no F:\ESTOQUE lá no servidor, existem arquivos que preciso abri-lo localmente no C:\ESTOQUE e outros no F:\ESTOQUE, entendeu.
Obrigado.

Harbour 3.2.0 dev

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 20:12
por asimoes
No final coloque VIA "DBFCDX" ou "DBFNTX" para temporários local

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 01 Nov 2018 21:54
por Jairo Maia
Olá Pessoal,

porter escreveu:Eu uso arquivos temporários
Não sei dizer sobre arquivos temporários, eu não uso.

porter escreveu:esses arquivos existem tanto nas estações como no servidor
As estações trabalham com arquivos independentes da rede? Desculpe mas não entendi.

porter escreveu: se abrir o arquivo dessa forma: USE PRODUTOS.DBF EXCLUSIVE,
como o sistema vai saber se é para abrir o arquivo que está no computador local no C:\ESTOQUE
Você terá que diferenciar arquivo que está local ou no servidor. Tem como, e falaremos sobre isso depois se você postar um trecho de código que um arquivo que tem que ser aberto na máquina local, e não no servidor. Tenho esse situação, tenha paciência para podermos ajudar. Poste um exemplo dessa situação e como você está tratando isso.

Nota: Se usar USE PRODUTOS.DBF EXCLUSIVE, o arquivo abero será o do servidor, desde que em seu .ini esteja como eu disse antes: DataPath = C:\ESTOQUE\

porter escreveu:existem arquivos que preciso abri-lo localmente no C:\ESTOQUE e outros no F:\ESTOQUE, entendeu.
Putz, acho que entendi. Abrir arquivo localmente é uma coisa, abrir no servidor é automático. Poste um exemplo que fica mais fácil explicar.

asimoes escreveu:No final coloque VIA "DBFCDX" ou "DBFNTX" para temporários local
Isso é definido no arquivo letodb.ini, definindo no comando Default_Driver = CDX ou NTX. Exemplo: Default_Driver = CDX

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Nov 2018 07:04
por asimoes
A cláusula VIA é para informar qual RDD deseja utilizar,
LETO, DBFCDX ou DBFNTX

Se não informar vai utilizar o que foi definido em
RddSetDefault

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Nov 2018 09:45
por Jairo Maia
asimoes escreveu:A cláusula VIA é para informar qual RDD deseja utilizar,
LETO, DBFCDX ou DBFNTX
Sim. Quando mudei para o RDD LETO, também alterei todos os comandos USE, que eram poucos por esse como está no exemplo do Toledo:
DbUseArea( .T.,  "LETO", PathLeto + cArqDbf,  cAlias,  .T.  )
Sintaxe:
DbUseArea( [<lNewArea>]  , [<cRddName>]  , <cDatabase>  , [<cAlias>] , [<lShared>] , [<lReadonly>] , [<cCodePage>] , [<nConnection>] ) --> NIL
<lNewArea>
If .T. (true) is passed for <lNewArea>, the function selects the next unused work area before the database is opened. The default value is .F. (false), which opens the database in the current work area. If the current work area is used, all files are closed before the new database is opened.

<cRddName>
<cRddName> is an optional character string with the name of the RDD to use for opening the database file. It defaults to the return value of RddSetDefault().

<cDatabase>
This is a character string holding the name of the database file to open. It can include path and file extension. The default file extension is DBF.

<cAlias>
This is the symbolic alias name of the work area as a character string. It defaults to the file name of <cDatabase> without extension.

<lShared>
Specifying .T. (true) for <lShared> opens the database in SHARED mode. The default value depends on the SET EXCLUSIVE setting. If set to ON, <lShared> defaults to .F. (false).

<lReadonly>
Specifying .T. (true) for <lReadonly> opens the database in READONLY mode. The default value is .F. (false) which opens the file for read and write access.

<cCodePage>
This is a character string specifying the code page to use for character strings stored in the database. It defaults to the return value of HB_SetCodePage().

<nConnection>
This parameter specifies a numeric server connection handle. It is returned by a server connection function which establishes a connection to a database server, such as SR_AddConnection() of the xHarbour Builder SQLRDD. When <nConnection> is passed, the function opens a database on the server.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Nov 2018 10:22
por porter
Putz, acho que entendi. Abrir arquivo localmente é uma coisa, abrir no servidor é automático. Poste um exemplo que fica mais fácil explicar.

Olá Jairo,
O arquivo ARQTEMP, está presente em todas as estações e no servidor, nele é inserido registros, e após terminar o processo, todos esses registros
do ARQTEMP, são inseridos em VENDAS, que existe somente no servidor, em seguida todos os registros de ARQTEMP são deletados, faço da seguinte forma:

SELECT 2
USE C:\ESTOQUE\ARQTEMP EXCLUSIVE
APPEND BLANK
REPLACE CODIGO WITH cCODIGO
REPLACE DESCRICAO WITH cDESCRICAO
REPLACE VALOR WITH cVALOR

SELECT 3
USE F:\ESTOQUE\VENDAS SHARED

SELECT 2 ; GOTO TOP
DO WHILE !EOF()
     cCODIGO := CODIGO
     cDESCRICAO := DESCRICAO
     cVALOR := VALOR
     SELECT 3
     APPEND BLANK
     REPLACE CODIGO WITH cCODIGO
     REPLACE DESCRICAO WITH cDESCRICAO
     REPLACE VALOR WITH cVALOR
     SELECT 2
     SKIP
ENDDO
SELECT 2
DELE ALL ; PACK


Harbour 3.2.0 dev

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Nov 2018 11:23
por Jairo Maia
Porter, quando você falou em arquivo temporário achei que seria um arquivo criado na memória. No seu caso, ambos são arquivos físicos, apenas um deles, ARQTEMP, recebe dados temporários, mas é um arquivo físico.

Vou sugerir da forma que faço. Além do RDD LETO, coloque também o RDD DBFNTX, mantendo como padrão o RDD LETO. Exemplo:
REQUEST LETO
REQUEST DBFCDX

Abaixo da Function Main coloque o RDD padrão:
Function Main()
...
...
RDDSetDefault( "LETO" )

E tente dessa forma, veja se vai funcionar:
SELECT 2
//USE C:\ESTOQUE\ARQTEMP EXCLUSIVE
DbUseArea( .F.,  "DBFCDX", "C:\ESTOQUE\ARQTEMP", "ARQTEMP",  .F.  )
APPEND BLANK
REPLACE CODIGO WITH cCODIGO
REPLACE DESCRICAO WITH cDESCRICAO
REPLACE VALOR WITH cVALOR

SELECT 3
//USE F:\ESTOQUE\VENDAS SHARED

// se na variavel DataPath de seu letodb.ini terminar com barra (\) use:
DbUseArea( .F.,  "LETO", "VENDAS", "VENDAS",  .T.  )

// se na variavel DataPath de seu letodb.ini estiver sem a barra no final use:
//DbUseArea( .F.,  "LETO", "\VENDAS", "VENDAS",  .T.  )

SELECT 2 ; GOTO TOP
DO WHILE !EOF()
     cCODIGO := CODIGO
     cDESCRICAO := DESCRICAO
     cVALOR := VALOR
     SELECT 3
     APPEND BLANK
     REPLACE CODIGO WITH cCODIGO
     REPLACE DESCRICAO WITH cDESCRICAO
     REPLACE VALOR WITH cVALOR
     SELECT 2
     SKIP
ENDDO
SELECT 2
ZAP

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Nov 2018 14:30
por porter
Jairo, realmente se trata de um arquivo físico, me expressei mal, estou fazendo alguns testes com
USE C:\ESTOQUE\ARQTEMP EXCLUSIVE VIA "DBFCDX", até agora está dando certo, mas pretendo também testar
da forma que você sugeriu, irei postando os resultados, porquê com certeza, deverão ser feito mais ajustes.

Obrigado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 02 Nov 2018 20:20
por Itamar M. Lins Jr.
Ola!
banco de dados danifica menos e os índices corrompem menos também quando ocorre por exemplo um pique de luz.
E parece que também à um ganho de velocidade na operações e outros benefícios tipo, acesso remoto/local via TcpIP, etc...

Seria isto ?

Sim.
Outra questão levantada. É abrir o DBF ou SGBD, qualquer. Podemos fazer isso, basta MUDAR no use "VIA LETO", "VIA DBFCDX"... Até "VIA SQLMIX" que abre o MariaDB, etc... Tudo junto.

Porter, com o Letodb vc não precisa mais trabalhar da forma que vc está trabalhando criando esses arquivos temporários(físico no HD) da estação. Não tem mais necessidade.
Quando lemos temporário pensamos ser um índice temporário ou na memória RAM.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Nov 2018 14:38
por porter
Olá,

Com esse comando, USE arqPARAM SHARED, consigo abrir esse arquivo normalmente se executar o sistema no servidor,
mas se executar o sistema na estação para acessar esse mesmo arquivo lá no servidor, está dando o erro:

Error LETO/1001 Erro de abertura: arqPARAM

Aqui, se eu tentar conectar com o IP do servidor, não conecta, somente da certo se cPath = "//localhost:2812/"
executando o sistema pela estação.

cPath := "//192.168.0.202:2812/
PROCEDURE ConectaLetoDbf(cPath)
    nConect := leto_Connect( cPath)
    // Faz o teste de conexao
    IF nConect == -1
       SetColor( "GR+/B" )
      CLS
       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
          MsgExclamation( "Nao conectado ao servidor: " + cPath )
       ENDIF
       Return .F.
     ENDIF

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Nov 2018 16:33
por asimoes
127.0.0.1 é o IP local
Na computação, o termo localhost se refere à localização do sistema que está sendo usado. É um dispositivo loopback ao qual é atribuído o endereço IP 127.0. 0.1

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Nov 2018 18:33
por Jairo Maia
Olá Pessoal,

No servidor, identifique qual é o IP do servidor. Uma forma simples de fazer isso é NO SERVIDOR, ir ao prompt de comando e digitar: ipconfig. Identifique o IPv4 do servidor, abra o sistema na estação, e informe o IP de onde está instalado o LetoDBf, ou seja, o IP do servidor.

Nas estações, não precisa ser instalado o LetoDBf, apenas informar o IP de onde ele está instalado.

Figura1.jpg

Figura2.jpg

Guarde essa informação como achar melhor, eu optei por guardar em um arquivo .HBV em cada estação, deixando claro que no Servidor sempre deixo o IP fixo.

Adaptado a meus sistemas. Crédito: Toledo (em exemplo postado nesse fórum).

Nota: Sempre lembrando a importante colaboração do Itamar , precursor em compartilhar dicas e informações sobre o LetoDBf.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 03 Nov 2018 19:13
por fladimir
Jairo ou outro colega, mesmo q não trabalhe com indice temporario, mas q esta testando ou usa o LETO, se possível fazer o seguinte teste:

Crie um rotina teste em LETO pra acessar uma tabela de clientes por exemplo
Criar um indice temporario na memoria filtrando no indice via FOR algo, tipo q nasceram em outubro ou outro filtro
Depois chame um Browse e poste os resultados

Grato.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Nov 2018 10:11
por Jairo Maia
Olá fladimir,

Na verdade não trabalho com índice temporário, mas dá para montar um exemplo. Se nenhum colega se antecipar, assim que puder monto e posto aqui.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Nov 2018 10:29
por Itamar M. Lins Jr.
Ola!
Aqui, se eu tentar conectar com o IP do servidor, não conecta, somente da certo se cPath = "//localhost:2812/"

Vc precisa liberar a porta do FIREWALL do servidor ai e se tem algum antivirus deve verificar isso.
Adicionar regra de exceção no FIREWALL PORTA 2812 do LETODBF.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Nov 2018 11:19
por asimoes
Estranho isso, no servidor eu gravo o IP dele em arquivo
.ini. E a minha aplicação lê o IP não tem erro

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Nov 2018 11:30
por Itamar M. Lins Jr.
Ola!
deixando claro que no Servidor sempre deixo o IP fixo.

Eu padronizo o nome do servidor LetoDbf. E deixo fixo também.
Se a maquina na qual está instalado o LetoDbf, chame-se "servidor", eu deixo em um arquivo .INI, ai posso copiar para qualquer estação esse arquivo.
Bom deixar os IP´s da estações fixos, porque quando muda o IP, cai a conexão.
E altero no roteador para atribuir os IP's dos celulares acima de tal faixa, para não colidir com os IP´s fixos.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Nov 2018 16:13
por asimoes
No roteador é só identificar o mac das placas e atribuir os IP´s
Meu cliente tem 1 servidor e 3 estações, uma rede simples, nunca tive problemas com acesso, só quando o roteador queimou, coisas do tempo.
Foi só trocar o roteador e reatribuir os IP´s, coisa de 10 min no máximo, uma rede grande é melhor atribuir um IP fixo para o servidor e o resto das
estações com DHCP

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Nov 2018 11:38
por porter
Olá pessoal,
Pela estação, estou conseguindo acessar normalmente o servidor, e pela estação, para abrir um arquivo que está no servidor com o USE ESTQ001 SHARED
abre normalmente, mas quando tento abrir outro arquivo dessa mesma forma, da estação está dando o seguinte erro:

Error Base/1132: Erro de limite: acesso de array

Os dois arquivos estão no servidor, e pela estação somente o primeiro abre, o segundo dá o erro descrito acima, tenho que fazer alguma
configuração no letodb.ini ?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Nov 2018 17:58
por asimoes
Porter,

Esse é o letdb.ini que eu uso, veja o que está diferente no seu.

;Server = \\192.168.56.1
;IP = 127.0.0.1
Port = 2812
DataPath = DB
;LogPath = /tmp
Default_Driver = CDX
;Lock_Scheme = 6
;Memo_Type = FPT
Share_Tables = 0
No_Save_WA = 1
Lower_Path = 0
EnableFileFunc = 1
EnableAnyExt = 1
Allow_UDF = 1
Pass_for_Login = 0
Pass_for_Manage = 0
Pass_for_Data = 0
;Pass_File = "leto_users"
Cache_Records = 21
;Max_Vars_Number = 1000
;Max_Var_Size = 67108864
;Tables_Max  = 999
;Users_Max = 99
Debug = 1
Optimize = 1
;HardCommit = 0 ver readme.txt
;AutOrder = 0
;ForceOpt = 0
;TimeOut = 360
;Zombie_Check = 30
;Server_User = advantage
;Server_UID = 1000
;Server_GID = 4
;BC_Services = letodb;
;BC_Interface = eth2
;BC_Port = 2812
DataBase = DB
;Backup = C:\Users\cisin\Documents\GitHub\LetoDBf\bin\backup
Mask = *.dbf,*.dbt,*.ntx
Lock = 1
Seconds = 30
Wait = 1
ArcCmd = tar -cvzf /tmp/backup/leto.tar.gz /tmp/backup/*

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Nov 2018 19:20
por porter
Olá Asimões, obrigado por responder.
Fiz as modificações, conforme o seu arquivo letodb.ini, o comando USE ESTQ001 SHARED executa e em seguida da a mensagem de erro: Error Base/1132: Erro de limite: acesso de array, só consegue acessar apenas o primeiro arquivo do servidor, quando tenta acessar o segundo arquivo, da erro, não consegui descobrir ainda onde estou errando.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Nov 2018 20:09
por Itamar M. Lins Jr.
Ola!
Porter, vc pŕecisa criar os exemplos e postar para todos nós testarmos.
FUNCTION MAIN
LOCAL aStru := {}
IF LETO_CONNE...
Cria estrutura do DBF vazio, indexar, etc...
BROWSE()

Dessa forma que vc está fazendo as suas perguntas fica muito cansativo, agente tentar adivinhar o que pode ser.
Isso não é erro do LetoDbf, tá parecendo que tem uma função ligada na abertura do arquivo(indice) não sei, e o LetoDb não enxerga.
Cadê esse arquivo ? cadê os códigos ?
Posta ai, agora bem simplificado.
A mesma coisa ocorre com outras pessoas que estão querendo usar o Letodbf.
Tem que aprender isolar o problema, linha por linha, fazer teste com códigos pequenos para que todos nós possamos testar. Pode ser um BUG do LetoDb e pode não ser.
Function main
local aStru := {{"nome","c",10,0}} //criar um DBF com apenas uma linha
local cPath := '//192...
IF leto_Connect( cPATH ) < 0
alert("erro...

  IF dbCreate( cPath + aStru)
      ? "Arquivo criado via leto..."
   ENDIF


Ai todo mundo vai saber te ajudar.

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Nov 2018 21:11
por asimoes
Porter,

Tem que usar o bom e velho debug, habilita o -b no hbp ou hbm, e coloca o altd() antes da abertura dos dbf´s, outra coisa mostra pra gente a sua rotina de abertura dos arquivos, pode ter algo errado ai

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Nov 2018 21:29
por asimoes
Porter,

Tenta isso:

USE ESTQ001 SHARED NEW ( a cláusula new é para atribuir uma nova área pro dbf )

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 06 Nov 2018 16:47
por porter
Olá,
O erro ocorre quando bloqueio um registro de PRODUTOS por exemplo para gravar e em seguida tento abrir CLIENTES por exemplo, eu não estava descobrindo o erro
porque o arquivo era aberto em outra parte do sistema, então não imaginava que o motivo era esse, então alterei e coloquei a
abertura do arquivo logo abaixo.

BloqReg( "PRODUTOS" )
REPLACE ULTVENDA WITH DATE()
UNLOCK
USE CLIENTES SHARED  -->> Error Base/1132: Erro de limite: acesso de array nessa linha, se bloquear registro para gravar.

FUNCTION BLOQREG(ARQ)
      SAVE SCREEN
      IF RLOCK()
         RETURN .T.
      ELSE
         DO WHILE .T.
            IF !RLOCK()
               MENSAGEM("Registro Indisponível!  ( " + ARQ + " ) " )
               RESTORE SCREEN
               LOOP
            ENDIF
            EXIT
         ENDDO
      ENDIF
      RETURN .T.


LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 06 Nov 2018 17:15
por Itamar M. Lins Jr.
Ola!
Porter use ALIAS no rlock() e em todo lugar, não sabemos que área está aberta, abrimos no início, e vamos só direcionando.
(cAlias)->(Rlock())

Da forma que vc mostrou o código, está embolando as áreas(tabelas)
BloqReg( "PRODUTOS" )
produtos->ULTVENDA := DATE() //não precisa do replace.
produtos->(DbUNLOCK())
IF SELECT("CLIENTES") > 0
  //JA TÁ ABERTO
ELSE
   USE CLIENTES SHARED 
ENDIF
//NA FUNÇÃO BLOQREG
FUNCTION BLOQREG(cAlias)
LOCAL lOk := .T.
hb_default(@cAlias,alias())
Do While .t.
      IF (cAlias)->(RLOCK())
          exit
      else
          IF neterr()
               MENSAGEM("Registro Indisponível!  ( " + ARQ + " ) " )
         lOk := .F.
...
ENDDO
Return lOk


Entendeu a lógica ?

Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 06 Nov 2018 18:44
por asimoes
Eu acrescentaria USE CLIENTES SHARED NEW

NEW para informar que está sendo aberto em uma área nova, se não fizer isso vai "matar" alguma área previamente informada

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 07 Nov 2018 14:40
por Itamar M. Lins Jr.
Ola!
A cláusula NEW, deve ser usada apenas para o numero 1,2,3,4,5... não colidir
O correto é verificar se está ou não aberto com SELECT() para não abrir várias vezes o mesmo DBF sem necessidade.
Se precisar usar um PACK, e não souber onde o DBF está aberto(área 1,2,3..) ? ou um flock/rlock travando ?

SELECT([<cAlias>]) --> nWorkArea

SELECT()
Determine the work area number of a specified alias
------------------------------------------------------------------------------
Syntax

     SELECT([<cAlias>]) --> nWorkArea

Arguments

     <cAlias> is the target work area alias name.

Returns

     SELECT() returns the work area of the specified alias as an integer
     numeric value.

Description

     SELECT() is a database function that determines the work area number of
     an alias.  The number returned can range from 0 to 250.  If <cAlias> is
     not specified, the current work area number is returned.  If <cAlias> is
     specified and the alias does not exist, SELECT() returns zero.

     Note:  The SELECT() function and SELECT command specified with an
     extended expression argument look somewhat alike.  This should not be a
     problem since the SELECT() function is not very useful on a line by
     itself.

Examples

     .  This example uses SELECT() to determine which work area
        USE...NEW selected:

        USE Sales NEW
        SELECT 1
        ? SELECT("Sales")            // Result: 4

     .  To reselect the value returned from the SELECT() function, use
        the SELECT command with the syntax, SELECT (<idMemvar>), like this:

        USE Sales NEW
        nWorkArea:= SELECT()
        USE Customer NEW
        SELECT (nWorkArea)


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 07 Nov 2018 15:27
por porter
Olá Itamar e asimões
Com DBFCDX, dá certo tanto da forma que eu vinha fazendo, como também dá certo, do jeito que você sugeriu,
mas com o LetoDbf, o mesmo erro ainda persiste, o erro ocorre quando executo o sistema na estação, o LetoDbf conecta normalmente tanto local como na estação, estou achando que o erro não está na forma como estou bloqueando o registro, ainda não descobri onde estou errando, USE CLIENTES SHARED NEW,
também dá o mesmo erro.
No servidor tenho uma pasta chamada LETODBF, e nessa pasta tenho esses arquivos:
leto.sh
letodb.exe
LETODB.INI
letodbf.log

letodbf.log
11.07.2018 15:47:38 INFO: connected  192.168.0.100:1967 estoque.exe CP: PT850  DF: dd/mm/yy  conn-ID 0
11.07.2018 15:47:46 INFO: disconnect 192.168.0.100:1967 estoque.exe users=(1 : 1 : 2), tables=(0 : 4)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 07 Nov 2018 18:45
por porter
Olá pessoal,
Não sei o motivo, mas ao comentar essa linha, não dá mais erro.

// produtos->(DbUNLOCK())

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Nov 2018 08:55
por rubens
Bom dia
E tem uma função nova para isso
Passe a usar DBRunlock() para destravar o registro...

Rubens

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Nov 2018 09:16
por asimoes
Porter eu uso:
APC01->( DbRLock() )

APC01->( DbCommit(), DbSkip(0), DbUnlock() )

Com LetoDb

Lembro de ter tido problemas com LetoDbf relacionado ao timeout da conexão com abertura de tabelas e gravação
Descobri que era o timeout, defini para -1 e nunca mais tive problemas. Eu uso o LetoDbf (fork) atualizado

   VAR nTimeOut         AS INTEGER INIT -1
   .
   .
   Do While Leto_Connect( ::cServidorDB, , , ::nTimeOut ) < 0
      If ::nLoop > 10 .AND. ::nLoop < 15
         cIpAddServer  := hwg_GetIni( 'CONFIGURACAO', 'Addr', '', [SERVER5\LETODBSERVER.INI] )
         cPortaServer  := hwg_GetIni( 'CONFIGURACAO', 'Port', '', [SERVER5\LETODBSERVER.INI] )
         ::cServidorDB := [//] + cIpAddServer + [:] + cPortaServer + [/]
      Elseif ::nLoop > 15
         ::lConnect := .F.
         Exit
      Elseif ::nLoop <= 10
         cIpAddServer  := aNICS[nVezes,1] //"127.0.0.1"
         ::cServidorDB := [//] + cIpAddServer + [:] + cPortaServer + [/]
         nVezes ++
         If nVezes  = Len( aNICS )
            nVezes := 1
         Endif
      Endif   
      ::nLoop ++
      oClPF:DoEvents()
   Enddo 

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Nov 2018 10:11
por porter
Olá pessoal,
Como disse no tópico acima, o problema ocorre quando executo UNLOCK, DBunlock ou DbrUnlock e tento abrir um novo arquivo
logo em seguida, se comentar esses comandos UNLOCK, DBunlock ou DbrUnlock, consigo normalmente abrir um novo arquivo,
vou desinstalar o LETODBF no servidor e instalar novamente para ver se dá certo.
Gostaria de saber, como faço para saber qual a versão do LETODBF, estou usando, porquê lá em serviços não consigo ver a versão,
e em programas instalados, ele não aparece.
Rubens DbrUnlock também não deu certo, Asimões vou testar essa rotina que você postou.

Obrigado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Nov 2018 10:57
por asimoes
porter escreveu:Gostaria de saber, como faço para saber qual a versão do LETODBF


Tem essa função LETO_GETSERVERVERSION() Nunca usei.

2018-11-08 11_59_46-Window.png
2018-11-08 11_59_46-Window.png (2.68 KiB) Visualizado 92638 vezes

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Nov 2018 20:14
por fladimir
E o teste q propus alguém fez? poderia postar os resultados?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 11 Nov 2018 10:34
por asimoes
Olá Pessoal,

No letoudf.prg tem esse código, alguém poderia explicar como funciona isso, a função cria uma tabela em memória
Isso é executado com a função leto_UDF() ?

FUNC elktest
  LOCAL cReturn := leto_Alias()
  LOCAL cAlias := leto_Alias( "ELK" )

  cReturn += "==" + cAlias  + ";"

  IF EMPTY( cAlias )
     IF leto_dbcreate( "mem:elk",{{"name","C",32,0},{"age","N",3,0}},"DBFCDX",.T.,"ELK")
        leto_ordcreate( "ELK", "mem:elk", "name", "NAME" )
        cReturn += leto_alias("ELK") + "#"
        leto_ordcreate( "ELK", "mem:elk", "age", "AGE" )
        leto_dbclosearea()
     ENDIF
  ENDIF
RETURN cReturn

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 11 Nov 2018 10:41
por asimoes
Fiz o teste:

Na minha aplicação fiz a execução hwg_msginfo(leto_UDF( "elktest" ))

2018-11-11 11_38_24-.png


A pergunta é: a tabela foi criada no servidor ou no cliente (no computador onde executou a chamada)?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 11 Nov 2018 17:34
por asimoes
leto_dbcreate() e leto_OrdCreate() são funções para executar no servidor, através da letoudf

leto_dbcreateTemp() função cliente identica a leto_dbcreate()

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 11 Nov 2018 18:37
por fladimir
uma dúvida isso não tem nada a ver com o teste q eu propus de indice temporario ou no caso de indice temporario filtrado tb tenho q usar essa função?

Alguém testou da forma q eu falei?

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 11 Nov 2018 19:36
por asimoes
fladimir escreveu:uma dúvida isso não tem nada a ver com o teste q eu propus de indice temporario ou no caso de indice temporario filtrado tb tenho q usar essa função?

Alguém testou da forma q eu falei?


Manda a estrutura da tabela e coloca novamente o que você quer testar, farei o teste.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Nov 2018 21:27
por fladimir
Alexandre, grato pela atenção...

Segue abaixo estrutura e chaves dos indices q utilizo

O q gostaria q testasse é criar a partir dessa tabela um indice temporario via LETO e ver se mostra correto em um BROWSE.

No ultimo teste a quase 1 ano atrás eu tinha tido um erro, mas não lembro como fiz, como não usei/testei mais o LETO não recordo totalmente os detalhes.

/*
* Estrutura clientes.dbf
*/
LOCAL aField[101]
   aField[001] := {"CODIGO"    , "C",  8,  0}
   aField[002] := {"NOME"      , "C", 60,  0}
   aField[003] := {"ENDERECO"  , "C", 60,  0}
   aField[004] := {"BAIRRO"    , "C", 25,  0}
   aField[005] := {"CIDADE"    , "C", 25,  0}
   aField[006] := {"ESTADO"    , "C",  2,  0}
   aField[007] := {"PONTOREF"  , "C", 25,  0}
   aField[008] := {"NASCIMENTO", "D",  8,  0}
   aField[009] := {"CEP"       , "C",  9,  0}
   aField[010] := {"TELEFONE"  , "C", 14,  0}
   aField[011] := {"LOJA"      , "C",  3,  0}
   aField[012] := {"TOLERANCIA", "N",  3,  0}
   aField[013] := {"BLOQUEIO"  , "N",  3,  0}
   aField[014] := {"JUROS"     , "N",  3,  0}
   aField[015] := {"DESCONTO"  , "N",  6,  2}
   aField[016] := {"DESCONTO2" , "N",  6,  2}
   aField[017] := {"RG"        , "C", 35,  0}
   aField[018] := {"INSCRICAO" , "C", 16,  0}
   aField[019] := {"CPF"       , "C", 11,  0}
   aField[020] := {"CNPJ"      , "C", 15,  0}
   aField[021] := {"EXTERNO"   , "C",  6,  0}
   aField[022] := {"TEMCASA"   , "C",  1,  0}
   aField[023] := {"TRABALHO"  , "C", 25,  0}
   aField[024] := {"CARGO"     , "C", 17,  0}
   aField[025] := {"SALARIO"   , "N",  9,  2}
   aField[026] := {"FONECOM"   , "C", 14,  0}
   aField[027] := {"FILIACAO"  , "C", 60,  0}
   aField[028] := {"CONJUGE"   , "C", 35,  0}
   aField[029] := {"NASCCONJ"  , "D",  8,  0}
   aField[030] := {"RGCONJ"    , "C", 15,  0}
   aField[031] := {"CPFCONJ"   , "C", 16,  0}
   aField[032] := {"TRABCONJ"  , "C", 20,  0}
   aField[033] := {"GANHOCONJ" , "N",  9,  2}
   aField[034] := {"CARGOCONJ" , "C", 21,  0}
   aField[035] := {"FONECONJ"  , "C", 14,  0}
   aField[036] := {"LIMITE"    , "N",  9,  2}
   aField[037] := {"CREDITO"   , "N", 12,  2}
   aField[038] := {"CADASTRO"  , "D",  8,  0}
   aField[039] := {"OBSERVACAO", "C", 70,  0}
   aField[040] := {"BLOQUEADO" , "C",  1,  0}
   aField[041] := {"AUTORIZA1" , "C", 30,  0}
   aField[042] := {"AUTORIZA2" , "C", 30,  0}
   aField[043] := {"AUTORIZA3" , "C", 30,  0}
   aField[044] := {"AUTORIZA4" , "C", 30,  0}
   aField[045] := {"DTULTCOMP" , "D",  8,  0}
   aField[046] := {"VLULTCOMP" , "N", 12,  2}
   aField[047] := {"BANCO"     , "C",  3,  0}
   aField[048] := {"AGENCIA"   , "C", 10,  0}
   aField[049] := {"CONTA"     , "C", 14,  0}
   aField[050] := {"APOSENTADO", "C",  1,  0}
   aField[051] := {"REFERENCIA", "C", 30,  0}
   aField[052] := {"VENDECRED" , "C",  1,  0}
   aField[053] := {"MES_ANO"   , "C",  4,  0}
   aField[054] := {"TIPO"      , "C",  1,  0}
   aField[055] := {"DIACOBRA"  , "C",  2,  0}
   aField[056] := {"SITUACAO"  , "C",  2,  0}
   aField[057] := {"MALADIRETA", "C",  1,  0}
   aField[058] := {"DTCADASTRO", "D",  8,  0}
   aField[059] := {"SENHA"     , "C",  5,  0}
   aField[060] := {"FANTASIA"  , "C", 30,  0}
   aField[061] := {"EMAIL"     , "C", 50,  0}
   aField[062] := {"HOME"      , "C", 35,  0}
   aField[063] := {"PRODUTOR"  , "C", 16,  0}
   aField[064] := {"REFCOM1"   , "C", 60,  0}
   aField[065] := {"REFCOM2"   , "C", 60,  0}
   aField[066] := {"REFCOM3"   , "C", 60,  0}
   aField[067] := {"VALEDESC"  , "C",  1,  0}
   aField[068] := {"PROMOCAO"  , "C",  1,  0}
   aField[069] := {"NATURALID" , "C", 25,  0}
   aField[070] := {"CODMUN"    , "C",  7,  0}
   aField[071] := {"DTULTATU"  , "D",  8,  0}
   aField[072] := {"NUMEROEND" , "C",  8,  0}
   aField[073] := {"MAXVLRPARC", "N", 12,  3}
   aField[074] := {"NRCALCADO" , "C",  2,  0}
   aField[075] := {"NRCALCCONJ", "C",  2,  0}
   aField[076] := {"CATEGORIA" , "C",  5,  0}
   aField[077] := {"GRUPO"     , "C",  5,  0}
   aField[078] := {"SUBGRUPO"  , "C",  5,  0}
   aField[079] := {"ORGAOEXP"  , "C",  2,  0}
   aField[080] := {"CARTTRAB"  , "C", 20,  0}
   aField[081] := {"AVALISTA1" , "C", 20,  0}
   aField[082] := {"DTULTSERV" , "D",  8,  0}
   aField[083] := {"VLULTSERV" , "N", 12,  2}
   aField[084] := {"CELULAR"   , "C", 14,  0}
   aField[085] := {"TEMPOSERV" , "C", 20,  0}
   aField[086] := {"QUEMCADALT", "C", 20,  0}
   aField[087] := {"AUT1_CPF"  , "C", 11,  0}
   aField[088] := {"AUT1_RG"   , "C", 21,  0}
   aField[089] := {"AUT1_NASC" , "D",  8,  0}
   aField[090] := {"AUT2_CPF"  , "C", 11,  0}
   aField[091] := {"AUT2_RG"   , "C", 21,  0}
   aField[092] := {"AUT2_NASC" , "D",  8,  0}
   aField[093] := {"AUT3_CPF"  , "C", 11,  0}
   aField[094] := {"AUT3_RG"   , "C", 21,  0}
   aField[095] := {"AUT3_NASC" , "D",  8,  0}
   aField[096] := {"AUT4_CPF"  , "C", 11,  0}
   aField[097] := {"AUT4_RG"   , "C", 21,  0}
   aField[098] := {"AUT4_NASC" , "D",  8,  0}
   aField[099] := {"LATITUDE"  , "N", 14,  8}
   aField[100] := {"LONGITUDE" , "N", 14,  8}
   aField[101] := {"NET_ID"    , "C", 20,  0}
   
// Array onde tem as chaves q uso para os indices:   
     #define ch_Files_03 {{ .f., 'clientes',  'clientes', 'codigo',                                .t.,'clientes1'  },;
                         { .f., 'clientes',  'clientes', 'nome',                                   .f.,'clientes2'  },;
                         { .f., 'clientes',  'clientes', 'cpf',                                    .f.,'clientes3'  },;
                          { .f., 'clientes',  'clientes', 'cnpj',                                  .f.,'clientes4'  },;
   { .f., 'clientes', 'clientes', 'STRZERO(Val(CharOnly("0123456789", Telefone)), LEN(Telefone))', .F.,'clientes5'  },;
           { .f., 'clientes', 'clientes', 'padr(CharOnly("0123456789", Telefone), LEN(Telefone))', .f.,'clientes6'  },;
                         { .f., 'clientes',  'clientes', 'fantasia',                               .f.,'clientes7'  },;
                         { .f., 'clientes',  'clientes', 'dtos(DtUltComp)',                        .f.,'clientes8'  },;
                     { .f., 'clientes',  'clientes', 'dtos(DtCadastro)',                           .f.,'clientes9'  },;


Era algo assim (fiz de cabeça, da uma revisada ai por favor se não escrevi nada errado... Kkkk):

#include 'rddleto.ch'

function TesteLETO()
        PRIVATE Cli1 := 10, Cli2 := 1000, cGrupo := "01" //----> Pensei q pudesse ser visibilidade tentei LOCAL, PRIVATE, STATIC, PUBLIC

   DBCLOSEALL()
   DbUseArea( .T., 'LETO', 'Clientes, 'Clientes', .T.)
   DBSETINDEX('Clientes.CDX')

   // Criando indices temporarios
   INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
          FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
          Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY
   Browse()

   INDEX ON Clientes->Codigo  TAG Temp02  TO (arquivotmp) ;
          FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
          Clientes->MalaDireta=="N" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY
   Browse()

return

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 10:12
por Itamar M. Lins Jr.
Olá!
Não vai funcionar em versão nenhuma.
Cli1,cli2,cgrupo não existem do lado do servidor. Nem com nenhum SGBD. Esqueceu que precisa usar '+' para juntar a query ?

Saudações,
Itamar M. Lins Jr

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 11:27
por fladimir
Entendi, foi o q eu deduzi nos meus testes, somente trocando os valores antes de mandar pro FOR.

Blz, agradeço pela elucidação explicativa, pq eu apesar de ter visto como funcionava não entendia o porque.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 12:13
por asimoes
Itamar M. Lins Jr. escreveu:Olá!
Não vai funcionar em versão nenhuma.
Cli1,cli2,cgrupo não existem do lado do servidor. Nem com nenhum SGBD. Esqueceu que precisa usar '+' para juntar a query ?

Saudações,
Itamar M. Lins Jr

É dessa forma que eu faço é até uma dica antiga do Itamar

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 14:37
por rubens
Boa tarde..
Itamar, como seria então... ?
Obrigado

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 14:55
por fladimir
Então o ruim é q 90% do meu sistema seja temporário ou não uso dessa forma...
Pra mim alterar tudo seria muito trabalho tento vista outros projetos.

Mas agradeço a todos.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 17:12
por asimoes
Fladmir,

Um exemplo de como eu faço os indices temporários com LetoDbf

cOrder := [ CODIGO ]
cQuery := [ ! Left( Classe_Pg, 2 ) $ "06,08,10,11,12" .AND. Empty( D_Faleci ) .AND. Empty( D_Deslig ) .AND. ! Deleted() ]
INDEX ON &cOrder. TAG A020100 FOR &cQuery. TEMPORARY ADDITIVE EVAL oClPF:Evento()

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 17:16
por asimoes
Essa aqui foi meio fo.. de fazer por que é um filtro para um do while..enddo
cVar1 := 'APC01->D_CL10 >= CTOD(' + ['] + DTOC( ThisForm:oDataIni:GetValue() ) + ['] + ') .AND. '
cVar2 := 'APC01->D_CL10 <= CTOD(' + ['] + DTOC( ThisForm:oDataFim:GetValue() ) + ['] + ') .AND. '   
CVar3 := cVar1 + cVar2 + 'Left( APC01->Classe_Pg, 2 ) = "10"'
nRegistros := ::GravaTemp( CVar3 )   

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 17:32
por fladimir
Obrigado por compartilhar Alexandre.

Esse ultimo ai ta loco... eu tb qdo o negocio é complexo subdivido e vou juntando depois as partes A B C etc.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 17:40
por asimoes
Fladimir,

Consegui indexar o seu exemplo e mostrar os dados:
Obs. Substitui o Browse() por DbEdit(), mas os registro foram exibidos.
Note que eu usei leto_dbcreateTemp()

  arquivotmp := "TESTE"
   
   cli1       := "001"
   
   cli2       := "002"
   
   cGrupo     := "01"
   
   leto_dbcreateTemp( "mem:clientes", aField, "DBFCDX", .T., "clientes")
   
   INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
          FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
          Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY
   
   clientes->( DbAppend() )
   Clientes->Codigo     := "001"
   clientes->Situacao   := "01"
   Clientes->MalaDireta := "S"
   clientes->( DbCommit() )
     
   clientes->( DbAppend() )   
   Clientes->Codigo     := "002"
   clientes->Situacao   := "01"
   Clientes->MalaDireta := "S"
   clientes->( DbCommit() )
   
   clientes->( DbGoTop() )
   
   DbEdit()

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 18:38
por fladimir
Interessante, vou ver se consigo voltar aos testes..

Vlw Alexandre.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 19:02
por asimoes
Fladimir,

Confirmando o que já foi disse pelo Itamar:
O que está do lado do servidor tem que existir nele.

Acho que vale a pena modificar os indices temporários, veja: a criação
//INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
//       FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
//       Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY

cOrder := [ Codigo ]
cQuery := [ VAL(Codigo) >= ] + Hb_NtoS( Val( cli1 ) ) + [ .AND. VAL( Codigo ) <= ] + Hb_NtoS( Val( cli2 ) ) + [ .AND. ] + ;
          [ MalaDireta == "S" .AND. Situacao == '] + cGrupo + [']

INDEX ON &cOrder. TAG Temp01 TO (arquivotmp) FOR &cQuery. ADDITIVE MEMORY


  If Leto_File( "clientes.dbf")
      DbUseArea( .T., "LETO", oASAPREV:cServidorDB + "clientes", "clientes", .T. )
   Else
      DbCreate( oASAPREV:cServidorDB + "clientes", aField, "LETO" )
      DbUseArea( .T., "LETO", oASAPREV:cServidorDB + "clientes", "clientes", .T. )
   Endif
     
   INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
          FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
          Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY
         
Descrição do erro:

Error LETO/1003  : Variable does not exist CLI1
Called from ->ORDCREATE(0)
Called from TESTE.PRG->TESTE(137)
Called from ASAPREV.PRG->(b)CLASAPREV_CHAMAROTINA(559)
Called from ASAPREV.PRG->CLASAPREV:CHAMAROTINA(559)
Called from ASAPREV.PRG->(b)CLASAPREV_ASAPREV(474)
Called from ->ONCOMMAND(868)
Called from ->(b)HMAINWINDOW(255)
Called from ->HMAINWINDOW:ONEVENT(474)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from ->HMAINWINDOW:ACTIVATE(430)
Called from ASAPREV.PRG->CLASAPREV:ASAPREV(530)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 19:09
por asimoes
Fazendo uma analogia com uma query em um banco relacional SELECT * FROM TABELA WHERE cWhere ORDER BY cOrder

cOrder := [ Codigo ]
cWhere := [ VAL(Codigo) >= ] + Hb_NtoS( Val( cli1 ) ) + [ .AND. VAL( Codigo ) <= ] + Hb_NtoS( Val( cli2 ) ) + [ .AND. ] + ;
[ MalaDireta == "S" .AND. Situacao == '] + cGrupo + [']

INDEX ON &cOrder. TAG Temp01 TO (arquivotmp) FOR &cWhere. ADDITIVE MEMORY

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 19:23
por asimoes
Uma função simples que ajuda na formação da criação do indice FormatQuotes()


cOrder := [ Codigo ]
cWhere := [ VAL(Codigo) >= ] + Hb_NtoS( Val( cli1 ) ) + [ .AND. VAL( Codigo ) <= ] + Hb_NtoS( Val( cli2 ) ) + [ .AND. ] + ;
          [ MalaDireta == "S" .AND. Situacao == ] + FormatQuotes( cGrupo )

Function FormatQuotes( cString )
   
   cString := StrTran( cString, '"', "'" )
   
   cString := ["] + cString + ["]
   
Return cString

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 13 Nov 2018 20:45
por fladimir
Bacana Alexandre, obrigado pelas informações e exemplos.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Nov 2018 14:05
por asimoes
Controle de transação com LetoDbf, muito interessante:
  Begin Sequence  With __BreakBlock()
 
      leto_BeginTransaction(.T.)   
     
      IF Clientes->( DbAppend() )
         IF ( lApp := NetErr() )
            Break
         ENDIF
      ENDIF   
      Clientes->Codigo     := "001"
      clientes->Situacao   := "01"
      Clientes->MalaDireta := "S"
      clientes->( DbRUnLock() )
     
      IF Clientes->( DbAppend() )
         IF ( lApp := NetErr() )
            Break
         ENDIF
      ENDIF       
      Clientes->Codigo     := "002"
      clientes->Situacao   := "01"
      Clientes->MalaDireta := "S"
      clientes->( DbRUnLock() )
     
      //A=B //aqui é para provocar o erro
     
      leto_CommitTransaction()
     
      clientes->( DbGoTop() )
     
   Recover
      Alert("Erro incluindo registro(s)")
      leto_Rollback()
      RETURN Nil
   End
   
   DbEdit()

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Nov 2018 16:30
por rubens
Boa tarde...

Sobre a criação de índices temporários tb tem essa observação no manual..
# Using temporary index orders [ created in Server OS temporary path ] are only possible in
mode: NO_Save_Wa = 1.


Rubens

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Nov 2018 18:44
por Itamar M. Lins Jr.
Ola!
Pra mim alterar tudo seria muito trabalho tento vista outros projetos.

Que forma ? Não muda nada no seu comando. Fica Igual, somente a parte de CLI1,CLI2,cGrupo que vc precisa troca antes para o conteúdo da variável, qualquer sentença SQL não é assim ?

cQuery := ... + " ' " + cli1 + " ' " +  ... 
cQuery := ... + " ' " + cGrupo + " ' " + ...


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Nov 2018 22:16
por fladimir
Fui pesquisar aki pra ver qts linhas teria q trocar até q não é muito

Imagem

Daria pra fazer em uns 3 a 5 dias.

Mas como disse o projeto q contém essas linhas não teria necessidade de alteração pq uso processamento já no servidor e acesso TS e são monousuários, não multi empresa.

Como estou envolvido em outros projetos, vou avaliar se mudo ou permaneço dessa forma.

Agradeço aos amigos aki do fórum, em especial desse post pelas dicas e auxilio em testes/ideias.

Vlw galera.

Abraço.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 16 Nov 2018 07:54
por rubens
Bom dia..

Alguém tem o o manage compilado para compartilhar?
O Console eu consegui compilar já o manage não. Precisa da HwGui e eu não tenho ela.

Obrigado

Rubens

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 16 Nov 2018 12:16
por asimoes
Tem que olhar o manual, quem está tomando erro com unlock veja se está usando controle de transação

Sobre controle de transação: leto_BeginTransaction(), leto_CommitTransaction() e leto_Rollback()

leto_BeginTransaction() o unlock e a gravação dos registros das tabelas é feito com leto_CommitTransaction()

Usando leto_CommitTransaction() se usar DbUnLock() ou DbRUnlock() o letodb entra em condição de erro, não pode usar essas funções! (está no manual)

Resumindo:

leto_BeginTransaction() ou leto_BeginTransaction(.t.) precisa usar leto_CommitTransaction() para gerar o registro

O legal disso é que não entra registro fantasma e se tem por exemplo 3 tabelas fazendo append blank e se estivrem dentro de begin sequence with __BreakBlock()

No Recover você pode usar leto_Rollback() que desfaz todos os appends blank, com isso as tabelas envolvidas não ficam inconsistentes.
begin sequence with __BreakBlock()
   leto_BeginTransaction()
   tabela1->( DbAppend() )
   tabela2->( DbAppend() )
   tabela3->( DbAppend() )
    leto_CommitTransaction() //gera os registros das tabelas e faz unlock
Recover
   leto_Rollback() // desfaz a transação e faz unclock
End

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Nov 2018 12:55
por porter
Olá pessoal,
Porquê em determinados momentos, da esse erro: Error LETO/1000 : Erro de sintaxe

Lá no LETODBF\BIN\letodbf.log
11.23.2018 13:35:28 INFO: disconnect 192.168.0.100:1415 estoque.exe users=(1 : 1 : 1), tables=(0 : 19)

O que pode estar desconectando o LetoDbf ?
Obrigado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Nov 2018 14:17
por asimoes
Porter,

Como ta definida a conexão com Leto_Connect() ?, observe que o timeout está com -1, tinha problema de conexão quando informava 30000 (30 seg), com -1
Nunca mais tive problema.

::nTimeOut := -1

Leto_Connect( cServidorDB, , , ::nTimeOut )

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Nov 2018 15:17
por porter
Como ta definida a conexão com Leto_Connect() ?, observe que o timeout está com -1, tinha problema de conexão quando informava 30000 (30 seg), com -1 Nunca mais tive problema.


::nTimeOut := -1
Leto_Connect( cServidorDB, , , ::nTimeOut )

Olá asimões, estou fazendo assim:

cPath := "SERVIDOR:2812"
nConect := leto_Connect( cPath)

Se fizer da forma como você sugeriu, precisa alterar também o timeout no arquivo letodb.ini, aqui o Timeout está com 360
Por curiosidade, porquê o exemplo que você passou, está assim ::nTimeOut, o que significa ::

Obrigado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Nov 2018 16:23
por asimoes
porter escreveu:Por curiosidade, porquê o exemplo que você passou, está assim ::nTimeOut, o que significa ::

é propriedade da classe, você pode usar:

nConect := leto_Connect( cPath, , , -1)

Obs.: ;TimeOut = 360 está comentado no meu letodb.ini

Meu letodb.ini
;Server = \\192.168.56.1
;IP = 127.0.0.1
Port = 2812
DataPath = DB
;LogPath = /tmp
Default_Driver = CDX
;Lock_Scheme = 6
;Memo_Type = FPT
Share_Tables = 0
Trigger = "Leto_Trigger"
No_Save_WA = 1
Lower_Path = 0
EnableFileFunc = 1
EnableAnyExt = 1
Allow_UDF = 1
Pass_for_Login = 0
Pass_for_Manage = 0
Pass_for_Data = 0
;Pass_File = "leto_users"
Cache_Records = 21
;Max_Vars_Number = 1000
;Max_Var_Size = 67108864
;Tables_Max  = 999
;Users_Max = 99
Debug = 1
Optimize = 1
;HardCommit = 0 ver readme.txt
;AutOrder = 0
;ForceOpt = 0
;TimeOut = 360
;Zombie_Check = 30
;Server_User = advantage
;Server_UID = 1000
;Server_GID = 4
;BC_Services = letodb;
;BC_Interface = eth2
;BC_Port = 2812
DataBase = DB
;Backup = C:\Users\cisin\Documents\GitHub\LetoDBf\bin\backup
Mask = *.dbf,*.dbt,*.ntx
Lock = 1
Seconds = 30
Wait = 1
ArcCmd = tar -cvzf /tmp/backup/leto.tar.gz /tmp/backup/*

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Nov 2018 16:37
por porter
Asimões,
O Timeout meu também está comentado, fiz da forma que você disse, e até agora não deu mais erro,
acho que resolveu o problema.

Obrigado por sua atenção.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Dez 2018 16:45
por porter
Olá pessoal, com essa rotina, estou conectando o LetoDBF, e verifico se a conexão foi bem sucedida,
qual é o comando que verifica se o LetoDBF, ainda está em execução, não é toda hora, mas de tempos em tempos
recebo a mensagem de erro Error LETO/1000 : Erro de sintaxe, então gostaria de testar no sistema se
é o Leto que está desconectando ou é a Rede que cai.

Mesmo desconectando o LetoDbf com net stop letodbf_service, a rotina abaixo, sempre retorna zero(0), na abertura do sistema,
funciona normal, mas se em alguma parte do sistema, eu desconectar o leto, ai a rotina abaixo, não funciona.
cPath := "SERVIDOR:2812"
IF leto_Connect( cPath ) < 0
    MsgExclamation( "Perdeu conexão.................. !")
ENDIF


//Conectar e testar conexão foi bem sucedida...
PROCEDURE ConectaLetoDbf(cPath)
    nTimeOut := -1
    nConect := leto_Connect( cPath, , , nTimeOut )
    // Faz o teste de conexao
    IF nConect == -1
       SetColor( "GR+/B" )
      CLS
       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
          MsgExclamation( "Nao conectado ao servidor: " + cPath + " , habilitar porta 2812 no servidor.")
       ENDIF
       Return .F.
     ENDIF

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Dez 2018 21:40
por Jairo Maia
Olá porter,

porter escreveu:não é toda hora, mas de tempos em tempos recebo a mensagem de erro Error LETO/1000 : Erro de sintaxe, então gostaria de testar no sistema se é o Leto que está desconectando ou é a Rede que cai.
Não está relacionado a conexão do Leto. É outro problema. A rotina de erro deve dar o caminho onde ocorreu o erro. Trata-se de "erro de sintaxe", e não de falha de conexão.

Identifique onde está ocorrendo o erro, e se puder, post o trecho do código.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Dez 2018 12:27
por porter
Olá Jairo,
A rotina de erro deve dar o caminho onde ocorreu o erro. Trata-se de "erro de sintaxe"


Essa rotina de erro seria o arquivo c:\letodbf\bin\letodbf.log ?
Se for, está retornando a seguinte mensagem:
12.05.2018 09:23:38 INFO: disconnect 192.168.0.120:23354 estoque.exe users=(1 : 1 : 2), tables=(0 : 12)
Nessa mensagem de erro, em tables=(0 : 12), sei que tables se refere ao arquivo e "0 : 12" o que é ?
Estou cadastrando códigos e valores pela estação, esse erro ocorre na estação.

Identifique onde está ocorrendo o erro, e se puder, post o trecho do código.


O erro não acontece toda hora, se conseguisse saber em qual linha do sistema está o erro ficaria mais fácil,
assim eu postaria o código.

Obrigado por sua atenção.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Dez 2018 12:51
por Jairo Maia
Olá porter,

Desconsidere o que eu disse antes. Segundo o Itamar pode ser sim erro na rede. Veja a parir desse tópico: http://www.pctoledo.com.br/forum/viewtopic.php?p=122799#p122799

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Dez 2018 16:37
por porter
Olá Jairo,
Eu já havia lido o post que você sugeriu, no caso dele o problema era com o Avast, no momento
estou cadastrando várias notas fiscais com bastante itens, e até o momento não deu erro,
fiz um teste também desconectando e conectando em seguida o cabo da rede e mesmo assim
o erro não está ocorrendo, gostaria de tratar o erro quando ocorressem reconectar e continuar
usando o sistema de onde parou, mas até agora, não sei onde está ocorrendo o erro, vou continuar
procurando.

Obrigado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Dez 2018 10:03
por rossine
Bom dia,

Estou fazendo testes com LetoDBF e usando o exemplo que peguei aqui no fórum, modifiquei para usar ao mesmo tempo LETODBF e DBFCDX.

Dois detalhes iniciais que percebi:

1) O DBRlock feito pelo LETO não é entendido pelo DBFCDX

2) No LETODBF a função "DbRLockList()" sempre retornar vazio. (Existe no LETODBF alguma função que me retorne isto ?)

Estou fazendo este teste pois pretendo usar o LETODBF em um novo projeto dentro de meu sistema que uso em DBFCDX.

Então pergunto: O RDDLETO trabalha em concomitância com o DBFCDX ?

Segue abaixo o exemplo que modifiquei e vejam as linhas: 272, 274, 296, 299, 305

#include "inkey.ch"
#include "rddleto.ch"
#include "hbgtinfo.ch"
#include "wvtwin.ch"
#include "hbgtwvg.ch"
#include "dbinfo.ch"

//sc delete letodbf_service
//net stop letodb_service
//net stop letodbf_service

request LETO
request DBFCDX

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PTISO
REQUEST HB_GT_WVT_DEFAULT
REQUEST HB_GT_WVT

Procedure Main(cIP)

  HB_SETCODEPAGE('PTISO')
  HB_LANGSELECT('PT')

//  RDDSETDEFAULT( "LETO" )
  RDDSETDEFAULT( "DBFCDX" )

set date       to BRITISH
set device     to screen
set epoch      to 2000
set print      OFF
set bell       OFF
set scoreboard OFF
set unique     OFF
set cursor     OFF
set confirm    OFF
set escape     ON
set deleted    ON
set wrap       ON
set century    ON

ReadInsert( .F. )

setcancel( .F. )

set( _SET_AUTOPEN, .F. )
set( _SET_AUTORDER, 0 )
set( _SET_AUTOSHARE, .F. )

Set( _SET_DIRSEPARATOR, "\" )
Set( _SET_FILECASE, "LOWER" )
Set( _SET_DIRCASE, "LOWER" )

set( _SET_DBFLOCKSCHEME, DB_DBFLOCK_COMIX )

//  LETO_INIT()

  WVT_SETONTOP()
  WVT_SETICON('icon_sys.ico')
  wvw_SetCodepage(255)
  wvw_SetTitle('Demo LetoDB Server - pctoledo')

  Set(39, 255)

  Set(40,159)

  nFontWidth:=Int(hb_gtinfo(HB_GTI_DESKTOPWIDTH)/80)
  nFontSize:=Int(hb_gtinfo(HB_GTI_DESKTOPHEIGHT)/25)
  HB_GtInfo(HB_GTI_FONTWIDTH, nFontWidth)
  HB_GtInfo(HB_GTI_FONTSIZE, nFontSize)

  SetMode( MaxRow() + 1, MaxCol() + 1 )

  HB_GtInfo( HB_GTI_ALTENTER, .T. )
  HB_GtInfo( HB_GTI_CLOSABLE, .F. )

  SetBlink(.f.)
  SET SCOREBOARD OFF
  SET CONFIRM ON
  SET DELETED ON
  SET DATE TO BRITISH
  SET CENTURY ON

  SetColor("N/BG")
  @ 0,0 Clear to MaxRow(), MaxCol()
  SetColor("W+/RB")
  @ 0,0 Clear to 0,MaxCol()
  @ 0,0 Say PadC("Abrindo DBF/CDX com LetoDB Server",80)
  SetColor("N/W")
  @ MaxRow(),0 Clear to MaxRow(),MaxCol()
  @ MaxRow(),1 Say "PCToledo - www.pctoledo.com.br/forum"

  cTela1:=SaveScreen(0,0,MaxRow(),MaxCol())

  If pcount()==0

    Janela(5,5,20,73,"Conexão com o LetoDB","N/W","W+/B","N/W")
    @ 7,7 Say "Escolha uma das formas de conexão:"
    @ 9,7  Say "Conexão Local  = o LetoDB Server tem que estar instalado no mesmo"
    @ 10,7 Say "                 computador  onde  este  programa  está  sendo"
    @ 11,7 Say "                 executado (localhost)."
    @ 13,7 Say "Informar IP    = o LetoDB Server foi instalado em um outro"
    @ 14,7 Say "                 computador na sua rede local."
    @ 16,7 Say "Conexão Remota = o LetoDB Server está instalado em um servidor"
    @ 17,7 Say "                 na Internet."
    SetColor("N/W,W+/R")
    @ 19,11 PROMPT " Conexão Local "
    @ 19,32 PROMPT " Informar IP "
    @ 19,51 PROMPT " Conexão Remota "
    MENU TO nPrompt

    If nPrompt==0
      Return
    Endif

    RestScreen(0,0,MaxRow(),MaxCol(),cTela1)

    DO CASE
      CASE nPrompt = 1
        cIP:="localhost"
      CASE nPrompt = 2
        Janela(8,18,14,59,"LetoDB na Rede Local","N/W","W+/B","N/W")
        @ 10,20 Say "Informe o Endereço de IP do computador"
        @ 11,20 Say "onde o LetoDB Server está instalado:"
        cIPInf:=spac(15)
        @ 13,30 Get cIPInf
        READ
        If Lastkey()=27 .or. Empt(cIPInf)
          Return
        Endif
        RestScreen(0,0,MaxRow(),MaxCol(),cTela1)
        cIP:=alltrim(cIPInf)
      CASE nPrompt = 3
        cIP:="pctoledo.noip.me"
    ENDCASE
  Endif

  PathLeto :=  "//"+cIP+":2812/"   
  nConect := leto_Connect( PathLeto )
  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( "Erro na conexão com o servidor: " + PathLeto )
    Endif
    Quit
  Endif

  // Depois de conectar no Banco de dados através do LETODBF, tem que setar o DBCDX como default novamente.
  RDDSETDEFAULT( "DBFCDX" )

//wait RDDSETDEFAULT()

   ? 'leto_memowrite( "test2.txt", 4095 * "B" ) - '
   ?? iif( leto_memowrite( "test2.txt", REPLICATE( "B", 4095 ) ), "Ok", "Failure" )
   ?? iif( leto_filesize( "test2.txt" ) == 4096, "!", "@" )  /* +1 for strg-z */
   ? 'leto_filesize( "test2.txt" ) - '
   ?? leto_filesize( "test2.txt" )
   cBuf := leto_memoread( "test2.txt" )
   IF cBuf == REPLICATE( "B", 4095 )
      ?? " fine"
   else
      ?? " wrong"
   ENDIF

  nPrompt:=1
  DO WHILE .T.
    RestScreen(0,0,MaxRow(),MaxCol(),cTela1)

    Janela(6,15,11,52,"Escolha uma das Opções","N/W","W+/G","N/W")
    SetColor("W+/GR+")
    @ 11,15 Clear to 11,52
    @ 11,16 Say "<Esc=Cancela>"
    SetColor("N/W,W+/R")
    @ 7,15 PROMPT " Abrir Banco de Dados                 "
    @ 8,15 PROMPT " Informações Básicas do LetoDB Server "
    @ 9,15 PROMPT " Lista de Usuários Conectados         "
    @ 10,15 PROMPT " Tabelas Abertas                      "
    MENU TO nPrompt

    If nPrompt==0
      Exit
    Endif

    DO CASE
      CASE nPrompt = 1
        BrowseDB(2,2,21,76,"Arquivo: NOMES.DBF")
        Close All
      CASE nPrompt = 2
        InfBasicas()
      CASE nPrompt = 3
        ListUsers()
      CASE nPrompt = 4
        ListTabelas()
    ENDCASE

  ENDDO

  leto_DisConnect()
Return

*****************************
Procedure Janela(nLini,nColi,nLinf,nColf,cTitJan,cCorJan,cCorTit,cCorTex)
  HB_Shadow(nLini,nColi,nLinf,nColf)
  SetColor(cCorJan)
  @ nLini,nColi Clear to nLinf,nColf
  SetColor(cCorTit)
  @ nLini,nColi Clear to nLini,nColf
  @ nLini,nColi Say PadC(cTitJan,(nColf-nColi)+1)
  SetColor(cCorTex)
Return

*****************************
Procedure BrowseDB(nLiniDB,nColiDB,nLinfDB,nColfDB,cTitDB)

  LOCAL lEnd, nKey, brw_regAnt, nRecno
  LOCAL cTela2:=SaveScreen(0,0,24,79)

  Private oBrowse

  SetColor("W+/B")

  cls

  DbUseArea( .t., "LETO", /*PathLeto +*/ "NOMES.DBF", "NOMES_LETO", .t. )

  ? "LETODBF-NETERR()", NETERR()

  if !leto_file( "nomes.cdx" )
     index on field->codigo /*NOMES_LETO->codigo*/ tag "001" to nomes
     index on field->nome   /*NOMES_LETO->nome  */ tag "002" to nomes
  endif

  set index to nomes

  NOMES_LETO->( DbSetOrder(1) )

  ? "indexkey()->LETO=", NOMES_LETO->( indexkey() )

  GO BOTTOM

  cCodigo:=StrZero(Val(NOMES_LETO->CODIGO)+1,4)

  NOMES_LETO->(DbAppend())

  If NOMES_LETO->(RLock())
     REPLACE NOMES_LETO->CODIGO   WITH cCodigo,;
             NOMES_LETO->NOME     WITH "Novo nome - " + time(),;
             NOMES_LETO->ENDERECO WITH "Endereco",;
             NOMES_LETO->CIDADE   WITH "Cidade",;
             NOMES_LETO->ESTADO   WITH "UF",;
             NOMES_LETO->CEP      WITH "00000000",;
             NOMES_LETO->SEXO     WITH "M"
     NOMES_LETO->(DbCommit())
     NOMES_LETO->(DbUnLock())
  endif

  nRecno := NOMES_LETO->( OrdKeyCount() )

  NOMES_LETO->( OrdKeyGoto( nRecno ) )

  ? "recno->", NOMES_LETO->( recno() ), "OrdKeyno->", NOMES_LETO->( ordkeyno() )

  ? ""
  ? "DbRLock-LETODBF=", NOMES_LETO->( DbRLock() ) , "  <- Aqui LETO travou o registro - OK"
  ? ""
  ? "DbRLockList()-LETO", hb_valtoexp( NOMES_LETO->( DbRLockList() ) ), " <- Esta funcao nao funciona no LETO ?
  ? ""

  DbUseArea(.t.,"DBFCDX", "dbf\NOMES.DBF", "NOMES_CDX", .t. )

  ? "DBFCDX-NETERR()", NETERR()

  if !file( "dbf\nomes.cdx" )
     index on field->codigo tag "001" to "dbf\nomes"
     index on field->nome   tag "002" to "dbf\nomes"
  endif

  set index to "dbf\nomes"

  NOMES_CDX->( DbSetOrder(1) )

  ? "indexkey()->DBFCDX=", NOMES_CDX->( indexkey() )

  NOMES_CDX->( OrdKeyGoto( nRecno ) )

  ? "recno->", NOMES_CDX->( recno() ), "OrdKeyno->", NOMES_CDX->( ordkeyno() )

  ? "DbRLock-DBFCDX=",   NOMES_CDX->( DbRLock() ), "<- Aqui o DBFCDX tambem conseguiu travar o mesmo registro :("
  ? ""

  ? "DbRLockList()-DBFCDX", hb_valtoexp( NOMES_CDX->( DbRLockList() ) ), " <- Aqui esta OK"

  ? "DbRUnLock-DBFCDX=", NOMES_CDX->( DbRUnLock() )

  ? "DbRUnLock-LETODBF=", NOMES_LETO->( DbRUnLock() )

  ? "DbRLock-DBFCDX="  , NOMES_CDX->( DbRLock() ), " <-Aqui OK porque o LETO destravou o registro"
  ? "DbRUnLock-DBFCDX=", NOMES_CDX->( DbRUnLock() )

  wait "Tecle ENTER..."

  RestScreen(0,0,24,79,cTela2)

  Janela(nLiniDB,nColiDB,nLinfDB,nColfDB,cTitDB,"W+/B","W+/RB","W+/B")
  SetColor("N/W")
  @ nLinfDB,nColiDB Clear to nLinfDB,nColfDB
  @ nLinfDB,nColiDB+1 Say "<Enter=Editar>  <Ins=Inserir>  <Del=Excluir>  <F2=Busca>  <F3=Localiza>"
  SetColor("R/W")
  @ nLinfDB,nColiDB+2 Say "Enter"
  @ nLinfDB,nColiDB+18 Say "Ins"
  @ nLinfDB,nColiDB+33 Say "Del"
  @ nLinfDB,nColiDB+48 Say "F2"
  @ nLinfDB,nColiDB+60 Say "F3"

  SetColor("W+/B")
  oBrowse := TBrowse():New(nLiniDB+1,nColiDB,nLinfDB-1,nColfDB)

  oBrowse:ColSep        := " "+chr(179)+" "
  oBrowse:HeadSep       := chr(205)+chr(209)+chr(205)
  oBrowse:GoTopBlock    := {|| dbGoTop() }
  oBrowse:GoBottomBlock := {|| dbGoBottom() }
  oBrowse:SkipBlock     := {| nSkip | dbSkipBlock( nSkip, oBrowse ) }

  oBrowse:AddColumn( TBColumnNew( "Código", FieldBlock("CODIGO") ) )
  oBrowse:AddColumn( TBColumnNew( "Nome", FieldBlock("NOME") ) )
  oBrowse:AddColumn( TBColumnNew( "Endereço", FieldBlock("ENDERECO") ) )
  oBrowse:AddColumn( TBColumnNew( "Cidade", FieldBlock("CIDADE") ) )
  oBrowse:AddColumn( TBColumnNew( "UF", FieldBlock("ESTADO") ) )
  oBrowse:AddColumn( TBColumnNew( "Cep", FieldBlock("CEP") ) )
  oBrowse:AddColumn( TBColumnNew( "Sexo", FieldBlock("SEXO") ) )

  oBrowse:configure()

  lEnd := .F.
  DO WHILE ! lEnd
     oBrowse:ForceStable()

     SetCursor(0)

     SetColor("W+/RB")
     @ nLiniDB,nColiDB+1 Say "Registro: "+Ltrim(Str(Recno())) + "/" + Ltrim(Str(Lastrec()))+Spac(3)
     SetColor("W+/B")

     nKey := Inkey( 0, HB_INKEY_ALL )

     IF oBrowse:applyKey( nKey ) == -1
       SetCursor(1)
       EXIT
     ENDIF
     DO CASE
       CASE nKey == K_ENTER
         EditarDB(.F.)
         oBrowse:refreshall()
       CASE nKey == K_INS
         EditarDB(.T.)
         oBrowse:refreshall()
       CASE nKey == K_DEL
         ExcluirDB()
         oBrowse:refreshall()
       CASE nKey == K_F2
         brw_regAnt = RECNO()
         BuscaDB()
         If brw_regAnt != RECNO()
           oBrowse:rowpos = 1
         Endif
         oBrowse:configure()
       CASE nKey == K_F3
         brw_regAnt = RECNO()
         LocalizaDB()
         If brw_regAnt != RECNO()
           oBrowse:rowpos = 1
         Endif
         oBrowse:configure()
     ENDCASE

  ENDDO

Return

*****************************
Procedure EditarDB(lNovo)
  LOCAL cTela2:=SaveScreen(7,7,13,70), nRec:=RECNO()
  Janela(7,7,12,68,"Cadastro de Clientes","N/W","W+/G","N/W")
  SetColor("W+/R")
  @ 12,7 Clear to 12,68
  @ 12,8 Say "<Esc=Cancela>"
  SetColor("N/W,w+/BG,N/W,N/W,N/W")
  If lNovo
    GO BOTTOM
    SKIP
  Endif

  If !NOMES_LETO->(RLock()) // Rossine 01/11/18
     Alert( "Registro bloqueado por outro usuário.;Tente novamente!")
     return NIL
  Endif

  cCodigo:=NOMES_LETO->CODIGO
  cNome:=NOMES_LETO->NOME
  cEndereco:=NOMES_LETO->ENDERECO
  cCidade:=NOMES_LETO->CIDADE
  cUF:=NOMES_LETO->ESTADO
  cCep:=NOMES_LETO->CEP
  cSexo:=NOMES_LETO->SEXO

  @ 8,8 Say "Código:       Nome:"
  @ 8,16 Say cCodigo
  @ 8,28 Get cNome Picture "@!" Valid !Empt(cNome)
  @ 9,8 Say "Endereço:" Get cEndereco
  @ 10,8 Say "Cidade:" Get cCidade
  @ 10,47 Say "Estado:" Get cUF Picture "!!"
  @ 11,8 Say "Cep:" Get cCep Picture "99999-999"
  @ 11,24 Say "Sexo:" Get cSexo Picture "!" Valid cSexo$"MF"
  Read

  If Lastkey()=K_ESC
    GO nRec
    RestScreen(7,7,13,70,cTela2)
    Return
  Endif
  If lNovo
    GO BOTTOM
    cCodigo:=StrZero(Val(NOMES_LETO->CODIGO)+1,4)
    NOMES_LETO->(DbAppend())
  Endif
  If NOMES_LETO->(RLock())
    REPLACE NOMES_LETO->CODIGO WITH cCodigo,;
            NOMES_LETO->NOME WITH cNome,;
            NOMES_LETO->ENDERECO WITH cEndereco,;
            NOMES_LETO->CIDADE WITH cCidade,;
            NOMES_LETO->ESTADO WITH cUF,;
            NOMES_LETO->CEP WITH cCep,;
            NOMES_LETO->SEXO WITH cSexo
    NOMES_LETO->(DbCommit())
    NOMES_LETO->(DbUnLock())
  Else
    If lNovo
      Alert("Não foi possível adicionar o Novo Registro.;Tente novamente!")
    Else
      Alert("Registro bloqueado por outro usuário.;Aguarde um momento e tente novamente!")
    Endif
    GO nRec
  Endif
  RestScreen(7,7,13,70,cTela2)
Return

*****************************
Procedure ExcluirDB()
  LOCAL cMsg:= "Confirma exclusão do registro?",;
        aOpcoes:= {"Sim", "Não"}
  If Alert( cMsg, aOpcoes) == 1
    If NOMES_LETO->(RLock())
      NOMES_LETO->(DbDelete())
      NOMES_LETO->(DbCommit())
      NOMES_LETO->(DbUnLock())
    Endif
  Endif
Return

*****************************
Procedure BuscaDB()
  LOCAL cTela2:=SaveScreen(10,31,14,50), nRec:=RECNO(),;
        nPromptB, cCodigo, cNome, nOrdAnt
  Janela(10,31,13,48,"Opção de busca","N/W","W+/G","N/W")
  SetColor("W+/GR+")
  @ 13,31 Clear to 13,48
  @ 13,32 Say "<Esc=Cancela>"
  SetColor("N/W,W+/R")
  @ 11,31 PROMPT "  Por Código      "
  @ 12,31 PROMPT "  Por Nome        "
  MENU TO nPromptB

  RestScreen(10,31,14,50,cTela2)
  If nPromptB==0
    Return
  Endif

  DO CASE
    CASE nPromptB = 1
      nOrdAnt:=DbSetOrder(1)
      cCodigo:=spac(4)
      cTela2:=SaveScreen(10,28,15,53)
      Janela(10,28,14,51,"Busca por Código","N/W","W+/BG","N/W")
      SetColor("W+/R")
      @ 14,28 Clear to 14,51
      @ 14,29 Say "<Esc=Cancela>"
      SetColor("N/W,w+/BG,N/W,N/W,N/W")
      @ 12,29 Say "Informe o Código:" Get cCodigo Picture "9999"
      READ
      If Lastkey()=K_ESC .or. Val(cCodigo)<1
        RestScreen(10,28,15,53,cTela2)
        DbSetOrder(nOrdAnt)
        Return
      Endif
      DbSeek(StrZero(Val(cCodigo),4))
      If !Found()
        Alert("Código não encontrado!")
        DbSetOrder(nOrdAnt)
        GO nRec
      Endif
      RestScreen(10,28,15,53,cTela2)
    CASE nPromptB = 2
      nOrdAnt:=DbSetOrder(2)
      cNome:=spac(40)
      cTela2:=SaveScreen(10,11,15,70)
      Janela(10,11,14,68,"Busca por Nome","N/W","W+/BG","N/W")
      SetColor("W+/R")
      @ 14,11 Clear to 14,68
      @ 14,12 Say "<Esc=Cancela>"
      SetColor("N/W,w+/BG,N/W,N/W,N/W")
      @ 12,12 Say "Informe o Nome:" Get cNome
      READ
      If Lastkey()=K_ESC .or. Empt(cNome)
        RestScreen(10,11,15,70,cTela2)
        DbSetOrder(nOrdAnt)
        Return
      Endif
      DbSeek(Alltrim(cNome))
      If !Found()
        Alert("Nome não encontrado!")
        DbSetOrder(nOrdAnt)
        GO nRec
      Endif
      RestScreen(10,11,15,70,cTela2)
  ENDCASE
Return

*****************************
Procedure InfBasicas()
  Local aInf:=LETO_MGGETINFO(), aDtHs:=LETO_MGGETTIME(),;
        nSec,nDay,nHour,nTransAll,nTransBad,nKey
  Janela(5,11,20,68,"Informações Básicas do LetoDB Server","N/W","W+/B","N/W")
  SetColor("W+/R")
  @ 20,11 Clear to 20,68
  @ 20,12 Say "<Esc=Sair>"
  SetColor("N/W")
  @ 07,12 Say "Versão: "+LETO_GETSERVERVERSION() + "    RddDefault: " + RDDSETDEFAULT()
  @ 08,12 Say "Data/Hora do Servidor: "+DToC(aDtHs[1])+" - "+TString(aDtHs[2])

  @ 10,12 Say "Usuários Online....: "+PadL(aInf[1],5)+"  Máximo: "+PadL(aInf[2],5)
  @ 11,12 Say "Tabelas abertas....: "+PadL(aInf[3],5)+"  Máximo: "+PadL(aInf[4],5)
  @ 12,12 Say "Indices abertos....: "+PadL(aInf[9],5)+"  Máximo: "+PadL(aInf[10],5)
  nSec := Val( aInf[5] )
  nDay := Int(nSec/86400)
  nHour := Int((nSec%86400)/3600)
  @ 13,12 Say "Tempo decorrido....: "+ Ltrim(Str(nDay)) + Iif(nDay>1," dias "," dia ") + ;
               Ltrim(Str(nHour))+Iif(nHour>1," horas "," hora ") + ;
               Ltrim(Str(Int((nSec%3600)/60))) + " minutos"
  @ 14,12 Say "Operações..........: "+Ltrim(aInf[6])
  @ 15,12 Say "KBytes enviados....: "+Ltrim(str(Int(Val(aInf[7])/1024)))
  @ 16,12 Say "KBytes lidos.......: "+Ltrim(str(Int(Val(aInf[8])/1024)))
  nTransAll := Val( aInf[14] )
  nTransBad := nTransAll - Val( aInf[15] )
  @ 17,12 Say "Total de transações: "+Ltrim(Str(nTransAll))+"  Falhas: "+Ltrim(Str(nTransBad))
  @ 18,12 Say "Tempo de espera....: "+Ltrim(aInf[13])+"  Máximo: "+Ltrim(aInf[12])

  Do While .T.
    nKey:=inkey(0)
    If nKey==K_ESC
      Exit
    Endif
  Enddo
Return

*****************************
Procedure ListUsers()
  Local aUsers:=LETO_MGGETUSERS(),;
        nUsers,cMsg
  Janela(5,6,19,72,"Lista de Usuários Conectados","N/W","W+/B","N/W")
  SetColor("W+/R")
  @ 19,6 Clear to 19,72
  @ 19,7 Say "<Esc=Sair>"
  SetColor("N/W")
  nUsers := Len(aUsers)
  If nUsers>0
    cMsg:="Ordem Endereço IP      Nome Cliente/Net  Programa        Tempo"+hb_eol()
    For i=1 To nUsers
      cMsg+=PadC(aUsers[i,1],5)+" "+PadR(aUsers[i,2],15)+"  "+;
            PadR(aUsers[i,3],16)+"  "+PadR(aUsers[i,4],15)+" "+;
            Padl(Ltrim(Str(Int((Val(aUsers[i,5])%86400)/3600))),2,'0')+":"+;
            Padl(Ltrim(Str(Int((Val(aUsers[i,5])%3600)/60))),2,'0') +":"+;
            Padl(Ltrim(Str(Int(Val(aUsers[i,5])%60))),2,'0')+hb_eol()
    Next
  Else
    cMsg:="Nenhum Usuário Conectado!"
  Endif
  MemoEdit(cMsg,6,7,18,71,.F.)

Return

*****************************
Procedure ListTabelas()
  Local aTables:=LETO_MGGETTABLES(),;
        nTbls, cMsg
  Janela(5,6,19,72,"Tabelas Abertas","N/W","W+/B","N/W")
  SetColor("W+/R")
  @ 19,6 Clear to 19,72
  @ 19,7 Say "<Esc=Sair>"
  SetColor("N/W")
  nTbls := Len(aTables)
  If nTbls>0
    cMsg:="Ordem Nome da Tabela"+hb_eol()
    For i=1 To nTbls
      cMsg+=PadC(aTables[i,1],5)+" "+PadR(aTables[i,2],15)+hb_eol()
    Next
  Else
    cMsg:="Nenhum Tabela aberta!"
  Endif
  MemoEdit(cMsg,6,7,18,71,.F.)

Return

*****************************
STATIC FUNCTION DbSkipBlock( n, oTbr )

  LOCAL nSkipped := 0

  IF n == 0
     dbSkip( 0 )

  ELSEIF n > 0
     DO WHILE nSkipped != n .AND. TBNext( oTbr )
        nSkipped++
     ENDDO
  ELSE
     DO WHILE nSkipped != n .AND. TBPrev( oTbr )
        nSkipped--
     ENDDO
  ENDIF

RETURN nSkipped

*****************************
STATIC FUNCTION TBNext( oTbr )

  LOCAL nSaveRecNum := RecNo()
  LOCAL lMoved := .T.

  HB_SYMBOL_UNUSED( oTbr )

  IF Eof()
     lMoved := .F.
  ELSE
     dbSkip( 1 )
     IF Eof()
        lMoved := .F.
        dbGoto( nSaveRecNum )
     ENDIF
  ENDIF

RETURN lMoved

*****************************
STATIC FUNCTION TBPrev( oTbr )

  LOCAL nSaveRecNum := RecNo()
  LOCAL lMoved := .T.

  HB_SYMBOL_UNUSED( oTbr )

  dbSkip( -1 )

  IF Bof()
     dbGoto( nSaveRecNum )
     lMoved := .F.
  ENDIF

RETURN lMoved

*****************************
Procedure LocalizaDB()
  Local nTamanhoNomeParaPesquisa:= 1
  Local nQuantRegistrosProcessados:= 0
  Local nQuantMaximaDeRegistrosNoGrid:= 60
  Local nRec:=RECNO(), nOrdAnt:=DBSetOrder(2)

  Janela(4,15,19,65,"Localizar Registro","N/W","W+/G","N/W")
  @ 5,16 Say "? e * podem ser usados na busca, por exemplo:"
  @ 6,16 Say "PAULO B* ou P* CA?* A*"
  @ 7,16 Say "Informe o Nome:"
  SetColor("W+/R")
  @ 19,15 Clear to 19,65
  @ 19,16 Say "<Esc=Sair>  <Enter=Seleciona>  "+CHR(24)+CHR(25)

  brw_mat:={{"",""}}

  brw:=TBrowse():New(8,16,18,64)
  private n:= 1, ntot:=len(brw_mat)

  brw:colorspec := "N/W,W+/R,W+/R,W+/BG,GR+/GR"
  brw:headsep:=chr(205)+chr(209)+chr(205)
  brw:colsep:=" "+chr(179)+" "
  brw:gotopblock({|| n:= 1})
  brw:gobottomblock({|| n:=ntot})
  brw:skipblock({|_1| (n:= n + _1, iif(n < 1, _1:= _1 - n + (n:= ;
                1), iif(n > ntot, _1:= _1 - (n - (n:= ;
                ntot)), Nil)), _1)})

  brw:addcolumn(tbcolumnnew("Código",{|| TRANS(brw_mat[n,1],"9999")}))
  brw:getcolumn(1):width := 4
  brw:getcolumn(1):cargo := {"9999"}
  brw:addcolumn(tbcolumnnew("Nome",{|| TRANS(brw_mat[n,2],"@!")}))
  brw:getcolumn(2):width := 40
  brw:getcolumn(2):cargo := {"@!"}
  volta_db=.t.
  st_pesq:=""
  idx=1
  cCorAnt:=SetColor("N/BG")
  @ 7,32 SAY spac(33)
  SetColor(cCorAnt)
  DO WHILE volta_db
    SETCOLOR("W+/B")
    SET CURSO OFF
    e=1
    DO WHILE !brw:stabilize() .AND. NEXTKEY()=0
    ENDD
    READINSERT(.f.)

    cCorAnt:=SetColor("N/BG")
    @ 7,32 SAY LEFT(st_pesq+spac(40),33)
    SetColor(cCorAnt)
   
    tecl_p=INKEY(0)
    carac_ = UPPER(CHR(tecl_p))
    IF (tecl_p>31 .and. tecl_p<1000) .or. tecl_p = K_BS
      If tecl_p = K_BS
        st_p=Left(st_pesq,Len(st_pesq)-1)
      Else
        st_p=st_pesq+carac_
      Endif
   
      st_p_:=st_p
      nTamanhoNomeParaPesquisa:= Len(st_p_)
      nQuantRegistrosProcessados:= 0
      NOMES_LETO->(DBSeek(st_p_))
      Private brw_mat:={}
      IF LEFT(st_p_,1)="*" .OR. "*" $ st_p_ .OR. "?" $ st_p_
        IF LEN(st_p_)>1
          st_p_+="*"
          nPas_:=1
          DO WHILE OrdWildSeek( st_p_, iif(nPas_=1,.F.,.T.) )
            aadd(brw_mat, {NOMES_LETO->CODIGO,NOMES_LETO->NOME} )
            nPas_+=1
            if nPas_ > nQuantMaximaDeRegistrosNoGrid
              EXIT
            EndIf
          ENDDO
        ENDIF
      ELSE
        SEEK st_p_
        IF FOUND() .and. !EMPT(st_p_)
          Do While !Eof()
            If Substr(NOMES_LETO->NOME,1,nTamanhoNomeParaPesquisa) == st_p_
              nQuantRegistrosProcessados += 1
              if nQuantRegistrosProcessados > nQuantMaximaDeRegistrosNoGrid
                EXIT
              EndIf
              aadd(brw_mat, {NOMES_LETO->CODIGO,NOMES_LETO->NOME} )
            ElseIf Substr(NOMES_LETO->NOME,1,nTamanhoNomeParaPesquisa) > st_p_
              EXIT
            Endif
            SKIP
          EndDo
        ENDIF
      ENDIF
      if Len(brw_mat)==0
        brw_mat:={{"",""}}
      Endif
      st_pesq=st_p
      n:=1
      ntot:=len(brw_mat)
      brw:rowpos=1
      brw:configure()
      LOOP
    ENDIF
    SET CURSO ON
    brw:dehilite()
    DO CASE
      CASE tecl_p = K_ENTER
        DBSetOrder(nOrdAnt)
        If Val(brw_mat[n,1])>0
          NOMES_LETO->(DBSeek(brw_mat[n,1]))
        Else
          GO nRec
        Endif
        volta_db=.f.
      CASE tecl_p = K_ESC
        DBSetOrder(nOrdAnt)
        GO nRec
        volta_db=.f.
      CASE tecl_p = K_UP
        brw:up()
      CASE tecl_p = K_DOWN
        brw:down()
      CASE tecl_p = K_RIGHT
        brw:right()
      CASE tecl_p = K_LEFT
        brw:left()
      CASE tecl_p = K_HOME   
        brw:home()
      CASE tecl_p = K_END   
        brw:end()
      CASE tecl_p = K_PGUP   
        brw:pageup()
      CASE tecl_p = K_PGDN   
        brw:pagedown()
      CASE tecl_p = K_CTRL_PGDN
        brw:gobottom()
      CASE tecl_p = K_CTRL_PGUP
        brw:gotop()
      CASE tecl_p = K_CTRL_END   
        brw:panend()
      CASE tecl_p = K_CTRL_HOME   
        brw:panhome()
      CASE tecl_p = K_CTRL_LEFT   
        brw:panleft()
      CASE tecl_p = K_CTRL_RIGHT   
        brw:panright()
    ENDC
*    st_pesq=""
  ENDD

Return



Obrigado,

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Dez 2018 20:26
por rossine
Olá,

Sobre o travamento de registros funcionou. Tive que mudar a configuração "Lock_Scheme" no letodb.ini

No DbInfo.ch está assim:

#define DB_DBFLOCK_COMIX        2   /* COMIX and CL53 DBFCDX hyper locking scheme */


Então mudei para "2" no letodb.ini

;Lock_Scheme = 6
Lock_Scheme = 2


Reiniciei o servidor do LetoDBF e funcionou.

Agora vou procurar algo sobre o DbRLockList.

T+

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 14 Dez 2018 08:30
por rossine
Olá,

Sobre a função DbRLockList(), no LetoDBF tem a "leto_MgGetLocks()" que retorna a lista dos locks.

Um detalhe interessante no LetoDBF é que no RDDCDX se você tem um sistema rodando no servidor e outro no terminal, a lista de Locks de um programa não é enxergada pelo outro programa e no LetoDBF sempre mostra todos os locks de ambos sistemas.

T+

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 16 Dez 2018 15:47
por rossine
Olá,

O retorno da função "dbRecordInfo para DBRI_LOCKED" não consegue enxergar o LOCK feito por outro programa sendo executado ao mesmo tempo.

  ? "DbRLock-LETODBF=", NOMES_LETO->( DbRLock() )   // Aqui LETO travou o registro - OK

  ? "leto_MgGetLocks=", hb_valtoexp( leto_MgGetLocks( nConect, "NOMES.DBF", "<100" )       // Aqui retorna a lista dos locks de todos os programas em execução

  ? "DBRI_LOCKED=", hb_valtoexp( NOMES_LETO->( dbRecordInfo( DBRI_LOCKED, recno() ) ) )     // Aqui retorna a lista dos locks só do programa em execução


Já que na função "leto_MgGetLocks()" os locks funcionam mult-sistema, talvez a função "dbRecordInfo" deveria também herdar este comportamento, mas deve ter um motivo para isto ser assim ou ainda não foi implementado no LetoDbf.

T+

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 21 Dez 2018 10:08
por rossine
Olá,

Estou tentando testar o esquema de Transação do LetoDBF, mas na linha que executo a função leto_BeginTransaction(), ocorre o erro abaixo:

Descrição do Erro: Erro ???DRIVER /1031 =>  Erro de sintaxe

[   2] LETO_BEGINTRANSACTION(0)                () [L]:.T., [U]:NIL,



Alguém saberia me dizer porque deste erro e como resolver ?

Obrigado,

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 21 Dez 2018 16:12
por rossine
Olá,
rossine escreveu:Olá,

Estou tentando testar o esquema de Transação do LetoDBF, mas na linha que executo a função leto_BeginTransaction(), ocorre o erro abaixo:

Descrição do Erro: Erro ???DRIVER /1031 =>  Erro de sintaxe

[   2] LETO_BEGINTRANSACTION(0)                () [L]:.T., [U]:NIL,



Alguém saberia me dizer porque deste erro e como resolver ?



Problema resolvido colocando o alias na função: MYALIAS->( leto_BeginTransaction() )

t+

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 22 Dez 2018 09:11
por porter
Olá pessoal,
Estou recebendo de tempos em tempos na estação, essa mensagem de erro no letodbf.log, o sistema trava e tenho que fecha-lo,
a mensagem diz que a porta 2812 foi desligada, o anti-vírus do servidor é o Avast, no firewall já liberei a porta 2812, já informei
a pasta do sistema na lista de exclusões do Avast e ainda continua apresentando esse problema, quando executo o sistema na estação,
espero que essas informações sejam suficientes para alguém que já teve esse problema, dizer o que pode ser feito, Obrigado.

12.21.2018 18:11:51       Server at port 2812 have shutdown.
01.01.2002 00:00:52       UDF file: C:\LETODBF\bin\letoudf.hrb not present.
01.01.2002 00:00:52 INFO: LetoDBf Server 3.00, will run at port :2812 ( internal also used :2813 )
01.01.2002 00:00:52 INFO: DataPath=\estoque, ShareTables=0, NoSaveWA=1, max database=999
01.01.2002 00:00:52 INFO: LoginPassword=0, CacheRecords=21, LockExtended=0
01.01.2002 00:00:52 DEBUG second socket: 188 for errors established
01.01.2002 00:00:52 DEBUG thread3() with pipe handle: 232 started .
.

Harbour 3.2.0(dev)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Dez 2018 08:08
por Jairo Maia
Olá porter,
porter escreveu:a mensagem diz que a porta 2812 foi desligada
Na verdade a mensagem está dizendo que o Servidor conectado na porta 2812 caiu.

Isso significa que o serviço LetoDBf Service parou. Você tem que entender o que está interrompendo o serviço do LetoDBf.

Ideal é você entender a razão que causa essa interrupção do serviço, mas alternativamente, você pode tentar fazer com que o windows reinicie o serviço automaticamente.

Tente o seguinte (no servidor):

1-Abra a tela de serviços do Windows;
2-Localize e selecione o serviço LetoDBf Service;
3-Clique com o botão direito sobre ele;
4-Vá na guia Recuperação e escolha Propriedades;
5-Marque Primeira Falha, Segunda Falha e Falha posteriores como Reiniciar o Serviço;
6-O tempo mínimo para outra tentativa do Windows é de 1 minuto, estará marcada como padrão;
7-Salve.

Se o serviço reiniciar e a conexão voltar dentro desse tempo (o sistema fica aguardando), então tente saber o que está parando o serviço.

Dica: Pode ser programa de acesso a banco também.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Dez 2018 11:00
por rossine
Olá,

Teria como usar o LetoDBF para acessar dois arquivos em unidades de discos distintas ?

Tentei configurar desta maneira mas não deu certo:

letodb.ini

...
DataPath = /
...


Exemplo de uso:

DbUseArea( .t., "LETO", "C:\myserver_C\ARQ_001.DBF", "NOMES_LETO_C", .t. )

DbUseArea( .t., "LETO", "D:\myserver_D\ARQ_002.DBF", "NOMES_LETO_D", .t. )


Obrigado,

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Dez 2018 09:10
por jelias
Olá amigos,

Tem alguém usando o LetoDB(f) com xHarbour 1.2.1?

Saudações,

Júlio.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Dez 2018 10:55
por asimoes
rossine escreveu:Olá,

Teria como usar o LetoDBF para acessar dois arquivos em unidades de discos distintas ?

Tentei configurar desta maneira mas não deu certo:


Acredito que somente executando o letodbf em portas distintas uma você usa a 2812 ou 2814 ...

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Dez 2018 11:22
por rossine
Olá,

O Elch, fez a implementação no LetoDBF para porder trabalhar com 2 arquivos letodn.ini distintos.

Vejam aqui: https://groups.google.com/forum/#!topic/harbour-users/-tbCwsJr_9g

T+

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Dez 2018 14:20
por asimoes
rossine escreveu:Olá,

O Elch, fez a implementação no LetoDBF para porder trabalhar com 2 arquivos letodn.ini distintos.


Você usa como serviço ? nunca precisei usar como serviço

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Dez 2018 17:52
por rossine
Olá Alexandre,

Sim, estou usando como serviço.

Abraço,

Rossine.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 30 Dez 2018 15:01
por rossine
Olá,

Tenho um índice onde tenho uma variável pública, assim:

Left( referencia, nNivel )

Usando o Leto, na hora de indexar, ocorre de execução , variável inexistente "nNivel"

Tentei criar esta variável no servidor atraves da funçao leto_varset() mas nao deu certo.

Alguem saberia me dizer como fazer ?

Resolvido: https://groups.google.com/forum/m/#!topic/harbour-users/ykkTp9LrEgQ

Obrigado,

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Jan 2019 12:07
por porter
Olá pessoal, tenho essa rotina onde transfiro registros de um arquivo para outro em seguida deleto o registro,
gostaria de saber, se com o LetoDBF, a cada registro deletado, é necessário dar um DBCOMMIT() e um DBUNLOCK()
a cada registro deletado, ou basta dar um DBCOMMIT() e um DBUNLOCK() quando terminar de processar o arquivo inteiro.

SELECT 82 // ITENS
SEEK STR(cPEDIDOS,6)
DO WHILE PEDIDO = cPEDIDO
     IGUALAVAR() // IGUALO VARIAVEIS
     SELECT 4 ; APPEND BLANK
     REPLACE CODMERCAD  WITH wCODMERCAD
     REPLACE NOMPRO_    WITH wNOMPRO_ 
     DBCOMMIT()
     DBRUNLOCK()
     SELECT 82
     RLOCK() ; DELETE // --> nessa linha, tem que executar DBCOMMIT() E DBUNLOCK() ?         
     SKIP
ENDDO
DBCOMMIT()
DBRUNLOCK()
SELECT 81
RETURN

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Jan 2019 13:25
por Jairo Maia
Olá porter,

Minha opinião: Apenas no final do processamento de todos os registros use DbCommit() e DbUnlock(). Usar DbRCommit(), DbCommit() ou COMMIT a cada registro atrasa e muito o processamento.

Eu uso apenas DbUnlock() no final do processamento (uso apenas isso) porque ao liberar o arquivo ou registro(s) eles são salvos no banco de dados automaticamente. Mas faça como achar mais seguro.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Jan 2019 13:32
por rubens
Boa tarde...
Eu uso apenas DbUnlock() no final do processamento (uso apenas isso) porque ao liberar o arquivo ou registro(s) eles são salvos no banco de dados automaticamente

Então.. Jairo.. eu tb usava dbcommit() e depois dbunlock(). Não sabia desse detalhe.
Então se usar apenas dbunlock() ele destrava o registro e salva alterações?
Isso apenas no registro atual ou na tabela inteira?

Achei isso no manual do harbour do git https://harbour.github.io/doc/harbour.html#dbunlock
Essa função libera o arquivo ou o bloqueio de registro na área de trabalho atualmente selecionada ou com alias. Ele não desbloqueará um bloqueio associado em bancos de dados relacionados.


Obg.
Rubens

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 04 Jan 2019 14:58
por Jairo Maia
Olá Rubens,

rubens escreveu:Isso apenas no registro atual ou na tabela inteira?
Na tabela aberta na área atual, e em todos os registros. Para ter esse efeito em áreas relacionadas e demais áreas abertas, use DbUnlockAll(), ou DbUnlock()->cNomeAlias.

Veja:
DbUnlock():
Releases file and all record locks in a work area.
(Tradução livre: libera o arquivo e todos os registros de uma determinada área)
PS: Se não informar a área, exemplo: DbUnlock()->cNomeAlias, o efeito será exclusivo na área atual.

DbUnlockAll():
Unlocks all records and releases all file locks in all work areas.
(Tradução livre: libera todos os registros e todos os arquivos em todas as áreas)

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 05 Jan 2019 18:01
por rossine
Olá,

Estou tendo um problema aqui com o Letodbf, quando eu vou gravar algum registro ou incluir um novo, dá erro de GPF ou trava a tela.
Estou abrindo os arquivos dbf e cdx, passando o path com IP corretamente e o arquivo é aberto normalmente.

Alguém já se deparou com este tipo de problema ?

Obrigado.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 08 Jan 2019 10:18
por Jairo Maia
Olá rossine,

Qual versão do Harbour você está usando? Pergunto porque nas duas versões mais recentes (a de 31/12/2018 e a anterior) tive muito problema na hora de travar registros usando o LETO, então voltei a usar uma versão de Junho de 2017.

Isso porque uso o Harbour 3.2, sobre o 3.4 não sei.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 10 Jan 2019 09:29
por asimoes
Olá,

Fiz atualização do LetoDbf ontem 09/01 atualização da mesma data e estou tendo problemas agora na criação de indices temporários

Error LETO/1006  Erro de criacao: DB\Harbour\h-AsaPrev\NETIO\SERVER5\DB\TMP6439544.CDX (DOS Error 3)
Called from ->ORDCREATE(0)


o DataPath no letodb.ini é:

DataPath = DB

Alguém está passando pelo mesmo problema ?

Acho que tem a ver com a nova função LETO_SETPATH

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 10 Jan 2019 11:41
por Jairo Maia
Alexandre, ainda não atualizei o LETO, mas você poderia fazer um teste por favor com a nova versão? Seria alterar DataPath = DB para DataPath = C:\DB, ou seja, colocar a unidade e reiniciar o serviço, para ver se vai funcionar.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 10 Jan 2019 12:44
por asimoes
Jairo Maia escreveu:Alexandre, ainda não atualizei o LETO, mas você poderia fazer um teste por favor com a nova versão? Seria alterar DataPath = DB para DataPath = C:\DB, ou seja, colocar a unidade e reiniciar o serviço, para ver se vai funcionar.


Jairo, descobri o problema, na minha aplicação logo no início tinha um

cDirSis := Hb_DirBase() + [NETIO\SERVER5\DB\]

SET DEFAULT TO &cDirSis.

Removi o SET DEFAULT TO &cDirSis. e funcionou nessa versão de 09/01/2019, o set default poderia até ser removido não impacta na aplicação.

Então nessa atualização não pode usar SET DEFAULT TO &cDirSis ou existe alguma forma que eu ainda não entendi, nem mesmo olhando o código da letodbf

O que eu não consegui entender ainda é essa função nova LETO_SETPATH que no changelog fiz que pode ser usada em substituição de SET PATH TO e SET DEFAULT TO,

Mas tem uma grande ? de como usar, se alguém souber gostaria de uma orientação de uso.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Jan 2019 16:35
por rossine
Olá Jairo,

Olá rossine,

Qual versão do Harbour você está usando? Pergunto porque nas duas versões mais recentes (a de 31/12/2018 e a anterior) tive muito problema na hora de travar registros usando o LETO, então voltei a usar uma versão de Junho de 2017.

Isso porque uso o Harbour 3.2, sobre o 3.4 não sei.



Estou usando o Harbour 3.4.

Parece que o problema está no controle do index, pois logo após alterar um um registro, até outro arquivo some os registros.

Tipo assim:

- Tenho um arquivo de contas a receber qonde a chaves principal é: documento + tipo de documento.
- Quando incluo um registro no contas a receber, os registros do cadastro de tipo de documentos, somem e quando eu tento reincluir um novo registro, aí ocorre o GPF.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 12 Jan 2019 18:44
por asimoes
Olá Rossine,

Tem como mostrar o código desta gravação ?

Eu tenho usado o harbour 3.4 compilado com LLVM/CLANG 7.01 e também a última atualização do letodbf de 12/01, o meu sistema está estável.
Faço DbRLock(), DbCommit(), DbUnLock() sem problemas.

Lembro de problemas com indice e por acaso descobri que era o parâmetro timeout Leto_Connect()

Passei usar: nTimeOut := -1
Nunca mais tive problemas com abertura de tabela e indices, as gravações estão ok.

Ex.:

cIpAddServer := [192.168.1.109]

cPortaServer := [2812]

cServidorDB  := [//] + cIpAddServer + [:] + cPortaServer + [/]

nTimeOut     := -1

Leto_Connect( cServidorDB, , , nTimeOut )

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 15 Jan 2019 21:01
por rossine
Olá Alexandre,

asimoes escreveu:Eu tenho usado o harbour 3.4 compilado com LLVM/CLANG 7.01 e também a última atualização do letodbf de 12/01, o meu sistema está estável.
Faço DbRLock(), DbCommit(), DbUnLock() sem problemas.

Lembro de problemas com indice e por acaso descobri que era o parâmetro timeout Leto_Connect()

Passei usar: nTimeOut := -1
Nunca mais tive problemas com abertura de tabela e indices, as gravações estão ok.

Ex.:

cIpAddServer := [192.168.1.109]

cPortaServer := [2812]

cServidorDB  := [//] + cIpAddServer + [:] + cPortaServer + [/]

nTimeOut     := -1

Leto_Connect( cServidorDB, , , nTimeOut )


Aqui eu já usava a configuração: nTimeOut := -1 e mesmo assim ocorria o erro que citei.

Não sei se o que o Elch mexeu nesta última release também resolveu meu problema, mas agora está funcionando 100%, inclusive estou testando em casa usando meu notebook via wifi acessando uma máquina local que deixei como servidor de dados do LETO e inclusive a velocidade de execução que também estava muito lento, melhorou muito o acesso aos dados.

Me parece que o Elch, corrigiu algum problema sobre "locks" nesta release. Vejam o comentário dele:

https://groups.google.com/forum/#!topic/harbour-users/lKCaAbJ9HPQ%5B26-50%5D

T+

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 20 Fev 2019 20:40
por jelias
Caros amigos,

Atualmente utilizo xHarbour 1.2.1 (Simplex) (Rev. 9421) / Borland C++ 5.5.1 (32 bit) e não tenho como iniciar uma migração para o Harbour hoje.
Já uso o Letodb em meu sistema e estou interessado em fazer testes com o Letodb(f). Após baixar, tentei gerar a LIB e encontrei os seguintes erros na execução do make_b32.bat.
O Letodb(f) aumentou a velocidade de acesso os dados? Na minha aplicação tenho que fornecer muitos relatórios várias vezes ao dia com críticas de vendas por item, o que gera uma demanda muito grande, visto que o banco de dados é enorme.

MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
   IF EXIST "obj\api\letocl.obj" del obj\api\letocl.obj
   bcc32 -c -Iinclude;D:\XHARBOUR\include -d   -tWM -D__WIN32__ -D__CONSOLE__  -DUSE_PMURHASH=1 -D__LETO_C_API__=1 -DLETO_NO_MT=1 -DLETO_NO_THREAD=1 -oobj\api\letocl.obj source\client\letocl.c
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
source\client\letocl.c:
Error E2209 D:\XHARBOUR\include\hbzlib.h 41: Unable to open include file '../source/rtl/zlib/zlib.h'
Error E2141 include\funcleto.h 176: Declaration syntax error
Error E2141 include\funcleto.h 177: Declaration syntax error
Error E2141 include\funcleto.h 178: Declaration syntax error
Error E2141 include\funcleto.h 180: Declaration syntax error
Error E2141 include\funcleto.h 181: Declaration syntax error
Error E2293 include\funcleto.h 182: ) expected
Error E2141 include\funcleto.h 185: Declaration syntax error
Error E2141 include\funcleto.h 186: Declaration syntax error
Error E2303 include\funcleto.h 189: Type name expected
Error E2293 include\funcleto.h 190: ) expected
Error E2303 include\funcleto.h 191: Type name expected
Error E2303 include\funcleto.h 192: Type name expected
Error E2147 include\funcleto.h 193: 'HB_BOOL' cannot start a parameter declaration
Error E2141 include\funcleto.h 196: Declaration syntax error
Warning W8017 D:\XHARBOUR\include\hbapirdd.h 125: Redefinition of 'HB_FT_TIME' is not identical
Error E2139 include\letocl.h 111: Declaration missing ;
Error E2238 include\letocl.h 112: Multiple declaration for 'HB_USHORT'
Error E2344 include\letocl.h 111: Earlier declaration of 'HB_USHORT'
Error E2139 include\letocl.h 112: Declaration missing ;
Error E2238 include\letocl.h 113: Multiple declaration for 'HB_USHORT'
Error E2344 include\letocl.h 111: Earlier declaration of 'HB_USHORT'
Error E2139 include\letocl.h 113: Declaration missing ;
Error E2238 include\letocl.h 114: Multiple declaration for 'HB_USHORT'
Error E2344 include\letocl.h 111: Earlier declaration of 'HB_USHORT'
Error E2139 include\letocl.h 114: Declaration missing ;
Error E2228 include\letocl.h 114: Too many error or warning messages
*** 26 errors in Compile ***

** error 1 ** deleting obj\api\letocl.obj


Se alguém puder ajudar, agradeço antecipadamente.

Saudações,

Júlio.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 23 Fev 2019 11:10
por Nascimento
na minha humilde opnião seria bom fazer um topico so com o letodb(fork) , aqui até tem muita informação, mais esta um pouco digamos "bagunçada" , porque mistura o letodb e o letodb(fork)
que convenhamos são parecidos mais tem pequenas diferenças
seria bom abrir um topico , com a a ideia inicial do itamar, que fosse um estilo manual de como iniciar , o que precisa o que mudaria no seu .prg atual
com pequenos exemplos funcionais, para facilitar
com toda certeza diminuiriam as duvidas em torno do assunto... fosse estilo o tutorial do acbr que o amigo rubens "salvo engano " fez
sei que demandaria um pouco de trabalho, então quem ja esta usando, poderia se empenhar "quando podesse claro pq sei que o tempo é corrido para nós ",
em ajudar esse topico ja que estaria tudo centalizado em um unico lugar

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 27 Fev 2019 20:16
por Nascimento
Com muito trabalho e ajuda de alguns amigos aqui ate consegui ja fazer a conexão com o letodbf

agora vem as duvidas:
como eu apago um indice que esta sendo gerenciado pelo letodb
se eu fechar os bancos tenho que reconectar?
falo isso pq em certo momento preciso fechar os bancos do modo compartilhado e reabrir em exclusivo

sem o leto em alguns casos uso rlock() , e em uma função deu o erro Leto/1022 travamento requerido, que so parou quando troquei rlock() por flock()
por hora são essas pequenas duvidas

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 28 Fev 2019 09:06
por jelias
Caro amigo Nascimento.

Nascimento escreveu:como eu apago um indice que esta sendo gerenciado pelo letodb

Não muda nada quanto ao uso do DBFCDX. Você pode continuar usando DBSETORDER(n).

Nascimento escreveu:se eu fechar os bancos tenho que reconectar?

Não é necessário, pois quando você fecha um arquivo específico, não termina a conexão com a pasta dos arquivos.

Nascimento escreveu:falo isso pq em certo momento preciso fechar os bancos do modo compartilhado e reabrir em exclusivo
sem o leto em alguns casos uso rlock() , e em uma função deu o erro Leto/1022 travamento requerido, que so parou quando troquei rlock() por flock(). por hora são essas pequenas duvidas

Nunca abri um arquivo em modo exclusivo no LETODB, por isso não posso dizer exatamente o porque do erro em questão, mais entendo que como o arquivo é exclusivo, o LETODB exige que todos os registros fiquem travados ""FLOCK()" para uma atualização.

Espero ter colaborado.
Saudações,

Júlio.

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 07 Jun 2023 22:02
por Linguagemclipper
Pessoal, o LETODBF foi atualizado e agora compila as libs para xharbour!!!
Entretanto, não estou conseguindo compilar o server com o HB32...

C:\PROGRAMAS\LetoDBf>hbmk2 letodb.hbp
hbmk2: Processando opções do ambiente: -comp=mingw
source\server\server.prg(348) Warning W0001 Ambiguous reference 'LETOOPT_UDFENABLED'
source\server\server.prg(349) Warning W0001 Ambiguous reference 'LETOOPT_DEBUGLEVEL'
source\server\server.prg(393) Warning W0001 Ambiguous reference 'LETOOPT_UDFENABLED'
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c: In function 'LetoMgKillUser':
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:3794:16: warning: implicit declaration of function 'hb_fsPipeWrite' [-Wimplicit-function-declaration]
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c: In function 'HB_FUN_LETO_FTS':
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:7355:16: warning: implicit declaration of function 'hb_strAtI' [-Wimplicit-function-declaration]
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c: In function 'leto_dbEvalJoinPrePos':
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:8370:10: warning: implicit declaration of function 'hb_itemCompare' [-Wimplicit-function-declaration]
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c: In function 'HB_FUN_LETO_DBEVAL':
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:9744:4: warning: implicit declaration of function 'HB_ISEVALITEM' [-Wimplicit-function-declaration]
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c: In function 'leto_Set':
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:12848:16: warning: implicit declaration of function 'hb_setGetItem' [-Wimplicit-function-declaration]
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c: In function 'leto_Info':
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:15122:15: error: 'DBI_TRANSREC' undeclared (first use in this function)
../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c:15122:15: note: each undeclared identifier is reported only once for each function it appears in
../../../../../../PROGRAMAS/LetoDBf/source/server/leto_2.c: In function 'HB_FUN_LETO_SERVER':
../../../../../../PROGRAMAS/LetoDBf/source/server/leto_2.c:2333:13: warning: this decimal constant is unsigned only in ISO C90 [enabled by default]
../../../../../../PROGRAMAS/LetoDBf/source/server/leto_2.c:2377:13: warning: implicit declaration of function 'hb_fsPipeWrite' [-Wimplicit-function-declaration]
../../../../../../PROGRAMAS/LetoDBf/source/common/common_c.c: In function 'HB_FUN_LETO_ISVALIDIP4':
../../../../../../PROGRAMAS/LetoDBf/source/common/common_c.c:773:56: error: 'LETO_DEFAULT_PORT' undeclared (first use in this function)
../../../../../../PROGRAMAS/LetoDBf/source/common/common_c.c:773:56: note: each undeclared identifier is reported only once for each function it appears in
hbmk2[letodb]: Erro: Executando compilador C/C++. 1
C:\HB32\comp\mingw\bin\gcc.exe -c -O3 -march=i586 -mtune=pentiumpro -fomit-frame-pointer -DUSE_LZ4=1 -DUSE_PMURHASH=1 -W -Wall -pipe -IC:/HB32/include -I../../../../../../PROGRAMAS/LetoDBf/include -I../../../../../../PROGRAMAS/LetoDBf/source/3rd/lz4/lib -IC:/HB32/contrib/hbct C:/Users/numer/AppData/Local/Temp/hbmk_f17t3t.dir/server.c C:/Users/numer/AppData/Local/Temp/hbmk_f17t3t.dir/errorsys.c C:/Users/numer/AppData/Local/Temp/hbmk_f17t3t.dir/common.c ../../../../../../PROGRAMAS/LetoDBf/source/server/errint.c ../../../../../../PROGRAMAS/LetoDBf/source/server/letoacc.c ../../../../../../PROGRAMAS/LetoDBf/source/server/letovars.c ../../../../../../PROGRAMAS/LetoDBf/source/server/letofunc.c ../../../../../../PROGRAMAS/LetoDBf/source/server/letolist.c ../../../../../../PROGRAMAS/LetoDBf/source/server/leto_2.c ../../../../../../PROGRAMAS/LetoDBf/source/common/blowfish.c ../../../../../../PROGRAMAS/LetoDBf/source/common/common_c.c ../../../../../../PROGRAMAS/LetoDBf/source/3rd/lz4/lib/lz4.c ../../../../../../PROGRAMAS/LetoDBf/source/common/lz4net.c ../../../../../../PROGRAMAS/LetoDBf/source/common/PMurHash.c C:/Users/numer/AppData/Local/Temp/hbmk_8p4cya.c

LetoDBf (fork) -> LetoDb com espinafre

MensagemEnviado: 11 Jun 2023 00:44
por Linguagemclipper
Esse erro acima eu resolví simplesmente baixando a última versão do HB32 novamente.
Depois disso compilou normalmente sem erros.