Проверка на неопределено

1. MaximKor 20 15.03.17 08:02 Сейчас в теме
Здравствуйте! Помогите пожалуйста разобраться.
Вот запрос:
ВЫБРАТЬ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
ПОМЕСТИТЬ СуммаДоговораВсего
ИЗ
	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
ГДЕ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
	СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
	СуммаДоговораВсего.СуммаДоговора
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты,
	СуммаДоговораВсего КАК СуммаДоговораВсего
ГДЕ
	ХозрасчетныйОстаткиИОбороты.Субконто2 = &Субконто2
	И ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

СГРУППИРОВАТЬ ПО
	ХозрасчетныйОстаткиИОбороты.Субконто2,
	СуммаДоговораВсего.СуммаДоговора
Показать


Но иной раз авансов нет. И тогда весь запрос не отрабатывает, по всем полям неопределенно, а данные из него нужны дальше в любом случае. Как проверить поле ХозрасчетныйОстаткиИОбороты.СуммаОборотКт на неопределенно и дать ему значение 0.
пробовал уже по разному и ЕСТЬ NULL и неопределенно, выдает ошибку. Спасибо.
По теме из базы знаний
Найденные решения
29. ice-net 19 15.03.17 09:39 Сейчас в теме
(28)
Можно и без..

|ВЫБРАТЬ
|    &ДоговорКонтрагента КАК ДоговорКонтрагента ,
|    ЕСТЬNULL(Хозрасчетный.СуммаОборотКт, 0) КАК СуммаАвансов,
|    ЕСТЬNULL(Заказы.СуммаВзаиморасчетовПриход, 0) КАК СуммаДоговора
|ИЗ
|    РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ДоговорКонтрагента = &ДоговорКонтрагента ) КАК Заказы,
|    (ВЫБРАТЬ СУММА(т.СуммаОборотКт) КАК СуммаОборотКт  ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов), Субконто1 = &ДоговорКонтрагента , , ) КАК т
|        ГДЕ
|            т.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) КАК Хозрасчетный

Показать


В любом случае будет работать лучше чем в (0) и быстрее
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. ResetAtreides 15.03.17 08:52 Сейчас в теме
(1) Разве таблицы связать по полю "Договор" не нужно? Без связи это полное соединение и бред получается, имхо
8. japopov 68 15.03.17 08:54 Сейчас в теме
(1) Во-первых, у Вас неверно написан запрос. Таблицы не соединены друг с другом.
10. kolya_tlt 86 15.03.17 08:59 Сейчас в теме
(8) первые 3 запроса бесплатно?)
2. YanSergey 145 15.03.17 08:26 Сейчас в теме
ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт, 0)
3. MaximKor 20 15.03.17 08:46 Сейчас в теме
(2) пробовал, все равно все поля возвращают значение неопределенно. причем по первому запросу значение всегда есть.
4. kolya_tlt 86 15.03.17 08:50 Сейчас в теме
(3) у вас результат пустой, вам программа и возвращает пустоту. чего вы удивляетесь? в чем проблема объявить переменную и присвоить ей значение в случае если оно есть?

	Сумма = 0;
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		Сумма = ВыборкаДетальныеЗаписи.Сумма;
	КонецЕсли;
11. MaximKor 20 15.03.17 09:00 Сейчас в теме
(4)
ВыборкаДетальныеЗаписи.Следующий()
весь запрос в этой случае не работает, а не только поле сумма
5. ice-net 19 15.03.17 08:51 Сейчас в теме
(0) Судя по полям:

ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор, 
СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов, 
СуммаДоговораВсего.СуммаДоговора


Вам нужен договор, Сумма авансов по нему и Сумма по заказам за ВСЕ время., т.е. 1 строка, Договор/Сумма1/Сумма2. Верно?
7. MaximKor 20 15.03.17 08:52 Сейчас в теме
(5)да верно, сумма по договору за все время точнее.
9. japopov 68 15.03.17 08:56 Сейчас в теме
(7) подождите, я Вам запрос перепишу полностью. У Вас там просто каша.
20. ice-net 19 15.03.17 09:16 Сейчас в теме
(7) Тогда лучше сделать так:

ВЫБРАТЬ
	&ДоговорКонтрагента КАК ДоговорКонтрагента ,
	ЕСТЬNULL(Хозрасчетный.СуммаОборотКт, 0) КАК СуммаАвансов,
	ЕСТЬNULL(Заказы.СуммаВзаиморасчетовПриход, 0) КАК СуммаДоговора
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ДоговорКонтрагента = &ДоговорКонтрагента ) КАК Заказы
	ПОЛНОЕ СОЕДИНЕНИЕ 
		(ВЫБРАТЬ СУММА(т.СуммаОборотКт) КАК СуммаОборотКт  ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов), Субконто1 = &ДоговорКонтрагента , , ) КАК т
		ГДЕ
			т.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) КАК Хозрасчетный
		ПО (ИСТИНА)

Показать
23. japopov 68 15.03.17 09:17 Сейчас в теме
(20) Вадим, это же будет тормозить жутко!
26. ice-net 19 15.03.17 09:25 Сейчас в теме
12. japopov 68 15.03.17 09:02 Сейчас в теме
Не могу проверить (нет подходящей конфигурации развёрнутой), так что вот, написано вручную - нужно перепроверить:
ВЫБРАТЬ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
ПОМЕСТИТЬ СуммаДоговораВсего
ИЗ
	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
ГДЕ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
	СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
	СУММА(СуммаДоговораВсего.СуммаДоговора) КАК СуммаДоговора
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ СуммаДоговораВсего КАК СуммаДоговораВсего
ПО ХозрасчетныйОстаткиИОбороты.Субконто2 = СуммаДоговораВсего.ДоговорКонтрагента
ГДЕ
ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

СГРУППИРОВАТЬ ПО
ХозрасчетныйОстаткиИОбороты.Субконто2
Показать
13. ResetAtreides 15.03.17 09:05 Сейчас в теме
(12) ЕстьNULL забыл добавить )
15. japopov 68 15.03.17 09:08 Сейчас в теме
(13) Не забыл. Какой IsNull при внутреннем соединении? Внутреннее соединение и так отрежет все несовпадающие записи.
17. ResetAtreides 15.03.17 09:10 Сейчас в теме
(15) ага, а я чет решил что ты левое сделал, оно вроде как более подходящее по логике первого поста
14. japopov 68 15.03.17 09:07 Сейчас в теме
(12)
1) Таблицы соединяем внутренним соединением. Тогда и условие по договору на вторую таблицу накладывать не надо: оно и так наложится неявно (просто из первой таблицы придут только записи с нужным договором).
2) Группировка только по группировочному полю, остальные поля - суммировать.
3) У меня этого нет, но Вы можете в первом запросе проиндексировать ещё по полю ДоговорКонтрагента - работать будет шустрее.

Что получится на Ваших данных?
16. MaximKor 20 15.03.17 09:09 Сейчас в теме
спасибо за старания. но пусто снова в запросе. даже если писать естьnull
Прикрепленные файлы:
18. ResetAtreides 15.03.17 09:10 Сейчас в теме
(16) а вот это как раз из-за внутреннего соединения, имхо. Сделай левое
19. japopov 68 15.03.17 09:14 Сейчас в теме
(16) Внутреннее соединение в моём запросе замените на левое.
22. MaximKor 20 15.03.17 09:16 Сейчас в теме
(19) тогда не работает условие по договору из первого запроса, добавил его во второй. и результат также, пусто
24. japopov 68 15.03.17 09:23 Сейчас в теме
(22) Уберите временно таблицу СуммаДоговораВсего. Отладьте данные во втором запросе.
Верните таблицу СуммаДоговораВсего. Настройте соединение таблиц по полю ДоговорКонтрагента.
Проверьте данные. Если появляются Null, вставьте внутрь сумм ЕСТЬNULL(***,0).

Трудно Вам дальше помогать (делать всё за Вас ;-) ), не имея источника для проверки.
27. ResetAtreides 15.03.17 09:25 Сейчас в теме
(24) Ты там правое соединение запулил. Это ж к авансам обороты цепляет, а надо наоборот
25. ResetAtreides 15.03.17 09:23 Сейчас в теме
(22) Покажи текст получившегося запроса-то. И отбор по договору запихни сразу в параметры виртуальных таблиц
P/S/ Смени правое соединение на левое
21. japopov 68 15.03.17 09:16 Сейчас в теме
(16)
ВЫБРАТЬ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
ПОМЕСТИТЬ СуммаДоговораВсего
ИЗ
	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
ГДЕ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
	СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,0)) КАК СуммаАвансов,
	СУММА(ЕСТЬNULL(СуммаДоговораВсего.СуммаДоговора,0)) КАК СуммаДоговора
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты
ПРАВОЕ СОЕДИНЕНИЕ СуммаДоговораВсего КАК СуммаДоговораВсего
ПО ХозрасчетныйОстаткиИОбороты.Субконто2 = СуммаДоговораВсего.ДоговорКонтрагента
ГДЕ
ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

СГРУППИРОВАТЬ ПО
ХозрасчетныйОстаткиИОбороты.Субконто2
Показать
28. ResetAtreides 15.03.17 09:29 Сейчас в теме
зачем по ИСТИНА-то соединять? Оно и так соединится. А вообще, похоже именно что надо покажет и ничего лишнего не тянет. Только больно уж узко специализированно получается, потом фиг этот запрос расширишь
29. ice-net 19 15.03.17 09:39 Сейчас в теме
(28)
Можно и без..

|ВЫБРАТЬ
|    &ДоговорКонтрагента КАК ДоговорКонтрагента ,
|    ЕСТЬNULL(Хозрасчетный.СуммаОборотКт, 0) КАК СуммаАвансов,
|    ЕСТЬNULL(Заказы.СуммаВзаиморасчетовПриход, 0) КАК СуммаДоговора
|ИЗ
|    РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ДоговорКонтрагента = &ДоговорКонтрагента ) КАК Заказы,
|    (ВЫБРАТЬ СУММА(т.СуммаОборотКт) КАК СуммаОборотКт  ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов), Субконто1 = &ДоговорКонтрагента , , ) КАК т
|        ГДЕ
|            т.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) КАК Хозрасчетный

Показать


В любом случае будет работать лучше чем в (0) и быстрее
30. japopov 68 15.03.17 09:42 Сейчас в теме
(29) Вот это - хорошо! Особенно хорошо, что обе задействованные виртуальные таблицы фильтруются сразу при получении.
Пожалуй, лучший вариант.
Хотя, вариации на тему (21) будут универсальнее, тут Reset Atreides прав.
32. ice-net 19 15.03.17 09:58 Сейчас в теме
(30)
Есть задача - есть решение)
Это не типовой код с запросом для 5 различных вариантов отчетов или еще что на 150 строк.. Это решение под конкретную задачу. Должно быть просто и оптимально, без излишеств. Что тут может модернизироваться? Добавить отбор за период, сделать по нескольким договорам(Чуть изменить отбор и связь добавить).. не очень понимаю для чего тут универсальность для дальнейших доработок, все итак легко и понятно.

Имхо. Без обид, но на (0) и (21) с такими отборами смотреть больно. =)
33. japopov 68 15.03.17 10:18 Сейчас в теме
(32)
Без обид. Я всегда стараюсь быть объективным. Потому и написал, что решение хорошее, но не масштабируемое.
А завтра понадобится всю эту красоту делать не по одному договору, а по списку, и сгруппировать долги по определённому признаку (ни разу не сталкивались с таким - "для ВОТ ЭТОЙ группы контрагентов считаем чётко, а по остальным - без учёта договоров"? Реально, такая задача была), и...?
А выбрать данные в две ВТ и потом их соединить по любому признаку - всегда проще и потом можно расширить, хоть по признаку длины ног секретарши директора!
34. ice-net 19 15.03.17 11:31 Сейчас в теме
(33)
Согласен, но а что, если надо будет добавить еще сумму приходов (если поставщик и покупатель одно лицо)?
Или разбить все это дело по реквизитам из регистратора определенного типа со сложными группировками по итогам?)

Я это к тому, что когда понадобиться - тогда и надо делать(под конкретные определенные потребности). Обычно такие доработки как минимум требуют переписать часть кода, а сложные - и вовсе иногда всю логику переделать.. Универсальность - не панацея)
31. MaximKor 20 15.03.17 09:57 Сейчас в теме
(29) спасибо за помощь!
Спасибо всем кто принимал участие!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот