Имя: Пароль:
1C
1C 7.7
v7: Сложный запрос для табличного поля 1С++
,
0 АЛьФ
 
05.05.17
12:23
Попробовали в Табличное поле прописать запрос не из одного селекта, а с созданием и заполнением временных таблиц, папдейтами и последующей итоговой выборки из них. Вроде как ТабличноеПоле проглатывает запрос, но работать с ним не хочет (у поставщика атрибут "Поля" - пустое значение).
Возник закономерный вопрос: это мы чего-то не так делаем или Табличное поле принципиально не работает с такими запросами?


Ну и код, собственно.
    оПоставщикДанных             = СоздатьОбъект("ПоставщикДанныхODBC.MSSQL");
    оПоставщикДанных.БазаДанных = СоздатьОбъект("ODBCDataBase");
    стрДатаЗапроса                =  "'" + СокрЛП(глПреобразоватьДатуВСтроку(НачМесяца(ВыбПериодПланирования.ДатаОкончания)) + " 00:00:00.000'");
    ТекстЗапроса                 = "
    |IF EXISTS(SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'[tempdb].[dbo].[#Временно]')) DROP TABLE #Временно
    |IF EXISTS(SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'[tempdb].[dbo].[#ВременноСырье]')) DROP TABLE #ВременноСырье
    |
    |SELECT IDENTITY(INT) AS Счет,ParentExt as Сырье,ВвестиВДействиеС,ФлагРаботы
    |INTO #Временно FROM Справочник_ОсновнойАналог
    |WHERE " + стрДатаЗапроса + " >= ВвестиВДействиеС  AND IsMark = 0
    |ORDER BY ВвестиВДействиеС
    |
    |SELECT тов.CODE as КодСырья,спр.Номенклатура, спр.Коэффициент as Коэффициент
    |, 'Х' as Исключить, CAST('1753-01-01 00:00:00.000' AS datetime)  as ВвестиВДействиеС, спр.ID
    |INTO #ВременноСырье
    |FROM Справочник_НоменклатураАналога as спр, Справочник_Товары as тов    
    |WHERE  спр.ParentExt =  ?текВладелец(14,9)
    |AND спр.IsMark = 0 AND тов.ID = спр.Номенклатура
    |
    |UPDATE #ВременноСырье SET ВвестиВДействиеС = тз.ДатаВвода FROM
    |(SELECT t2.Сырье as Сырье, t2.ВвестиВДействиеС as ДатаВвода FROM
    |    (SELECT t1.Сырье,ВвестиВДействиеС,t1.ФлагРаботы
    |    FROM #Временно AS t1 WHERE t1.Счет in (SELECT MAX(Счет) AS Счет FROM #Временно )) as t2
    |WHERE t2.ФлагРаботы = 1) as тз
    |WHERE тз.Сырье = ID
    |
    |SELECT КодСырья as КодСырья
    |    , Номенклатура as [Аналог $Справочник.Товары]
    |    , Коэффициент as Коэффициент
    |    , Исключить as Исключить
    |    , ВвестиВДействиеС as Основной
    |    , ID as [Элемент $Справочник.НоменклатураАналога]
    |FROM #ВременноСырье";

    оПоставщикДанных.УстТекстЗапроса(ТекстЗапроса);
    оПоставщикДанных.Поля.Добавить("Элемент").Автоудаление = 0; // тут ошибка, что Поля - "не агрегатный объект"
    оПоставщикДанных.УстКлючПорядка("Аналог");
1 Ёпрст
 
05.05.17
12:37
Это, УстИДПоле не нужно разве там сделать  еще ?
Усё позабыл
2 АЛьФ
 
05.05.17
12:41
2(1) Нужно. Оно дальше и до него не доходит. Этот код с простым запросом с одним селектом прекрасно отрабатывает.
3 Ёпрст
 
05.05.17
12:43
Была же какая-то хрень, чтоб пакетный запрос выдавал последний результат..Склероз.
4 trdm
 
05.05.17
12:46
в QA это было. Выбор номера пакета для выполнения.
5 АЛьФ
 
05.05.17
12:54
2(4) И?...
6 Ёпрст
 
05.05.17
13:02
Это, а так, не работает ?

Источник = СоздатьОбъект("ODBCDataProvider.MSSQL");
Источник.БазаДанных =  СоздатьОбъект("ODBCDataBase");

Источник.УстТекстЗапроса(ТекстЗапроса);
Источник.УстКлючПорядка("Аналог");
Источник.УстИдПоля("твой ид для поля")

Поля  = Источник.Поля;
ПолеЭлемент = Поля.Добавить("Элемент");
ПолеЭлемент.Автоудаление = 0

ТабПоле.ПоставщикДанных = Источник;
ТабПоле.ПоставщикДанных.Обновить();
7 Ёпрст
 
05.05.17
13:03
И не помню ужо, между запросами, не надо ли ;  втыкать, случаем ?
8 АЛьФ
 
05.05.17
13:06
2(6) на строке "Источник.УстКлючПорядка("Аналог")" пишет, что нет такого поля "Аналог".
2(7) В менеджере этот запрос отрабатывает нормально без ошибок.
9 Ёпрст
 
05.05.17
13:15
(8)
|SET NOCOUNT OFF

вот это воткни в начало
10 Ёпрст
 
05.05.17
13:15
или ON ?
^))
11 Ёпрст
 
05.05.17
13:16
|SET NOCOUNT ON
или OFF ?

короче, это в первую строчку в запросе
12 АЛьФ
 
05.05.17
13:22
2(9)(10)(11) Не помогло.
13 ADirks
 
05.05.17
13:42
А зачем заполнение временных таблиц в запросе для ТП? Конечно оно работать не будет. Заполняйте ВТ перед показом, а в запросе для ТП оставить только финальный селект.
14 АЛьФ
 
05.05.17
13:50
2(13) Как обойти я придумаю. Это просто был самый просто путь решения вопроса. Фигово, если ТП воспринимает только простой селект :(
15 Ёпрст
 
05.05.17
13:56
(14)Не со временными табличками он тоже работал Надо поискать примёр
16 ADirks
 
05.05.17
13:57
ТП этот селект же ещё модифицирует разными способами. И состав полей меняется, и условия. Так что, по другому особо и не сделаешь.
17 АЛьФ
 
05.05.17
14:00
2(16) Понятно. Спасибо.