Имя: Пароль:
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...), но при этом жрет гораздо меньше памяти.