Имя: Пароль:
1C
1С v8
Про isnull (ЕСТЬNULL)
0 andrewks
 
19.11.11
20:32
Киньте, плиз, примером, как можно в первом параметре этой функции получить значение составного типа
1 rs_trade
 
19.11.11
20:34
(0) первый параметр туде передается, а не получается.
2 Rie
 
19.11.11
20:34
(0) Какого составного типа значение ты хочешь извлечь из таблицы?
3 andrewks
 
19.11.11
20:36
(1) вот я и спрашиваю, как туда можно передать значение составного типа, содержащее NULL
4 andrewks
 
19.11.11
20:37
в общем, я фантазирую на отвлечённые темы после разрыва шаблона от этих строк:

Возвращаемое значение: значение первого параметра, в случае, если первый параметр не содержит значение NULL, значение второго параметра в противном случае.

Второй параметр будет преобразован к типу первого в случае, если тип первого параметра является строкой или числом.
5 lubja
 
19.11.11
20:39
может тогда через выбор организовать?
6 Rie
 
19.11.11
20:39
(4) Дык эта... А в чём проблема-то?
7 lubja
 
19.11.11
20:40
+5 типа
выбор когда <условие>
  тогда
  иначе
конец
8 GROOVY
 
19.11.11
20:40
(4) Про составной тип ни слова.
9 Rie
 
19.11.11
20:41
(3) Что-то непонятно... NULL - это не составное значение. Это - признак отсутствия значения при соединении таблиц. Какое "составное значение" ты рассчитываешь получить при соединении таблиц?
10 andrewks
 
19.11.11
20:41
(6)(8) хорошо, объясните тогда, что означает "содержит", и про какое приведение типов для _второго_ говорится, если тип _первого_ параметра является строкой или числом?
11 andrewks
 
19.11.11
20:42
(9) понимаю. поэтому и разрыв шаблона
12 Rie
 
19.11.11
20:42
(10) Читай "содержит" как "является" - и будет счастье.
13 andrewks
 
19.11.11
20:42
(12) хорошо, допустим. а с приведением типов какая легенда?
14 Rie
 
19.11.11
20:44
(13) Например, тип первого параметра - строка, тип второго параметра - дата.
15 andrewks
 
19.11.11
20:45
(14) а дальше?
16 andrewks
 
19.11.11
20:45
+(15) строка != NULL, какое приведение типов тогда?
17 Rie
 
19.11.11
20:47
(16) Например,
ВЫБРАТЬ
   ISNULL(Договоры.Наименование,'20110101') КАК ВотОно
ИЗ
   Справочник.Контрагенты КАК Контрагенты
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК Договоры
   ПО Договоры.Владелец = Контрагенты.Ссылка
18 rs_trade
 
19.11.11
20:48
уже вторая ветка. я например тебя совсем не понимаю.
19 andrewks
 
19.11.11
20:51
(18) кстати, ты мне в предыдущей ветке так и не ответил.

дело-то не во мне. это _я_ не понимаю некоторые перлы из ЖКК. особо "разрывошаблонистые" вот пощу, просто тупые пропускаю.

добрая четверть скринов в ЖКК не соответствует тексту, я ж молчу.
20 andrewks
 
19.11.11
20:59
(17) и в каком случае будет приведение типов?

щас специально проверил, если NULL в 1-м параметре, возвращается значение такого же типа, что и 2-й параметр.
т.е. запрос


   select
    isnull(Клиенты.Наименование,datetime(2011,01,05)) as НаимКл
   ,Склады.Наименование
   from
    Справочник.Клиенты as Клиенты
   full join
    Справочник.Склады as Склады
   on Клиенты.Ссылка=Склады.Ссылка



возвращает именно значение типа дата в поле НаимКл, когда на входе NULL
то же и с числами
21 rs_trade
 
19.11.11
21:01
(19) я там так и не понял почему ты считаешь что агрегатная функция должна была вернуть несколько строк.

Хочешь изучить язык запросов, читай книги по ms sql, а не жкк.
22 andrewks
 
19.11.11
21:03
(21) наоборот, я считаю, что должна была вернуть одну строку. а вернула две
23 andrewks
 
19.11.11
21:08
(21) у меня вопросы не по инструкциям скуля, а про вполне определённые их реализации в 1с 8. зачем мне книжки про ms sql? я их ещё в универе читал, что надо, осталось в памяти, что не надо - забыл, ну и ладно, всё равно же не надо
24 Rie
 
19.11.11
21:19
(23) В документации по SQL насчёт ISNULL сказано "Тип аргумента replacement_value должен явно преобразовываться к типу аргумента check_expresssion".
Полагаю, на это и стоит ориентироваться.
25 rs_trade
 
19.11.11
21:30
я честно говоря не помню никакого приведения типов. по моему просто возвращается второй параметр с его же типом
26 Rie
 
19.11.11
21:33
(25) Если нет явного преобразования - так и есть.
IMHO, авторы документации по языку запросов 1С, переписывая описание ISNULL, просто упустили слова о необходимости преобразовывать явно.
27 andrewks
 
19.11.11
21:35
(24) не всё так просто. читаю здесь:
http://msdn.microsoft.com/en-us/library/ms184325.aspx
Is the expression to be returned if check_expression is NULL. replacement_value must be of a type that is implicitly convertible to the type of check_expresssion.

опять про неявное преобразование типов. и ни одного реального примера, когда же может выполняться это самое преобразование типов
28 andrewks
 
19.11.11
21:37
если isnull засунуть в sum - ругань, тоже никаких  невяных преобразований типов
29 Rie
 
19.11.11
21:38
(27) Не знаю насчёт 2008-го SQL - нет его под рукой. 2005-й уверенно возвращает значение безо всяких преобразований типа.
30 rs_trade
 
19.11.11
21:51
как ведет себя 1с легко проверить посмотрев запрос в профайлере.
31 andrewks
 
19.11.11
22:07
всё, вкурил.
вот здесь разъяснено:
http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=ISNULL_COALESCE

пример:

DECLARE @Field1 char(3), @Field2 char(50)
SET @Field2 = 'Some Long String'

SELECT ISNULL(@Field1, @Field2)
--Returns 'Som'


методисты 1С слизали описание с BOL, даже не потрудившись выяснить, а будет ли оно соответствовать реализации языка запросов 1С.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший