Clipper On Line • Ver Tópico - LetoDBf (fork) -> LetoDb com espinafre

LetoDBf (fork) -> LetoDb com espinafre

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor Itamar M. Lins Jr. » 06 Nov 2018 17:15

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3394
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 97 vezes
Mens.Curtidas: 155 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 06 Nov 2018 18:44

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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor Itamar M. Lins Jr. » 07 Nov 2018 14:40

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3394
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 97 vezes
Mens.Curtidas: 155 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor porter » 07 Nov 2018 15:27

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)
porter
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 899
Data de registro: 10 Dez 2009 15:44
Cidade/Estado: OLIMPIA-SP
Curtiu: 3 vezes
Mens.Curtidas: 15 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor porter » 07 Nov 2018 18:45

Olá pessoal,
Não sei o motivo, mas ao comentar essa linha, não dá mais erro.

// produtos->(DbUNLOCK())
porter
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 899
Data de registro: 10 Dez 2009 15:44
Cidade/Estado: OLIMPIA-SP
Curtiu: 3 vezes
Mens.Curtidas: 15 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor rubens » 08 Nov 2018 08:55

Bom dia
E tem uma função nova para isso
Passe a usar DBRunlock() para destravar o registro...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1343
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 61 vezes
Mens.Curtidas: 80 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 08 Nov 2018 09:16

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 
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor porter » 08 Nov 2018 10:11

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.
porter
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 899
Data de registro: 10 Dez 2009 15:44
Cidade/Estado: OLIMPIA-SP
Curtiu: 3 vezes
Mens.Curtidas: 15 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 08 Nov 2018 10:57

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 1020 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor fladimir » 08 Nov 2018 20:14

E o teste q propus alguém fez? poderia postar os resultados?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


DESKTOP CONSOLE Harbour 3.4.0dev (4541270) (2016-06-28 07:05) | Console | MINGW | DBF | CDX | FastReport | MySQL
DESKTOP VISUAL... Harbour 3.2 | MinGW | Xailer 4.0.2 | MariaDB Nativo | Outros via ADO | FastReport
MOBILE Android/IOS e WEB - Outros
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2235
Data de registro: 15 Nov 2006 19:21
Curtiu: 17 vezes
Mens.Curtidas: 124 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 11 Nov 2018 10:34

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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 11 Nov 2018 10:41

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)?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 11 Nov 2018 17:34

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()
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor fladimir » 11 Nov 2018 18:37

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?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


DESKTOP CONSOLE Harbour 3.4.0dev (4541270) (2016-06-28 07:05) | Console | MINGW | DBF | CDX | FastReport | MySQL
DESKTOP VISUAL... Harbour 3.2 | MinGW | Xailer 4.0.2 | MariaDB Nativo | Outros via ADO | FastReport
MOBILE Android/IOS e WEB - Outros
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2235
Data de registro: 15 Nov 2006 19:21
Curtiu: 17 vezes
Mens.Curtidas: 124 vezes

LetoDBf (fork) -> LetoDb com espinafre

Mensagempor asimoes » 11 Nov 2018 19:36

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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3953
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 273 vezes
Mens.Curtidas: 187 vezes

Anterior Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro