Btrieve прямая работа без драйвера

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1265
Зарегистрирован: 06 Ноябрь 2014, 12:48

Btrieve прямая работа без драйвера

Сообщение finsoftrz » 11 Май 2019, 23:18

Недавно сетовал, что в кларионе нет штатной возможности работы с расширенными командами btrieve. Оказалось, что предусмотрена возможность прямого выполнения команд, используя PROP:PositionBlock. Пример из help:

Код: Выделить всё

 MAP
  MODULE('Btrieve')
   BTRV(USHORT,LONG,<*STRING>,*UNSIGNED,<*STRING>,BYTE,BYTE),|
    NAME('BTRV'),PASCAL,RAW
    END
  END

StatData STRING(33455)
KeyData  STRING(64)
DataLen  UNSIGNED(33455)

 CODE
 PosBlock = file{PROP:PositionBlock}
 BTRV(15,PosBlock,StatData,DataLen,KeyData,64,0)  !Get file statistics
Функция BTRV достаточно подробно описана в документации по api btrieve и предлагается как основа для различных языков программирования. Выглядит достаточно низкоуровнево, но если все это дело оформить в виде класса, то его использование в приложении достаточно простое. В целом стратегия понятна. Использовать who/where/what для структур file и queue. Например, задаем в queue нужные для чтения поля с теми же именами, что в file структуре и делаем что-то вида:
myClass.LoadQueue(*File, *Key, *Queue, String, Long)
Последние 2 параметра задают условия фильтрации и количество запрашиваемых записей. В результате получим заполненную очередь.
Не попробовав, сложно сказать, какой прирост производительности даст такая схема. Использовать ее есть смысл для расширенных операций, в которых можно ограничить чтение только заданными полями, задать условия отбора записей и возвращать за раз множество записей. То есть для оптимизации некоторых тяжелых отчетов.
Рязань решает.

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1265
Зарегистрирован: 06 Ноябрь 2014, 12:48

Btrieve прямая работа без драйвера

Сообщение finsoftrz » 12 Май 2019, 22:22

В общем, проверил, работает. Фильтрация средствами btrieve, пакетное чтение, чтение заданных полей. Остановился на таком синтаксисе:

Код: Выделить всё

form_r  routine
  DATA
FsBtrieveApiL &FsBtrieveApi

lor:queue queue, pre()
lor:nameK string(20)
.

  CODE

  clear(TBtr:record)  !устанавливаем значения для ключа
  TBtr:ID=1           !будем начинать выборку с записи с id=1

  FsBtrieveApiL &= new(FsBtrieveApi)
  FsBtrieveApiL.init(TestBtrv,TBtr:key1)  !параметрами передаем ссылку на таблицу и ключ
  
  status#=FsBtrieveApiL.GetEqual()        !встаем на запись с ид=1
  if status#=0                            !запись найдена
     TBtr:ID=1
     FsBtrieveApiL.AddFilter('TBtr:ID','>','',0,TBtr:ID,0,0)  !добавляем фильтрацию ид>1
     status#=FsBtrieveApiL.GetNextExt(lor:queue,100,0)        !читаем одно поле в очередь порцией 100 записей

     fsViewQueue('',lor:queue)   !смотрим результат
     free(lor:queue)
  .

  FsBtrieveApiL.kill
  dispose(FsBtrieveApiL)
btrw1.jpg
Рязань решает.

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1265
Зарегистрирован: 06 Ноябрь 2014, 12:48

Btrieve прямая работа без драйвера

Сообщение finsoftrz » 12 Май 2019, 22:57

Глянул скорость на базе товаров 30+ тыс наименований.
Чтение по ключу с кодом (Long) через драйвер set/next занимает 60-70 мс.
Чтение в очередь с полями кода и наименования (150 символов) порциями по 300 записей занимает примерно 10 мс.
Рязань решает.

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1265
Зарегистрирован: 06 Ноябрь 2014, 12:48

Btrieve прямая работа без драйвера

Сообщение finsoftrz » 13 Май 2019, 9:02

Дополнил еще методы GetNextExt, GetPreviousExt, StepNextExt, StepPreviousExt необязательным параметром для отключения сохранения результата в очереди. Эта опция увеличивает скорость чтения и может быть использована для прогрева кэша.
Рязань решает.

Ответить