Página 1 de 1

Dbf na memoria

Enviado: 27 Fev 2015 19:04
por janio
Ola a todos,

Estou fazendo uns testes com dbf temporario na memoria, muito bom por sinal. Ocorre q qndo crio algum indice desse dbf, o comando dbDrop( "mem:test" ) apaga o 'dbf virtual', mas NAO o indice dele. O indice continua la na memoria e qndo tento criar outro dbf com outra estrutura, tem dado erro!

Como apagar tbm o indice?

Código: Selecionar todos

			aCampos := {} 
		   aAdd( aCampos , { "PEDIDO" , "N" ,  8 , 0 } )
			aAdd( aCampos , { "NRFECF" , "C" ,  21, 0 } )
		   aAdd( aCampos , { "NUMCCF" , "N" ,  6 , 0 } )
		   aAdd( aCampos , { "NUMCOO" , "N" ,  6 , 0 } )
		   aAdd( aCampos , { "DATEMI" , "D" ,  8 , 0 } )
		   aAdd( aCampos , { "FLGCAN" , "C" ,  1 , 0 } )

		   dbCreate( "mem:test", aCampos, "DBFCDX" , .T., "memArea" )

		   INDEX ON NRFECF + Str(NUMCCF) TAG CHAVE1

			Close memArea
		  	dbDrop( "mem:test" ) // aqui apaga apenas o dbf. E o indice????


Dbf na memoria

Enviado: 27 Fev 2015 19:59
por lugab
Jânio,

Acho q o bom e velho Hb-Run () executa qq coisa, até mesmo um Hb-Run ("delete arquivo.cdx")

By the way, vc poderia nos mostar como faz o dbseek() neste arquivo em memória, pra localizar um determinado registro pela chave criada ??.

Dbf na memoria

Enviado: 27 Fev 2015 21:39
por Itamar M. Lins Jr.
Resposta de quem fez.
dbDrop() deletes table, memofile and production index if they exist.

best regards,
Przemek
Saudações,
Itamar M. Lins Jr.

Dbf na memoria

Enviado: 28 Fev 2015 16:49
por janio
Itamar,

Acho que descobri o que está acontecendo!

Meu rdd default eh "MEDCDX" pq uso o Mediator... dae preciso colocar "DBFCDX" como parametro no dbcreate.

DBCREATE("mem:test", {{"F1", "N", 9, 0}},"DBFCDX", .T., "memarea")

Se omito esse parametro, o erro do indice desaparece, mas por outro lado eh criado uma tabela no mysql e nao um dbf temporario!

Assim da erro na criação do segundo indice:

Código: Selecionar todos

	DBCREATE("mem:test", {{"F1", "N", 9, 0}},"DBFCDX", .T., "memarea")

	INDEX ON F1 TAG CHAVE1

	Close memarea
	DBDROP("mem:test")

	DBCREATE("mem:test", {{"F2", "N", 9, 0}},"DBFCDX", .T., "memarea")

	INDEX ON F2 TAG CHAVE1

	Close memarea
	DBDROP("mem:test")
Assim nao da erro, porém em vez do dbf na memoria eh criado uma tabela fisica no mysql:

Código: Selecionar todos

	DBCREATE("mem:test", {{"F1", "N", 9, 0}},, .T., "memarea")

	INDEX ON F1 TAG CHAVE1

	Close memarea
	DBDROP("mem:test")

	DBCREATE("mem:test", {{"F2", "N", 9, 0}},, .T., "memarea")

	INDEX ON F2 TAG CHAVE1

	Close memarea
	DBDROP("mem:test")
Janio

Dbf na memoria

Enviado: 01 Mar 2015 08:26
por janio
Engraçado, qndo o rdd eh o leto... nao dah problema tbm.

:(

pq so com mediator?

Janio

Dbf na memoria

Enviado: 10 Mar 2015 10:37
por Kapiaba
Bom dia Janio,

Tente assim:

Código: Selecionar todos

FUNCTION CRIAR_DBF()

   LOCAL aDbf

   ***********************************
   * Minimal Clipper/Mediator program

   #Include "mediator.ch" && optional if not using Mediator macros

   request medntx && mandatory

   //RDDSETDEFAULT("MEDNTX") && set default data source to MEDNTX RDD driver
   && OR
   RDDSETDEFAULT("MEDCDX") && set default data source to MEDCDX RDD driver

   USE PRT

   ? "Connected to Mediator server"

   * Any database operations coming here will operate on
   * database server instead of DBF files!

   WAIT

   ? "Disconnecting from Mediator - Bye"

   // DBCREATE(<cDatabase>, <aStruct>, [<cDriver>])

   aDbf := {}
   AADD(aDbf, { "Name",    "C", 25, 0 })
   AADD(aDbf, { "Address", "C", 1024, 0 })
   AADD(aDbf, { "Phone",   "N", 13, 0 })
   //DBCREATE("PRT", aDbf,   "MEDNTX")
   DBCREATE("PRT", aDbf,   "MEDCDX")
   USE

RETURN NIL
https://pctoledo.org/forum/viewto ... 6&start=15

Abs

Dbf na memoria

Enviado: 10 Mar 2015 21:44
por JoséQuintas
Pra mim a coisa parece simples:
Nos RDDs do Harbour, ao criar "mem:" cria na memória.
O RDD mediator passa a usar o mediator, e no mediator não existe o recurso de "mem:"., pois depende do banco de dados utilizado.
A saída seria usar DBFCDX para esse arquivo na memória

Quanto ao lettodb, não deveria aceitar também.
Pra que criar arquivo temporário na memória do servidor?

Dbf na memoria

Enviado: 10 Mar 2015 21:53
por Itamar M. Lins Jr.
Engraçado, qndo o rdd eh o leto... nao dah problema tbm.
Porque usa o RDDCDX ou NTX do Harbour mais novo!
O mediator deve estar desatualizado deve ter sido criado antes dessa feature da criação do arquivo "mem:"
De que ano é esse mediator ?

Saudações,
Itamar M. Lins Jr.

Dbf na memoria

Enviado: 10 Mar 2015 22:02
por Itamar M. Lins Jr.
Pra que criar arquivo temporário na memória do servidor?
E quem disse que irá criar no servidor o arquivo temporário ?
Já testou p/ ver se é assim que funciona ?
Se ele muda de "LETO" para "DBFCDX" ou "DBFNTX", lógico que é para ser criado na própria estação.

Na estação!

Código: Selecionar todos

DBCREATE("mem:test", {{"F1", "N", 9, 0}},"DBFCDX", .T., "memarea")
Na estação!

Código: Selecionar todos

dbCreate( "testdbf", aStruct, "DBFCDX", .T., "MYALIAS" )
No servidor!

Código: Selecionar todos

DBCREATE("LETO", {{"F1", "N", 9, 0}},"leto", .T., "leto")
Pelo menos eu acredito que funcione assim, com o LETO é assim, falta testar a criação do arquivo mem:

Saudações,
Itamar M. Lins Jr.

Dbf na memoria

Enviado: 11 Mar 2015 08:34
por janio
Amigos,

A criação do TEMPORÁRIO eh na memoria da ESTAÇÃO! O mediator está criando uma tabela física, no hd e não na memoria. É um bug do Mediator. Não deveria ser assim. Deve ser pq a minha versão do mediator, como disse o Itamar, deve ser de antes desse 'benefício' do harbour.

Vou verificar...

Ja com o LETO funciona direitinho! Qndo vc manda criar um dbf no servidor, ele cria no servidor... qndo vc manda criar um dbf na MEMORIA da ESTAÇÃO, ele cria... enfim, funciona!

Talvez uma solução seria antes de criar o mem: mudar o rdd default para DBFCDX e depois voltar para MEDCDX... mas ae daria um trabalho em tanto. Deixar como tá (criando o dbf no hd da estação), por enquanto!

Janio

Dbf na memoria

Enviado: 23 Mar 2015 12:29
por Itamar M. Lins Jr.
Explicação legal do Przemek, de como funciona e a sintaxe.
Um problema parecido com o seu.
Your impression was correct.
The problem was only with your code.
You haven't set DBFCDX as default RDD so
dbDrop( "MEM:det" )
was executed by DBFNTX RDD and for sure DBFNTX cannot delete CDX
production index. You only have to fix your code and add
rddSetDefault( "DBFCDX" )
at the beginning so
dbDrop( "MEM:det" )
will be executed by DBFCDX or pass explicitly "DBFCDX" to dbDrop()
function, i.e.
dbDrop( "MEM:det",, "DBFCDX" )

By default dbDrop() removes table, memofile and production indexes for
given RDD. If you want to remove non production indexes then you should
use:
dbDrop( <cTable>, <cIndex> [, <cRDD> ] )
Some RDDs may bind indexes with tables (i.e. SQL based RDDs) so table
name should be also given for portable programs though DBF* RDDs do not
use it when indexes are deleted.

> I tested it with ferase("mem:det.cdx" ) which returns -1 and still get
> this error, so please if you can show how to get rid of this cdx.

hb_vf*() functions allow to access Harbour virtual filesystems, i.e.:
hb_VFErase( "mem:det.cdx" )

Look at the changelog about other hb_vf*() functions or ask on
harbour-user list for help.

best regards,
Przemek

Saudações,
Itamar M. Lins Jr.

Dbf na memoria

Enviado: 23 Mar 2015 15:14
por janio
Legal Itamar!

Vou fazer mais alguns testes!

Janio

Dbf na memoria

Enviado: 23 Mar 2015 19:57
por janio
Itamar,

Aparentemente agora está funcionando!

dbDrop() tem um terceiro parametro para informar o RDD!

Show!

Janio