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

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.
Código:
(cAlias)->(Rlock())

Da forma que vc mostrou o código, está embolando as áreas(tabelas)
Código:
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

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

LetoDBf (fork) -> LetoDb com espinafre

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 ?

Código:
SELECT([<cAlias>]) --> nWorkArea

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

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

07 Nov 2018 18:45

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

// produtos->(DbUNLOCK())

LetoDBf (fork) -> LetoDb com espinafre

08 Nov 2018 08:55

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

Rubens

LetoDBf (fork) -> LetoDb com espinafre

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

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

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.

LetoDBf (fork) -> LetoDb com espinafre

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 1022 vezes

LetoDBf (fork) -> LetoDb com espinafre

08 Nov 2018 20:14

E o teste q propus alguém fez? poderia postar os resultados?

LetoDBf (fork) -> LetoDb com espinafre

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() ?

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

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)?

LetoDBf (fork) -> LetoDb com espinafre

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()

LetoDBf (fork) -> LetoDb com espinafre

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?

LetoDBf (fork) -> LetoDb com espinafre

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