Página 1 de 1

LetoDb - Bug com Temporary Additive

Enviado: 17 Fev 2016 11:36
por asimoes
Pessoal,

Gostaria de uma confirmação sobre um bug com indices temporários usando a clausula Temporary ou Memory Additive com o rdd Leto

A situação é esta:
Em uma rotina eu faço isto:

O indice real da tabela APC01 é APC01.CDX

Código: Selecionar todos

APC01->(ordListClear()) //Remove o indice APC01.CDX da área de trabalho.
Até aqui tudo bem, não há indice na área de trabalho.
Só para confirmar que não há nenhum indice na área de trabalho, faço o For..Next OrdCont() que é zero

Código: Selecionar todos

FOR I:=1 TO APC01->(OrdCount())
   ? APC01->(OrdName(i))
   ? APC01->(OrdKey(i))
   ? APC01->(OrdFor(i))
   inkey(0)
NEXT
Agora é criado o indice temporário:

Código: Selecionar todos

INDEX ON CODIGO TAG TEMPIND01 FOR !Deleted() TEMPORARY ADDITIVE //Aparentemente cria o indice temporário.
O Problema que eu verifiquei é que o aquivo APC01.CDX foi atualizado!!!???

Então temos um bug na criação de indices temporários com LetoDb?

Fiz o mesmo teste em um programa sem letodb usando somente o rdd dbfcdx
O resultado do teste foi sem erro, o indice temporário foi criado e o indice fisico apc01.cdx não foi modificado.

Código: Selecionar todos

   USE APC01 ALIAS APC01 SHARED NEW VIA "DBFCDX"
   
   INDEX ON CODIGO TAG CODIGO TO APC01
   
   APC01->(DbCloseArea())
   
   USE APC01 ALIAS APC01 SHARED NEW VIA "DBFCDX"
   SET INDEX TO APC01.CDX
   FOR I:=1 TO APC01->(OrdCount())
       ? APC01->(OrdName(i))
       ? APC01->(OrdKey(i))
       ? APC01->(OrdFor(i))
       inkey(0)
   NEXT
   
   APC01->(OrdListClear())
   
   FOR I:=1 TO APC01->(OrdCount()) //verifica se há algum indice
       ? APC01->(OrdName(i))
       ? APC01->(OrdKey(i))
       ? APC01->(OrdFor(i))
       inkey(0)
   NEXT
   
   INDEX ON UTI+CODIGO TAG TEMPIND01 FOR UTI="S" .AND. !Left(Classe_Pg,2) $ "06,08,10,11,12" .AND. Empty(D_Faleci) .AND. Empty(D_Deslig) .AND. !Deleted() TEMPORAY ADDITIVE
   
   FOR I:=1 TO APC01->(OrdCount())
       ? APC01->(OrdName(i))
       ? APC01->(OrdKey(i))
       ? APC01->(OrdFor(i))
       inkey(0)
   NEXT

LetoDb - Bug com Temporary Additive

Enviado: 17 Fev 2016 13:03
por asimoes
Informação complementar:

Fiz o teste com HBNETIO e não houve o erro, o bug é no LetoDb

LetoDb - Bug com Temporary Additive

Enviado: 17 Fev 2016 14:21
por asimoes
Caraca,

Esse bug tá fazendo o indice inflar mais que balão de circo.

Vou ter voltar pro hbnetio.

LetoDb - Bug com Temporary Additive

Enviado: 17 Fev 2016 20:01
por JoséQuintas
Mas encontrou algum problema com hbnetio, ou apenas quis testar lettodb?

Só lembrando:
O servidor hbnetio vém pronto pra uso no Harbour.
Sinceramente... nem sei como instalar. Acho que faz mais de um ano que instalei e nunca precisei mexer.
Continua rodando até hoje.

LetoDb - Bug com Temporary Additive

Enviado: 17 Fev 2016 20:46
por asimoes
Quintas,
Mas encontrou algum problema com hbnetio, ou apenas quis testar lettodb?
Com hbnetio, está funcionando, da mesma forma se usar somente o rdd dbfcdx
O problema é com o letodb, mesmo usando ordlistclear() o letodb atualiza o indice fisico, para indices criados com temporary ou memory.
cada vez que faço uso do temporário ele bagunça o indice fisico como eu disse "inflando" erro critico! espero que alguém aqui confirme este bug que eu estou informando.

LetoDb - Bug com Temporary Additive

Enviado: 03 Mar 2017 02:16
por fladimir
Fiquei na dúvida, mas como o assunto é relativo a LetoDB e Additive Temporary vou postar aki...

Só um detalhe estou testando o LetoDB FORK (conforme tópico)

nas chamadas q tem Additive Temporary esta dando problema... exemplo:

Código: Selecionar todos

********************************************************************************
PROCEDURE Consulta()
********************************************************************************
	private dDt1, dDt2

	dDt1 := date()
   dDt2 := date()
   
	Abre('Vendas')
   INDEX ON RIGHT(Vendas->NrVenda,4) TO (temporario) ;
		FOR Vendas->Data >= dDt1 .and. Vendas->Data <= dDt2  ADDITIVE TEMPORARY // Aki da erro  no Log esta: Error Base/1003 Variable does not exist: dDt1 (sendo q tem)
		
...		 
return 

LetoDb - Bug com Temporary Additive

Enviado: 03 Mar 2017 09:08
por Itamar M. Lins Jr.
Ola!
Já tinha passado por este problema com o LetoDBf.

Código: Selecionar todos

2016-12-28 11:11 UTC+0100 Rolf 'elch' Beckmann (elchs users.noreply.github.com)
  * include/letocl.h
  * source/client/leto1.c
  * source/client/letocl.c
    + fExlusive flag for creating index
    ! fix LetoDbSkip() skipbuffer use
    ; Thanks! to Itamar for pointig to it

  * source/server/letofunc.c
    + fExlusive flag for creating index
    ! fix filename verification for fTemporary index

  * Readme.txt
  * source/server/leto_lnx.c
  * source/server/server.prg
    + adding UID and GID for Linux server to run as daemon

Tem que ativar isso, no letodb.ini "No_Save_WA = 1"
# Using temporary index orders [ created in Server OS temporary path ] are only possible in
mode: NO_Save_Wa = 1.
Leia o readme.txt tem mais coisas lá.

Saudações,
Itamar M. Lins Jr.

LetoDb - Bug com Temporary Additive

Enviado: 03 Mar 2017 09:12
por Itamar M. Lins Jr.
Ola!
Quanto ao outro problema com o Letodb... vem a mesma resposta que estamos acostumados:
Tem que criar um programinha simples que demonstre o problema para que todos possam testar.

Saudações,
Itamar M. Lins Jr.

LetoDb - Bug com Temporary Additive

Enviado: 03 Mar 2017 21:37
por fladimir
A propriedade q vc citou no letodb.ini já estava setada igual ao mencionado.

Segue exemplo q independente se é Temporario (preciso tb) ou não o erro ocorre, então pra isolar fiz um exemplo sem o temporário pra após contornado ver se o temporário vai funcionar.

Código: Selecionar todos

#include 'rddleto.ch'
func erro()
	LOCAL cPath, nConnect

	PRIVATE dt1 := Date()-30,; //----> Pensei q pudesse ser visibilidade tentei LOCAL, PRIVATE, STATIC, PUBLIC 
			  dt2 := Date()

	cPath := "//AKI_VAI_O_IP:2812/"
	RDDSETDEFAULT( 'LETO' )
	nConnect := leto_Connect(cPath)
	if nConnect == -1
		nRes := leto_Connect_Err()
		if nRes == LETO_ERR_LOGIN
			alert( "Falha ao Logar" )
		elseif nRes == LETO_ERR_RECV
			alert( "Error ao conectar" )
		elseif nRes == LETO_ERR_SEND
			alert( "Erro de envio" )
		else
			alert( "Nao connectado ao servidor: " + cPath )
		endif
		return .F.
	endif

	DBCLOSEALL()
 	DbUseArea( .T., 'LETO', 'VENDAS', 'VENDAS', .T.)   
   DBSETINDEX('VENDAS')
   INDEX ON RIGHT(VENDAS->NrVenda,4) TO Teste1 FOR VENDAS->DtVenda >= dt1 .and. VENDAS->DtVenda <= dt2 //--> Tentei trocar o nome das variáveis, tirar a referencia do alias VENDAS->
RETURN	                                        //--> Aki o original ‚ TEMPORARY (no letodb.ini esta setado akela sugestao) mas tirei pq tb nao deu certo
O Erro permanece dizendo q a variavel não é encontrada (segue imagem)
Imagem sem título.png

LetoDb - Bug com Temporary Additive

Enviado: 03 Mar 2017 23:27
por cl@udio
Boa noite a todos.
Fladimir
Tem algum problema com as clausulas FOR e WHILE.
Tenho este problema algumas vezes.
Apago todos os indices temporarios, e volta ao normal.
Mas ainda nao consegui identificar o erro.
Pois a TAG e totalmente diferente.
Trabalho com CDX.
[]s
Claudio

LetoDb - Bug com Temporary Additive

Enviado: 04 Mar 2017 00:35
por fladimir
Claudio obrigado pela atenção, mas se observar no código, estou testando sem ser indice temporário e ocorre o problema

LetoDb - Bug com Temporary Additive

Enviado: 04 Mar 2017 09:49
por fladimir
Se no exemplo postado eu trocar a condição do FOR para texto conforme abaixo, funciona, tanto pra indice normal ou temporario.

Código: Selecionar todos

   
   cCondicao :=  "VENDAS->DtVenda >= " + DTOC(dt1) + " .and. VENDAS->DtVenda <= " + DTOC(dt2) //--> fazendo assim da certo
   INDEX ON RIGHT(VENDAS->NrVenda,4) TO Teste1 FOR &cCondicao TEMPORARY // Ai funciona das 2 formas sem TEMPORARY e com.
Não sei se pode ser alguma configuração ou se é questão de avisar o pessoal da LETODB, se mais alguém pudesse testar o código exemplo e comprovar se a hipótese esta correta.

De qualquer forma vou continuar os testes aki pra ver como se comporta.

Agora, caso os testes dos colegas e a hipótese acima se confirme, pra não ter q mudar os meus INDEX.... vou ver pra fazer um

Código: Selecionar todos

#command INDEX => OrdCreate() ou para DbCreateIndex()
Mas isso seria um assunto para depois de avaliarmos as opções disponíveis.

[] 's

LetoDb - Bug com Temporary Additive

Enviado: 04 Mar 2017 10:05
por Itamar M. Lins Jr.
Ola!
O erro está correto.
A variável DT1 não existe do lado do servidor. Assim como não funcionará em qualquer sentença SQL. Tem que expandir mesmo

Código: Selecionar todos

cQuery := " dtos(vencimento) >= '"+dtos(dIni)+"' .and. dtos(vencimento) <= '"+dtos(dFim)+"' "

cOrdBy := " dtos(vencimento) + cod_banco + numero " //conta + dtos(vencimento) "

dbSelectArea('ch')
IF ch->(ordNumber("CH100")) > 0
   ch->(ordDestroy("CH100"))
EndIf

Index on &cOrdBy TAG ch100 FOR &cQuery temporary additive
Saudações,
Itamar M. Lins Jr.

LetoDb - Bug com Temporary Additive

Enviado: 04 Mar 2017 10:17
por fladimir
Obrigado Itamar por confirmar minha avaliação e prestar um esclarecimento do pq não achar a variavel q é pq do lado do Servidor não tem. Ok.

[] 's