Расчёт заказа на изготовление изделия

Vladimir

Администратор
Команда форума
Проект для "Арт Фасад" (фабрика мебельных дверей).
Начальные требования:
1. Расчет заказа на базе нескольких моделей деталей с разной стоимостью. Справочник деталей с отделкой для каждой модели прилагается. При добавлении детали указываются: вид модели, вид отделки, исполнение. Номенклатура из справочника может учитываться как поштучно, так и за квадратный метр, при этом надо указать размеры детали.
2. Формирование печатной формы заказа.

Элементы программы:
- список клиентов;
- список лакокрасочных материалов;
- списки моделей и видов отделки;
- справочник номенклатуры;
- форма заказов.

1. Справочники клиентов, ЛК материалов, моделей и видов отделки
Создаётся объект "Заказчики" и задаётся первое поле в объекте "Наименование" (путём перетаскивания типа поля "строка" в список записей или двойным кликом). Также можно задать сортировку будущего списка записей в свойстве объекта "Сортировка" по этому полю (по умолчанию - по возрастанию):
1. Создание объекта.png 2. Задание имени объекта и добавление первого поля.png

Таким же образом создаётся объект ЛК материалов. Но так как доступ к нему будет достаточно редкий, есть смысл поместить его в группу "Справочники". При задании свойства объекта "Группа", в левом меню проекта будет добавлена кнопка группы "Справочники", которая открывает список всех объектов, помещённых в одноимённую группу:
3. Добавление объекта в группу.png 4. Группа объектов в меню проекта.png

Аналогично создаются справочники моделей и видов отделки, которые также помещаются в группу справочников.

После открытия справочников в левом меню проекта их можно заполнить: вручную или через импорт данных из файла формата .csv, что особенно необходимо, если базу данных требуется заполнить большим объёмом информации из сторонних источников. Напомню, что данные в формате .csv можно создать при помощи офисных приложений MS Excel, LO/OO Calc и др.
Подробнее тут: Импорт данных из файла .csv

2. Справочник номенклатуры
Должен включать в себя ссылки на объекты моделей и отделки, название, цену и тип детали: учитывать в заказе поштучно или в квадратных метрах.
В новый объект "Номенклатура" добавляются поля:
- тип Строка с именем "Название";
- тип Число: имя - "Цена", знаков после запятой - 2, суффикс - "руб.";
- тип Переключатель: имя - "Тип", значения - "м2, шт", стиль - "рисунки" (позже добавим иконки для стиля рисунков);
- тип Объект: имя - "Модель", источник - объект "Модель";
- тип Объект: имя - "Отделка", источник - объект "Отделка".
Примечание: когда для вновь добавленного поля объекта выбирается источник, то полю присваивается имя этого источника. Если имя отличается от стандартного ("Объект"), то оно уже не меняется.

Для всех полей свойству "Отображать" устанавливается свойство "список и вкладка" - это значит, что все поля будут отображаться в списке записей.

В свойствах сортировки указываются "Модель" и "Отделка" - это значит, что список сначала сортируется по моделям, а они в свою очередь - по типам отделки.
5. Создание справочника номенклатуры.png

Так как для переключателя "Тип" был выбран стиль иконок (отображение в списке записей не вариантов переключателя, а соответствующих иконок), необходимо поместить одноимённые иконки в ресурсы проекта. Для этого открывается форма ресурсов и в ней добавляются иконки с одноимённым названием (расширение .png или .jpg):
7. Иконки в ресурсах проекта.png

Примечание: в меню "Конструктор"-"Встроенные объекты" можно добавить иконки из списка предопределённых в программе.

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

3. Форма заказов
Создание формы состоит из трёх этапов:
1) создание объекта заказов, который будет базовым;
2) создание объекта списка состава заказа, который будет дочерним к базовому объекту заказов;
3) создание формы связи, которая объединит эти два объекта.

Объект заказов будет содержать в себе следующие данные:
- число "№": для автонумерации свойству "Исходное" устанавливается "макс.+1";
- ссылка на объект "Заказчики": меняется имя на "Заказчик";
- дата "Дата";
- дата "Дата окончания": свойство "Вид" меняется на "строка" - это позволит оставлять пустое значение;
- надпись "Если модели и эффекты в составе заказа отличаются, то тут не заполнять": предупреждает о том, что если в составе заказов изделия будут для разных моделей, то заполнять поля модели и отделки не надо. Если же их задать в родительском объекте формы, то они будут автоматически подставляться в каждую добавляемую запись состава заказа;
- ссылка на объект "Модель";
- ссылка на объект "Отделка";
- ссылка на объект "ЛК материал": меняется имя на "Вид ЛКМ";
- число "Скидка": задаётся суффикс "%" (будет копироваться в создаваемые записи дочернего списка изделий в составе заказа);
- число "Площадь": задаётся 3 знака после запятой и суффикс "м2" - данному полю потом будет задано суммирование из дочернего списка состава заказа;
- число "Стоимость": задаётся 2 знака после запятой и суффикс "руб." - для него также будет производится суммирование из состава заказа;
- число "Со скидкой": аналог стоимости, но для расчёта со скидкой;
- группа "продукт": задаётся цвет, которым будут выделены поля надписи, "Модель" и "Отделка" для лучшего визуального восприятия данной информации.
Созданное поле группы задаётся в свойстве "Группа". Поле группы располагается в конце списка свойств каждого поля.

Сортировка в объекте задаётся по полю "№" в обратном порядке - чтобы последний заказ был в начале списка (свойство сортировки в объекте используется в форме, созданной на его базе).
Свойство "В меню" переводится в "скрыть" - так как на базе данного объекта будет создана форма, то нет необходимости делать его доступным из меню проекта.
9. Объект заказов.png

Создаём объект, который будет служит в качестве дочернего списка состава заказа. Первое поле: поле ссылки на объект "Модель".
В данном объекте нам понадобится поле ссылки на родительский объект, которое будет автоматически создано в форме при добавлении дочернего списка.
Сохраняем объект и создаём форму связи на базе объекта "Заказ".
10. Создание формы связи.png 11. Форма связи на базе выбранного объекта.png
При выборе объекта в имя формы (если не было изменено исходное) подставляется имя объекта и при этом добавляется префикс "_". Имя меняется на "Заказы", а префикс можно удалить.
В форме связи, в левом списке, отображаются поля базового объекта, которые можно добавить в список записей формы. Кроме того, для некоторых типов полей можно задать дополнительные свойства или переопределить существующие.
Добавляем в список следующие поля и задаём дополнительные свойства:
- "№";
- "Заказчик": задаётся фильтр установкой свойства "В фильтре" в значение "внизу" - фильтр по этому полю будет располагаться под списком записей;
- "Дата";
- "Площадь": потом будет задано суммирование по рассчитываемой площади;
- "Стоимость": также будет задано суммирование по стоимости;
- "Со скидкой": будет суммирование по стоимости со скидкой.
12. Форма связи с установленными полями для отображения в списке.png
Обратите внимание, что после сохранения формы и её повторного изменения - изменить базовый объект уже нельзя.

При выбранной форме в списке - переходим на вкладку "Дочерние списки" и добавляем объект "Состав заказа". Если имя для дочернего списка не было задано, то для него подставится имя дочернего объекта, которое потом можно изменить. Свойства "Связь" (подчинённая") и "Управление" ("разрешено") - не меняются.
13. Добавление дочернего списка в форму связи.png
При добавлении дочернего объекта в форме связи, в этом объекте добавляется системное поле ссылки на базовый объект формы связи. Данное поле ссылки полностью аналогично пользовательскому, но служит программе для определения, какое поле использовать при выборке данных при работе в форме. По умолчанию для поля ссылки свойство "Отображать" устанавливается в "скрытый", а в префикс добавляется тильда (~). Также поле отображается серым цветом с курсивом.
14. Системное поле ссылки на объект для формы связи.png

Теперь можно продолжить настройку дочернего списка.

Полю "Модель" для свойства "Копия из" задаётся значение "[~Заказ.Модель.Название]". Это значит, что при создании записи в дочернем списке, для поля будут браться данные из объекта "~Заказ", поле "Модель". Так как данное поле также является ссылкой на объект, то необходимо прописать более глубокое вложение, указывающее откуда брать данные - это поле "Название" объекта "Модель".
Примечание: если используется ещё более глубокое вложение, то для получения данных необходимо указывать всю цепочку ссылок: [1 объект.2 объект.3 объект.поле 3-го объекта].

Добавляются следующие поля:
- поле ссылки "Отделка": свойству "Копия из" задаётся "[~Заказ.Отделка.Название]" - для получения из родительского объекта вида отделки;
- поле ссылки "Исполнение" на объект "Номенклатура";
- число "Кол-во": исходное значение задаётся в "1" (чтобы не менять в случае, когда задаётся одна деталь), суффикс: "шт.";
- переключатель "Тип": значения "м2, шт", свойству "Копия из" задаётся "[Исполнение.Тип]" - это значит, что тип изделия будет браться из справочника номенклатуры (это будет нужно для формул расчёта);
- числовые поля "Высота" и "Ширина": суффикс "мм", а для ширины можно задать свойству "Новая строка" - нет, чтобы оба поля располагались на одной строке;
- число "цена из справочника": 2 знака после запятой, а свойству "Копия из" - значение "[Исполнение.Цена]" (чтобы получать значение цены из справочника);
- поле расчёта "Цена": 2 знака после запятой, суффикс "руб." в формуле указывается "[цена из справочника]" (в дальнейшем поле "цена из справочника" будет скрываться, и останется лишь расчётное поле цены, которое не может редактироваться);
- число "скидка из заказа": для "Копия из" задаётся "[~Заказ.Скидка]" - получение скидки из базового объекта заказа;
- расчёт "Скидка": суффикс "%" и копируется значение из числа "[скидка из заказа]" (число будет скрываться, а расчёт останется);
- расчёт "расчёт площади": 3 знака после запятой и формула расчёта: "[Высота]*[Ширина]/1000000";
- поле условия "м2": при условии "[Тип]=м2" полю "[Площадь]" присваивается значение поля "[расчёт площади]";
- поле условия "шт": при условии "[Тип]=шт" полю "[Площадь]" присваивается значение "1" (это надо, чтобы при умножении на цену из справочника, при незаданных размерах - сохранилась цена за штуку);
- число "Площадь": 3 знака после запятой, суффикс "м2";
- расчёт "Стоимость": 2 знака после запятой, суффикс "руб.", формула "[Площадь]*[Цена]*[Кол-во]";
- расчёт "Со скидкой": 2 знака после запятой, суффикс "руб.", формула "[Стоимость]*(1-[Скидка]/100)";
- строка "Примечание";
- группа "размеры": задаётся цвет, свойству "скрытие" - значение "[Исполнение.Тип]!=м2" (поля этой группы будут скрываться, если деталь не выбрана или не штучная), задаётся полям "Высота" и "Ширина".

Полям, которые надо показать в списке, свойству "Отображать" задаётся "список и вкладка": "Модель", "Отделка", "Исполнение", "Кол-во", "Высота", "Ширина", "Цена", "Скидка", "Стоимость", "Со скидкой", "Примечание".

Поля, которые не требуются для отображения в детализации, можно убрать. В режиме предварительной отладки - например на 2-ую вкладку (свойству "Вкладка" задаётся значение "2"), а по окончанию разработки проекта - на 8-ую вкладку. Хитрость в том, что 8-ая вкладка при редактировании дочерней записи списка в форме связи - никогда не отображается в детализации.
Убираются поля: "Тип", "цена из справочника", "скидка из заказа", "расчёт площади", "Площадь".
Сортировка в объекте не задаётся, чтобы в списке записи располагались в той же последовательности, как они и были добавлены.
Объект убирается из меню (свойство "В меню" - "скрыть").
15. Объект состава заказа.png

Теперь возвращаемся к форме "Заказы".
- поле "Площадь": в списке можно скрыть, свойству "Сумма по" задаётся объект "Состав заказа", а полю - "расчёт площади";
- поле "Стоимость": из списка скрываем, свойству "Сумма по" задаётся объект "Состав заказа"."Стоимость";
- поле "Со скидкой": суммирование по "Состав заказа"."Со скидкой".
16. Завершение настройки формы заказов.png

Теперь необходимо настроить связи при выборе детали в объекте "Состав заказа" для поля "Исполнение". При открытии данного объекта необходимо, чтобы в общем списке справочника номенклатуры остались только те записи, которые соответствуют заданным полям "Модель" и "Отделка".
Для этого в объекте "Состав заказа" задаются передаваемые параметры:
- для поля "Модель": свойству "Передаваемый" указывается значение "модель" (можно любое имя, но лучше, чтобы было понятно, что передаётся);
- для поля "Отделка": свойству "Передаваемый" указывается значение "отделка".
18. Задание передаваемого параметра.png

В объекте "Номенклатура" включаются фильтры и задаются принимающие параметры (должны абсолютно точно совпадать с передаваемыми, с учётом регистра):
- для поля "Модель": включается фильтр в значение "внизу" (или "на вкладке" - при индивидуальной работе можно увидеть этот фильтр на второй вкладке за списком, а при сетевой многопользовательской работе - можно полностью скрыть этот фильтр от переназначения), а активированному свойству "Принимаемый" указывается значение "модель";
- для поля "Модель": включается фильтр и активированному свойству "Принимаемый" указывается значение "отделка".
19. Задание принимаемого параметра.png

На этом работа со структурой проекта завершена.

Переходим к тестированию и заполнению данных.
В форме заказов создаём запись. В ней можно выбрать клиента (если не существует - сразу создать), дата устанавливается текущей, дата завершения остаётся пустой, выбирается модель, тип отделки, вид ЛКМ и задаётся скидка. Поля "Площадь", "Стоимость" и "Со скидкой" недоступны к редактированию, так как получают данные из дочернего списка состава заказа.
17. Заполнение данных по заказу.png
При добавлении записи в состав заказа, если в заказе были заданы модель и отделка, они будут автоматически установлены в детали состава заказа - их можно изменить на другие. При выборе "Исполнение" - откроется справочник номенклатуры с установленными фильтрами по модели и отделке. После выбора нужного значения, в зависимости от типа детали (расчёт по метражу или поштучно) - будут активированы поля ширины и высоты для заполнения.
20. Добавление записи в состав заказа.png

Создание печатной формы для заказа.
Для формы связи "Заказы" создаётся шаблон MS Word.
21. Шаблон документа MS Word.png
Подробнее о создании шаблонов документов: Как создать шаблон документа в MS Word?

Для выбранной записи создаём документ.
22. Создание документа на основе данных заказа.png 23. Печатная форма документа заказа.png

Пример проекта в приложении.
 

Вложения

Сверху Снизу