Clipper On Line • Ver Tópico - LetoDb e Harbour, como usar.

LetoDb e Harbour, como usar.

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

Moderador: Moderadores

 

LetoDb e Harbour, como usar.

Mensagempor Minduim » 09 Jun 2014 15:15

Itamar;
em harbour utilizo a função hb_DirExist() para verificar se um diretório existe;

ao tentar criar uma rotina em Letodb com a função Leto_Directory() para fazer esta verificação, noto que o retorno da função é
sempre o mesmo, independente do parametro utilizado;

estou fazendo algo errado?, tem outra opção?

arquivo teste.prg
********************************
Function Main
LOCAL cPath, aDir

REQUEST LETO
RDDSETDEFAULT( "LETO" )

cPath := "//127.0.0.1:2812/"
@  1, 2 say "Leto_Directory( cPaTH, cParam )    Arquivos"

aDir:= Leto_Directory( cPath )
@  2, 2 say "cParam = ' '" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "D" )
@  3, 2 say "cParam = 'D'" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "H" )
@  4, 2 say "cParam = 'H'" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "S" )
@  5, 2 say "cParam = 'S'" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "V" )
@  6, 2 say "cParam = 'V'" + space(25) + str(len( aDir ), 6)

inkey(0)

return .T.
//Fim
Minduim
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 06 Abr 2011 13:02
Cidade/Estado: Santo andré - SP
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

LetoDb e Harbour, como usar.

Mensagempor Itamar M. Lins Jr. » 09 Jun 2014 17:18

Tem um BUG na leto_directory()
Só está vindo os arquivos. Não vem as subpastas.
Já mandei em email, vamos aguardar a resposta.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LetoDb e Harbour, como usar.

Mensagempor filizola » 10 Jun 2014 15:56

Itamar, seguindo os seus passos. acontece este erro.

Pode me ajudar ?
Anexos
erro.jpg
"Um passo a frente, e já não estará mais no mesmo lugar..."
Avatar de usuário

filizola
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 412
Data de registro: 19 Ago 2003 20:10
Cidade/Estado: Belo Horizonte/MG
Curtiu: 5 vezes
Mens.Curtidas: 6 vezes

LetoDb e Harbour, como usar.

Mensagempor Itamar M. Lins Jr. » 10 Jun 2014 18:01

Ola!
Pulou algo na leitura.
O hbmk2 não achou a lib rddleto!
Volte 3 casas. E leia novamente sobre o arquivo hbmk.hbm!
Quando postar coloque o conteúdo do seu arquivo acesso.hbp
Seguiu esses passos ?
http://www.pctoledo.com.br/forum/viewtopic.php?f=42&t=15108&start=15#p88946

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LetoDb e Harbour, como usar.

Mensagempor filizola » 12 Jun 2014 15:17

Desculpe mas realmente estou voltando os olhos para o letodb agora.

o make_b32.bat nao roda -> "make' nao e conhecido como um comando interno ou externo.

compilando diretamente os arquivos de extensao .hbp ger a extensaõ .a na pasta lib

utilizo o harbour nigthly (32)

conteudo do meu arquivo acesso.hbp

letodb.hbc
acesso.prg

conteudo do meu arquivo letodb.hbc

{win}incpaths=c:\letodb\include;
{win}libpaths=c:\letodb\lib;

{win}libs=rddleto

Desde já, agradeço
"Um passo a frente, e já não estará mais no mesmo lugar..."
Avatar de usuário

filizola
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 412
Data de registro: 19 Ago 2003 20:10
Cidade/Estado: Belo Horizonte/MG
Curtiu: 5 vezes
Mens.Curtidas: 6 vezes

LetoDb e Harbour, como usar.

Mensagempor Minduim » 14 Jun 2014 09:31

Itamar, bom dias a todos nós;

em harbour me utilizo da função SetFAttr() para modificar o atributo de um arquivo oculto de disco, para que as funções de tratamento de arquivo possam visualizá-lo;
- se o arquivo esta oculto ( atributo 'H' ), executo:
SetFAttr( arquivo, 0 ) // modifica o atributo para: sem atributo
- o arquivo esta visível para a funções de tratamento de arquivo;
- faço as operações necessárias e executo:
SetFAttr( arquivo, 2 ) // modifica o atributo para: oculto

como as funções LETO são análogas as do harbour, entendo que também terei que modificar os atributos do arquivo para ficarem visíveis para as funções do LETO, mas não encontrei uma função em LETO que trabalhe este parâmetro;
também não posso testar esta teoria enquanto a função LETO_DIRECTORY() não for corrigida;

alguma luz?

arquivo teste
********************************
Function Main
LOCAL cPath, aDir, cArq, cRet

REQUEST LETO
RDDSETDEFAULT( "LETO" )

cPath:= "//127.0.0.1:2812/"
cArq:= "TESTE.TXT" // arquivo com atributo 'H' (hidden/oculto)

aDir:= Leto_Directory( cPath, "H" )

if len( aDir ) > 0 .AND. ascan( aDir, { |_a| Upper( alltrim( _a[1] ) ) == cArq } ) > 0

  cRet:= Leto_MemoRead( cPath + cArq )

else

   cRet:= "ARQUIVO NAO ENCONTRADO"

endif

@  0, 0 say cRet
inkey(0)

return .T.


em tempo: também não encontrei uma função em LETO para a função em harbour "HB_DISKSPACE()"
Minduim
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 06 Abr 2011 13:02
Cidade/Estado: Santo andré - SP
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

LetoDb e Harbour, como usar.

Mensagempor Minduim » 17 Jun 2014 11:12

Itamar, bom dia a todos nós;

creio que identifiquei mais um erro na função LETO_DIRECTORY();

se chamamos a função em outro diretório que o padrão, este outro diretório existe e com um nome de pesquisa com mais de 11 caracteres aparece o erro na execução;

arquivo teste
********************************
Function Main
LOCAL cPath, aDir

REQUEST LETO
RDDSETDEFAULT( "LETO" )

cPath := "//127.0.0.1:2812/teste/xxxxxxxx.xxx"

@  1, 2 say "Leto_Directory( cPaTH, cParam )    Arquivos"

aDir:= Leto_Directory( cPath )
@  2, 2 say "cParam = ' '" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "D" )
@  3, 2 say "cParam = 'D'" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "H" )
@  4, 2 say "cParam = 'H'" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "S" )
@  5, 2 say "cParam = 'S'" + space(25) + str(len( aDir ), 6)

aDir:= Leto_Directory( cPath, "V" )
@  6, 2 say "cParam = 'V'" + space(25) + str(len( aDir ), 6)

inkey(0)

return .T.
Minduim
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 06 Abr 2011 13:02
Cidade/Estado: Santo andré - SP
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

LetoDb e Harbour, como usar.

Mensagempor Toledo » 18 Jun 2014 19:30

Amigos, teria como incluir no LetoDb alguma função para retornar informações sobre o servidor, como: versão do Sistema Operacional, número de serie do HD, data e hora no servidor,etc?

Outra dúvida, existe algum site onde se pode baixar a última versão do LetoDb já compilados para Windows e/ou Linux?

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

LetoDb e Harbour, como usar.

Mensagempor Minduim » 19 Jun 2014 08:19

bom dia Toledo;

não sei se sou a melhor fonte de informação para você, mas vou compartilhar minhas informações:

- estou utilizando a versão do site abaixo e creio que é a ultima versão disponibilizada:
http://sourceforge.net/projects/letodb/

-data e hora no servidor:
      LETO_MGGETTIME()                                     --> aDateTime
Function returns array {, }:
dDate - server date;
nSeconds - seconds after midnight.
Convert this values to datetime variable (Harbour):
hb_DTOT( aDateTime[1], aDateTime[2] )


das suas dúvidas, é só o tenho para compartilhar.
Minduim
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 06 Abr 2011 13:02
Cidade/Estado: Santo andré - SP
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

LetoDb e Harbour, como usar.

Mensagempor Toledo » 19 Jun 2014 09:30

Minduim escreveu:- estou utilizando a versão do site abaixo e creio que é a ultima versão disponibilizada:
http://sourceforge.net/projects/letodb/

Se você observar, esta versão é de 28/11/2012, então as atualizações feitas recentemente não estão neste binário.

Neste link tem a versão mais recente, com todas atualizações, mas é o código fonte. O que eu queria era se não tem algum site que já vem com o executável do LetoDb (atualizado) compilado para Windows e/ou Linux.
No caso das LIB's ai não tem jeito, tem que baixar o código fonte e compilar mesmo (veja como compilar aqui), mas o executável do LetoDb não importa como foi compilado. A versão para Windows fica até fácil compilar, mas uma versão Linux do LetoDb atualizada e já compilada seria muito bom.

Sobre a data e hora, muito obrigado!

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

LetoDb e Harbour, como usar.

Mensagempor Itamar M. Lins Jr. » 23 Jun 2014 11:08

Ola!
Amigos, teria como incluir no LetoDb alguma função para retornar informações sobre o servidor, como: versão do Sistema Operacional, número de serie do HD, data e hora no servidor,etc?

Data e hora:
   aDH := LETO_MGGETTIME()
   If DToS(aDH[1]) <> DToS(DATE())
      Hwg_MsgStop("Corrija a data do computador.")
      Leto_Commit()
      Close all
      Cancel
   EndIf

Sistema operacional, Numero de serie do HD, etc,etc...
Criar um arquivo de nome letoudf.prg e colocar dentro suas funções.
Veja o exemplo na pasta tests\letoudf.prg
/*  $Id: letoudf.prg,v 1.1.2.15 2013/03/21 18:53:35 ptsarenko Exp $  */

#include "dbinfo.ch"
#include "set.ch"

#ifdef __LINUX__
   #define DEF_SEP      '/'
   #define DEF_CH_SEP   '\'
#else
   #define DEF_SEP      '\'
   #define DEF_CH_SEP   '/'
#endif

/*
* File version
*/
FUNCTION UDF_Version
   RETURN "1.08"

FUNCTION UDF_Init
/*
* This function called immediately after loading letoudf.hrb, if exist
*/
   SET AUTORDER TO 1
   RETURN Nil

/*
* This sample function demonstrates how to use udf function on Letodb server
*
* Function Call from client:
*
* cRecBuf := Leto_Udf("UDF_AppendRec", <cFieldName>, [<cOrder>|<nOrder>], [<xMin>])
*
* The function return buffer of appended record. After call of Leto_ParseRec
*
* Leto_ParseRec( cRecBuf )
*
* Internal data of rddleto is filled from record buffer.
*/

FUNCTION UDF_AppendRec( nUserStru, cFieldName, xOrder, xMin )
   LOCAL nPos := FieldPos( cFieldName )
   LOCAL xKey, lApp, lOver := .F.

   IF ! Empty( xOrder )
      OrdSetFocus( xOrder )
   ENDIF
   IF leto_TableLock( nUserStru, 1 )

      dbGoBottom()
      xKey := FieldGet( nPos )
      IF Empty(xKey) .and. ! Empty(xMin)
         xKey := xMin
      ENDIF

      IF ValType( xKey ) == "N"
         xKey ++
         IF hb_FieldType(nPos) $ 'NF'
            lOver := xKey > Val( Replicate( "9", hb_FieldLen( nPos ) ) )
         ELSEIF hb_FieldLen( nPos ) == 2
            lOver := xKey > 0x7FFF
         ELSEIF hb_FieldLen( nPos ) == 4
            lOver := xKey > 0x7FFFFFFF
         ENDIF
      ELSEIF ValType( xKey ) == "C"
         xKey := StrZero( Val(xKey) + 1, Len(xKey) )
         lOver := (xKey = '*')
      ENDIF

      IF lOver
         lApp := .F.
      ELSE
         lApp := ( UDF_Append( nUserStru ) != Nil )
      ENDIF

      IF lApp
         FieldPut( nPos, xKey )
         dbCommit()
      ENDIF
      leto_TableUnLock( nUserStru, 1 )
   ELSE
      lApp := .F.
   ENDIF

   RETURN if( lApp, leto_rec( nUserStru ), Nil )

FUNCTION UDF_Append( nUserStru )
   LOCAL lApp, lSetDel

   lSetDel := Set( _SET_DELETED, .f. )
   dbGoTop()
   Set( _SET_DELETED, lSetDel )
   IF Deleted() .and. Empty( OrdKeyVal() )
      IF( lApp := leto_RecLock( nUserStru ) )
         dbRecall()
      ENDIF
   ELSE
      dbAppend()
      IF ( lApp := ! NetErr() )
         leto_RecLock( nUserStru, RecNo() )
      ENDIF
   ENDIF
   RETURN if( lApp, leto_rec( nUserStru ), Nil )

/*
* This sample function delete records on scope xScope, xScopeBottom and filter <cFilter>
*/
FUNCTION UDF_DeleteRecs( nUserStru, xScope, xScopeBottom, xOrder, cFilter, lDeleted )
   LOCAL aRecs := {}, n

   leto_SetEnv( xScope, xScopeBottom, xOrder, cFilter, lDeleted )
   dbEval({|| AADD(aRecs, RecNo())})
   leto_ClearEnv( xScope, xScopeBottom, cFilter )

   FOR EACH n in aRecs
      dbGoto(n)
      IF leto_RecLock( nUserStru, n )
         ClearRec()
         leto_RecUnlock( nUserStru, n )
      ENDIF
   NEXT
   dbCommit()

   RETURN leto_rec( nUserStru )

STATIC FUNCTION ClearRec
   LOCAL nCount := FCount(), nLoop, xValue

   dbDelete()
   FOR nLoop := 1 to nCount
      xValue := Nil
      SWITCH HB_FIELDTYPE( nLoop )
         CASE "C"
         CASE "M"
            xValue := ""
            EXIT
         CASE "N"
         CASE "F"
         CASE "I"
         CASE "Y"
         CASE "Z"
         CASE "2"
         CASE "4"
         CASE "8"
         CASE "B"
            xValue := 0
            EXIT
         CASE "L"
            xValue := .F.
            EXIT
         CASE "D"
         CASE "T"
            xValue := CTOD( "" )
            EXIT
      ENDSWITCH
      IF xValue != Nil
         FieldPut( nLoop, xValue )
      ENDIF
   NEXT
   RETURN Nil

/*
* UDF_UpdCascade - cascade update key fields in main and relation table
* Parameters:
*   nRecNo       - record number in the main table
*   cKeyField    - field name in the main table (primary key)
*   xKeyNew      - new value of key field
*   cClientAlias - client alias of the relation table
*   cKeyField2   - field name in the relation table (foreign key)
*   xOrder       - order name or order number in the relation table
*
* This function return array of record buffer in two tables
* Call from client:
*
* aRecBuf := Leto_Udf("UDF_UpdCascade", ... )
* (table1)->( leto_ParseRec( aRecBuf[1] ) )
* (table2)->( leto_ParseRec( aRecBuf[2] ) )
*/
FUNCTION UDF_UpdCascade( nUserStru, nRecNo, cKeyField, xKeyNew, cClientAlias, cKeyField2, xOrder )
   LOCAL xKeyOld, cLetoAlias, cArea := Alias()
   LOCAL nPos := FieldPos( cKeyField ), nPos2
   LOCAL cRecBuf1, cRecBuf2

   dbGoto( nRecNo )
   xKeyOld := FieldGet( nPos )
   IF xKeyOld != xKeyNew .and. leto_RecLock( nUserStru, nRecNo )
      FieldPut( nPos, xKeyNew )
      leto_RecUnlock( nUserStru, nRecNo )
      cRecBuf1 := leto_rec( nUserStru )

      cLetoAlias := leto_Alias( nUserStru, cClientAlias )
      dbSelectArea( cLetoAlias )
      IF Empty( cKeyField2 )
         cKeyField2 := cKeyField
      ENDIF
      nPos2 := FieldPos( cKeyField2 )
      IF ! Empty( xOrder )
         ordSetFocus( xOrder )
      ENDIF
      WHILE dbSeek( xKeyOld )
         IF leto_RecLock( nUserStru, RecNo() )
            FieldPut( nPos2, xKeyNew )
            leto_RecUnlock( nUserStru, RecNo() )
         ELSE
            EXIT
         ENDIF
      ENDDO
      dbSeek( xKeyNew )
      cRecBuf2 := leto_rec( nUserStru )

      dbSelectArea( cArea )

   ENDIF
   RETURN { cRecBuf1, cRecBuf2 }

/*
* UDF_FilesExist - check files existence at the specified path
* Parameters:
* cPaths - list of directories, delimited with comma
* aFiles - array of filenames without path to check
*
* This function return array of path for each file or "-" symbol,
* if file doesn't exist
*/
FUNCTION UDF_FilesExist( nUserStru, cPaths, aFiles)
   LOCAL aRet := {}, cFile, lFound, cPath
   LOCAL cDataPath := leto_GetAppOptions( 1 )
   LOCAL aPath := leto_getPath( cPaths )

   for each cFile in aFiles
      lFound := .f.
      for each cPath in aPath
         if File( StrTran( cDataPath + cPath + cFile, DEF_CH_SEP, DEF_SEP ) )
            AADD( aRet, cPath )
            lFound := .t.
            exit
         endif
      next
      if ! lFound
         AADD( aRet, "-" )
      endif
   next

   RETURN aRet

STATIC FUNCTION leto_getPath( cPaths )
   LOCAL aPath := hb_ATokens( cPaths, "," ), nI
   for nI := 1 to len( aPath )
      if ! ( Right( aPath[ nI ], 1) $ DEF_CH_SEP + DEF_SEP )
         aPath[ nI ] += DEF_CH_SEP
      endif
   next
   RETURN aPath

/*
* UDF_Locate function locate record on scope xScope, xScopeBottom and filter <cFilter>
   If lLast parameter specified, function locate the last occurence of record.
   If record isn't found, UDF_Locate returns eof() value.
*/
FUNCTION UDF_Locate( nUserStru, xScope, xScopeBottom, xOrder, cFilter, lDeleted, lLast )

   leto_SetEnv( xScope, xScopeBottom, xOrder, cFilter, lDeleted )

   IF lLast == Nil
      GO TOP
   else
      GO BOTTOM
   endif

   leto_ClearEnv( xScope, xScopeBottom, cFilter )

   RETURN leto_rec( nUserStru )

/*
* UDF_dbEval function returns buffer with records by order <xOrder>, and for condition,
* defined in <xScope>, <xScopeBottom>, <cFilter>, <lDeleted> parameters
* Function call from client:
   
   leto_ParseRecords( leto_Udf('UDF_dbEval', <xScope>, <xScopeBottom>, <xOrder>, <cFilter>, <lDeleted> ) )
   while ! eof()
      ...
      skip
   enddo
   dbInfo( DBI_CLEARBUFFER )

*/
FUNCTION UDF_dbEval( nUserStru, xScope, xScopeBottom, xOrder, cFilter, lDeleted )
   LOCAL cRecs

   leto_SetEnv( xScope, xScopeBottom, xOrder, cFilter, lDeleted )
   GO TOP
   cRecs := leto_dbEval( nUserStru )
   leto_ClearEnv( xScope, xScopeBottom, cFilter )

   RETURN cRecs

FUNCTION UDF_Trans( nUserStru, cTo )
/*
* UDF_Trans copy all records from current area to area with <cTo> client alias
   with conversion between numeric and character fields.
*/
   LOCAL cArea := Alias()
   LOCAL cAliasTo := leto_Alias( nUserStru, cTo )
   LOCAL lSetDel
   LOCAL lRes := .T., oError

   dbSelectArea( cArea )
   IF ! Empty( cAliasTo )
      lSetDel := Set( _SET_DELETED, .f. )
      BEGIN SEQUENCE WITH { |e|break( e ) }
         OrdSetFocus( 0 )
         GO TOP
         WHILE ! eof()
            UDF_TransRec( cAliasTo )
            SKIP
         ENDDO
         (cAliasTo)->(dbCommit())
      RECOVER USING oError
         WrLog('UDF_Trans error: ' + cArea + '-->' + cTo + ' ' +;
oError:description + if(!Empty(oError:operation), ':' + oError:operation,'') +;
' recno ' + LTrim(Str(RecNo())))
         lRes := .F.
      END SEQUENCE
      Set( _SET_DELETED, lSetDel )
   ENDIF
   RETURN lRes

STATIC FUNCTION UDF_TransRec( cAliasTo )
   LOCAL nPos1, nPos2, xVal, cFName, ct1, ct2

   (cAliasTo)->( dbAppend() )
   IF ! NetErr()
      FOR nPos1 := 1 to FCount()
         cFName := FieldName( nPos1 )
         IF (nPos2 := (cAliasTo)->(FieldPos(cFName))) # 0 .and. ! (cAliasTo)->(hb_FieldType(nPos2)) $ '+^'
            xVal := (cAliasTo)->(FieldGet(nPos2))
            ct2 := ValType( xVal )
            xVal := FieldGet( nPos1 )
            IF ! Empty( xVal )
               ct1 := ValType( xVal )
               IF ct2 = ct1
                  IF ct1 == "C"
                     xVal := RTrim( xVal )
                  ENDIF
                  (cAliasTo)->(FieldPut( nPos2, xVal ))
               ELSEIF ct1 = 'C' .and. ct2 = 'N'
                  (cAliasTo)->(FieldPut( nPos2, Val(xVal)))
               ELSEIF ct1 = 'N' .and. ct2 = 'C'
                  (cAliasTo)->(FieldPut( nPos2, Str(xVal, hb_FieldLen(nPos2), hb_FieldDec(nPos2))))
               ENDIF
            ENDIF
         ENDIF
      NEXT
      IF Deleted()
         (cAliasTo)->( dbDelete() )
      ENDIF
   ENDIF
   RETURN Nil

FUNCTION UDF_OpenTables( nUserStru, aTables, cPaths )
/*
* UDF_OpenTables open a tables, described in aTables array,
   and return to client an array with structure of opened tables
   Each table described with array of (at least) 1 to 5 elements:
   {<cFileName>, [<cAlias>], [<lShared>], [<lReadOnly>], [<cdp>]}
   Tables are opened on the server by one request from the client,
   the server returns information on open tables in the array,
   and then elements of array is transferred to the "use" command.
   The "use" command opens tables without the request to the server.
   The <alias> in the "use" command is mandatory parameter.

   Example of usage UDF_OpenTables from client:

   if leto_UDFExist( "UDF_OpenTables" )

      aAreas := leto_UDF( ""UDF_OpenTables"", {{"table1",, .t.}, {"table2",, .t.}, {"table3",, .t.}} )
      use (aAreas[1]) alias table1 shared new
      use (aAreas[2]) alias table2 shared new
      use (aAreas[3]) alias table3 shared new

   else

      use table1 alias table1 shared new
      use table2 alias table2 shared new
      use table3 alias table3 shared new

   endif

*/
   LOCAL aOpen := {}, aItem, nLen, cTable
   LOCAL cDataPath, aPath, cPath, cOpen

   IF cPaths != nil
      cDataPath := leto_GetAppOptions( 1 )
      aPath := leto_getPath( cPaths )
   ENDIF

   FOR EACH aItem IN aTables
      cTable := aItem[1]
      IF ! Empty( aPath )
         FOR EACH cPath IN aPath
            IF File( StrTran( cDataPath + cPath + cTable + ".dbf", DEF_CH_SEP, DEF_SEP ) )
               cTable := cPath + cTable
               exit
            ENDIF
         NEXT
      ENDIF
      nLen := len( aItem )
      cOpen := leto_Use( nUserStru, cTable,;
                         IIF( nLen >=2, aItem[2], ),;
                         IIF( nLen >=3, aItem[3], ),;
                         IIF( nLen >=4, aItem[4], ),;
                         IIF( nLen >=5, aItem[5], ) )
      AADD( aOpen, "+" + cTable + ";" + Substr( cOpen, Asc( Left( cOpen, 1 ) ) + 2 ) )
   NEXT

   RETURN aOpen


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LetoDb e Harbour, como usar.

Mensagempor Itamar M. Lins Jr. » 23 Jun 2014 11:25

Ola!
Foi corrigido o BUG do leto_directory

2014-06-20 17:20 UTC+0300 Pavel Tsarenko (tpe2/at/mail.ru)
* source/server/server.prg
* reverted last change
* source/client/leto1.c
* checking for empty tag name moved to the client side

2014-06-19 18:25 UTC+0300 Pavel Tsarenko (tpe2/at/mail.ru)
* source/client/letomgmn.c
! fixed typo in LETO_DIRECTORY()

2014-06-17 17:40 UTC+0300 Pavel Tsarenko (tpe2/at/mail.ru)
* source/server/server.prg
* allow empty tag name in index creation, for compatibility with DBFCDX


Anexo letodb atualizado.

Saudações,
Itamar M. Lins Jr.
Anexos
letodb_1_350_2_196.rar
LetoDb Atualizado 20/06/2014
(699.85 KiB) Baixado 265 vezes
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LetoDb e Harbour, como usar.

Mensagempor Toledo » 24 Jun 2014 10:39

Itamar, obrigado pela informação, já criei o meu arquivo letoudf.prg com as funções que eu precisava. Deu um pouco de trabalho para entender como iria funcionar estas novas funções com o server letodb, mas consegui, deu certo.

Então, para quem precisar que o server letodb execute alguma função específica, segue o que tem que ser feito:

1 - Crie o seu arquivo letoudf.prg com as funções que você precisa, veja modelo que está em \tests\letoudf.prg.

2 - Compile o arquivo letoudf.prg da seguinte forma:

harbour letoudf.prg -gh -n -w -i\hb32\include

3 - No comando acima será criado o arquivo letoudf.hrb, que você deve copiar para a pasta \BIN do LetoDb.

4 - Abra o arquivo server.prg que está na pasta \source\server do LetoDb e observe que no início deste arquivo existe vários comandos REQUEST chamando várias funções do Harbour. Então verifique se as funções do Harbour, que você usou nas funções que você criou no arquivo letoudf.prg, estão relacionadas em um destes REQUEST. As funções que não estiverem, você terá então que incluir em algum destes REQUEST.

Então, se você incluiu alguma função no REQUEST, você terá que compilar novamente o LetoDb, para isto basta entrar na pasta do LetoDb e digitar:

hbmk2 letodb.hbp

Atenção: se for necessário, você terá que incluir no arquivo letodb.hbp as LIB's que tem as funções que foram incluídas no REQUEST. Por exemplo, se no arquivo letoudf.prg você usou alguma função que está na LIB hbct e incluiu esta função lá no REQUEST do server.prg, então no arquivo letodb.hbp você terá que incluir uma linha com: -lhbct

5 - No seu programa para chamar as funções que você criou no letoudf.prg, use a seguinte função:
PathServ   :=  "//localhost:2812/"
cRet := Leto_Udf(PathServ+"UDF_NomeFunc",param1,...)

A expressão UDF_NomeFunc é o nome da função que você quer executar.
A expressão ,param1,... são os parâmetros da função, se for necessário.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

LetoDb e Harbour, como usar.

Mensagempor Minduim » 24 Jun 2014 16:49

Toledo, muito boas as suas explicações e obrigado por compartilhar a utilização do arquivo letoudf;

Itamar;
agradeço sua atenção;

fiz os testes com as modificações do letodb;
a função "Leto_DirExist" entendo que esta ok;
mas percebo que a função "Leto_Directory" ainda não esta retornando corretamente conforme os parametros;


arquivo teste
********************************
Function Main
LOCAL cPath, aDir

REQUEST LETO
RDDSETDEFAULT( "LETO" )

cPath := "//127.0.0.1:2812/teste/"

if Leto_DirExist( cPath )
   @  1, 2 say "Leto_Directory( cPaTH, cParam )    Arquivos"

   aDir:= Leto_Directory( cPath )
   @  2, 2 say "cParam = ' '" + space(25) + str(len( aDir ), 6)

   aDir:= Leto_Directory( cPath, "D" )
   @  3, 2 say "cParam = 'D'" + space(25) + str(len( aDir ), 6)

   aDir:= Leto_Directory( cPath, "H" )
   @  4, 2 say "cParam = 'H'" + space(25) + str(len( aDir ), 6)

   aDir:= Leto_Directory( cPath, "S" )
   @  5, 2 say "cParam = 'S'" + space(25) + str(len( aDir ), 6)

   aDir:= Leto_Directory( cPath, "V" )
   @  6, 2 say "cParam = 'V'" + space(25) + str(len( aDir ), 6)
else
   @  1, 2 say "Diretorio " + cPath + " nao encontrado"
endif

inkey(0)

return .T.
Minduim
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 06 Abr 2011 13:02
Cidade/Estado: Santo andré - SP
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

LetoDb e Harbour, como usar.

Mensagempor Minduim » 26 Jun 2014 14:49

Itamar;

fiz um pequeno estudo da função 'directory' com e sem o 'leto';

na 'imagem 001' traz o retorno da função sem utilizar o 'leto';
observe que o retorno só é correto com a sintaxe 'disk:\', contrariando a informação do 'harbour' conforme a 'imagem 003';

na 'imagem 002' traz o retorno da função utilizando o 'leto';
observe que o retorno é sempre com se utilizando a sintaxe 'disk:';

Toledo;

no post anterior, entendo que você implementou a função 'volserial' no 'leto' de sua aplicação;
observe na 'imagem 001' e 'imagem 002' que o retorno da função é sempre em relação ao driver 'C';
você também observa isto ou estou fazendo algo errado?

arquivo letoudf
********************************
function UDF_VOLSERIAL( cLabel )

   return VolSerial( cLabel )
Anexos
imagem 001.jpg
imagem 001
imagem 002.jpg
imagem 002
imagem 003.jpg
imagem 003
Minduim
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 06 Abr 2011 13:02
Cidade/Estado: Santo andré - SP
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Anterior Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro