Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Не пойму, что нужно... (число прочтений - 5118 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Не пойму, что нужно...
01. Октября 2008 :: 07:31
Печать  
База DBF

Код
Выбрать все
SELECT
		СпрНом.ID as [Товар_1c_type_Справочник_Номенклатура]
,	(
   	SELECT TOP 1
     	И.VALUE Цена
     FROM
     	_1SCONST И WITH (NOLOCK)
     WHERE
       И.ID = 4335 AND И.OBJID = СпрНом.ID AND И.DATE <= {d '2008-04-09'}
     ORDER BY
     	И.DATE DESC, И.TIME DESC, И.DOCID DESC
   ) as Цена
FROM
		sc33 as СпрНом
WHERE
		СпрНом.ID IN (SELECT Val FROM 60cb3d55-0906-4749-84a3-adff0adee8b2)
ТЗТЧ = глЗапрос.ВыполнитьИнструкцию(глТекст);
{D:\CURRENT_SQL\EXTFORMS\ТЕСТVAS.ERT(44)}: FAILED! ICommandText::Execute(): Function name is missing ). 

  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #1 - 01. Октября 2008 :: 07:46
Печать  
Сорри. Вставлял из SQL и не увидел некоторые фишки, типа, WITH (NOLOCK)
Код
Выбрать все
SELECT
		СпрНом.ID as [Товар_1c_type_Справочник_Номенклатура]
,	(
   	SELECT TOP 1
     	И.VALUE
     FROM
     	1SCONST as И
     WHERE
       И.ID = 4335 AND И.OBJID = СпрНом.ID AND И.DATE <= {d '2008-04-09'}
     ORDER BY
     	И.DATE DESC, И.TIME DESC, И.DOCID DESC
   ) as Цена
FROM
		sc33 as СпрНом
WHERE
		СпрНом.ID IN (SELECT Val FROM ad356b8f-32bc-4e26-b674-6f1e5ad73f0d)
ТЗТЧ = глЗапрос.ВыполнитьИнструкцию(глТекст);
{D:\CURRENT_SQL\EXTFORMS\ТЕСТVAS.ERT(44)}: FAILED! ICommandText::Execute(): SQL: Queries of this type are not supported. 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #2 - 01. Октября 2008 :: 07:52
Печать  
по моему в  подзапросе нельзя использовать top 1.

попробуй для эксперемента убрать тоp1 выполнится запрос или нет
конечно при этом результаты будут неправильными.

Я бы переписал и вместо подзапроса использовал бы
left join ( или inner join если не нужны позиции где раньше нужной даты цены не установлены ).
Еще вариант использовать max.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #3 - 01. Октября 2008 :: 07:54
Печать  
В подзапросе можно использовать top 1!
а вот WITH (NOLOCK), и сами подзапросы в DBF вещь сомнительная
  
Наверх
ICQ  
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #4 - 01. Октября 2008 :: 07:55
Печать  
Z1 писал(а) 01. Октября 2008 :: 07:52:
по моему в  подзапросе нельзя использовать top 1.

попробуй для эксперемента убрать тоp1 выполнится запрос или нет
конечно при этом результаты будут неправильными.

Код
Выбрать все
ICommandText::Execute(): SQL: The ORDER BY clause is invalid in subqueries, unless TOP is also specified. 



Цитата:
Я бы переписал и вместо подзапроса использовал бы
left join ( или inner join если не нужны позиции где раньше нужной даты цены не установлены ).
Еще вариант использовать max.

Попробую переписать
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #5 - 01. Октября 2008 :: 07:58
Печать  
ну все равно top 1 иХМО это очень плохо

Еще алиас на Цена ( из запроса в посте 1 ) идет два раза внутри подзапроса  и внешне наверное в этом ошибка.
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #6 - 01. Октября 2008 :: 08:15
Печать  
Короче, я переписал так, но колонка цена у меня совсем пустая:
Код
Выбрать все
SELECT
		СпрНом.ID as [Товар_1c_type_Справочник_Номенклатура]
,	Цена.Значение as Цена
FROM
		sc33 as СпрНом
LEFT JOIN
		(
			SELECT TOP 1
				И.OBJID as Товар
			,	И.VALUE as Значение
     FROM
     	1SCONST as И
     WHERE
       И.ID = '4335' AND И.OBJID IN (SELECT Val FROM 87e16d6c-11d7-4f4c-bea4-e0bcda62cf86) AND И.DATE <= {d '2008-04-09'}
     ORDER BY
     	И.DATE DESC, И.TIME DESC, И.DOCID DESC
		) as Цена
ON
		СпрНом.ID = Цена.Товар
WHERE
		СпрНом.ID IN (SELECT Val FROM 87e16d6c-11d7-4f4c-bea4-e0bcda62cf86) 

  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #7 - 01. Октября 2008 :: 08:40
Печать  
Короче цена у нас как реквизит справочника Номенклатура. Периодического типа. Получаю ее так:
Код
Выбрать все
глМета = СоздатьОбъект("Metadatawork");
ИдЦены = глМета.ИДРеквизитаСправочника("Номенклатура","РекомендЦена");
 


Если в запрос ее ложу так:
Код
Выбрать все
глЗапрос.УстановитьТекстовыйПараметр("ИдЦены",ИдЦены); 


то выходит ошибка:
Код
Выбрать все
FAILED! ICommandText::Execute(): Operator/operand type mismatch. 


Если в запрос ее ложу так:
Код
Выбрать все
глЗапрос.УстановитьТекстовыйПараметр("ИдЦены",Строка(ИдЦены)); 


то получаю пустую таблицу

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #8 - 01. Октября 2008 :: 08:47
Печать  
в условие where должно быть
:ИдЦены
перед идентефикатором :

Также очень помагает при ошибках использовать
глЗапрос.Отладка(1). Текст sql запроса через буфер обмена переносишь в qa и там все отлаживаешь.
После этого исправляешь исходный запрос на 1сpp
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #9 - 01. Октября 2008 :: 08:50
Печать  
Z1 писал(а) 01. Октября 2008 :: 08:47:
в условие where должно быть
:ИдЦены
перед идентефикатором :

Также очень помагает при ошибках использовать
глЗапрос.Отладка(1). Текст sql запроса через буфер обмена переносишь в qa и там все отлаживаешь.
После этого исправляешь исходный запрос на 1сpp

Ну это для меня не новость. Перед идентификатором у меня как раз и стоит :

Код
Выбрать все
глМета = СоздатьОбъект("Metadatawork");
ИдЦены = Строка(глМета.ИДРеквизитаСправочника("Номенклатура","РекомендЦена"));

ИмяТаблицы = "";
глЗапрос.УложитьСписокОбъектов(СписокТовара,ИмяТаблицы);
глЗапрос.УстановитьТекстовыйПараметр("ИдЦены",ИдЦены);
глЗапрос.УстановитьТекстовыйПараметр("ВыбДата",Конт.ДатаДок);

глТекст = "
|SELECT
|		СпрНом.ID as [Товар $Справочник.Номенклатура]
|,	Цена.Значение as Цена
|FROM
|		$Справочник.Номенклатура as СпрНом
|LEFT JOIN
|		(
|			SELECT TOP 1
|				И.OBJID as Товар
|			,	И.VALUE as Значение
|     FROM
|     	1SCONST as И
|     WHERE
|       И.ID = :ИдЦены AND И.OBJID IN (SELECT Val FROM "+ИмяТаблицы+") AND И.DATE <= :ВыбДата~~
|     ORDER BY
|     	И.DATE DESC, И.TIME DESC, И.DOCID DESC
|		) as Цена
|ON
|		СпрНом.ID = Цена.Товар
|WHERE
|		СпрНом.ID IN (SELECT Val FROM "+ИмяТаблицы+")
|";
 

  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #10 - 01. Октября 2008 :: 08:58
Печать  
Здесь что-то не так с условием ИдЦены. Если убрать это условие, запрос работает. То, что мне возвращает метод ИДРеквизитаСправочника в поле ID таблицы 1SCONST нет.
Надо как-то по-другому получать ИД цены
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #11 - 01. Октября 2008 :: 09:15
Печать  
Объект Metadatawork, я так понял, работает с SQL. А у меня DBF.
Как мне получить идентификатор реквизита справочника под DBF?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #12 - 01. Октября 2008 :: 09:29
Печать  
ReLock писал(а) 01. Октября 2008 :: 09:15:
Объект Metadatawork, я так понял, работает с SQL. А у меня DBF.
Как мне получить идентификатор реквизита справочника под DBF?

не правильно понял
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #13 - 01. Октября 2008 :: 09:32
Печать  
Можешь либо разобраться сам постепенно со своим запросом либо все уже написано до нас
см.Эффективное использование MSSQL в 1С при помощи ВК 1С++
глава 8
Цитата:
Глава 8:  Периодические реквизиты

Периодические реквизиты хранятся в файле _1SConst

Для получения их значений служит виртуальное значение

$ПоследнееЗначение.<ИмяСправочника >| Константа.<ИмяРеквизита |

ИмяКонстанты>(<ИдОбъекта>, <Дата>[, <Время>[, <ИДДокумента>]]), которое является коррелированным подзапросом (вложенный запрос, в котором используется значения основного).



Пример: Справочник.Номенклатура, подчиненный справочник Цены с периодической ценой.

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

NOTE: В DBF метапарсер выдает не работающий запрос.

Попытаемся переложить это в DBF

|SELECT  
|  СпрН.Descr AS Наименование,
|  Цены.Цена as [Цена $Число]
|FROM
|  $Справочник.Номенклатура СпрН
|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
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Не пойму, что нужно...
Ответ #14 - 01. Октября 2008 :: 13:03
Печать  
Похоже надо как-то по-другому написать.
Код
Выбрать все
|SELECT
|	СпрНом.ID as [Товар $Справочник.Номенклатура]
|,	Цена.Значение as Цена
|FROM
|	$Справочник.Номенклатура as СпрНом
|LEFT JOIN
|(
|SELECT TOP 1
|	И.OBJID as Товар
|,	И.VALUE as Значение
|FROM
|     	1SCONST as И
|WHERE
|	И.ID = $ИсторияРеквизита.Номенклатура.РекомендЦена AND И.OBJID IN (SELECT Val FROM "+ИмяТаблицы+") AND И.DATE <= :ВыбДата~~
|ORDER BY
|    	И.DATE DESC, И.TIME DESC, И.DOCID DESC
|) as Цена
|ON
|	СпрНом.ID = Цена.Товар
|WHERE
|	СпрНом.ID IN (SELECT Val FROM "+ИмяТаблицы+")
 


Из всех товаров только у одного есть цена. Остальные - пустые. Это неправильно.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать