Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите новичку во вложенном запросе через OLE DB (число прочтений - 10902 )
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Помогите новичку во вложенном запросе через OLE DB
18. Апреля 2013 :: 11:15
Печать  
Если использовать параметры в запросе то вложенный запрос работает:            
     ТекстЗапроса = "SELECT
     |Док.IDDoc as [Док $Документ.НакладнаяТоварыОпт]
     |,$Док.Валюта As [Валюта $Справочник.Валюты]
     |,(select TOP 1 cast(value as numeric(18,4))    FROM  1SConst   where id = $ИсторияРеквизита.Валюты.Курс  and date <= :НачДата~~ and objid = [i][color=#00ff00]:ф_Валюта[/color][/i] ORDER BY date desc,time desc,docid desc) As Курс
     |FROM $Документ.НакладнаяТоварыОпт AS Док";      
Если поменять параметр [i][color=#00ff00]:ф_Валюта[/color][/i] на значение [i]$Док.Валюта[/i] то все хана:
     ТекстЗапроса = "SELECT
     |Док.IDDoc as [Док $Документ.НакладнаяТоварыОпт]
     |,$Док.Валюта As [Валюта $Справочник.Валюты]
     |,(select TOP 1 cast(value as numeric(18,4))    FROM  1SConst   where id = $ИсторияРеквизита.Валюты.Курс  and date <= :НачДата~~ and objid = [i][color=#00ff00]$Док.Валюта[/color][/i] ORDER BY date desc,time desc,docid desc) As Курс
     |FROM $Документ.НакладнаяТоварыОпт AS Док";      
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #1 - 18. Апреля 2013 :: 11:24
Печать  
Если запрос выполнять через SQLite то все ОК, а через OLE DB не хочет и все! Как вообще использовать переменные основного запроса  во вложенных запросах?????В ДБФ базах! И еще проблема если вложенный запрос (с параметрами - первый код) выполнять отдельно то он выдает одну строку, если как вложенный то выдает ошибку "Subquery returned more than one record" - что больше чем одна запись! Такое впечатление что оператор TOP  в вложенном запросе  не отрабатывает!)(((Вот такие две проблемы не знаю даже как дальше жить!!!!!!!! Плачущий
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #2 - 18. Апреля 2013 :: 11:40
Печать  
бери не топ, а max(date)
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #3 - 18. Апреля 2013 :: 11:48
Печать  
спасибо!!! попробую, а по поводу 1-го вопроса ни кто не подскажет?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #4 - 18. Апреля 2013 :: 11:55
Печать  
Ну, ты еще и неверно свой курс вычисляешь - надо на дату документа, а не на начДата
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #5 - 18. Апреля 2013 :: 12:06
Печать  
Это я для примера просто поставил параметр :НачДата что бы запрос проще выглядел для примера(без доп привязки к таблице журнала, меньше строк), а так у меня привязка к дате документа! Суть заключается что  подставить значение основного запроса в вложенный ни как не получается!Хотя в SQLite такой проблемы не возникает!
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #6 - 18. Апреля 2013 :: 12:32
Печать  
чет не пойму как мне поменять TOP на MAX куда  вставить MAX в этой строке (select TOP 1 cast(value as numeric(18,4))    FROM  1SConst   where id = $ИсторияРеквизита.Валюты.Курс  and date <= :НачДата~~ and objid = :ф_Валюта ORDER BY date desc,time desc,docid desc)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #7 - 18. Апреля 2013 :: 13:14
Печать  
грубо, нужно взять max(t.value)
при условии, что t.date = (select max(t2.date) from 1sconst as t2 where
t2.id = t.id and t2.objid-t.objid)
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #8 - 18. Апреля 2013 :: 16:13
Печать  
Порылся на форуме нашел не много другое решении, но как подставить дату текущего документа???, если параметр подставлять то все ОК:
     ТекстЗапроса = "SELECT
     |Док.IDDoc as [Док $Документ.НакладнаяТоварыОпт]
     |,$Док.Валюта As [Валюта $Справочник.Валюты]
     |,Журнал.Date as Дата
   |,Курс.Value as Курс
     |FROM $Документ.НакладнаяТоварыОпт AS Док
     |LEFT JOIN 1SJOURN AS Журнал ON Док.IDDoc = Журнал.IDDOC
     |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 Курс.objid = $Док.Валюта  
     |";      
КАК ВМЕСТО :НачДата~~ подставить Журнал.Date???? когда подставляешь то пишет не найдена колонка!!!!!!!!! Не ужели ни кто не сталкивался! Заранее благодарен если кто подскажет!!!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #9 - 19. Апреля 2013 :: 05:30
Печать  
Дык, это нафик ни кому не нужно - сама валюта и курс, как правило, валяется в шапке самого документа.
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #10 - 19. Апреля 2013 :: 11:01
Печать  
Кароче запросом 1С++ эту праблемку не решить только SQLite поможет жаль, 1С++ быстрей раза в 3 работает, чем SQLite
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #11 - 19. Апреля 2013 :: 11:48
Печать  
Да всё решаемо.
Если в лоб нельзя - всегда можно создать временную табличку, потом с ней соединяться в запросе.
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #12 - 19. Апреля 2013 :: 12:43
Печать  
Это понятно! Но думаю если с временной таблицей, то эффект от скорости уйдет, поэтому целесообразней в данном случаи SQLite - текст запроса намного проще.Интересно как автор класса  ПрямогоЗапроса, от этого ушел! Я так понимаю у него если запущенно монопольно, то запрос выполняется через SQLite иначе чере OLE DB! Он же как то реализовал Срезпоследних! попробую я на досуге написать  через ПрямойЗапрос!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #13 - 23. Апреля 2013 :: 05:01
Печать  
Там всё тоже самое. Там "срез последних" на дату, а не на дату из самого запроса(дату документа, к примеру).
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #14 - 23. Апреля 2013 :: 16:10
Печать  
Спасибо! Тогда и пробовать не буду!
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #15 - 23. Апреля 2013 :: 16:48
Печать  
Eprst спасибо, что подсказываешь! А не знаешь в запросах случайно можно ли сделать двойную типизацию колонки!  SELECT Coalesce($Док_1.Контрагент,$Док_2.Склад) as [Информация $Справочник]! Что бы в одной колонки хранились данные из справочника контрагенты и склады! Если не указывать вид справочника то данные получаются как в dbf. можно ли например использовать оператор case в квадратных скобках [] или как-то по другому???
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #16 - 24. Апреля 2013 :: 05:06
Печать  
если Док_1.Контрагент и Док_2.Склад имеют типы Справочник.Контрагенты и Справочник.Склады соответственно, то
SELECT Coalesce($ВидСправочника36.Контрагенты+$Док_1.Контрагент, $ВидСправочника36.Склады+$Док_2.Склад) as [Информация $Справочник]
  

1&&2&&3
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #17 - 24. Апреля 2013 :: 06:19
Печать  
Спасибо trad! А если разные типы надо, например Перечисление, Справочник, можно типизацию сделать в одной колонке?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #18 - 24. Апреля 2013 :: 06:53
Печать  
http://www.1cpp.ru/docum/icpp/html/ODBC.html#id28

SELECT Coalesce('B1'+$ВидСправочника36.Контрагенты+$Док_1.Контрагент, 'B1'+$ВидСправочника36.Склады+$Док_2.Склад, 'E1'+$ВидПеречисления36.МоеПеречисление+$Док_3.РеквизитП) as [Информация $Неопределенный]
  

1&&2&&3
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #19 - 24. Апреля 2013 :: 08:36
Печать  
Спасибо большое!!!!!
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #20 - 27. Апреля 2013 :: 11:26
Печать  
Послушайте, кто знает можно ли каким оператором SQL реализовать, конструкцию ЕСЛИ, кроме case, типа как в 1С ?(условие,истина, ложь)?
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #21 - 27. Апреля 2013 :: 11:42
Печать  
И еще вопросик, можно ли как применить вычисляемое значение в запросе:
|, Док.Валюта [Валюта $Справочник.Валюты]
|,(select...) As [Курс $Число.15.2] - вычисляет курс
|, ДокСтроки.СуммаСНДС*Курс [Выручка $Число.18.2] - хочу в запросе сразу вычислить значении, но так не работает, если *(select...) то соответственно работает, но тогда получается два раза выполняется один и тот же подзапрос!
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #22 - 29. Апреля 2013 :: 04:57
Печать  
Alex2013 писал(а) 27. Апреля 2013 :: 11:42:
И еще вопросик, можно ли как применить вычисляемое значение в запросе:
|, Док.Валюта [Валюта $Справочник.Валюты]
|,(select...) As [Курс $Число.15.2] - вычисляет курс
|, ДокСтроки.СуммаСНДС*Курс [Выручка $Число.18.2] - хочу в запросе сразу вычислить значении, но так не работает, если *(select...) то соответственно работает, но тогда получается два раза выполняется один и тот же подзапрос!



вытащи (select ...) Курс из селект-листа в джойн
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #23 - 29. Апреля 2013 :: 05:02
Печать  
Т.е. вместо

Код
Выбрать все
Select
    Док.ДатаДок,
    Док.Валюта,
    (select top 1 Курсы.Курс from КурсыВалют Курсы Where Курсы.Валюта = Док.валюта And Курсы.ДатаКурса = Док.ДатаДок) Курс
From
   Док 



пишешь

Код
Выбрать все
Select
    Док.ДатаДок,
    Док.Валюта,
    Курсы.Курс
From
   Док
   Left Join КурсыВалют Курсы on Курсы.Валюта = Док.валюта And Курсы.ДатаКурса = Док.ДатаДок
 



примерно так
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #24 - 29. Апреля 2013 :: 10:47
Печать  
Satans Claws  так не прокатит! Соединиться с таблице курсов так не получится  по Курсы.ДатаКурса = Док.ДатаДок! Т.к. курсы надо на последнию дату <=!  Вот сам подзапрос:
(select  cast(value as numeric)    FROM [_1S.Const]  where id = :ИсторияРеквизита.Валюты.Курс  and date <= Журнал.Date and objid = Валюта ORDER by date desc limit 1) As [Курс $Число.15.2]
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #25 - 06. Мая 2013 :: 04:18
Печать  
Да что ты говоришь:



Код
Выбрать все
///******************************** Павел  24.11.2010
//	идОбъект:
//		'     0   ' ($ПустойИД) - Константа, значение по умолчанию
//		Char(9) - ид элемента справочника
//		Ссылка на элемент справочника
//	идОбъектМетаданных: Число или Строка
//		Число - идентификатор объекта метаданных (см. РадугаСервис.ИДОбъекта())
//		Строка - строка вида <ИмяКонстанты>|<ВидСправочника>.<Реквизит>
//	ДоДаты:
//		Дата
//		Строка в формате "ГГГГММДД"
//		путь к данным, имеющим тип DateTime или Char(8)
//
//	Значение периодики будет выглядеть как АлиасПериодики.Value
Функция ДжойнПериодики(АлиасПериодики = "Периодика", идОбъект = "$ПустойИД", Знач идОбъектМетаданных, Знач ДоДаты) Экспорт
	Если ТипЗначения(ДоДаты) = 3 Тогда
		ДоДаты = "'" + Формат(ДоДаты, "ДГГГГММДД") + "'";
	КонецЕсли;

	Если нРег(идОбъект) = нРег("$ПустойИД") Тогда
		//это периодика константы
		Если Число(идОбъектМетаданных) = 0 Тогда
			идОбъектМетаданных = РадугаСервис.ИДКонстанты(идОбъектМетаданных);
		КонецЕсли;
		ТекстЗапроса = "
		|	LEFT JOIN _1SCONST " + АлиасПериодики + " (NoLock) on
		|		" + АлиасПериодики + ".ObjID = $ПустойИД
		|		And " + АлиасПериодики + ".ID = " + идОбъектМетаданных + "
		|		And " + АлиасПериодики + ".Date =
		|		(
		|			SELECT max(Date)
		|			From _1SConst
		|			WHERE
		|				Date <= " + ДоДаты + "
		|				And ID = " + идОбъектМетаданных + "
		|				And ObjID = $ПустойИД
		|		)
		|";
	Иначе
		Если Число(идОбъектМетаданных) = 0 Тогда
			сзВидРекв = СтрокуВСписок(идОбъектМетаданных, ".", 1);
			идОбъектМетаданных = РадугаСервис.ИДРеквизитаСправочника(сзВидРекв.ПолучитьЗначение(1), сзВидРекв.ПолучитьЗначение(2));
		КонецЕсли;

		Если ТипЗначения(идОбъект) = 2 Тогда
			идОбъект9 = идОбъект;
		Иначе
			идОбъект9 = "'" + РадугаСервис.ЗначениеВСтрокуБД(идОбъект) + "'";
		КонецЕсли;
		//надо допиливать до позиции документа
		ТекстЗапроса = "
		|	LEFT JOIN _1SCONST " + АлиасПериодики + " (NoLock) on
		|		" + АлиасПериодики + ".ObjID = " + идОбъект9 + "
		|		And " + АлиасПериодики + ".ID = " + идОбъектМетаданных + "
		|		And " + АлиасПериодики + ".Date =
		|		(
		|			SELECT max(Date)
		|			From _1SConst (NoLock)
		|			WHERE
		|				Date <= " + ДоДаты + "
		|				And ID = " + идОбъектМетаданных + "
		|				And ObjID = " + идОбъект9 +"
		|		)
		|";
	КонецЕсли;

	Возврат ТекстЗапроса;
КонецФункции	// ДжойнПериодики
///******************************** Павел  24.11.2010 




Единственно, я так и не допилил эту функцию, чтоб она могла брать периодику с точностью до позиции документа. Но мне это, тьфу-тьфу, и не требуется - хватает и с точностью до даты.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #26 - 06. Мая 2013 :: 04:34
Печать  
Alex2013 писал(а) 29. Апреля 2013 :: 10:47:
ORDER by date desc limit 1


Ух ты какой интересный синтаксис...
Я так понимаю - это аналог SELECT TOP 1, но найти не могу в хелпе его описание...
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #27 - 09. Мая 2013 :: 12:55
Печать  
Satans Claws писал(а) 06. Мая 2013 :: 04:34:
Alex2013 писал(а) 29. Апреля 2013 :: 10:47:
ORDER by date desc limit 1


Ух ты какой интересный синтаксис...
Я так понимаю - это аналог SELECT TOP 1, но найти не могу в хелпе его описание...

Это из других типов СУБД, типа Firebird, SQLite, MySQL
  
Наверх
ICQ  
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #28 - 15. Мая 2013 :: 11:10
Печать  
Salimbek писал(а) 09. Мая 2013 :: 12:55:
Satans Claws писал(а) 06. Мая 2013 :: 04:34:
Alex2013 писал(а) 29. Апреля 2013 :: 10:47:
ORDER by date desc limit 1


Ух ты какой интересный синтаксис...
Я так понимаю - это аналог SELECT TOP 1, но найти не могу в хелпе его описание...

Это из других типов СУБД, типа Firebird, SQLite, MySQL

Да! это из  SQLite
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать