Clipper On Line • Ver Tópico - LetoDBf (fork) -> LetoDb com espinafre
Mudar para estilo Clássico
Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.
Postar uma resposta

LetoDBf (fork) -> LetoDb com espinafre

08 Ago 2017 17:06

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

08 Ago 2017 18:27

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.
Código:
/*
* 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

08 Ago 2017 21:34

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

15 Ago 2017 14:07

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.
Anexos
ubuntu-testes.zip
(1.68 MiB) Baixado 285 vezes

LetoDBf (fork) -> LetoDb com espinafre

15 Ago 2017 17:55

Ola!
Código:
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:

Código:
  IF ARQLOCOK = 'F' ; dbCloseAll() ; RETURN ; ENDIF


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

16 Ago 2017 13:30

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

03 Abr 2018 20:36

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

04 Abr 2018 06:22

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

05 Abr 2018 11:13

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

05 Abr 2018 11:25

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

07 Abr 2018 12:27

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

12 Abr 2018 16:40

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

12 Abr 2018 17:13

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

17 Abr 2018 16:48

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

17 Abr 2018 18:26

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