Наверное, будет в тему.
Я сейчас использую такую схему построения отчетов. Не SQL, но, думаю, это не важно.
В словаре объявляется временная таблица с переменным именем и одним полем ID.
Эта таблица создается в индивидуальном каталоге пользователя и открывается с монопольным доступом. Специальный шаблон ищет первое свободное имя xxx.tps для временной таблицы при входе в окно отчета, а при завершении работы с отчетом удаляет временную таблицу.
Итоги формируются в локальную очередь, затем номера строк записываются в ID временной таблицы. Это позволяет использовать все наработки для стандартных Browse (поиск, фильтр, итоги и расшифровки колонок и т.п.) и не прописывать в словаре структуру таблицы конкретного отчета.
Промежуточные заголовки групп и итоги выделяются стилем.
Окно шаблона имеет две (редко больше) закладки. На одной задаются параметры отчета, на второй показывается итоговый Browse.
Отдельные шаблоны отвечают за:
1. Сохранение и восстановление параметров отчета, как одиночных, так и списковых - а-ля 1С.
2. Вызов отчета в автоматическом режиме, например, из другого отчета.
3. Сохранение и восстановление формата Browse с возможностью выбора сохраненных ранее вариантов.
4. Кнопка расшифровки отчета, позволяющая запустить в отдельном потоке отчет-расшифровку или открыть форму документа.
Для печати Browse используется сильно переделанный под себя шаблон "печать
как есть" от Сергея Павлова (как мне показалось, с "буржуйскими корнями").
Этот шаблон позволяет автоматически разворачивать лист в ландшафт и разбивать на страницы по горизонтали. Доделывать пришлось перенос длинных строк, разделение строк линией, передачу стиля для выделения внутренних заголовков и итогов и прочие мелочи, связанные с внутренним стандартом оформления отчетов.
Для вывода в Excel используется шаблон и класс DirectExcel Олега Руденко, доработанный на предмет передачи стилей для внутренних заголовков и итогов групп.
Дополнительная возможность - вывод в текстовый формат и CSV, также переделанный шаблон Олега.
Такой подход покрывает основную массу отчетов и позволяет на основе однажды сделанной мастер-процедуры очень быстро разрабатывать итоговый отчет - остается, как правило, расставить параметры и поля в List и написать рутинки заполнения локальной очереди и вызова расшифровки.
Еще можно отметить, что многие отчеты имеют типовые формы. Это позволяет создавать дополнительные заготовки (взаиморасчеты, карточка товара и т.п.), а затем импортировать их в заказное приложение с минимальной адаптацией или совсем без нее.
Пользователи, привыкшие к интерфейсу 1С, реагируют вполне положительно, т.к наиболее востребованный функционал перекрывается, а скорость формирования несопоставимо выше.
С уважением,
Вячеслав Черников support@finsoft.ryazan.ru
Код: Выделить всё
udf_listObjPropVals{PROP:SQL} = 'DELETE FROM udf_listObjPropVals'
udf_listObjPropVals{PROP:SQL} = !
'INSERT INTO udf_listObjPropVals SELECT
IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT ' & !
'FROM dbo.listObjPropVals_ALL(' & Objects.IDObj & ')'
RTFM, RTFM и еще раз RTFM. Если не поможет повторить до просветления.
(
вроде как в том cлучае, если будет ODBC, будет проще перебросить простым
tempTable{PROP:SQL} = 'SELECT ... FROM udf_listObjPropVals'
)
3. Поставить перед именем таблицы #.
4. Работать непосредственно с набором, который возвращает функция. Типа:
udf_listObjPropVals{PROP:SQL} = 'SELECT
IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT ' & !
'FROM dbo.listObjPropVals_ALL(' & Objects.IDObj & ')'
Правда редактировать эти записи через стадартную форму не получится.
Придется сделать отдельную функцию на добавление/исправление/удаление записей. И вызывать ее (через PROP:SQL) вместо стандартных процедур.
С уважением,
Алексей Каминский
Нач. отд. АСУ ЖБК100
3. Поставить перед именем таблицы #.
ну, если я правильно понял, то в самом SQL это делается так:
--------------------
Код: Выделить всё
DROP TABLE #udf_listObjPropVals
SELECT IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT
INTO #udf_listObjPropVals
FROM dbo.listObjPropVals(1, @DT)
SELECT * FROM #udf_listObjPropVals
DROP TABLE #udf_listObjPropVals
--------------------
и это понятно...
а вот
4. Работать непосредственно с набором, который возвращает функция. Типа:
udf_listObjPropVals{PROP:SQL} = 'SELECT
IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT ' & !
'FROM dbo.listObjPropVals_ALL(' & Objects.IDObj & ')'
не совсем - пункт 4 - альтернатива пункту 3, или их необходимо выполнять одновременно?
--
Best regards,
Иван
(Добавление)
Hello Vadym,
Вот так я делаю это в Query Analyzer:
------------------------------------
USE Serteko
DECLARE @DT DATETIME
SET @DT = GETDATE()
DROP TABLE #udf_listObjPropVals
SELECT IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT
INTO #udf_listObjPropVals
FROM dbo.listObjPropVals(1, @DT)
SELECT * FROM #udf_listObjPropVals
DROP TABLE #udf_listObjPropVals
------------------------------------
а вот так я пытаюсь сделать это в Кларионе:
----------------------------------------------
dummySQL{PROP:SQL} = !
'SELECT IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT ' & !
'INTO #udf_listObjPropVals ' & !
'FROM dbo.listObjPropVals(' & Objects.IDObj & ', ' & CLIP(todayStr) &')'
----------------------------------------------
при этом udf_listObjPropVals - таблица, на основе которой строится Browse, она объявлена в словаре как MSSQL.
А потом ты просто вызываешь эту ХП у себя в проге, используя таблицу с подходящей структурой для выгребания результата запроса.
вот я и не понимаю - куда можно "выгрести результат запроса", чтобы его можно было просмотреть с помощью стандартного Browse?
я могу объявлять временные таблицы в словаре Clarion-а?
если да, то имя должно включать '#'?
судя по тому, как работает пример в Query Analyzer - должно!
иначе этот пример не работает.
а если я создал Browse для этой таблицы, то при открытии окна (видимо CheckOpen) возмущается, что файл
"#udf_..." или "dbo.#udf_..." или "dbo.udf_..." не найден!
ничего не понимаю...
вопрос не в том, как выгрести, а куда выгрести!
могу ли я развернуть Browse на основе временной (# - для SQL Server-а) таблицы?
--
Best regards,
Иван
(Добавление)
Код: Выделить всё
DROP TABLE #udf_listObjPropVals
SELECT IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT
INTO #udf_listObjPropVals
FROM dbo.listObjPropVals(1, @DT)
SELECT * FROM #udf_listObjPropVals
DROP TABLE #udf_listObjPropVals
--------------------
и это понятно...
Похоже не совсем.
Надо так:
Код: Выделить всё
udf_listObjPropVals{PROP:SQL} = 'DROP TABLE #udf_listObjPropVals'
udf_listObjPropVals{PROP:SQL} = !
'INSERT INTO #udf_listObjPropVals SELECT
IDVal,IDObj,IDProp,Name,IDPropType,Type,Val,StartDT ' & !
'FROM dbo.listObjPropVals_ALL(' & Objects.IDObj & ')'
И, соответственно, в описании таблицы udf_listObjPropVals аттрибут Full PathName поставить равным #udf_listObjPropVals. Или добавить:
udf_listObjPropVals{PROP:SQL} = ' SELECT * FROM #udf_listObjPropVals '
Только Insert надо делать до Open таблицы. Дальше сервер сам разруливать все будет.
Написал: ClaList(2)