Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите новичку во вложенном запросе через OLE DB (число прочтений - 10907 )
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 [2] 
ОтправитьПечать