Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос DBF и индексы
0 sendems
 
26.10.12
18:33
Привет, товарищи.
Есть такой прямой запрос, который прекрасно работал:

|SELECT
|    Рег.DATE AS ДатаДень,
|    SUM(-1*$Рег.Прибыль*(1-Рег.DEBKRED*2)) AS ПрибыльТовара
|FROM
|    $Регистр.ПартииТоваров AS Рег
|WHERE
|    ($Рег.Товар+DTOS(Рег.DATE)+Рег.TIME+Рег.IDDOC+STR(Рег.LINENO,4)+STR(Рег.ACTNO,6) BETWEEN
|        :выбТовар+DTOS(:Дата1~~)+'      '+'         '+'0000'+'000000' AND
|        :выбТовар+DTOS(:Дата2~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'9999'+'999999') AND
|    (Рег.IDDOCDEF NOT IN ($ВидДокумента.Перемещение,$ВидДокумента.Списание)) AND
|    ($Рег.Статус IN (:СП1,:СП2,:СП3,:СП4,:СП5)) AND
|    ($Рег.Фирма = :выбФирма)
|GROUP BY
|    Рег.DATE
|";

Потом мне захотелось выбрать все движения в регистре по всем товарам за тот же период, переписал условие BETWEEN так:
|    ($Рег.Товар+DTOS(Рег.DATE)+Рег.TIME+Рег.IDDOC+STR(Рег.LINENO,4)+STR(Рег.ACTNO,6) BETWEEN
|        '        '+DTOS(:Дата1~~)+'      '+'         '+'0000'+'000000' AND
|        'ZZZZZZZZ'+DTOS(:Дата2~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'9999'+'999999')
т.е. просто заменил конкретный товар на строки в 9 знаков длиной, как описано в .DD

Так вот по-новому, запрос не фильтрует по датам и вываливает все движения за все время.
Может индекс так не умеет работать? Или я еще чего не знаю, просветите.
1 Mikeware
 
26.10.12
18:37
какой-то у тебя странный подход. и индекс, похоже, тоже странный...
2 orefkov
 
26.10.12
21:07
Для отбора по всем товарам этот индекс не подойдет.
А то что ты сделал, показывает твое полное непонимание работы индексов.
3 КонецЦикла
 
26.10.12
21:07
Используй индекс DATETIME, а не VIAХХХ
Сам сравни строки ''+Дата и 'ZZZ'+Дата
Понятно что дата значения вовсе тут не имеет
4 orefkov
 
26.10.12
21:52
А 1sqlite сам бы индекс подобрал, какой надо. И без этих трехэтажных выражений в условиях.
5 Злопчинский
 
26.10.12
22:45
(4) на дбфной версии - есть какой-то резон использовать VFP или достаточно SQlite...?
6 orefkov
 
26.10.12
23:45
1sqlite  проигрывает фоксу по времени при больших агрегациях (sum ... group by...), но при этом жрет гораздо меньше памяти.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший