Página 3 de 4

letodb e letodbf ?

Enviado: 12 Mar 2024 18:06
por leandrolinauer
Boa tarde a todos.
Fiz as alterações e esta ocorrendo algo errado que ainda não descobri.
minha pasta é:
C:\DADOS (Já uso desta forma para exatamente ficar mais facil fazer copia)
meu programa original mas que não é executado fica em
C:\DADOS \ EMPRESAX \ EXE (PASTA DO EXECUTAVEL E DO CONFIG.INI E OUTRAS PARAFERNALHAS)
o programa executável fica em cada maquina inclusive esta que é servidora por exemplo (é pq tenho uns clientes que tem dó de gastar com servidor dedicado)
fica em:
C:\EMPRESAX \ EXE \nomedoprograma.exe (este é o que eu executo o qual vai lá na pasta C:\DADOS \EMPRESAX\ AONDE TEM OS DBFs e usa.)

Problema que ocorreu.
Ao executar o programa ele criou arquivos dbf e indices vazios nesta pasta junto com o executavel.
Removi todos as configurações leto, deinstalei o servidor leto mas continuou a criar no lugar errado.
Removi a lib do executavel e ai deu certo, voltou ao DBF normal na pasta correta, mas sem LETO.

Alguem sabe qual configuração devo alterar?
Grato

letodb e letodbf ?

Enviado: 12 Mar 2024 18:13
por Itamar M. Lins Jr.
Olá!
Ao executar o programa ele criou arquivos dbf e indices vazios nesta pasta junto com o executavel.
Normal!!!rsrsr acontece nas melhores famílias. Covid? Aqui eu peguei uma tal de dengue...
Cade seu letodb.ini ?
A pasta é c:\dados ?
O resto(subdir) não importa.
Cadê seu fonte .prg ativando o leto e o comando use/dbcreate tá como ? o file ? ou leto_file ?
Não precisa postar tudo não só a parte que interessa.

Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 13 Mar 2024 09:46
por leandrolinauer
Bom dia Itamar.
Montei assim.
C:\DADOS\EMPRESAX\ (Pasta da empresa onde esta o banco de dados no servidor), caso seja a mesma máquina tem as duas pasta
\EXE\ (Pasta onde fica o executavel atualizado e outras informações)
\FILIAL1\ATIVO\ (Pasta banco de dados da filial1) dbfs e idxs
\FILIAL2\ATIVO\ (Pasta banco de dados da filial2) dbfs e idxs
Pasta do executável
C:\EMPRESAX\EXE\ (Pasta do executável) que fica em cada terminal aqui não tem DBF e nem IDX

Leto, coloquei ele na pasta C:\DADOS e instalei ele e esta em execução no SERVIÇOS do windows.
Leto.ini

Código: Selecionar todos

;Server = 192.168.1.11 (ip da minha maquina, onde estou testando)
;IP = 192.168.1.11
Port = 2812
DataPath = c:/dados/
;LogPath = /tmp
Default_Driver = IDX
;Lock_Scheme = 6
Memo_Type = FPT
Share_Tables = 1
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 = C:/DADOS/
Backup = /tmp/backup
Mask = *.dbf,*.dbt,*.idx 
Lock = 1
Seconds = 30
Wait = 1
ArcCmd = tar -cvzf /tmp/backup/leto.tar.gz /tmp/backup/*
FONTE:

Código: Selecionar todos

#include "rddleto.ch"  // defines do RDD
#include "dbinfo.ch"   // Header file for the RDD API Index OrderInfo and DBInfo support
#include "leto_std.ch" // traduz os comandos para o LETO
#include "letofile.ch" // traduz as funções para o LETO 

REQUEST LETO
REQUEST RDDLETO
REQUEST RDDInfo
Request DBFCDX
//quando forço para ele testar a conexão da erro de envio
nConect := leto_Connect( "//"+oDB_Server +":"+ oDB_Porta +"/")
   If nConect == -1
      nRes := leto_Connect_Err()
      //showmessage(,,"Leto",0)
      If     nRes == LETO_ERR_LOGIN
         ShowMessage(,, "Falha ao Logar",5 )
      ElseIf nRes == LETO_ERR_RECV
         ShowMessage(,,  "Erro ao conectar",5 )
      ElseIf nRes == LETO_ERR_SEND (ocorre este erro)
         ShowMessage(,,  "Erro de envio",5 )
      Else
         ShowMessage(,,  "Nao conectado ao servidor" ,5)
      EndIf
      Return .F.
   Else
      Showmessage(,,"Conectado ao servidor.",0) 
EndIf
Mesmo com o codigo acima desativado mas a LIB compilada no programa, ocorre a criação dos DBFs e IDXs na pasta do executável.
Não entendi pq esta criando no lugar errado.

letodb e letodbf ?

Enviado: 13 Mar 2024 10:12
por Itamar M. Lins Jr.
Olá!
Sobre o LetoDb.ini
O ponto e virgula ";" Anula o comando diz que é um comentário tipo // ou && do Harbour/Clipper.
Quem vai ativar(Ligar nosso .exe) o LetoDb quando é executado é:
nConect := leto_Connect( "//"+oDB_Server +":"+ oDB_Porta +"/")
Quem vai fazer a TROCA se é local ou não quando usamos o comando USE ou DbUseArea() é:
RddSetDefault("LETO")

Se NÃO tem essa TROCA via RddSetDefault() para o LETO vc precisa indicar no USE ou DbUseArea():
DbUseArea(.T.,"LETO",cDB,cAlias,.T.,.F.,'PTISO') //Usando Leto com DBFCDX
DbUseArea(.T.,"DBFCDX",cDB,cAlias,.T.,.F.,'PTISO') //Usando DBFCDX SEM LETO (local ou pasta compartilhada) -> mesmo com RDDSETDEFAULT("LETO")
Entendeu essa parte ?

Para verificar os DBF's via LETO, use IF LETO_FILE("clientes.dbf") //Assim vai usar o Leto via TCP.
A função file("clientes.dbf") vai depender se está no "C:" ou mapeado "y:\dados\pasta\"

A função file() é uma coisa leto_file() é outra.
Atenção o LetoDb está MONITORANDO a pasta "c:\dados" e tudo que tem dentro dela.
DataPath = c:/dados/
Troque por essa:
DataPath = c:\dados
Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 13 Mar 2024 10:31
por Itamar M. Lins Jr.
Olá!
Default_Driver = IDX
IDX ?
É o quê mesmo ? CDX sem usar TAG ? De toda forma não existe IDX(RDD)(que eu saiba) troque por CDX
No meu aqui "letodb.ini" eu renomeio o padrão e uso esse:

Código: Selecionar todos

Port = 2812              
DEFAULT_DRIVER = CDX     
DATAPATH = c:\database
ENABLEFILEFUNC = 1
CRYPT_TRAFFIC = 0
PASS_FOR_LOGIN = 0
PASS_FOR_MANAGE = 0
PASS_FOR_DATA = 0
Share_Tables  = 0
Cache_Records = 60
No_Save_WA = 1
[DATABASE]
DataPath = c:\database
Driver = CDX
Obs! é letodb.ini não é leto.ini Para outras pessoas não confundirem.

Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 13 Mar 2024 15:00
por leandrolinauer
Boa tarde.
Quanto a:
Default_Driver = IDX (MACACADA MINHA, não prestei atenção no comando DRIVER e não indices, o drive que uso é DBFCDX mas utilizo sem TAG, ficando IDX.
devido ao antigo sistema NTX indice para utilizar dbsetorder(x) nos relatorios, tenho que mudar muitos para usar TAG.

Quanto a: LETOdb.INI
Usar somente do seu exemplo já basta?
Port = 2812
DEFAULT_DRIVER = CDX
DATAPATH = c:\database (só trocaria para minha pasta C:\DADOS)
ENABLEFILEFUNC = 1
CRYPT_TRAFFIC = 0
PASS_FOR_LOGIN = 0
PASS_FOR_MANAGE = 0
PASS_FOR_DATA = 0
Share_Tables = 0
Cache_Records = 60
No_Save_WA = 1
[DATABASE]
DataPath = c:\database (só trocaria para minha pasta C:\DADOS)
Driver = CDX

//forma como abro os arquivos

Código: Selecionar todos

Function NetUseFile(cArquivo,aIndice,lNew,cAlias,cDriver,lShared,nRetry,nOrc,oExt,nDir,nLoja)
Local lForever,lRet:=.T.
cDriver :=If(cDriver=Nil,oRDD,cDriver) //informo ou pega o configurado no config.ini meu oRDD
lShared :=If(lShared=Nil,.T.,lShared) //bloquea ou nao
nRetry  :=If(nRetry =Nil,10,nRetry)
lNew    :=If(lNew   =Nil,.T.,lNew)
oExt    :=If(oExt   =Nil,"DBF",oExt)
nDir    :=If(nDir   =Nil,wDir,nDir)
nLoja   :=If(nLoja  =Nil,If(wFilial=Nil,"0001",wFilial),nLoja)
lForever:=(nRetry=0)
If wNetUse=.T.
   If MyFile(nDir+cArquivo+"."+oExt) //myfile procura se existe o arquivo
      ShowWaitProc()
      DbUseArea(lNew,cDriver,nDir+cArquivo+"."+oExt,cAlias,lShared)
...restante do codigo
....

Código: Selecionar todos

//funcoes de ajuda leto e dbfcdx
Function MyDirectory(a)
If oVIA_RDD=="LETO"
   Return LETO_Directory(a)
Else
	Return Directory(a) 
EndIf   

FuncTion MyFile(a)
If oVIA_RDD=="LETO"
   Return LETO_FILE(a) //procura
Else
   Return hb_FileExists(a) //File(a)
EndIf

FuncTion MyMakeDir(a)
If oVIA_RDD=="LETO"
   Return .F. //LETO_FILE(a) //procura
Else
   Return MakeDir(a) //cria a pasta
EndIf

Procedure MyFRename(a,b)
If oVIA_RDD=="LETO"
   LETO_FRename(a,b) //renomear
Else
   FRename(a,b) //renomear
   If FError() <> 0
      Return .F.
   EndIf
EndIf
Return .T.

Procedure MyFErase(a)
If oVIA_RDD=="LETO"
   LETO_FErase(a) //apaga
ElseIf oVIA_RDD=="NETIO"
   dbDrop(a)
Else
   FErase(a) //apaga
EndIf
Return .T.
Aproveitando o ensejo, para poder usar tanto LETO como DBFCDX local na maquina cliente daria certo?
Porque?, penso em deixar os temporários ainda na maquina do cliente em c:\empresa\temp

letodb e letodbf ?

Enviado: 13 Mar 2024 17:27
por Itamar M. Lins Jr.
Olá!
Usar somente do seu exemplo já basta?
Sim
Basta só isso ai.
Caso vc use o padrão dos demais.
devido ao antigo sistema NTX indice para utilizar dbsetorder(x) nos relatorios, tenho que mudar muitos para usar TAG.
Veja! Se eu entendi direito com CDX não muda, pode usar dbSetOrder(x), CDX só faz melhorar vai colocar tudo no BAG CDX.

Aqui:
If oVIA_RDD=="LETO"
Return .F. //LETO_FILE(a) //procura
Else
Return MakeDir(a) //cria a pasta
EndIf
Use:
Leto_DirMake( cPath ) ==> -1 if failed
Creates a directory at the server. [ renamed, formerly: Leto_MakeDir ]

Aqui:
Para fError()
Use:
Leto_FError( [ lAskServer ] ) ==> nError
Returns an error code set by ( some, not for all ) file functions at client.
NEW: with optional <lAskServer> set to TRUE ( .T. ) a query is send to the server.

DbDrop() funciona com LetoDbf()

Vc tá usando o LetoDbf do Elch, correto ?
Preciso ver o conteúdo do nDir

Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 13 Mar 2024 17:49
por Itamar M. Lins Jr.
Olá!
Aqui:

Código: Selecionar todos

FuncTion MyFile(a)
If oVIA_RDD=="LETO"
   Return LETO_FILE(a) //procura
Else
   Return hb_FileExists(a) //File(a)
EndIf
Tá passando o tal nDIR no parametro -> (a) ? -> DbUseArea(lNew,cDriver,nDir+cArquivo+"."+oExt,cAlias,lShared)
Removi todos as configurações leto, deinstalei o servidor leto mas continuou a criar no lugar errado.
Deve ser, por isso que sem leto deu erro ?

Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 13 Mar 2024 18:10
por Itamar M. Lins Jr.
Olá!
Aproveitando o ensejo, para poder usar tanto LETO como DBFCDX local na maquina cliente daria certo?
Sim.
Porque?, penso em deixar os temporários ainda na maquina do cliente em c:\empresa\temp
Eu uso TEMPORARY nos indices para isso.
Ou uso na memória.

Código: Selecionar todos

...
If Select('pa') > 0
   FechaDb('pa')
   dbDrop("mem:"+cArqParcelas,,"DBFCDX") 
EndIf
...
DbCreate("mem:"+cArqParcelas,aDbStrut,'DBFCDX',.T.,"pa")
Tudo que vc poder diminuir de tráfego na REDE melhorará a performance do sistema.
Copiando arquivo DBF pela rede do servidor para estação é fluxo desnecessário. Até localmente (Salvando no hd) abrindo, fechando...

Código: Selecionar todos

Index on &OrdBy Tag re100 for &cQuery temporary eval {||oBar:Step(),.T.}
Meus relatórios a maioria tem o tal Gauge ou Barra de Progresso.

Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 14 Mar 2024 08:21
por leandrolinauer
Bom dia.
Sobre:
Veja! Se eu entendi direito com CDX não muda, pode usar dbSetOrder(x), CDX só faz melhorar vai colocar tudo no BAG CDX
R: É porque nos relatórios eu chamo apenas o indice necessário, e em alguma movimentação quando pesquiso alguma coisa, utilizo abrir apenas o indice que necessito, é aonde tenho que mudar tudo no sistema primeiro para poder usar TAG no CDX.

Sobre:
Vc tá usando o LetoDbf do Elch, correto ?
R: Sim, pelas informações é o mais completo.
A uns anos atrás eu havia feito um test com LETODB o antigo e não gostei dele, ficou lento demais, por isto abandonei.
Ontem cedo fiz uns teste e consegui a conexão com o LETODBF mas ainda continuou criando os dbfs no lugar errado.
Vou analisar tudo que vc me passou para fazer novas alterações e testar novamente.

grato

letodb e letodbf ?

Enviado: 14 Mar 2024 17:31
por leandrolinauer
Boa tarde Itamar.
Hoje acabei não vendo praticamente nada, fiz outras alterações no sistema necessárias, mas agora a tardinha fui dar mais uma mexidinha e resolvi fazer por partes.
me alegrei que descobri o que esta fazendo criar os dbfs e idx na pasta aonde esta o executável em execução.
Este camarada abaix
//#include "letofile.ch" // traduz as funções para o LETO (não sei pra que serve, como tinha no exemplo no site coloquei e me fe...rrei (rsrsrs)

Estes outros abaixo da pra ficar sem problemas
#include "rddleto.ch" // defines do RDD
#include "dbinfo.ch" // Header file for the RDD API Index OrderInfo and DBInfo support
#include "leto_std.ch" // traduz os comandos para o LETO

Só testei esta parte, não chamei o LETO para ver se da conexão novamente, antes estava fazendo conexão só criava os dbfs vazios no lugar errado.

Agora vou mexer mais um pouquinho por partes.
Valeu

letodb e letodbf ?

Enviado: 18 Mar 2024 17:57
por leandrolinauer
Boa tarde.
Enrosquei em outro processo com o LETO.

Assim que eu uso com DBFCDX o relacionamento de campos em outros DBFs.
DbSetRelation(aArquivo,{|| &aRelation. },aRelation)

Como que é feito com LETO, porque esta ocorrendo erro, se estiver correto desta forma, vou ter que ver o porque do erro.

Estou tendo que alterar o sistema todo para trabalhar desta forma

Somente DBFCDX e somente LETO.
Talvez LETO e DBFCDX em temporários no servidor.

grato

letodb e letodbf ?

Enviado: 18 Mar 2024 19:45
por Itamar M. Lins Jr.
Olá!
DbSetRelation(aArquivo,{|| &aRelation. },aRelation)
Precisa REVELAR o tal aRelation antes
O que tem nesse aRelation ? é um ARRAY ? vc usa &aRelation... ? Tá certo isso ?

Código: Selecionar todos

cFunc:="DbSetRelation(aArquivo,{||"+ &aRelation +" },aRelation)"
&cFunc
Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 18 Mar 2024 20:01
por Itamar M. Lins Jr.
Olá!
Em um único RELATION que uso é esse aqui:

Código: Selecionar todos

Set relation to cod_fornec into 'fo' 
No ppo fica assim:

Código: Selecionar todos

dbSetRelation( "fo", {|| cod_fornec}, "cod_fornec", .F. )
Funciona normal, veja que não tem VARIÁVEIS.

Saudações,
Itamar M. Lins Jr.

letodb e letodbf ?

Enviado: 19 Mar 2024 08:28
por leandrolinauer
Bom dia
Então, funciona bem porque eu criei funções para abertura de arquivos e relacionamentos.
Exemplo como eu uso.
Abro os arquivos
NetUseFile("CEST0150",{"CEST0150"},.T.,,,,,.T.) ///cadastro de CST
NetUseFile("CEST0300",{"CEST0300","CEST0301","CEST0302","CEST0303","CEST0304"},.T.,,,,,.T.) //CADASTRO DE MERCADORIAS
na sequencia relaciono
NetRelFile("CEST0150","CST")// relaciono com o cest0150 da cst através do campo que existe no cest0300 CST para mostrar o nome da CST.
Desta forma acima não preciso escrever desta forma abaixo
dbSetRelation("CEST0150", {|| CEST0150->CST},"CEST0150->CST")

e assim vai para outros arquivos.
em DBFCDX funciona a anos assim.

DbSetRelation(aArquivo,{|| &aRelation. },aRelation)

Código: Selecionar todos

USE Employee NEW
USE Department NEW INDEX Dept
SELECT Employee
dbSetRelation("Department", {|| Employee->Dept},"Employee->Dept")
LIST Employee->Name, Department->Name
eu aprendi a usar funções ao invés de comandos em quase todos os modulos do sistema
dbSetRelation("CEST0150", {|| CEST0150->CST},"CEST0150->CST") isto


Grato