|
СКД. Программный вывод отчета с фиксированным макетом. | ☑ | ||
---|---|---|---|---|
0
guitar_player
21.03.12
✎
15:10
|
Добрый день!
Формирую табличный документ при помощи СКД программно. Есть фиксированный макет и в нем, например, есть 2 области - заголовок, строка. Подскажите пожалуйста, как програмно можно определить был результат итогового запроса пустым? Сейчас если под условия ничего не попадает, то выводится только заголовок. Делаю авторассылку отчетов, мне нужно определить - если данных не было, то отправлять этот отчет не нужно, либо делать какие то другие действия. Есть какие нибудь решения? |
|||
1
Лодырь
21.03.12
✎
15:11
|
проверить количество строк?
|
|||
2
Aprobator
21.03.12
✎
15:11
|
высота таблицы?
|
|||
3
guitar_player
21.03.12
✎
15:12
|
если ты про высоту таблицы, то это не совсем подходящий вариант, так как она может быть разная для разного отчета, есть еще варианты?
|
|||
4
Лодырь
21.03.12
✎
15:16
|
Ну добавь в конце заголовка невидимый маркер. Проверь его позицию после вывода отчета. Если в конце отчета стоит маркер - отчет пустой.
|
|||
5
guitar_player
21.03.12
✎
15:19
|
(4) в принципе вариант, спасибо. Может кто нибудь предложет другие идеи?
|
|||
6
Лодырь
21.03.12
✎
15:31
|
(5) Хочешь вариантов, ок держи (не проверял):
Вызови внешнюю функцию при расчете ресурса отчета - измени внешний флаг внутри этой функции. |
|||
7
Лодырь
21.03.12
✎
15:33
|
(5) В порядке дежурного бреда. Продублируй предварительно запрос. Пустое значение - идем лесом, непустое - запускаем СКД. )
|
|||
8
guitar_player
21.03.12
✎
16:28
|
(7) ну это не вариант... вариант (6) попробую, спасибо)
|
|||
9
guitar_player
22.03.12
✎
04:23
|
(6) выкрутился так:
В отчет добавил параметр, в вычисляемых полях добавил поле, в нем вызываю внешнюю функцию, передаю туда параметр, там его меню. Соответственно если были данные - параметр изменился, если нет - нет. Работает, йа доволен! Всем спасибо! |
|||
10
badboychik
22.03.12
✎
05:30
|
ты бы еще в реестре параметр завел...
или в файлик на диске цифру 1 писал |
|||
11
Escander
22.03.12
✎
05:40
|
а разве ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент не позволяет выводить в табличный документ программно? что-бы при выводе "ручками" не отслеживать?
|
|||
12
badboychik
22.03.12
✎
05:52
|
позволяет выводить, только после вывода получается готовый результат, его пустоту можно только по высоте таблицы определить
|
|||
13
badboychik
22.03.12
✎
05:53
|
а почему высота может быть разная если макет фиксированный?
|
|||
14
Escander
22.03.12
✎
05:59
|
(12) а зачем? первый элемент вывода - шапка, если элементов больше 1 - значит основная часть не есть пустая!
|
|||
15
Лодырь
22.03.12
✎
06:02
|
Если предположить что отчет сложной структуры, например состоящий из двух частей:
1. Описательно пояснительная, назыаемая заголовком ) 2. Данные то тогда определить вывелись ли данные из пункта 2 действительно сложно |
|||
16
badboychik
22.03.12
✎
06:03
|
(14) ты отладчиком хоть раз пробегал процесс вывода? Там всегда элементов больше 1 и даже больше 5 :) и первый элемент не шапка.
Там можно по имени макета определить что выводится - если имя макета = "Макет3", это значит детальная строка. Если там есть значение и таких строк больше одной, значит результат не пустой |
|||
17
badboychik
22.03.12
✎
06:10
|
смотри урок №82 по СКД )
|
|||
18
Escander
22.03.12
✎
06:13
|
(16)ну это в первом приближении, если шапка есть то вот такой код поможет, в крайнем случае допиливаемо:
................. Процессор = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; Процессор.УстановитьДокумент(ДокументРезультат); Процессор.НачатьВывод(); ЭлементРез = ПроцессорКомпоновки.Следующий(); ДанныеЕсть = Ложь; Пока Не ЭлементРез = Неопределено Цикл Если Не ДанныеЕсть И ЭлементРез.ЗначенияПараметров.Количество()>0 Тогда ДанныеЕсть = Истина; КонецЕсли; Процессор.ВывестиЭлемент(Элемент); ЭлементРез = ПроцессорКомпоноки.Следующий(); КонецЦикла; Ответ на вопрос ТС в переменной ДанныеЕсть, не? |
|||
19
Escander
22.03.12
✎
06:14
|
(17) чей?
|
|||
20
Escander
22.03.12
✎
06:15
|
(15) у ТС структура:заголовок, строка.
|
|||
21
badboychik
22.03.12
✎
06:32
|
(18) не пойдет, там даже в пустом отчете есть одна строка с количеством параметров больше нуля, проверено. Надо еще значения проверять, там они равны NULL если пустой результат
(19) Фарита конечно же ) Тут вроде бы баннер висел |
|||
22
guitar_player
22.03.12
✎
06:38
|
(20) я написал, что у меня произвольная структура. СКД хранится в элементе справочника, продвинутый пользователь настраивает его как хочет. К высоте таблицы, количеству областей привязываться нельзя
|
|||
23
guitar_player
22.03.12
✎
06:38
|
(10) что не нравится?
|
|||
24
Escander
22.03.12
✎
06:42
|
(21)ну тогда наверное не Фарит а Евгений.
>Надо еще значения проверять, там они равны NULL если пустой результат ну тык вот, мелкий допил и опа, вуаля! |
|||
25
guitar_player
22.03.12
✎
07:59
|
Сделал вот так:
Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновки.Следующий(); Если ЭлементРезультата = Неопределено Тогда Прервать; Иначе Если Не ДанныеЕсть И ЭлементРезультата.ЗначенияПараметров.Количество() > 0 И ЕстьЗаполненныеЗначенияПараметровМакетаКомпоновкиДанных(ЭлементРезультата.ЗначенияПараметров) Тогда ДанныеЕсть = Истина; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); КонецЕсли; КонецЦикла; Функция ЕстьЗаполненныеЗначенияПараметровМакетаКомпоновкиДанных(ЗначенияПараметровМакетаКомпоновкиДанных) Для Каждого Элемент Из ЗначенияПараметровМакетаКомпоновкиДанных Цикл Если Элемент.Значение <> NULL Тогда Возврат Истина; КонецЕсли; КонецЦикла; Возврат Ложь; КонецФункции //ЕстьЗаполненныеЗначенияВМассиве Все правильно понял? |
|||
26
Escander
22.03.12
✎
09:01
|
вроде так, проверку заполнения никогда не делал, но похоже.
всё-же перед циклом стоит сделать ДанныеЕсть = Ложь;; |
|||
27
guitar_player
22.03.12
✎
09:06
|
(26) конечно стоит, только не зацепил эту строчку при копировании
|
|||
28
Escander
22.03.12
✎
09:48
|
(27) искомое получилось?
|
|||
29
guitar_player
22.03.12
✎
09:48
|
(28) да, все работает! Спасибо!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |