Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема DBF. Оптимизация вывода прайса (число прочтений - 1163 )
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
DBF. Оптимизация вывода прайса
09. Ноября 2009 :: 12:30
Печать  
Есть задача оптимизировать вывод прайса, т.к. основное время в звпросе тратится на получение цены.
Данные
Справочник товаров - "Запаси"
у него периодический реквизит ЦенаБазовая.

Вот вариант моего зпароса
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

ТекстЗапроса = "
|SELECT
|      Спр.ID as [ТМЦ $Справочник.Запаси]
|      ,Цены.value as [ЦенаБазовая $Число]
|FROM
|      $Справочник.Запаси as Спр
|LEFT JOIN (
|      SELECT
|            c_dt.objid as objid,
|            c_dt.value as value
|      FROM 1sconst as c_dt
|      WHERE
|            c_dt.date IN
|            (SELECT MAX(c.date)
|            FROM 1sconst as c
|            WHERE
|                  (c.date <= :ВыбСистемнаяДата~~)
|                  AND (c.id = $ИсторияРеквизита.Запаси.ЦінаБазова)
|                  AND (c.objid = c_dt.objid)
|            )
|            AND  c_dt.id = $ИсторияРеквизита.Запаси.ЦінаБазова
|            ) as Цены
|ON Спр.id = Цены.objid

Что только не пробовал, не получается попасть в индекс.
Может есть варианты по другому достать цены, при этом красиво попадя в индекс?

Индекс такой есть у таблицы констант:
ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3)

Пишу для попадания в индекс полную фразу:
Where (c.id+c.objid+DTOS(c.date)+c.TIME+c.DOCID+STR(c.PARTNO,3) = $ИсторияРеквизита.Запаси.ЦінаБазова+c_dt.objid)
Ругается: SQL: Error correlating fields

Господа ГУРУ. предложите пожалуйста свои варианты. думаю всем будет полезно.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: DBF. Оптимизация вывода прайса
Ответ #1 - 09. Ноября 2009 :: 21:01
Печать  
Код
Выбрать все
ТекстЗапроса = "
| SELECT
|	TabMaxIndex.ID as [ТМЦ $Справочник.Запаси]
|	,Цены.value as [ЦенаБазовая $Число]
|
| FROM
|  
|(SELECT
|     Спр.ID as ID,
|     .partno,3)  ) as IndexMax
|
|FROM
|	$Справочник.Запаси as Спр
|
|LEFT JOIN 1sconst as Период
|
|ON
| rtno,3) =

|  $ИсторияРеквизита.Запаси.ЦінаБазова+Спр.id  
|
// здесь можно поставить условие на номенклатуру если нужна не вся или дату, если нужна цена на "прошлый" день
| GROUP BY   Спр.ID
|
| )  TabMaxIndex
|
|LEFT JOIN 1sconst as Цены
|
|ON
|  Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) =  TabMaxIndex.IndexMax
|"; 

  
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: DBF. Оптимизация вывода прайса
Ответ #2 - 10. Ноября 2009 :: 11:48
Печать  
Кирюхе РЕСПЕКТ
Действительно заработало быстрее.
Единственное, что нужно не забыть так это указать:
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать