Форум » [x]Harbour » HBMEMIO » Ответить

HBMEMIO

Dima: Что то я застрял. Вот такой код работает [pre2] REQUEST HB_MEMIO REQUEST DBFCDX PROCEDURE Main() dbCreate( "mem:test", { { "pole", "N", 1, 0 }},,.T.,"tmp" ) index on pole tag "test" close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},,.T.,"tmp" ) index on pole2 tag "test" close tmp dbDrop( "mem:test" ) RETURN [/pre2] Но так как работаю с ADS , код пришлось изменить и он становится не рабочим [pre2] REQUEST HB_MEMIO REQUEST DBFCDX PROCEDURE Main() dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag "test" close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag "test" close tmp dbDrop( "mem:test" ) RETURN [/pre2] Как явно указать DBCREATE что юзать нужно именно HBMEMIO ?

Ответов - 42, стр: 1 2 3 All

PSP: А так [pre2]dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"HBMEMIO",.T.,"tmp" )[/pre2] не получается?

Dima: PSP пишет: не получается? Нет так падает Dbcreate

SergKis: Dima пишет:Как явно указать DBCREATE что юзать нужно именно HBMEMIO ? PROCEDURE Main() RddSetDefault('DBFCDX') dbCreate( "mem:test", { { "pole", "N", 1, 0 }}, ,.T.,"tmp" ) ? RddName() // DBFCDX без RddSetDefault будет DBFNTX ...


PSP: Тогда ничего не надо указывать. "mem:test" достаточно. [pre2]https://groups.google.com/forum/?fromgroups=#!topic/harbour-users/d8C6cXWbR-E[/pre2]

SergKis: Dima HB_MEMIO через mem: в имени dbf

Dima: SergKis пишет: RddSetDefault('DBFCDX') dbCreate( "mem:test", { { "pole", "N", 1, 0 }}, ,.T.,"tmp" ) Это понятно ;) Но у меня RddSetDefault('ADSCDX') Поэтому dbcreate будет юзать именно ADSCDX и прога упадет. Можно сделать через ж...у Перед Dbcreate установитьRddSetDefault('DBFCDX') а после создания индекса RddSetDefault('ADSCDX')

Dima: Dima пишет: Перед Dbcreate установитьRddSetDefault('DBFCDX') а после создания индекса RddSetDefault('ADSCDX') Фокус не удался. Dima пишет: PROCEDURE Main() dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag "test" close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag "test" close tmp dbDrop( "mem:test" ) RETURN если умалчиваемый RDD LetoDB или ADSCDX то как сделать приведенный выше код рабочим ? Похоже по DBDROP убивается база а индекс продолжает жить.

Dima: Вот так будет пахать [pre2] dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag test orddestroy("test") close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag test orddestroy("test") close tmp dbDrop( "mem:test" ) [/pre2]

alkresin: Никак не пойму, чего именно вы хотите добиться. Чтобы rddads работал через hbmemio ? Это невозможно, да и зачем ?

Dima: alkresin пишет: Чтобы rddads работал через hbmemio ? Нет конечно , чуть позже объясню и все станет ясно.

Dima: [pre2] REQUEST DBFCDX REQUEST HB_MEMIO REQUEST ADS rddSetDefault( "ADSCDX" ) ..... и тд и тп иду в определеный раздел своей проги и формирую ведомость. открываю нужные базы с умалчиваемым RDD (ADSCDX) и создаю временную базу в памяти для отчета. dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag test ....... создал отчет и якобы похоронил и временную базу и индекс к ней close tmp dbDrop( "mem:test" ) затем лезу в другой раздел проги и создаю совершенно другой отчет и поля в базе будут другие и ключи в индексе тоже. создаю с тем же MEM: именем полагая что по DBDROP("mem:test") ранее я убил и базу и индекс. dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag test // облом наступит тут с base error 1003 [/pre2] Где я не прав и что нужно исправлять ? Почему жив предыдущий индекс ? То есть все как и выше писал [pre2] dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag test close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag test // BASE/1003 Variable does not exist: POLE close tmp dbDrop( "mem:test" ) [/pre2]

Pasha: Dima пишет: Где я не прав и что нужно исправлять ? Почему жив предыдущий индекс ? Метод drop отсутствует у DBFCDX, он его наследует от своего предка, т.е. DBF. А dbfDrop удаляет только файл dbf. Индекс он тоже вроде бы пытается удалить, ищет по запросу RDDI_ORDSTRUCTEXT, но что-то там не складывается видать. Можно не заморачиваться с этими методами rdd, а поступить проще: FErase("mem:test.dbf") FErase("mem:test.cdx") Префикс mem: хорош тем, что работает для любых файловых операций, если подключен memio. Это не rdd, а драйвер ввода-вывода. Так что это можно использовать.

Dima: Pasha пишет: FErase("mem:test.dbf") FErase("mem:test.cdx") Попробую , спасибо !!! Pasha пишет: Это не rdd, Это я понял методом полевых испытаний ;)

Dima: Pasha А как по имени алиаса закрыть индексы , закрыть базу и потом из завалить ? Про mem: речь Пробую функцию сочинить но пока не выходит. Что то типа memdrop(alias)

SergKis: Dima Есть еще hb_dbdrop(dbf,ind,rdd,...) no VIA RDD parameter, use default

Pasha: Dima пишет: А как по имени алиаса закрыть индексы , закрыть базу и потом из завалить ? Это же обычная рабочая область, закрывается по dbCloseArea() вместе с индексами. А валить файл и индекс надо как обычные файлы, только указать префикс "mem:" перед именем.

Andrey: SergKis пишет: Есть еще hb_dbdrop(dbf,ind,rdd,...) no VIA RDD parameter, use default А это для чего ? По доке не нашел...

Dima: Решил сделать так [pre2] Func Clearmemfile(_alias) local cfile:=(_alias)->(dbinfo(DBI_FULLPATH)) local cindeks:=(_alias)->(dbOrderInfo(DBOI_FULLPATH)) (_alias)->(DbCloseArea()) hb_dbdrop(cfile,cindeks) return nil [/pre2]

SergKis: Andrey пишет:По доке не нашел... см. DbCmd.c (на ней, я так понимаю, сделана dbDrop(...)) [pre2] HB_FUNC( HB_DBDROP ) { LPRDDNODE pRDDNode; HB_USHORT uiRddID; HB_ULONG ulConnection; const char * szDriver; PHB_ITEM pName; szDriver = hb_parc( 3 ); if( ! szDriver ) /* no VIA RDD parameter, use default */ { szDriver = hb_rddDefaultDrv( NULL ); } ulConnection = hb_parnl( 4 ); pRDDNode = hb_rddFindNode( szDriver, &uiRddID ); /* find the RDDNODE */ pName = hb_param( 1, HB_IT_STRING ); if( pRDDNode && pName ) hb_retl( SELF_DROP( pRDDNode, pName, hb_param( 2, HB_IT_STRING ), ulConnection ) == HB_SUCCESS ); else hb_errRT_DBCMD( EG_ARG, EDBCMD_EVAL_BADPARAMETER, NULL, HB_ERR_FUNCNAME ); } [/pre2]

Dima: Dima пишет: Решил сделать так Так тоже не прокатило. Индексный продолжает жить в памяти.



полная версия страницы