Отдел технической поддержки
+7(929) 90-77-500
help@profsegment.ru


дата обновления 08.06.2023
 

 

Вводная часть

 

Установка программы (версии: ОРБИТА, СПУТНИК, МЕНЕДЖЕР)

 

Новшества ПрофСтрой 4

 

Операции

 

Настройки

 

Ценообразование

 

Каталоги

 

Конструктив

 

Оформление заказов

 

Групповые оптимизации раскроя

 

Генератор отчетов

 

Просмотр отчетов

 

Вид мрамор

 

Перевод

 

Помощь

 

Корпоративная версия с кабинетами дилеров

 

Первичная настройка

 

Модуль AutoCAD

 

Модуль МС

 

Склад

 

Модуль мультиформатной поддержки (1С)

 

Модуль - базовый CRM

 

Модуль склада готовой продукции

 

Архив новостной рассылки

"Практикум"

При создании документооборота на предприятии возникают проблемы, связанные с не согласованностью различных подразделений этого предприятия:

  • отчеты создает конструктор или технолог, работающий в AutoCad'е, не знающий среду и средства разработки - в данном случае это html и sql.
  • отчеты создает менеджер или системный администратор, не знающий производство и особенности технологических настроек.

Этот подраздел призван разъяснить некоторые часто встречающиеся моменты и вопросы пользователей при создании отчетов и документооборота.

Этапы создания отчета

Процесс создания отчета с точки зрения пользователя можно понимать как прохождение трех основных этапов:

  • выборка данных из базы данных программы по заданным условиям -индексам, параметрам, фильтрам
  • дополнительные вычисления параметров - суммы столбцов, сложение финансовых показателей и т.п.
  • оформление отображения информации - стили шрифтов, таблицы, диаграммы.

Первый этап - самый главный и сложный. Он предполагает наличие в базе данных тех сохраненных данных, которые потребуются для выборки. В противном случае в отчет не попадет требуемая информация.

Примеры

Пользователь создал отчет вывода рамок москитной сетки с указанием фильтра 'Профиль_в_составе_М/С': (aTypM=1)and(aTypP=20), а в отчет они не попадают, хотя имеются в общей спецификации изделия.
При детальном анализе ошибок в отчете не обнаружили. Оказалось, что для рамок в материальных ценностях стоит подтип 'дополнительный профиль'.

Пользователь пытается вывести в отчет профили армирования, в привязке к конкретному профилю, но выводится одна строка с общим количеством. В предопределенном отчете по групповому раскрою профилей не заполняется столбец 'часть' - положение профиля [верх, низ., левый, прав., верт., гориз.].
Снова отчет тут не причем - проблема в том, что в расчетных данных не был установлен флаг 'Спецификация профилей и пакетов для сборки'.

ВАЖНО
Перед тем, как создавать отчет, необходимо согласовать техническое задание на отчет с технологом предприятия и с финансовой службой, так как возможно сначала потребуется весьма существенное изменение технологических и ценовых настроек !

Сборка профилей и пакетов

В расчетных данных есть очень важный флаг: 'Спецификация профилей и пакетов для сборки'. От установки этого флага зависит - насколько подробную информацию будет содержать таблица спецификации изделий SpecPAU.

При выключенном флаге спецификация изделия сохраняется в 'экономичном режиме'. Однотипные одноразмерные позиции складываются в одну. По сравнению с 'подробным' режимом, объем сохраняемых данных по изделию примерно в 3 раза меньше. Этот режим используется, если нужна простая спецификация - список комплектующих изделия/проекта.

При включенном флаге происходит 'подробное' сохранение спецификации. Сохраняется номер элемента, ориентация, привязка к составам. Становится возможным вывести в отчет - какой винтик входит в состав конкретного профиля, какое стекло в составе стеклопакета. Этот режим используется для формирования подробных сборочных спецификаций с выводом привязок типа профиль-армирование, стеклопакет-стекло, стеклопакет-раскладка.

Примеры

Представим себе глухую квадратную коробку с размерами 1000х1000 мм, и рассмотрим только профиль коробки с армированием.
При выключенном флаге 'Спецификация профилей и пакетов для сборки' в таблице SpecPAU сохранится одна запись профиля и одна - армирования:

АртикулТекстураДлина, ммУглы резаКол воЧастьЭлем.№
КоробкаБелый100045° х 45°4низ1
АрмированиеБез цвета96090° х 90°4низ1


При включенном флаге 'Спецификация профилей и пакетов для сборки' в таблице SpecPAU сохранится 4 записи профиля и 4 записи армирования:

АртикулТекстураДлина, ммУглы резаКол воЧастьЭлем.№
КоробкаБелый100045° х 45°1низ1
КоробкаБелый100045° х 45°1прав.2
КоробкаБелый100045° х 45°1верх3
КоробкаБелый100045° х 45°1лев.4
АрмированиеБез цвета96090° х 90°1низ1
АрмированиеБез цвета96090° х 90°1прав.2
АрмированиеБез цвета96090° х 90°1верх3
АрмированиеБез цвета96090° х 90°1лев.4


Режимы цикла 'Спецификация'

В генераторе отчетов есть предопределенный цикл 'Спецификация'. Это единственный цикл, для которого возможно определения фильтров по типам материальных ценностей и группам печати, а также два режима вывода.

Режим ~Спецификация:Запрос:СТАНДАРТ~ действует по умолчанию. Выводит прямую выборку из таблицы спецификации изделий SpecPAU. Вывод данных зависит от флага в расчетных данных 'Спецификация профилей и пакетов для сборки'. Аналогом работы цикла в этом режиме служит код:
~SQL1:Установить:SELECT * FROM SpecPAU WHERE~
~SQL1:Добавить:(pUnic=:Индекс1.AsInteger:)AND~
~SQL1:Добавить:(oNumb=:Индекс2.AsInteger:) ORDER BY aNumb~
~SQL1:НАЧАЛО~
. . .
~SQL1:КОНЕЦ~

Режим ~Спецификация:Запрос:ПОГОНАЖ~ должен устанавливается явно. Аналогом работы цикла в этом режиме служит код:

~SQL1:Установить:SELECT DISTINCT pUnic,aTypM,aTypP,aNumb,~
~SQL1:Добавить:clNum,clNu1,clNu2 FROM SpecPAU~
~SQL1:Добавить:WHERE (pUnic=:Индекс1.AsInteger:)~
~SQL1:Добавить:AND(oNumb=:Индекс2.AsInteger:)~
~SQL1:Добавить:ORDER BY aNumb~
~SQL1:НАЧАЛО~
. . .
<!-- вычисляем SQL выборкой суммарное количество -->

~SQL2:Установить:SELECT SUM(aQtyA*oQtyI) as QTY~
~SQL2:Добавить:FROM SpecPAU,ListORD WHERE (oNumb>0)AND~
~SQL2:Добавить:(SpecPAU.pUnic=ListORD.pUnic)AND~
~SQL2:Добавить:(SpecPAU.oNumb=ListORD.oNumb)AND~
~SQL2:Добавить:(SpecPAU.pUnic=:Индекс1.AsInteger:)AND~
~SQL2:Добавить:(SpecPAU.oNumb=:Индекс2.AsInteger:)AND~
~SQL2:Добавить:(aNumb=:SQL1aNumb.AsString:)AND~
~SQL2:Добавить:(clNum=:SQL1clNum.AsInteger:)AND~
~SQL2:Добавить:(clNu1=:SQL1clNu1.AsInteger:)AND~
~SQL2:Добавить:(clNu2=:SQL1clNu2.AsInteger:)~
~SQL2:НАЧАЛО~
. . .
~SQL2:QTY:AsFloat~ <!-- Количество -->
. . .
~SQL2:КОНЕЦ~

. . .

~SQL1:КОНЕЦ~

Для суммирования профилей, имеющих одинаковые длины и углы раза, имеется расширенный режим: ~Спецификация:Запрос:ПОГОНАЖ.РАЗМЕРЫ~.

ТЕРМИНОЛОГИЯ
Под термином 'погонаж' в контексте программы понимается суммарное количество комлектующих всех типов соответственно их единицам измерения без деления на нормы поставки (хлыст, упаковка, лист). Для профилей и уплотнений это пог.м., для аксессуаров - [шт., компл, мл. …], для заполнений - кв.м.

Типы профилей в изделии

При создании отчетов часто возникает необходимость выделить профили конкретного подтипа или применения.

Подтип профиля и его применение в изделии не одно и тоже, как считают многие начинающие пользователи !

Подтип профиля является свойством материальной ценности типа 'профили' и назначается в окне 'Ценообразование/Материальные ценности'.При расчете изделия сохраняется его спецификация в таблице SpecPAU, в которой типы и подтипы комплектующих сохраняются в точном соответствии с настройкой материальных ценностей в таблице Artikls. Профили определяется полем aTypM smallint (для профилей =1), а подтип профиля полем aTypP smallint, значения которого подробно описаны в разделе 'Приложение'.

Применением профиля является назначение основного элемента в изделии. В программе имеются три типа применения основных профилей: коробка, створка, импост. Векторная структура изделия сохраняется в таблице SaveELM. Профили определяется полем aTypM smallint (для профилей =1), а применение профиля полем typP smallint, значениями которого могут быть [1, 2, 3] - соответ-ственно [коробка, створка, импост].

В зависимости от системы профилей эти три применения включают в себя несколько назначений, с учетом терминологии можно представить таблицей:

программаалюминийпластикдерево
перегородка
окно / дверь
фасад
окно / дверьокно / дверь
коробкакоробка / порог
стойка на границе изделия
ригель на границе изделия
рамабрус рамы
створкастворкастворкабрус створки
импостстойка внутри изделия
ригель внутри изделия
траверса / импост
импост
штульп
поперечина
импост
горбылек
накладка


Получение данных из таблицы МЦ

У пользователей часто возникает потребность внутри цикла 'Спецификация' получить данные из таблицы материальных ценностей. Приведем пример получения данных по артикулу: ценовой коэффициент, норма отхода, размер делового остатка.
~Спецификация:НАЧАЛО~
<!-- вводим параметр 'Арт№' для передачи его в подзапрос SQL1 -->
~Спецификация:aNumb:AsString:Арт№~
. . .
<!-- формируем подзапрос в таблицу материальных ценностей -->
~SQL1:Установить:SELECT aOuts,aKoef,aOstD FROM Artikls~
~SQL1:ДОБАВИТЬ:WHERE aNumb=:Арт№.AsString~
~SQL1:НАЧАЛО~
~SQL1:aKoef:AsFloat:Ценовой_коэффициент~
~SQL1:aOuts:AsFloat:Норма_отхода_%~
~SQL1:aOuts:AsFloat:Размер_делового_остатка~
~SQL1:КОНЕЦ~
. . .
~Спецификация:КОНЕЦ~

Исключение из отчета конструктивных мат.ценностей

В программе можно определять так называемые 'конструктивные' материальные ценности. Такие артикулы начинаются с символа '@' и участвуют только в описании структуры изделия. В спецификацию они не попадают и в стоимости не учитываются, поэтому при выводе тарифа материальных ценностей только для бухгалтера их нужно исключить. Для этого нам потребуется применение оператора SQL подобия строковых полей - LIKE, в простом примере запрос будет выглядеть так:

SELECT * FROM Artikls WHERE NOT(aNumb LIKE('@%'))

В исходном тексте отчета блок программируемого цикла с упорядочиванием по типу и артикулу будет выглядеть следующим образом:
~SQL1:УСТАНОВИТЬ:SELECT aTypM,aNumb,aName~
~SQL1:ДОБАВИТЬ:FROM Artikls~
~SQL1:ДОБАВИТЬ:WHERE NOT(aNumb LIKE('@%'))~
~SQL1:ДОБАВИТЬ:ORDER BY aTypM,aNumb~
~SQL1:НАЧАЛО~
. . .
~SQL1:КОНЕЦ~

Выбор группы печати в SQL цикле

У продвинутых пользователей при создании документооборота возникает практический вопрос: как указать группу материальных ценностей для программируемого SQLn цикла.

В предопределенном цикле 'Спецификация' это решается просто с помощью фильтра явного указания группы печати. Для программируемого SQLn цикла прямого поля для указания группы не существует, поэтому решается с помощью специальной команды:

~SQLn:Добавить:Группа_печати:Название_группы~
или с указанием параметра:
~SQLn:Добавить:Группа_печати:Параметр.AsText~

для исключение только одной группы печати:
~SQLn:Добавить:Группа_печати_не:Название_группы~.

Примеры

<!-- создаем диалоговое окно для выбора группы печати -->
~Форма.Создать~
~Форма.Заголовок=Выберите группу печати~
~Форма.Ширина=300~
~Форма.Высота=300~
~Форма.Вывод=Применить~

<!-- создаем компонент - таблицу данных -->
~Форма.Таблица.Создать~
~Форма.Таблица.Ширина=300~
~Форма.Таблица.Высота=300~
~Форма.Таблица.Сверху=0~
~Форма.Таблица.Слева=0~

~Форма.Таблица.Столбец.Добавить~
~Форма.Таблица.Столбец.Поле=gName~
~Форма.Таблица.Столбец.Ширина=266~
~Форма.Таблица.Столбец.Выровнять=Слева~
~Форма.Таблица.Столбец.Заголовок.Текст=Название группы~
~Форма.Таблица.Столбец.Заголовок.Выровнять=Центр~

<!-- выборка данных для отображения в таблице -->
~Форма.Таблица.SQL.Установить=SELECT gName FROM GrupPrn~
~Форма.Таблица.SQL.Добавить=ORDER BY gName~
~Форма.Таблица.SQL.Открыть~

<!-- рузультатом будет параметр gName.AsString с названием группы печати -->
~Форма.Таблица.Вывод=gName.AsString~

~Форма.Показать~ <!-- отображаем диалоговое окно -->
<!-- если была нажата кнопка 'Отменить', то прервать формирование отчета и закрыть окно предварительного просмотра -->

~IF:Применить<>0:THEN~
~Отчет:Закрыть~
~ENDIF~

Диалоговое окно имеет вид:



<!-- теперь формируем программируемый цикл SQL1 по спецификации проекта с указанием нужной группы печати -->
~SQL1:Установить:SELECT * FROM Artikls,SpecPAU WHERE~
~SQL1:Добавить:(pUnic=:Индекс1.AsInteger:)AND~
~SQL1:Добавить:(Artikls.aNumb=SpecPAU.aNumb)AND~
~SQL1:Добавить:Группа_печати:gName.AsText~
~SQL1:Добавить:ORDER BY aNumb~
~SQL1:Начало~
. . .
~SQL1:Конец~

Необходимо отметить, что команда установки группы печати в SQLn цикле ~SQL1:Добавить:Группа_печати:gName.AsText~ работает только с таблицей 'Artikls', которая должна быть обязательно указана в запросе при перечислении таблиц. В противном случае при формировании выходного отчета программа выдаст сообщение об ошибке.

<!-- аналогичный пример программируемого цикла SQL1 по спецификации проекта, но с указанием группы печати, которую нужно исключить -->

~SQL1:Установить:SELECT * FROM Artikls,SpecPAU WHERE~
~SQL1:Добавить:(pUnic=:Индекс1.AsInteger:)AND~
~SQL1:Добавить:(Artikls.aNumb=SpecPAU.aNumb)AND NOT~
~SQL1:Добавить:Группа_печати:gName.AsText~
~SQL1:Добавить:ORDER BY aNumb~
~SQL1:Начало~
. . .
~SQL1:Конец~

Иногда нужно вывести материальные ценности по двум или более группам печати в одном программируемом SQLn цикле. В этом случае применяется многострочное построение SQL запроса.

Примеры

<!-- программируемого цикла SQL1 по спецификации изделия, с указанием трех групп печати -->
~SQL1:Установить:SELECT * FROM Artikls,SpecPAU WHERE~
~SQL1:Добавить:(pUnic=:Индекс1.AsInteger:)AND~
~SQL1:Добавить:(oNumb=:Индекс2.AsInteger:)AND~
~SQL1:Добавить:(Artikls.aNumb=SpecPAU.aNumb)AND~
~SQL1:Добавить:(~
~SQL1:Добавить:Группа_печати:Сборка~
~SQL1:Добавить:OR~
~SQL1:Добавить:Группа_печати:Стекольная~
~SQL1:Добавить:OR~
~SQL1:Добавить:Группа_печати:Фурнитура~
~SQL1:Добавить:)~
~SQL1:Добавить:ORDER BY aNumb~
~SQL1:Начало~
. . .
~SQL1:Конец~

К СВЕДЕНИЮ
При использовании команд установки групп печати, пользователю нужно всегда помнить четыре важных момента:
  • При подстановке названия групп материальных ценностей явно, как в последнем примере, надо избегать частого изменения названия групп печати. Так как в каждом случае изменения названия группы печати пользователю придется проверять все отчеты, в которых было использовано это название.
  • В подстановке строкового параметра, содержащего название группы печати, обязательно использовать преобразование типа AsText (строка без кавычек). Распространенной ошибкой пользователя является применение преобразования типа AsString (строка с кавычками), что приводит к ошибке выполнения SQL запроса.
  • SQL с указанием команды установки группы печати выполняется на порядок медленнее, чем без нее. Поэтому в отчетах надо стараться избегать многократного и циклического выполнения таких SQL циклов.
  • При поставке отчетов своим дилерам, имеющим midi и maxi версии (с возможностью редакции тарифа и групп печати), необходимо провести соответствующий инструктаж с администраторами дилерских отделов.

Исключение из отчета не введенных контрагентов

При выводе статистических отчетов по проектам и контрагентам может возникнуть проблема включения данных по проектам, для которых не определен заказчик. Это может произойти по разным причинам: забыл пользователь, заказчик не успел сообщить - от какой фирмы он заключает договор и т.п.

Общей ошибкой пользователей является заблуждение в том, что не заполненные строковые поля в базе данных это пустая строка ''. В действительности это не так. Для любых типов полей в базе данных незаполненные поля имеют специальное значение NULL, в данном примере это ListPrj.kName char(64).

Проблема исключения проектов, для которых не указан заказчик, решается с помощью условия-проверки строкового поля на значения NULL:
SELECT * FROM ListPrj WHERE NOT(kName is NULL)

В исходном тексте отчета блок программируемого цикла с упорядочиванием по типу и артикулу будет выглядеть следующим образом:
~SQL2:УСТАНОВИТЬ:SELECT * FROM ListPrj~
~SQL2:ДОБАВИТЬ:WHERE NOT(kName is NULL)~
~SQL2:НАЧАЛО~
. . .
~SQL2:КОНЕЦ~

Для получения списка заказчиков по проектам без повторения необходимо применить оператор SQL DISTINCT:
SELECT DISTINCT kName FROM ListPrj WHERE NOT(kName is NULL)

Доступ к ценовым настройкам

В текущей версии программы в с помощью генератора отчетов можно получить любую информацию, хранящуюся в базе данных.
При создании отчетов-программ (например формирования альтернативного отчета по ценообразованию проекта) необходимо получить данные из таблицы расчетных данных - SysData с условием выбора по идентификатору.

Идентификатор представляет собой целое число, определенное в поле 'sUnic' таблицы 'SysData', и которое сопоставлено в программе с конкретной величиной. Список идентификаторов с описанием и значениями можно посмотреть в SQL программаторе, открыв таблицу SysData, но в качестве практического примера ниже приведен исходный код в генераторе отчетов.

Для получения данных по расчетным данным применяется цикл:
~SQL1:УСТАНОВИТЬ:SELECT sFlot,sText FROM SysData~
~SQL1:ДОБАВИТЬ:WHERE sUnic=Идентификатор~
~SQL1:НАЧАЛО~
. . .
~SQL1:sFlot:AsFloat:Числовой_параметр~
~SQL1:sText:AsString:Строковый_параметр~
. . .
~SQL1:КОНЕЦ~

Примеры

<!-- пример исходного текста макроса для вывода всех ценовых настроек -->
<TABLE style="border-collapse: collapse; font-size:11px; font-family:Arial;" bgColor=#FFFFFF cellpadding=2 spacepadding=2 border=1 borderColor=#0>

<TR>
<TD bgColor=#CCCCCC align=center>Иденти-фикатор</TD>
<TD bgColor=#CCCCCC align=center>Название</TD>
<TD bgColor=#CCCCCC align=center>Числовое значение</TD>
<TD bgColor=#CCCCCC align=center>Строковое значение</TD>
</TR>

<!-- выборка данных из таблицы SysData может иметь два возможных условия:
(sUnic>1000)AND(sUnic<2000) - графические настройки
(sUnic>2000)AND(sUnic<3000) - ценовые настройки -->


<!-- в данном примере формируем запрос по выборке ценовых настроек -->
~SQL1:УСТАНОВИТЬ:SELECT sUnic,sName,sFlot,sText FROM SysData~
~SQL1:ДОБАВИТЬ:WHERE (sUnic>2000)AND(sUnic<3000)~
~SQL1:ДОБАВИТЬ:ORDER BY sUnic~
~SQL1:НАЧАЛО~

<TR>
<TD align=center>~SQL1:sUnic:AsInteger~</TD>
<TD align=left>~SQL1:sName:AsString~</TD>
<TD align=right>~SQL1:sFlot:AsFloat~</TD>
<TD align=center>~SQL1:sText:AsString~</TD>
</TR>

~SQL1:КОНЕЦ~

</TABLE>

Выходной отчет будет иметь примерный вид:

ИдентификаторНазваниеЧисловое значениеСтроковое значение
2001Стоимость ч/ч на производстве0,00~
2002Коэффициент рентабельности производства1,00~
2003Коэффициент наценки на материал2,00~
2004Коэффициент наценки на заполнения1,00~
2005Коэффициент раскроя профилей1,00~
2006Начало рабочего дня8,00~
2007Учитывать норму отхода в себестоимости1,00~
2008Общий кант для хлыстов, мм50,00~
2009Минимальная торговая наценка , %0,00~
2010Припуск для реза, мм4,00~
2011Налог на добавленную стоимость18,00~
2012Не рассчитывать штапики на сторонах20,00~
2013Проверять минимальный радиус гиба профилей1,00~
2014Сохранять маршрут вычислений1,00~
2015Спецификация профилей и пакетов для сборки1,00~
2016Проверять цену проекта на прибыль0,00~
2017Расчет сторон фурнитуры с учетом фальца1,00~
2018Расчет трудозатрат для фурнитуры0,00~
2019Проверять толщины заполнений для стоек1,00~
2020Тип расчета проекта по умолчанию3,00~
2021Учитывать нормы отходов по умолчанию0,00~
2022Использовать дополнительно0,00~
2023Коммерческая наценка1,00~
2024Коэффициент рентабельности комплектации проекта1,00~
2025Коэффициент рентабельности комплектации изделий1,00~
2026Анализ угловой деформации контуров пакетов1,00~
2027Разрешить подбор зеркальных вариантов соединений0,00~
2028Общая скидка проекта распространяется на работы0,00~
2029Общая скидка проекта распространяется на трудозатраты0,00~


Следовательно, для получения параметра со значением коммерческой наценки (идентификатор=2023) можно использовать следующий код:
~SQL1:УСТАНОВИТЬ:SELECT sFlot FROM SysData WHERE sUnic=2023~
~SQL1:НАЧАЛО~
~SQL1:sFlot:AsFloat:Коммерческая_наценка~
~SQL1:КОНЕЦ~

Готовый блок для выбора периода

При создании статистических отчетов с указанием периода и других опций полезно создать готовый блок для включения его в отчеты:

<!-- создаем диалоговое окно с размером клиентской части 220*180 -->
~Форма.Создать~
~Форма.Заголовок=Ввод данных~
~Форма.Ширина=220~
~Форма.Высота=180~
~Форма.Вывод=Применить ~


~Форма.Надпись.Создать~
~Форма.Надпись.Текст=Начало периода~
~Форма.Надпись.Сверху=12~
~Форма.Надпись.Слева=10~
~Форма.Надпись.Ширина=100~

<!-- календарь для сохранения результата создаем параметр ДАТА1.AsDate -->
~Форма.Календарь.Создать~
~Форма.Календарь.Сверху=8~
~Форма.Календарь.Слева=110~
~Форма.Календарь.Ширина=100~
~Форма.Календарь.Вывод=ДАТА1~

~Форма.Надпись.Создать~
~Форма.Надпись.Текст=Конец периода~
~Форма.Надпись.Сверху=42~
~Форма.Надпись.Слева=10~
~Форма.Надпись.Ширина=100~

<!-- календарь для сохранения результата создаем параметр ДАТА2.AsDate -->
~Форма.Календарь.Создать~
~Форма.Календарь.Сверху=38~
~Форма.Календарь.Слева=110~
~Форма.Календарь.Ширина=100~
~Форма.Календарь.Вывод=ДАТА2~

<!-- список-переключатель опций, для сохранения результата создаем параметр ОПЦИЯ.AsString -->
~Форма.Список.Переключатель.Создать~
~Форма.Список.Переключатель.Текст=Включить проекты~
~Форма.Список.Переключатель.Сверху=70~
~Форма.Список.Переключатель.Слева=10~
~Форма.Список.Переключатель.Ширина=200~
~Форма.Список.Переключатель.Высота=100~
~Форма.Список.Переключатель.Вывод=ОПЦИЯ~
~Форма.Список.Переключатель.Очистить~
~Форма.Список.Переключатель.Добавить=На стадии оформления~
~Форма.Список.Переключатель.Добавить=Отправленные в производство~
~Форма.Список.Переключатель.Добавить=Завершенные~

~Форма.Показать~ <!-- отображаем диалоговое окно -->

<!-- если нажата кнопка 'Отменить', то прервать создание отчета и закрыть окно предварительного просмотра -->
~IF:Применить<>0:THEN~
~Отчет:Закрыть~
~ENDIF~

Диалоговое окно имеет вид:



Этот блок входит в состав поставки 'Reports/ФОРМА/Период.txt' последних версий. После создания в генераторе отчетов на его основе отдельного макроса (для примера назовем макрос 'Период') возможно включение этого блока в состав статистических отчетов по проектам.

Примеры

<!-- отчет по оценке прибыли по завершенным проектам с выбором периода с приведением к основной валюте -->

~Отчет:Загрузить_из_отчета:Период~ <!-- загружаем блок выбора опций -->

<P style="font-size:12px; text-align:center; color:#0; font-weight: bold;">
Отчет по прибыли за период с ~AsDate:ДАТА1~ по ~AsDate:ДАТА2~<br>

проекты

~IFS:ОПЦИЯ=На стадии оформления:THEN~ на стадии оформления
~ENDIF~

~IFS:ОПЦИЯ=Отправленные в производство:THEN~ в производстве
~ENDIF~
~IFS:ОПЦИЯ=Завершенные:THEN~ завершены
~ENDIF~

</P>

~SQL1:Установить:SELECT cShor FROM Correnc WHERE cSets<>0~
~SQL1:Начало~
~SQL1:cShor:AsString:ОснВалюта~ <!-- обозначение основной валюты -->
~SQL1:Конец~

~Точность:2:2:",":"_"~ <!-- устанавливаем точность и формат: AsFloat -->

<TABLE style="border-collapse: collapse; color:#0; font-weight: none;">
<TR>
<TD bgColor=#cccccc align=center>Заказ №</TD>
<TD bgColor=#cccccc align=center>Заказчик</TD>
<TD bgColor=#cccccc align=center>Дата</TD>
<TD bgColor=#cccccc align=center>Себест.,<br>~AsString:ОснВалюта~</TD>
<TD bgColor=#cccccc align=center>Стоим.,<br>~AsString:ОснВалюта~</TD>
<TD bgColor=#cccccc align=center>Оплата,<br>~AsString:ОснВалюта~</TD>
</TR>

~AsFloat:Себестоимость=0~ <!-- параметры для суммирования столбцов -->
~AsFloat:Стоимость=0~
~AsFloat:Оплачено=0~

~SQL1:Установить:SELECT * FROM ListPrj WHERE~
~SQL1:Добавить: (pDate>=:ДАТА1.AsDate:)AND(pDate<=:ДАТА2.AsDate:)~

~IFS:ОПЦИЯ=На стадии оформления:THEN~
~SQL1:Добавить:AND(pWork=0):~
~ENDIF~

~IFS:ОПЦИЯ=Отправленные в производство:THEN~
~SQL1:Добавить:AND(pWork=1):~
~ENDIF~

~IFS:ОПЦИЯ=Завершенные:THEN~
~SQL1:Добавить:AND(pWork=2):~
~ENDIF~

~SQL1:Добавить:ORDER BY zNumb~
~SQL1:НАЧАЛО~
<TR>
<TD align=left>~SQL1:zNumb:AsString~</TD>
<TD align=left>~SQL1:kName:AsString~</TD>
<TD align=center>~SQL1:pDate:AsDate~</TD>
<TD align=right>~SQL1:pSebe:AsFloat~</TD>
<TD align=right>~SQL1:pPrcD:AsFloat~</TD>
<TD align=right>~SQL1:mSumm:AsFloat~</TD>
</TR>

~AsFloat:Себестоимость=Себестоимость+SQL1pSebe~
~AsFloat:Стоимость=Стоимость+SQL1pPrcD~
~AsFloat:Оплачено=Оплачено+SQL1mSumm~
~SQL1:КОНЕЦ~

<TR style="font-weight: bold">
<TD colspan=3> </TD>
<TD valign=top align=right>~AsFloat:Себестоимость~</TD>
<TD valign=top align=right>~AsFloat:Стоимость~</TD>
<TD valign=top align=right>~AsFloat:Оплачено~</TD>
</TR>

~AsFloat:ПланПрибыль=Стоимость-Себестоимость~
~AsFloat:Пол_Прибыль=Оплачено-Себестоимость~

<TR>
<TD align=left colspan=2>Плановая прибыль, ~AsString:ОснВалюта~</TD>
<TD align=right><b>~AsFloat:ПланПрибыль~</b></TD>
<TR>
<TD align=left colspan=2>Полученная прибыль, ~AsString:ОснВалюта~</TD>
<TD align=right><b>~AsFloat:Пол_Прибыль~</b></TD>
</TABLE>

Выходной отчет будет иметь примерный вид:

Отчет по прибыли за период с 01.11.05 по 03.11.05
проекты завершенные


Заказ №ЗаказчикДатаСебест., $Стоим., $Оплата, $
17Иванов01.11.05345,00504,00504,00
19Петров03.11.05931,201 098,671 000,00
1276,201 602,671 504,00
Плановая прибыль, $326,47
Полученная прибыль, $227,80

Создание отчета по группе проектов

Общей ошибкой пользователей при создании отчетов по группе проектов является попытка простой замены формы вызова отчета с 'Проект' на 'Проекты'. Этого не достаточно. Дело в том, что любой предопределенный цикл по проекту (Изделия, Спецификация и т.д.) получает в первую очередь не индексы, а массив указателей проектов. В случае, когда выделен один проект, массив указателей не заполнятся (пустой) и циклы получают индексы проекта и изделия: Индекс1.AsInteger и Индекс2.AsInteger.

Для цикла 'Спецификация' второй индекс имеет дополнительный смысл: если Индекс2 равен нулю, значит цикл будет по спецификации всего проекта (всех изделий проекта).

Массив указателей на проекты автоматически создается в случае выделения пользователем нескольких проектов, но его можно создать программно на основе программируемого цикла SQLn по таблице проектов ListPrj с выборкой поля-индекса проекта pUnic:
~SQLn:УСТАНОВИТЬ:SELECT pUnic FROM ListPrj WHERE …~
~SQLn:ВЫБОР.ПРОЕКТЫ~

После команды создания массива указателей на проекты предопределенный цикл 'Спецификация' будет производить выборку данных (спецификацию) по группе проектов, причем вычисляемые поля по общему погонажу для каждого комплектующего (артикул+текстура) будут рассчитываться по нескольким проектам.

Примеры

<!-- блок для создания отчета с суммирование количества (общего погонажа) по каждому артикулу по нескольким проектам, для примера отправленным в производство (pWork=1) -->
~SQL1:УСТАНОВИТЬ:SELECT pUnic FROM ListPrj WHERE pWork=1~
~SQL1:ВЫБОР.ПРОЕКТЫ~

<TABLE style="border-collapse: collapse; color:#0; font-weight: none;">
~Спецификация:ЗАПРОС:Погонаж~
~Спецификация:НАЧАЛО~
<TR>
<TD>~Спецификация:Артикул~</TD>
<TD>~Спецификация:Название~</TD>
<TD>~Спецификация:Основная_текстура~</TD>
<TD>~Спецификация:ОБЩИЙ_ПОГОНАЖ~</TD>
<TD>~Спецификация:Ед.Изм.~</TD>
</TR>
~Спецификация:КОНЕЦ~

</TABLE>

Разделение светопрозрачных и роллетных конструкций

При использовании модуля роллетных конструкций возникает необходимость разделения светопрозрачных и роллетных изделий.
Как правило, это разделение обусловлено тем, что производством окон и роллет занимаются разные цеха производства и разные бригады.

Заголовки роллетных конструкций сохранятся в той же таблице, что и оконные изделия - ListOrd. Поле oSysP является ссылкой на систему профилей для светопрозрачных изделий, или равно `-1` для роллетных.

Примеры

<!-- вывод светопрозрачных конструкций по проекту c коэффициентом рентабельности подсистемы профилей -->
<TABLE style="border-collapse: collapse; color:#0; font-weight: none;">
<TR>
<TD bgColor=#CCCCCC align=center>Номер</TD>
<TD bgColor=#CCCCCC align=center>Название</TD>
<TD bgColor=#CCCCCC align=center>Коэфф. рентабельности системы</TD>
</TR>

~SQL1:Установить:SELECT oNumb,oName,Koef~
~SQL1:Добавить:FROM ListOrd,SysProf~
~SQL1:Добавить:WHERE (ListOrd.pUnic=:Индекс1.AsInteger:)AND~
~SQL1:Добавить:(ListOrd.oSysP=SysProf.nUni)~
~SQL1:Добавить:ORDER BY oNumb~
~SQL1:Начало~
<TR>
<TD align=center>~SQL1:oNumb:AsInteger~</TD>
<TD align=center >~SQL1:oName:AsString~</TD>
<TD align=center >~SQL1:Koef:AsFloat~</TD>
</TR>
~SQL1:Конец~

</TABLE>

<!-- вывод роллетных конструкций по проекту -->
~SQL1:Установить:SELECT * FROM ListOrd WHERE~
~SQL1:Добавить:(pUnic=:Индекс1.AsInteger:)AND(oSysP=-1)~
~SQL1:Добавить:ORDER BY oNumb~
~SQL1:Начало~
. . .
~SQL1:Конец~


Разбиение отчета на страницы при печати

Стандарт HTML не предоставляет прямой команды разбиения страницы при печати. Но в Internet Explorer'е версии 6 и выше имеется возможность решить эту проблему с помощью следующей конструкции:

<br style="page-break-before: always">


Примеры

<!-- пример разбиения страниц в отчете, содержащем 2 эскиза изделия на первой странице и по 3 на всех последующих -->



<!-- начинаем счетчик эскизов с 1, так как на первом листе 2 изделия -->
~AsInteger:Счетчик=1~

~ИЗДЕЛИЯ:начало~
. . .
~AsInteger:Счетчик=Счетчик+1~

~AsInteger:Остаток=Счетчик-3*TRUNC(Счетчик/3)~

<!-- делаем разрыв, если остаток от деления на 3 равен нулю -->
~IF:Остаток=0:THEN~
<br style="page-break-before: always">
~ENDIF~

~ИЗДЕЛИЯ:конец~

Установка точек прерываний

В заключение рассмотрим возможность установки контрольных точек в исходном тексте отчета.
К сожалению, стандарт html и возможности Internet Explorer'a не предоставляют каких-либо средств по отладке отчетов во времени их формирования и выполнения. Поэтому разработчики программы ввели специальную команду: ~ДИАЛОГ:строка1:<br>:строка2~.

Эта команда является по сути своей точкой остановки метода формирования отчета и показа пользователю диалогового информационного окна с запросом о прекращении формирования отчета. Строки сообщения пользователь может формировать выводить по своему усмотрению. Обычно в тексте сообщения показывают значения вычисляемых параметров отчета. Подстрока '<br>' служит для переноса текста на новую строку.

Примеры

<!-- вывод информационного окна со значениями параметров -->
. . .
~AsFloat:Количество=57~ ~AsFloat:Сумма=865,94~
. . .
~ДИАЛОГ:Количество=:Количество.AsFloat:<br>:Сумма=:Сумма.AsFloat~
. . .

При формировании отчета программа выведет окно:



Просмотр параметров отчета

Дополнительно имеется команда вывода информационного окна со списком всех определенных в отчете параметров и их значений: ~ПАРАМЕТРЫ~.

К сведению
Эта команда полезна для того, чтобы посмотреть, какие параметры передаются в отчеты при их вызове из разных окон программы в текущей под'версии. После успешного тестирования отчета не забудьте удалить команды установки контрольных точек прерываний и просмотра параметров из исходного текста.