|
Запросы: ОБЪЕДИНИТЬ приводит к появлению null | ☑ | ||
---|---|---|---|---|
0
Evgenius
05.04.17
✎
14:46
|
Доброго времени суток.
При выполнении запроса в экспортируемой процедуре менеджера справочника, вызванной через com-соединение (подключаемся к базе с помощью com-соединения, вызываем процедуру), запрос с ОБЪЕДИНИТЬ ВСЕ приводит к появлению null в некоторых колонках в отдельных строках. Объединяются 2 запроса к ранее созданным временным таблицам, в которых нет НИ ОДНОГО значения null в этих же колонках: если выбрать данные из каждой по отдельности, там ничего такого не обнаруживается. Вопрос: в каких случаях UNION ALL (ОБЪЕДИНИТЬ ВСЕ) приводит к замене значений на NULL? Все значения во временных таблицах строковые (проверил тип данных каждого значения, выбирая данные из каждой таблицы по отдельности). Спасибо |
|||
1
SiAl-chel
05.04.17
✎
15:10
|
(0) Поля в объединяемых запросах идентичны по типу и количеству?
|
|||
2
Evgenius
05.04.17
✎
15:12
|
По количеству - конечно, на этот счет есть сообщение об ошибке ("Разное количество полей в объединяемых запросах").
По базовому типу - тоже (строка) |
|||
3
DrZombi
гуру
05.04.17
✎
15:14
|
(2) Используйте конструкцию вида "ЕстьNULL(<Поле>,"" или Выразить(<Знач> как Число или Строка и т.д.))" :)
|
|||
4
SiAl-chel
05.04.17
✎
15:15
|
(2) Такая ошибка бывает, когда последовательность полей разных типов нарушена. То есть в 1-м запросе - это дата, во 2-м - ссылка или число.
(3) +100 |
|||
5
Naf2017
05.04.17
✎
15:15
|
(0) запрос уже давай
|
|||
6
Evgenius
05.04.17
✎
15:16
|
(3) нет никаких значений null в исходных данных, я выше писал
|
|||
7
Naf2017
05.04.17
✎
15:18
|
(4) да ладно:
ВЫБРАТЬ АвансовыйОтчет.Ссылка, АвансовыйОтчет.СуммаДокумента ИЗ Документ.АвансовыйОтчет КАК АвансовыйОтчет ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВозвратТоваровПоставщику.Ссылка, ВозвратТоваровПоставщику.Дата ИЗ Документ.ВозвратТоваровПоставщику КАК ВозвратТоваровПоставщику |
|||
8
Evgenius
05.04.17
✎
15:21
|
(5)
Ну, как-то так: ВЫБРАТЬ ВременнаяТаблица.Показатель, ВременнаяТаблица.КодПоказателя, ВременнаяТаблица.ТипСуммы, ВЫБОР КОГДА ВременнаяТаблица.Оператор > 0 ТОГДА ВременнаяТаблица.Сумма ИНАЧЕ -ВременнаяТаблица.Сумма КОНЕЦ КАК Сумма , ВременнаяТаблица.РегиональноеПодразделение, ВременнаяТаблица.ОС, ВременнаяТаблица.Покупатели, ВременнаяТаблица.СсылкаНаДокумент, ВременнаяТаблица.ДатаДокумента ИЗ ВременнаяТаблица3 КАК ВременнаяТаблица ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВременнаяТаблица.Показатель, ВременнаяТаблица.КодПоказателя, ВременнаяТаблица.ТипСуммы, ВременнаяТаблица.Сумма КАК Сумма , ВременнаяТаблица.РегиональноеПодразделение, ВременнаяТаблица.ОС, ВременнаяТаблица.Покупатели, ВременнаяТаблица.СсылкаНаДокумент, ВременнаяТаблица.ДатаДокумента ИЗ ВременнаяТаблица1 КАК ВременнаяТаблица УПОРЯДОЧИТЬ ПО РегиональноеПодразделение, ОС, НематериальныеАктивы, Покупатели, СсылкаНаДокумент, ДатаДокумента |
|||
9
Evgenius
05.04.17
✎
15:25
|
Гарантируется, что в обеих объединяемых таблицах одинаковое кол-во колонок, и у всех, кроме колонки Сумма базовый тип - строка
|
|||
10
Naf2017
05.04.17
✎
15:29
|
(8)(9) ты не ври, мы еще не знаем, что там у тебя во временных таблицах
|
|||
11
Ёпрст
05.04.17
✎
15:30
|
(9)
>>>, и у всех, кроме колонки Сумма базовый тип - строка >>>КОГДА ВременнаяТаблица.Оператор > 0 Одна из черепашек врёт |
|||
12
Evgenius
05.04.17
✎
15:30
|
(11) Сорри, у двух колонок тип = число
:-) |
|||
13
Ёпрст
05.04.17
✎
15:32
|
(12) это же не весь запрос ?
|
|||
14
Evgenius
05.04.17
✎
15:33
|
(10) Таблицы я проверил, читай выше: если выбирать данные из каждой по отдельности, то нет ни значений null, ни каких либо еще типов, кроме числа (Оператор, Сумма) и строки (все остальные)
|
|||
15
Ёпрст
05.04.17
✎
15:33
|
при таком запросе нулл полей не будет.
Видать еще-где-то-левым-соединением-балуешьси |
|||
16
Evgenius
05.04.17
✎
15:33
|
(13) В том-то и дело, что весь
|
|||
17
Tateossian
05.04.17
✎
15:36
|
Надо смотреть на твои временные таблицы 1...3
|
|||
18
Evgenius
05.04.17
✎
15:39
|
(17) Согласен! Но см. выше, нет в них нет ничего, кроме строк, если выбирать из них по отдельности, не объединяя
|
|||
19
h-sp
05.04.17
✎
15:43
|
(18) ну может группы туда фигачишь вместе с элементами во временные таблицы, мы же не видим отсюда.
|
|||
20
Evgenius
05.04.17
✎
15:46
|
(19) Не, правда, ну сколько можно: там нет ссылок! Там строки. И 2 числовые колонки. я про них забывал сообщить только потому, что с ними всё нормально, значения null появляются в тех колонках, где в обеих таблица строки (иногда пустые строки)
|
|||
21
DailyLookingOnA Sunse
05.04.17
✎
15:51
|
А откуда известно, что в таблицах Null нет?
В консоли на глаз? |
|||
22
h-sp
05.04.17
✎
15:52
|
(20) Null в отчет выводится как пустая строка, вы где смотрите?
|
|||
23
Evgenius
05.04.17
✎
15:54
|
(21) (22)
Нет. При проверке типа значения, содержащего null, возвращается Тип("null"). Я не поленился таблицы по одной достать и перебрать с проверкой типа значения |
|||
24
h-sp
05.04.17
✎
15:54
|
(20) попробуйте убрать какие-то строки из запроса. например, оставьте одну строчку
ВЫБРАТЬ ВременнаяТаблица.Показатель проверьте, потом если всё нормально добавьте следующие строчки. так найдете конкретную строку запроса. |
|||
25
Evgenius
05.04.17
✎
15:57
|
Главный смех в том, что если процедура вызвана в той же базе, но не через COM-соединение, то она отрабатывает совершенно нормально...
|
|||
26
h-sp
05.04.17
✎
16:00
|
(25) но это пакетный запрос идет. или через менеджер временных таблиц?
|
|||
27
Evgenius
05.04.17
✎
16:03
|
Через менеджер. Тот запрос, который я привел, выполняется отдельно именно в таком виде
|
|||
28
Вафель
05.04.17
✎
16:03
|
пронумеруй строки и посмотри где возникает null
|
|||
29
Вафель
05.04.17
✎
16:04
|
ну или хотя бы номер таблицы выбирай
|
|||
30
h-sp
05.04.17
✎
16:06
|
(27) ну тогда чудес не бывает. или менеджер не той базы или запрос. А как получил ВременнаяТаблица.СсылкаНаДокумент в виде строки? в запросе вроде не преобразует ссылку в строку.
|
|||
31
Evgenius
05.04.17
✎
16:09
|
(30) Все объекты создаются в процедуре, а не вне её.
Поле СсылкаНаДокумент содержит результат функции ПРЕДСТАВЛЕНИЕ() |
|||
32
h-sp
05.04.17
✎
16:16
|
(31) ПРЕДСТАВЛЕНИЕ() нельзя использовать, это не строка, вот оно и глючит.
|
|||
33
Evgenius
05.04.17
✎
16:19
|
Думал про это, но как объяснить, что при помещении в ТЗ это становится строкой?
|
|||
34
Evgenius
05.04.17
✎
16:19
|
(без специального преобразования)
|
|||
35
Evgenius
05.04.17
✎
16:21
|
(32) а что же тогда результат функции ПРЕДСТАВЛЕНИЕ() из себя представляет (простите за тавтологию), когда его помещают во временную таблицу?
|
|||
36
Ёпрст
05.04.17
✎
16:23
|
(35) там всегда ссылка на объект. ПРЕДСТАВЛЕНИЕ это уже на выходе запроса 1с-ина сама отрабатывает потом
|
|||
37
Evgenius
05.04.17
✎
16:24
|
(36) Это при запросе, не создающем временную таблицу. ВТ содержит не текст запроса, а его результаты
|
|||
38
Tateossian
05.04.17
✎
16:35
|
(35) Вот запрос:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | ПРЕДСТАВЛЕНИЕ(Организации.Ссылка) КАК Представление, | ПРЕДСТАВЛЕНИЕССЫЛКИ(Организации.Ссылка) КАК ПредставлениеСсылки |ПОМЕСТИТЬ ВременнаяТаблица |ИЗ | Справочник.Организации КАК Организации |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВременнаяТаблица.Представление, | ВременнаяТаблица.ПредставлениеСсылки |ИЗ | ВременнаяТаблица КАК ВременнаяТаблица"; Запрос.Выполнить(); Вот профайлер: INSERT INTO #tt52 WITH(TABLOCK) (_Q_000_F_000_00RRef, _Q_000_F_000_01, _Q_000_F_001_00RRef, _Q_000_F_001_01) SELECT T1._IDRRef, T2._Description, T1._IDRRef, T2._Description FROM dbo._Reference135 T1 WITH(NOLOCK) LEFT OUTER JOIN dbo._Reference135 T2 WITH(NOLOCK) ON T1._IDRRef = T2._IDRRef |
|||
39
mehfk
05.04.17
✎
16:39
|
Что-то ты не то профайлером поймал
|
|||
40
Tateossian
05.04.17
✎
16:39
|
(36) По сути, представление и представление ссылки работает одинаково. Думаю, будут отличия для справочников, где представление кодом или наименованием.
|
|||
41
Tateossian
05.04.17
✎
16:39
|
(39) Чо эта?
|
|||
42
mehfk
05.04.17
✎
16:41
|
тьфу, глаз замылился, показалочь что соединяются рахные таблицы
|
|||
43
Ёпрст
05.04.17
✎
16:42
|
(37) ну, наглядный тест на вшивость - поставь условие на временную табличку , типа
Где ВременнаяТаблица.СсылкаНаДокумент = "Вася" будешь приятно удивлён в неработоспособности этой конструкции. Даже профайлер открывать не надо |
|||
44
Вафель
05.04.17
✎
16:42
|
а интересно зачем это они соединяются?
|
|||
45
mehfk
05.04.17
✎
16:44
|
(44) Чтобы было видно, какие мощные программисты пишут платформу.
|
|||
46
Вафель
05.04.17
✎
16:47
|
я примерно догадываюсь зачем
|
|||
47
Evgenius
05.04.17
✎
16:48
|
(38) Ну, это говорит о том, что во временной таблице будет уже строка (значение поля, являющегося представлением объекта)
|
|||
48
Evgenius
05.04.17
✎
16:49
|
(43) Я только что был приятно удивлен её работоспособностью :-)
Неужели ты думал, что во временную таблице будет помещена ссылка? Так вот, нет |
|||
49
Вафель
05.04.17
✎
16:49
|
(47) а зачем он тогда саму ссылку выбирает?
Ой не просто там строка будет |
|||
50
Ёпрст
05.04.17
✎
16:49
|
(48) врешь же
|
|||
51
Tateossian
05.04.17
✎
16:52
|
Тут я интерпретировал вопрос по своему. Для документов будет немного другой запрос (но сути не меняет):
INSERT INTO #tt53 WITH(TABLOCK) (_Q_000_F_000_00RRef, _Q_000_F_000_01, _Q_000_F_000_02, _Q_000_F_001_00RRef, _Q_000_F_001_01, _Q_000_F_001_02) SELECT TOP 1 T1._IDRRef, T2._Number, T2._Date_Time, T1._IDRRef, T2._Number, T2._Date_Time FROM dbo._Document494 T1 WITH(NOLOCK) LEFT OUTER JOIN dbo._Document494 T2 WITH(NOLOCK) ON T1._IDRRef = T2._IDRRef |
|||
52
Evgenius
05.04.17
✎
16:53
|
(50) Ты же видел запрос вверху (из профайлера). И ты сам-то как себе это представлял - что при использовании ПРЕДСТАВЛЕНИЯ() и просто Ссылки в поле ВТ помещается одно и то же, что ли?
И нет, не вру. |
|||
53
Ёпрст
05.04.17
✎
16:54
|
(52) конечно врешь, хочешь сказать, что такой код у тебя работает ?
ВЫБРАТЬ ПРЕДСТАВЛЕНИЕ(Валюты.Ссылка) КАК Вася ПОМЕСТИТЬ Табличка ИЗ Справочник.Валюты КАК Валюты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Табличка.Вася ИЗ Табличка КАК Табличка Где Табличка.Вася ="лох" |
|||
54
Evgenius
05.04.17
✎
16:54
|
Такой - не знаю, но выборка из моей временной таблицы, созданной в менеджере - работает. Ты привел пакетный запрос
|
|||
55
mehfk
05.04.17
✎
16:58
|
(54) А какая разница?
|
|||
56
mehfk
05.04.17
✎
16:59
|
Хочешь строки - выгружай в ТЗ, а потом ТЗ засовывай обратно.
|
|||
57
Tateossian
05.04.17
✎
17:00
|
Мне кажется в случае ком соединения если тип строка(50) и тип строка(100) - это разные типы. Надо это проверить.
|
|||
58
DailyLookingOnA Sunse
05.04.17
✎
17:01
|
Делал в запросах для отчетов на СКД условие соединений таблиц по представлению.
Был неприятно удивлен. Не соединялось. |
|||
59
Evgenius
05.04.17
✎
18:07
|
(56) Строки у меня уже есть. Это факт, а не мнение
|
|||
60
Evgenius
05.04.17
✎
18:10
|
(56) (55) Разница, в том, что при помещении во временную таблицу представление формируется сразу. Видимо, помещение в ВТ движком приравнивается к возврату данных на клиента.
А пакетный запрос, который привел Ёпрст - он даже не скомпилится, наверное |
|||
61
Evgenius
05.04.17
✎
18:11
|
(57) Да, но даже так - откуда появляется этот чертов null?
|
|||
62
mehfk
05.04.17
✎
18:12
|
(59) Давай минимальный кусок кода, который подтвердит твой "факт" на люой базе. Иначе это голословное утверждение.
|
|||
63
Evgenius
05.04.17
✎
18:17
|
(62) Какой кусок коды подтвердит, по твоему, наличие во временной таблице строк?
Уважаемый, я ничего не собираюсь доказывать, я просто изложил факты и попросил помощи. Сам твой вопрос доказывает, что ты с этой ситуацией не сталкивался и вряд ли подскажешь, куда копать. Есть временные таблицы, в которые помещены результаты запросов. Когда данные из них выбираешь - это строки и числа. Сам подумай: поскольку запрос, которым были сформированы эти таблицы, выполнялся несколько итераций назад, могла платформа догадаться, что ссылку |
|||
64
mehfk
05.04.17
✎
18:19
|
(63) Доzzzzzzzвидания!
|
|||
65
mehfk
05.04.17
✎
18:34
|
||||
66
Evgenius
05.04.17
✎
18:34
|
(63)+
что ссылку в одной из колонок временной таблицы нужно при следующем запросе заменить на представление??? |
|||
67
mehfk
05.04.17
✎
18:36
|
||||
68
Evgenius
05.04.17
✎
18:47
|
(67) Ответь на мой вопрос
|
|||
69
Evgenius
06.04.17
✎
07:22
|
Вопрос простой: поскольку запрос, которым были сформированы эти таблицы, выполнялся несколько итераций назад, как платформа может потом догадаться, что ссылку, которую она, по твоему, поместила в колонку ВТ, нужно при последующей выборке из ВТ превратить в представление объекта?
Или просто создай запрос, инициализируй менеджер ВТ, создай там таблицу, в одной из колонок которой будет результат функции ПРЕДСТАВЛЕНИЕ. Потом попробуй отобрать из этой таблицы данные с отбором по строковому значению по колонке, в которой находятся результаты функции ПРЕДСТАВЛЕНИЕ |
|||
70
Неверный Параметр И
06.04.17
✎
08:58
|
(69) Если читать документацию не по диагонали, а хотя бы слева направо, то можно понять, что функция представления всегда рассчитывается в самый последний момент,при передаче результатов вызывающему. Сделано это специально, так как при формировании представления учитывается локализация сеанса. До этого 1сная колонка хранится как набор полей, необходимых для вычисления.
В момент запроса данных из твоей одиночной таблицы платформа возвращает тебе результат, вычисляя строку. Ты видишь эту строку и начинаешь брызгать подливой о типах данных в запросе. Как только запрос становится сложнее, поле представление начинает содержать в себе разные по типу и количеству наборы служебных колонок для вычисления представления. Объединение таких наборов - неопределенное поведение и платформа подставляет тебе null. Успехов в изучении матчасти. |
|||
71
Naf2017
06.04.17
✎
08:59
|
(70) я думаю проблема банальнее, но автор не делится кодом, а голословно утверждает
|
|||
72
Evgenius
06.04.17
✎
09:47
|
(70)
Если не тратить время на колкости и отвечать на встречные вопросы, толку от вашего участия в обсуждении будет больше. Вы утверждаете, что ВО ВРЕМЕННОЙ ТАБЛИЦЕ, КУДА ПОМЕЩЕН РЕЗУЛЬТАТ ФУНКЦИИ ПРЕДСТАВЛЕНИЕ, ХРАНИТСЯ НАБОР КОЛОНОК ВМЕСТО РЕЗУЛЬТАТА? |
|||
73
Evgenius
06.04.17
✎
09:48
|
(71) Так давай договоримся, какой именно код тебе поможет понять, что происходит. ВЕСЬ КОД процедуры - это сотни 3 строк. Вообще, по нормальному описанию тоже можно понять, но я допускаю, что чего-то в моих описаниях не хватает
|
|||
74
mehfk
06.04.17
✎
09:49
|
||||
75
Evgenius
06.04.17
✎
11:47
|
Мне надо было повнимательней посмотреть листинги, выложенные Tateossian :)
Всем спасибо ) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |