Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Halcyon поиск записи


Автор: 14SatanA88 21.9.2012, 13:43
Доброго времени суток, уважаемые программеры.

Работаю с таблицами данных dBase IV. Есть одна таблица весом в 20 мегабайт, в которой 160000 записей.
В таблице содержатся цены на модели шмоток. Необходимо отобрать актуальные цены на определенный перечень моделей (перечень этот часто меняется, но это не столь важно). Моделей около 500, немного.

Опишу некоторые поля таблицы, которые участвуют в отборе цен:
 НАИМЕНОВАНИЕ ПОЛЯ (ТИП ПОЛЯ, ШИРИНА)
 TER (CHARACTER, 1)      - код территории.
 POL (NUMERIC, 4)         - код получателя.
 MOD (CHARACTER, 10)  - собственно модель шмотки.
 KODV (NUMERIC, 1)       - код валюты.
 DAT (DATE, 8)                - дата цены.

Значит, изначально у нас есть модель, код территории, код получателя и код валюты. Нужно по этим критериям выбрать самую свежую цену (поскольку в таблице может хранится несколько цен разных дат)

Сперва просто использовал компонент TQuery и запросом отбирал нужную информацию, но на это тратится очень много времени.

В итоге стал использовать Halcyon, а точнее THalcyonDataSet.
Динамически цепляю индекс.
Код

MemoryIndexAdd('NSICEN', 'MOD + TER + STR(KODV,1) + STR(POL,4) + DESCEND(DTOS(DAT))', '', Duplicates, Ascending);

Дальше проблема, из-за которой я вообще создал этот топик: хочу найти цену по четырем заданным критериям (все, кроме даты)
Код

FindKey(['Р5012447', '0', 0, 0]);

В итоге выбирается не то, что нужно

Если убрать DESCEND(DTOS(DAT)) из строки индекса, то результат поиска оправдывает ожидания, но необходимость поиска свежей цены по дате убивает смысл этого самого поиска.

Помогите разобраться.

Автор: Данкинг 21.9.2012, 14:20
Цитата(14SatanA88 @  21.9.2012,  14:43 Найти цитируемый пост)
в 20 мегабайт, в которой 160000 записей.

160000 записей - и .dbf размером всего 20 метров?  smile 
Цитата(14SatanA88 @  21.9.2012,  14:43 Найти цитируемый пост)
Помогите разобраться. 

1. Переписать прогу на ФоксПро.
2. Использовать другую СУБД - тот же Access.

Автор: 14SatanA88 21.9.2012, 14:25
Уважаемый Данкинг,
Цитата

1. Переписать прогу на ФоксПро.
2. Использовать другую СУБД - тот же Access.


Переписать прогу либо использовать другую СУБД не выйдет, предприятие.

Автор: Данкинг 21.9.2012, 15:05
А если использовать Tdbf и, соответственно, locate?

Автор: 14SatanA88 21.9.2012, 15:09
Данкинг, надо бы попробовать.
Если можно, запилите ссылок сразу.

Автор: Данкинг 21.9.2012, 15:52
Цитата(14SatanA88 @  21.9.2012,  16:09 Найти цитируемый пост)
Если можно, запилите ссылок сразу. 

Ну, в поиске Tdbf, какие тут ещё ссылки. smile Таблицу любого размера открывает моментально, т.е. как если бы таблица открывалась непосредственно FoxPro.

Автор: 14SatanA88 21.9.2012, 16:28
Поставил tDBF, создал индекс.

MOD + TER + STR(KODV,1) + STR(POL,4) + DESCEND(DTOS(DAT)) - вот такой не съел, потому что не знает о DESCEND.

MOD + TER + STR(KODV,1) + STR(POL,4) + DTOS(DAT) - вот этот съел, но сортировка нужна по ДАТЕ в обратную сторону.

DTOS(DAT) + MOD + TER + STR(KODV,1) + STR(POL,4), [ixDescending] - попробовал вот так, но, видимо, из-за даты долго работает Locate, хотя находит то что нужно найти.

Может, я делаю что-то не так?

Автор: Данкинг 21.9.2012, 16:33
Цитата(14SatanA88 @  21.9.2012,  17:28 Найти цитируемый пост)
вот этот съел, но сортировка нужна по ДАТЕ в обратную сторону.

А если после  DTOS(DAT) tag descend добавить?

Автор: 14SatanA88 21.9.2012, 16:36
Цитата

А если после  DTOS(DAT) tag descend добавить?


пробовал, ругается что не знает таких слов движок этот...

Автор: 14SatanA88 28.9.2012, 14:21
Проблема решилась написанием скрипта на clipper и запуск его собсна из программы на Delphi в нужный момент.

Автор: Данкинг 28.9.2012, 16:55
Цитата(14SatanA88 @  28.9.2012,  15:21 Найти цитируемый пост)
написанием скрипта на clipper

В смысле, скрипта - программы .exe, что ли?

Автор: 14SatanA88 28.9.2012, 17:20
Цитата

В смысле, скрипта - программы .exe, что ли?


да, просто фоновая прожка на клиппере. у них там просто колоссальный выигрыш в скорости по сравнению с Halcyon или Apollo. (я о работе с индексами NTX)

Автор: Данкинг 28.9.2012, 17:52
Ну понятно, я таких случаях на фоксе пишу .fxp и запускаю его из проги на Дельфи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)