![]() |
|
Отдел технической поддержки дата обновления 07.08.2024 |
|
"Практикум"При создании документооборота на предприятии возникают проблемы, связанные с не согласованностью различных подразделений этого предприятия:
Этот подраздел призван разъяснить некоторые часто встречающиеся моменты и вопросы пользователей при создании отчетов и документооборота. Этапы создания отчетаПроцесс создания отчета с точки зрения пользователя можно понимать как прохождение трех основных этапов:
Первый этап - самый главный и сложный. Он предполагает наличие в базе данных тех сохраненных данных, которые потребуются для выборки. В противном случае в отчет не попадет требуемая информация. ПримерыПользователь создал отчет вывода рамок москитной сетки с указанием фильтра 'Профиль_в_составе_М/С': (aTypM=1)and(aTypP=20), а в отчет они не попадают, хотя имеются в общей спецификации изделия.При детальном анализе ошибок в отчете не обнаружили. Оказалось, что для рамок в материальных ценностях стоит подтип 'дополнительный профиль'. Пользователь пытается вывести в отчет профили армирования, в привязке к конкретному профилю, но выводится одна строка с общим количеством. В предопределенном отчете по групповому раскрою профилей не заполняется столбец 'часть' - положение профиля [верх, низ., левый, прав., верт., гориз.]. Снова отчет тут не причем - проблема в том, что в расчетных данных не был установлен флаг 'Спецификация профилей и пакетов для сборки'. ВАЖНО Перед тем, как создавать отчет, необходимо согласовать техническое задание на отчет с технологом предприятия и с финансовой службой, так как возможно сначала потребуется весьма существенное изменение технологических и ценовых настроек ! Сборка профилей и пакетовВ расчетных данных есть очень важный флаг: 'Спецификация профилей и пакетов для сборки'. От установки этого флага зависит - насколько подробную информацию будет содержать таблица спецификации изделий SpecPAU.При выключенном флаге спецификация изделия сохраняется в 'экономичном режиме'. Однотипные одноразмерные позиции складываются в одну. По сравнению с 'подробным' режимом, объем сохраняемых данных по изделию примерно в 3 раза меньше. Этот режим используется, если нужна простая спецификация - список комплектующих изделия/проекта. При включенном флаге происходит 'подробное' сохранение спецификации. Сохраняется номер элемента, ориентация, привязка к составам. Становится возможным вывести в отчет - какой винтик входит в состав конкретного профиля, какое стекло в составе стеклопакета. Этот режим используется для формирования подробных сборочных спецификаций с выводом привязок типа профиль-армирование, стеклопакет-стекло, стеклопакет-раскладка. ПримерыПредставим себе глухую квадратную коробку с размерами 1000х1000 мм, и рассмотрим только профиль коробки с армированием.При выключенном флаге 'Спецификация профилей и пакетов для сборки' в таблице SpecPAU сохранится одна запись профиля и одна - армирования:
При включенном флаге 'Спецификация профилей и пакетов для сборки' в таблице SpecPAU сохранится 4 записи профиля и 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:Конец~ К СВЕДЕНИЮ При использовании команд установки групп печати, пользователю нужно всегда помнить четыре важных момента:
Исключение из отчета не введенных контрагентовПри выводе статистических отчетов по проектам и контрагентам может возникнуть проблема включения данных по проектам, для которых не определен заказчик. Это может произойти по разным причинам: забыл пользователь, заказчик не успел сообщить - от какой фирмы он заключает договор и т.п.Общей ошибкой пользователей является заблуждение в том, что не заполненные строковые поля в базе данных это пустая строка ''. В действительности это не так. Для любых типов полей в базе данных незаполненные поля имеют специальное значение 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> Выходной отчет будет иметь примерный вид:
Следовательно, для получения параметра со значением коммерческой наценки (идентификатор=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 проекты завершенные
Создание отчета по группе проектовОбщей ошибкой пользователей при создании отчетов по группе проектов является попытка простой замены формы вызова отчета с 'Проект' на 'Проекты'. Этого не достаточно. Дело в том, что любой предопределенный цикл по проекту (Изделия, Спецификация и т.д.) получает в первую очередь не индексы, а массив указателей проектов. В случае, когда выделен один проект, массив указателей не заполнятся (пустой) и циклы получают индексы проекта и изделия: Индекс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~ . . . При формировании отчета программа выведет окно: ![]() Просмотр параметров отчетаДополнительно имеется команда вывода информационного окна со списком всех определенных в отчете параметров и их значений: ~ПАРАМЕТРЫ~.К сведению Эта команда полезна для того, чтобы посмотреть, какие параметры передаются в отчеты при их вызове из разных окон программы в текущей под'версии. После успешного тестирования отчета не забудьте удалить команды установки контрольных точек прерываний и просмотра параметров из исходного текста. |