Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Не работает как надо запрос на dbf (число прочтений - 1771 )
Den@
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 23
Зарегистрирован: 24. Октября 2008
Не работает как надо запрос на dbf
21. Февраля 2009 :: 19:59
Печать  
Сам запрос:
     
ТекстЗапроса = "
     |SELECT
     |            Спр.ID AS [Номенклатура $Справочник.Номенклатура],
     |            Запрос.Остаток AS Остаток,
     |            Запрос.ЦенаПост/Запрос.Остаток AS ЦенаПост,
     |            ЗапросЦены.Цена AS ЦенаРеал,
     |            0 AS [Фильтр $Число],
     |            0 AS [Свернуть $Число]
     |FROM
     |            $Справочник.Номенклатура AS Спр
     //запрос к остаткам
     |            LEFT JOIN
     |            (
     |            SELECT
     |                        $Рег.Номенклатура AS Спр,
     |                        SUM($Рег.ЦенаПост*$Рег.Количество) AS ЦенаПост,
     |                        SUM($Рег.Количество) AS Остаток
     |            FROM
     |                        $РегистрИтоги.Остатки AS Рег
     |            WHERE
     |                        (Рег.Period = :ДатаТА~~)";
     Если ПустоеЗначение(фВыбФирма) = 0 Тогда
           ТекстЗапроса = ТекстЗапроса + "
           |AND
           |            $Рег.Фирма = :ВыбФирма";
     КонецЕсли;
     ТекстЗапроса = ТекстЗапроса + "
     |            GROUP BY
     |                        Спр
     |            ) AS Запрос ON Спр.ID = Запрос.Спр
     //запрос к ценам
     |            LEFT JOIN
     |            (
     |            SELECT
     |                  СпрН.ID AS СпрН,
     |                  Цены.Цена AS Цена
     |            FROM
     |                  $Справочник.Номенклатура AS СпрН
     |                  LEFT JOIN
     |                  $Справочник.Цены СпрЦ ON (СпрЦ.ParentExt = СпрН.ID)
     |                                                       AND
     |                                           ($СпрЦ.ТипЦен = :ТипЦен)
     |                  LEFT JOIN
     |                  (
     |                  SELECT
     |                        Период.objid as objid,
     |                        Период.value as Цена
     |                  FROM 1sconst as Период
     |                  WHERE
     |                        Период.date IN
     |                        (
     |                        SELECT
     |                              MAX(Константа.date)
     |                              FROM 1sconst as Константа
     |                              WHERE
     |                                    (Константа.date <= :ВыбДата~~)
     |                                    AND
     |                                    (Константа.id = $ИсторияРеквизита.Цены.Цена)
     |                                    AND
     |                                    (Константа.objid = Период.objid)
     |                        )
     |                        AND Период.id = $ИсторияРеквизита.Цены.Цена
     |                  ) AS Цены ON Цены.objid = СпрЦ.ID
     |            ) AS ЗапросЦены ON Спр.ID = ЗапросЦены.СпрН
     |
     |WHERE
     |            Спр.ParentID = :Группа      
     |            AND
     |            Спр.IsFolder = 2";
           
     Запрос.УстановитьТекстовыйПараметр ("Группа", лГруппа);
     Запрос.УстановитьТекстовыйПараметр("ДатаТА", НачМесяца(ПолучитьДатуТА()));
     Запрос.УстановитьТекстовыйПараметр("ВыбДата", ТекущаяДата());
     Запрос.УстановитьТекстовыйПараметр("ТипЦен", Константа.РозничнаяЦена);
     Запрос.УстановитьТекстовыйПараметр("ВыбФирма", фВыбФирма);

Теперь по ошибкам:

1. При выполнении запроса для различных групп товара, поле ЦенаПост для одной из групп товара для всех элементов содержит пустое значение, даже там где есть остатки. Для всех остальных групп показывает все верно.

2. В результате выполнения выдается номенклатура со всеми изменениями ЦенаРеал в пределах текущего месяца, т.е. если было 2 поступления в текущем месяце для данного товара, то получается две строки с одинаковой номенклатурой (цена устанавливается документами), чего нам не нужно, а нужна только последняя цена.
Пробовал запрос к ценам выполнять отдельно, работает также, как и тут, выдает лишние строки. По-моему функция MAX должна была выбрать только одно значение...

Где копать - не знаю, так как в запросах не силен то все что нужно в основном скопировал откуда-то и дорабатывал для своих нужд, может ошибка на поверхности, подскажите пожалуйста!
  
Наверх
 
IP записан
 
Aleksandr
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 21. Февраля 2009
Re: Не работает как надо запрос на dbf
Ответ #1 - 21. Февраля 2009 :: 21:18
Печать  
Замени
Код
Выбрать все
ТекстЗапроса = "
      |   СпрН.ID AS СпрН,
      |   Цены.Цена AS Цена
........
 


на
Код
Выбрать все
      |    СпрН.ID AS СпрН,
      |    $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) As
      |    LEFT JOIN
      |    $Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
      |                             $СпрЦ.ТипЦен = :ТипЦен";Цена  



я на сколько понял в справончике цен реквезит Цена переодический, получай последнее значение

относительно первого вопроса думаю $Рег.Количество гдето принимает значение 0, а сумма не списалась, или на оборот - цена прихода = 0. Тоесть нарушена последовательность документов, вот и получаешь по группе остоток = 0,  хотя такое же должно быть в разрезе элементов
« Последняя редакция: 21. Февраля 2009 :: 23:44 - Aleksandr »  
Наверх
 
IP записан
 
Den@
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 23
Зарегистрирован: 24. Октября 2008
Re: Не работает как надо запрос на dbf
Ответ #2 - 22. Февраля 2009 :: 13:05
Печать  
Спасибо! Насчет 1, при первой же возможности займусь перепроведением, должно быть и правда где-то образовалась ошибка. Хотя если убрать деление, то общая цена поступления выводится правильно для всех элементов...

Насчет 2 $ПоследнееЗначение - это же только для SQL, а у меня dbf... Вопрос актуален, так как сейчас приходится после выполнения запроса в цикле заполнять цену реализации средствами 1с, что гораздо медленнее работает...
  
Наверх
 
IP записан
 
Den@
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 23
Зарегистрирован: 24. Октября 2008
Re: Не работает как надо запрос на dbf
Ответ #3 - 29. Марта 2009 :: 00:24
Печать  
По поводу проблемы с отображением цен, пришел в итоге к следующему варианту:

Код
Выбрать все
	//запрос к ценам
	ТекстЗапроса = "
	|SELECT  
	|	СпрН.Descr AS Наименование,
	|	Цены.Цена as [ЦенаРеал $Число]
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	$Справочник.Цены СпрЦ ON (СпрЦ.ParentExt = СпрН.ID
	|							 AND
	|                            $СпрЦ.ТипЦен = :ТипЦен)
	|INNER JOIN (
	|	SELECT
	|		Период.objid as objid,
	|		Период.value as Цена
	|	FROM 1sconst as Период
	|	WHERE
	|		(DTOS(Период.date)+Период.time) IN
	|		(SELECT
	|			MAX(DTOS(Константа.date)+Константа.time)
	|		FROM 1sconst as Константа
	|		WHERE
	|			d+STR(Константа.partno,3) BETWEEN
	|			$ИсторияРеквизита.Цены.Цена+'         '+'00000000'
	|			AND
	|			$ИсторияРеквизита.Цены.Цена+'zzzzzzzzz'+:ВыбДата)
	|			AND
	|			Константа.objid = Период.objid
	|		)
	|	) as Цены ON Цены.objid = СпрЦ.id
	|WHERE
	|	СпрН.parentid+STR(СпрН.isfolder,1)+UPPER(СпрН.code) = :ВыбГруппа";
 



Он выдает то что нужно, только последнюю цену на элементы. Однако тут есть досадный момент: не получается в полной мере соединиться по индексу в подзапросе, если поставить при сравнении:

$ИсторияРеквизита.Цены.Цена+Период.objid+:ВыбДата

то Фокс выдает ошибку: Error collating fields. Как я понимаю, он не может сформировать строку из поля "внешнего" запроса. Странно что при этом тут же в операторе WHERE он прекрасно работает с этим полем Печаль
Таким образом, получается замедление вдвое по сравнению с тем, когда скрыто условие

|AND
|Константа.objid = Период.objid

и соединение идет полностью по индексу. Кто-нибудь может сказать, есть ли возможность для данной задачи написать так, чтобы использовать соединения только по индексам?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Не работает как надо запрос на dbf
Ответ #4 - 29. Марта 2009 :: 07:24
Печать  
попробуй для даты применить dtos(:ВыбДата)

  
Наверх
ICQ  
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Не работает как надо запрос на dbf
Ответ #5 - 31. Марта 2009 :: 07:28
Печать  
Насчет периодических почитай в хелпе, там достаточно наглядный пример.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать