Btrieve прямая работа без драйвера
Добавлено: 11 Май 2019, 23:18
Недавно сетовал, что в кларионе нет штатной возможности работы с расширенными командами btrieve. Оказалось, что предусмотрена возможность прямого выполнения команд, используя PROP:PositionBlock. Пример из help:
Функция BTRV достаточно подробно описана в документации по api btrieve и предлагается как основа для различных языков программирования. Выглядит достаточно низкоуровнево, но если все это дело оформить в виде класса, то его использование в приложении достаточно простое. В целом стратегия понятна. Использовать who/where/what для структур file и queue. Например, задаем в queue нужные для чтения поля с теми же именами, что в file структуре и делаем что-то вида:
myClass.LoadQueue(*File, *Key, *Queue, String, Long)
Последние 2 параметра задают условия фильтрации и количество запрашиваемых записей. В результате получим заполненную очередь.
Не попробовав, сложно сказать, какой прирост производительности даст такая схема. Использовать ее есть смысл для расширенных операций, в которых можно ограничить чтение только заданными полями, задать условия отбора записей и возвращать за раз множество записей. То есть для оптимизации некоторых тяжелых отчетов.
Код: Выделить всё
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
myClass.LoadQueue(*File, *Key, *Queue, String, Long)
Последние 2 параметра задают условия фильтрации и количество запрашиваемых записей. В результате получим заполненную очередь.
Не попробовав, сложно сказать, какой прирост производительности даст такая схема. Использовать ее есть смысл для расширенных операций, в которых можно ограничить чтение только заданными полями, задать условия отбора записей и возвращать за раз множество записей. То есть для оптимизации некоторых тяжелых отчетов.