Página 3 de 4
Tabela temporária em memória
Enviado: 15 Fev 2016 13:02
por rmlazzari
O recurso do Harbour é pra criar um arquivo temporário na memória.
Se está no disco, é arquivo temporário em disco, não é em memória.
Se fosse pra criar em disco, nem precisava existir o recurso, então algo está errado aí.
A única diferença é que se a gente criar arquivo normal, explicitamente no disco, quando chamar o programa de novo e tentar recriá-lo, vai dar pau, dizer que o arquivo já existe. Criando como stream, a dbcreate() apenas dá um zap... ou recria em cima, vai saber... Deve recriar em cima...
Mas o gozado foi descobrir que o termo "mem:" pode ser trocado, sem problema algum, rs...
Aguardo o retorno de vocês.
Xeretarei, asimoes.
Té já!
Tabela temporária em memória
Enviado: 15 Fev 2016 13:06
por rmlazzari
Mas que o arquivo está no disco e não na RAM... ah, isso está, sim.
Fui...
Tabela temporária em memória
Enviado: 15 Fev 2016 13:37
por JoséQuintas
Que tal isto:
Se isso é recurso do NTFS, o programa vai dar erro se usar FAT32 ou se o servidor não tiver esse recurso.
Se rodar em CD, o recurso de criar arquivo na memória também vai dar erro, por tentar gravar no CD.
Pen drive, também geralmente é FAT32.
E por aí vai.
Passou de temporário na memória, para sujeito a problemas.
Tabela temporária em memória
Enviado: 15 Fev 2016 13:50
por JoséQuintas
Testado no pen drive em fat32:
d:\cdrom\fontes\integra>H:
H:\>d:\temp\test
Error DBFNTX/1004 Create error: mem:test.dbf (OS Error 123)
Called from DBCREATE(0)
Called from MAIN(5)
H:\>
Código: Selecionar todos
PROC main()
LOCAL nI
FIELD F1
DBCREATE("mem:test", {{"F1", "N", 9, 0}},, .T., "memarea")
FOR nI := 1 TO 1000
DBAPPEND(); F1 := HB_RANDOM() * 1000000
NEXT
INDEX ON F1 TAG f1
DBEVAL({|| QOUT(F1)})
DBCLOSEAREA()
// Inkey(0)
// DBDROP("mem:test") // Free memory resource
RETURN
Tabela temporária em memória
Enviado: 15 Fev 2016 13:56
por asimoes
Quintas,
Neste seu teste tá faltando REQUEST HB_MEMIO e incluir HBMEMIO.HBC
Tabela temporária em memória
Enviado: 15 Fev 2016 14:13
por JoséQuintas
Peguei o fonte no changelog.
Fazendo o que indicou, nenhum arquivo é criado em disco.
E funciona normal no pendrive.
Então, se aparece alguma coisa em disco, estão compilando errado.... rs
É preciso muito cuidado nisso, porque se fizer errado, como aconteceu nas postagens, nem dá pra perceber o erro.
Coindiciu com um recurso do Windows.
Curioso que foi você mesmo que iniciou o post, por estar gravando no disco... rs
Não gostei, muito perigoso.
Tabela temporária em memória
Enviado: 15 Fev 2016 14:47
por asimoes
Quintas,
Usando o REQUEST HB_MEMIO e tendo o cuidado de informar o driver no dbcreate acredito que vai funcionar, agora se o arquivo gerado fica escondido em algum lugar não deu pra saber, pelo menos com o alternatestreamview não encontrei nada.
Tabela temporária em memória
Enviado: 15 Fev 2016 22:51
por rmlazzari
Copiei do "C:\hb32\contrib\hbmemio\tests\test.prg" que você indicou, asimoes...
e agora parece funcionar. Não encontrei nenhum arquivo "stream" com aquele utilitário, o Alternate Stream View, e também não encontrei nenhum arquivo de zero bytes, como era aquele "mem...
Parece que REQUEST HB_MEMIO sozinho é que não funcionou, deu o erro que falei no começo:
.hbmk/win/mingw/sudoku.o:sudoku.c:(.data+0x4c8): undefined reference to `HB_FUN_HB_MEMIO'
collect2: ld returned 1 exit status
Tanto que, só para confirmar, se tirar o #require "hbmemio", o erro volta.
Mas voltando o #require... que o arquivo está "lá" (aonde é que não sei), está, sim...
194
Vai ver está na RAM mesmo, ué... e sem a chamada a HB_MEMIO, quem cuida dessa parte do Harbour, prá não "deixar na mão", criou esse "mem" no disco em forma de stream.
Tabela temporária em memória
Enviado: 21 Jul 2016 16:49
por rubens
Na minha rotina de lançamento de compras eu uso um arquivo icomprast.dbf. Fica mais fácil para eu manuseiar os itens daquela compra específica, só no final é que eu gravo os itens no arquivo de itens de compras definitivo.
Já havia pesquisado sobre o arquivo em memoria e acho que dá pra encaixar meu icomprast.dbf nesse esquema.
A minha dúvida éh: Esse arquivo mem é criado na memória da máquina que o sistema está rodando ou no servidor? (Digo servidor para compartilhamento e não TS)
Porque se dois usuários entrarem na rotina ao mesmo tempo, vão trabalhar com o arquivo criado na memória da máquina? senão vai dar pau, porque o usuário A já está com o arquivo na memória aberto em modo exclusivo.
Sabem me dizer onde é criado o arquivo mem?
Obrigado
Rubens
Tabela temporária em memória
Enviado: 21 Jul 2016 16:59
por asimoes
Rubens,
A criação é na máquina que executa o programa e não no servidor.
Tabela temporária em memória
Enviado: 21 Jul 2016 17:53
por rubens
Asimoes...
Pelo que eu vi quando cria o arquivo ele já abre.. tentei abrir com o use e deu erro, daí fiz teste e segui o exemplo acima percebi que ele cria e abree o arquivo..
E tem função para saber se o arquivo existe ou só pelo teste do alias?
Tipo para testar o icomprast.dbf usa o file('icomprast.dbf') e para testar se existe um arquivo na memória? tentei file('mem:icomprast.dbf') e deu erro...
Obrigado
Rubens
Tabela temporária em memória
Enviado: 21 Jul 2016 18:37
por asimoes
Rubens,
Você tem como testar se a tabela está criada usando
If Select("tabtemp") != 0
Endif
Tabela temporária em memória
Enviado: 21 Jul 2016 18:40
por asimoes
Exemplo da pasta contrib/hbmemio/tests
Código: Selecionar todos
#require "hbmemio"
REQUEST HB_MEMIO
PROCEDURE Main()
LOCAL tmp
dbCreate( "mem:test", { { "F1", "N", 9, 0 } }, , .T., "memarea" )
FOR tmp := 1 TO 1000
dbAppend()
FIELD->F1 := hb_randNum( 1000000 )
NEXT
INDEX ON FIELD->F1 TAG f1
dbEval( {|| QOut( FIELD->F1 ) } )
dbCloseArea()
dbDrop( "mem:test" ) /* Free memory resource */
RETURN
Tabela temporária em memória
Enviado: 22 Jul 2016 09:52
por rubens
Obrigado aSimoes...
Sabe quais o argumentos da função dbDrop() ?
Eu Tô fazendo assim
Código: Selecionar todos
Function haver()
...
cDbf := CriaDBFMem('IHT')
...
dbCloseArea()
dbDrop( cDbf )
Return nil
**********************************************************************************************************
FUNCTION CriaDBFMem(cAlias)
LOCAL cTela := SaveScreen()
LOCAL GetList := {}
LOCAL cDbf := ''
LOCAL aStru
LOCAL cIndice := ''
*----------------------------------------------------------------------------
If cAlias = 'IHT'
cDbf := 'mem:IHAVERT.DBF'
cIndice := 'mem:IHAVERT.CDX'
// Verifica se o alias esta aberto se tiver fecha e apaga o arquivo da memoria
If Select('IHAV')>0
zap
Else
aStru := {;
{"CODPRO_" ,"C",05,00},;
{"NOMPRO_" ,"C",40,00},;
{"QTDE_" ,"N",12,03},;
{"UND_" ,"C",02,00}}
DbCreate(cDbf, aStru,, .T., cAlias)
Index on codpro_ tag codpro to (cIndice)
DbSetIndex(cIndice)
EndIf
*----------------------------------------------------------------------------
RETURN cDbf
Onde eu coloco dbDrop( cDbf ) na linha 06 poderia colocar dbDrop( select() ) ou dbDrop( dbSelectArea()) ?
Obrigado
Rubens
Tabela temporária em memória
Enviado: 22 Jul 2016 17:41
por asimoes
Rubens,
Quanto ao nome da tabela não é necessário a extensão .DBF
E quanto índice faça como no exemplo que eu postei sem o " to (cIndice) "
O parâmetro da Dbdrop é o nome da tabela ex.
cTabela:="mem:tabela"
DbDrop(cTabela)