1.1. Программное обеспечение подсистемы “Производство” корпоративной компьютерной системы “Русский Сахар” разработано собственным коллективом программистов на Visual FoxPro 5.0. Внимательное изучение Российского опыта (в т.ч. и опыта реальной работы с ведущими зарубежными системами SAP R/3, SunSystems, Scala, Platinum) показало, что стандартных решений, которые мы могли бы прямо использовать у себя, нет. Комплексная настройка такой системы (во многих случаях это фактически разработка новых модулей) технически сложна и дорога.
1.2. При ведении данного внутрифирменного програмного продукта документально оформляются все этапы создания програмного обеспечения. На данном этапе подсистема более года находится в опытной эксплуатации, в ходе которой было внесено более 1000 доработок и исправлений, перечень которых приведен в приложении 2. Эти исправления в основном связаны с учётом неочевидных вначале деталей бизнес - процессов “Русского Сахара” и с добавлением полезных дополнительных возможностей. Степень отлаженности и завершённости созданных программ позволяет перейти к их промышленной эксплуатации.
1.3. Постоянная доработка програмного обеспечения в процессе опытной эксплуатацией позволило не только систематизировать детали бизнес процессов фирмы “Русский сахар”, но и постоянно уточнять сами решаемые подсистемой задачи. Эксплуатация програмного обеспечения еще в процессе создания позволило раньше начать окупать затраты. Так как программы тестировались администраторами баз данных и пользователями на реальных данных в реальных условиях применения, исключается несоответствие результата разработки действительным условиям работы. Все проектные решения постоянно документировались вначале в виде рабочих материалов, а затем в виде окончательных документов.
1.4. ***. С разработкой специального програмного обеспечения, отражающего специфику бизнеса, связана опасность стать заложником такой фирмы поставщика программных средств. После создания и ввода в эксплуатацию прикладная программная система становится неотъемлемой частью повседневной коммерческой работы, что, например, позволяет поставщикам программных средств требовать завышенной оплаты своих услуг по сопровождению и развитию системы. Разработка специальных программных средств управленческого учета, отражающих содержательную сторону коммерческой деятельности фирмы требует осмысления и аккумулирования в программном продукте заметной части “Ноу-Хау” сотрудников фирмы. Это способствует обобществлению знаний о корпоративном бизнесе, систематическому накоплению их в формальном виде. Но в случае выполнения работ внешними исполнителями происходит передача этих ценных знаний фирме - разработчику специальных программных средств и создаются условия для тиражирования их в среде конкурентов.
Комплекс программ “Производство” корпоративной компьютерной системы “Русский Сахар” служит для обеспечения эффективной работы с базами данных операторов, менеджеров и администраторов баз данных фирм холдинга “Русский Сахар”. Комплекс программ обеспечивающий работу пользователей, включает следующие функции:
Для создания программного обеспечения, включающего системы управления базами данных, был использован продукт фирмы Microsoft “Visual FoxPro 5.0”. Система управления состоит из исполняемых программных модулей - файлов с расширением exe. Один программный модуль соответствует одному рабочему месту. Такой файл можно получить компилированием файла контейнера проекта с подключенными к нему файлами исходных текстов. Виды используемых файлов исходных текстов, подключаемых к файлу проекта, приведены в таб. 1.
Отчет | внутренний FoxPro |
таблица FoxPro |
|||
Форма | внутренний FoxPro |
таблица FoxPro |
|||
Классы | внутренний FoxPro |
таблица FoxPro |
|||
Программы | текст на языке FoxPro |
текст |
|||
Меню | внутренний FoxPro |
таблица FoxPro |
|||
Рисунки и иконки | рисунок bmp, иконка ico |
рисунок bmp, иконка ico |
Таб. 1.
4.1. Для установки исходных текстов програмного обеспечения. на компьютер разработчика необходим компакт-диск с исходными текстами системы управления и лицензионная версия программы Microsoft Visual FoxPro 5.0. На компьютере должна быть установлена операционная система Windows версии не ниже 95. Предварительно следует установить шрифты из поддиректории ********\*****\******\** или ********\*****\******\** сервера в зависимости от версии операционной системы.
В начале надо установить программу Microsoft Visual FoxPro 5.0. Потом скопировать поддиректорию ******** директории ******* с компакт-диска на локальный диск компьютера. Полученная таким образом директория станет основной директорией проекта.
Перед началом работы с проектом следует у всех файлов основной директории и поддиректорий снять статус “только для чтения”.
4.2. Для установки програмного обеспечения на компьютер (рабочую станцию) пользователя на нем предварительно должна быть установлена операционная система Windows версии не ниже 95 с доступом к корпоративной локальной компьютерной сети. Перед установкой рабочего места необходимо разрешить доступ с рабочей станции на чтение-запись к директории ******** диска *** сервера ***. На рабочей станции диск *** должен иметь название *:.
В начале следует установить библиотеки времени выполнения для Microsoft Visual FoxPro 5.0. Для этого следует запустить программу Setup из поддиректории *:\********\********. После выполнения установки библиотек следует удалить временную директорию *:\********, которую создала программа Setup на локальном диске.
На рабочем столе Windows следует установить ярлык нужного рабочего места со ссылкой на исполняемый файл в директории *:\********. В свойствах ярлыка следует указать “Развернутое во весь экран”.
Исходные тексты располагаются на локальном диске разработчика (обычно C:) в поддиректориях внутри основной директории разработчика - Sugain01. Также в поддиректориях хранятся вспомогательные таблицы и файлы. Разработчик тестирует разрабатываемую подсистему, используя копии реальной базы данных. Копия базы данных и получаемые компилированием исполняемые файлы рабочих мест располагаются в основной директории разработчика. Список поддиректорий расположенных внутри основной директории приведен в таб. 2. Дерево основной директории разработчика изображено на рис. 1.
Рис. 1. Структура основного каталога разработчика задачи. РАЗВЕРНУТЬ РИСУНОК
****** | Оригиналы вспомогательных файлов системы управления предназначенные для копирования | ||
**** | Коды программ | ||
***** | Экспериментальное изучение возможностей использования накопленной информации или возможностей среды FoxPro | ||
***** | Формы ввода, формы настройки отчетов | ||
**** | Библиотеки классов | ||
******** | Рабочее место менеджера ********* отдела | ||
***** | Рисунки, дополнительные файлы | ||
****** | Маски отчетов | ||
******** | Рабочее место администратора баз данных | ||
******** | Рабочее место ************** отдела | ||
******** | Рабочее место ***************** отдела | ||
******** | Рабочее место ************* отдела | ||
***** | Вспомогательные файлы |
Таб. 2.
Часть программ и форм, подключенных к файлу-контейнеру проекта, являются специальными инструментами разработчика. Они используются для нужд разработчика, например для настроек среды FoxPro, планирования проекта или для экспериментов по изучению возможностей использования накопленной в базах данных информации. В контейнере проекта такие файлы помечены значком f, и при компилировании к исполняемому модулю рабочего места такие файлы подключены не будут. К таким файлам относятся программ config1, config_debug.
Config1 - Основная рабочая настроечная программа. Config1 настраивает среду FoxPro и среду проекта. Эту программу следует запускать при каждом открытии проекта или запуске среды FoxPro. При первом ее запуске будут настроены все пути к директориям, используемым файлом проекта. После этого проект в среде FoxPro будет закрыт и его надо будет запустить еще раз. Затем следует запустить программу config1 повторно. При этом будут настроены прочие параметры среды и проекта. После завершения настройки надо сохранить параметры FoxPro как параметры по умолчанию, тогда при последующих запусках проекта не потребуется запускать программу config1 дважды.
Config_debug - устанавливает для среды проекта отладочный режим. В этом режиме разработчик при запуске различных модулей проекта (форм, программ) сможет получать дополнительные сообщения и информацию полезную для отладки программ. Например, в качестве стандарта в программах и формах введен порядок закрытия промежуточных курсоров при помощи специальной процедуры close_cursor(). При нормальном режиме эта процедура закрывает указанную открытую таблицу или курсор. В отладочном режиме процедура выдает сообщение о закрытии курсора, но сам курсор не закрывает, и после завершения работы с модулем разработчик может просмотреть полученные при работе промежуточные данные в незакрытых курсорах.
7.1. При запуске откомпилированного файла системы управления с рабочего места оператора, управление прежде всего передается программе main. Эта программа является головной программой проекта. В окне проекта ее наименование выделено жирным шрифтом. Программа main обеспечивает выполнение следующей последовательности действий:
7.2. Головная программа запускает меню модуля рабочего места. Каждое рабочее место имеет свое меню. Оно располагается в директории рабочего места. Эта директория имеет название Su_AAAAA, где AAAAA - код модуля подсистемы. Соответствие кода и подсистемы определяется таблицей cura_con основной базы данных.
- | фрагмент вырезан |
- | - |
- | - |
- | - |
- | - |
- | - |
Таб. 3. Распечатка данных из таблицы cura_con базы данных.
Директория подсистемы содержит исходные тексты лишь тех форм и программ, которые используются только для данного рабочего места. В этой директории также находится и файл-контейнер проекта рабочего места.
7.3. Настройка окна рабочего места начинается с вывода в заголовок окна названия модуля подсистемы (например для модуля "Производство" - ""Русский Сахар" Оперативный учет производственных операций"). После выполнения этой команды управление передается подпрограмме config.
Для того, чтобы пользователь имел возможность закрыть приложение, подпрограмма config настраивает событие, происходящее при нажатии кнопки C в правом верхнем углу окна приложения.
7.4. Подпрограмма config осуществляет настройку среды FoxPro. Она настраивает текущую и рабочие директории, режимы работы команд FoxPro с данными, стандартный вид даты, времени, денежных единиц, определяет порядок сортировки согласно русскому алфавиту.
7.5. Программа config подключает базовые процедуры и функции из файлов ProcMain - основные процедуры и функции общего пользования и ProcFilt - функции создания фильтров. Список базовых процедур и функций приведен в табл. 4.
ProcMain | SessiSet | Установки для новой сессии данных открываемой для каждой формы ввода данных |
DatePer | Номер периода по дате |
|
Variabl | Загрузка и сохранение глобальных переменных и настроек системы управления |
|
For_Developer | Информационное сообщение под грифом "ОБРАТИТЕСЬ К РАЗРАБОТЧИКУ" |
|
For_Admin | Информационное сообщение под грифом "АДМИНИСТРАТОРУ" |
|
From_Developer | Информационное сообщение под грифом "СООБЩЕНИЕ РАЗРАБОТЧИКА" |
|
From_BD | Информационное сообщение под грифом "СООБЩЕНИЕ БАЗЫ ДАННЫХ" |
|
From_Sys | Информационное сообщение под грифом "СООБЩЕНИЕ СИСТЕМЫ УПРАВЛЕНИЯ" |
|
Stop_Sys | Запрещающее сообщение под грифом "СООБЩЕНИЕ СИСТЕМЫ УПРАВЛЕНИЯ" |
|
Stop_BD | Запрещающее сообщение под грифом "СООБЩЕНИЕ БАЗЫ ДАННЫХ" |
|
Call_To_Admin | Информационное сообщение под грифом "ОБРАТИТЕСЬ К АДМИНИСТРАТОРУ" |
|
Yes_No_Sys | Сообщение с вопросом под грифом "СООБЩЕНИЕ СИСТЕМЫ УПРАВЛЕНИЯ" |
|
Copy_File | Проверка наличия файла и его копирование |
|
Suppl_Dir_Controle | Контроль наличия вспомогательной директории на компьютере пользователя и входящих в нее вспомогательных фалов |
|
Err_Analis | Анализ ожидаемых ошибок не связанных с нарушением работы системы управления |
|
Wait_Mess | Вывод сообщения при ожидании |
|
Wait_Mess_Clear | Окончание ожидания выполнения операций с данными - закрытие сообщения ожидания |
|
Close_Cursor | Закрытие курсора или таблицы |
|
Debug_Mess | Сообщение в отладочном режиме |
|
Cut_Legal_Form | Обрезание в юридическом названии фирмы юридической формы - при этом остается только само название фирмы (для отчетов) |
|
Use_Exclusiv | Попытка открытия многопользовательской таблицы в режиме исключительного доступа |
|
Fam_I_O | Получение строки "Фамилия И.О." из фамилии, имени и отчества |
|
Begin_End_Memo | Строка содежащая первую и последнюю строчку мемо поля |
|
Word_End | Формирование окончания для слов в сочетанием с количественным числительным |
|
Nul_Cut | Обрезание в числовой строке лишних нулей спереди и сзади |
|
Del_Space | Удаление лишних пробелов внутри строки |
|
ProcFilt | Alltrim_Filter | Обрезание лишних разделителей слева и справа списка фильтра |
Quantity | Количество элементов в списке фильтра |
|
Sub_List | Вычитание списков фильтра |
|
Len_El_1_List | Определение длинны первого элемента в списке фильтра |
|
El_1_List | Первый элемент в списке фильтра |
|
Sub_El_1 | Список фильтра без первого элемента |
|
Cond_Cond | Соединение двух условий фильтра |
|
Txt_Cond | Создание условия фильтра сравнения с текстовой строкой |
|
Txt_Cond1 | То же, но с учетом длинны строки |
|
Cond_St | Создание любого условия фильтра |
|
BCond_Bcond | Объединение двух фильтров |
|
Date_Cond | Создание условия фильтра - сравнение с датой |
|
Date_Diapason | Создания условия фильтра по диапазону дат |
|
DTOC_ | Перевод даты в формат для условия фильтра |
|
String_List | Создание строки фильтра по таблице |
|
Mix_List | Создание строки фильтра по таблице из двух полей |
|
Colon1_List | Выделение из двухколончатой строки списка первой колонки |
|
FilSet | Суммарный фильтр из двух строк (для совместимости с предыдущими версиями) |
|
LocSet | Поиск первой записи по условию из двух строк (для совместимости с предыдущими версиями) |
Таб. 4. Основные процедуры и функции.
7.6. Подпрограмма config подключает базовые библиотеки классов интерфейса. Подключается библиотека sup_tm, которая содержит набор классов форм, представляющих собой стандартные инструменты используемые в формах ввода и в формах настройки отчетов. Список классов библиотеки sup_tm приведен в таб. 5.
Expert_Openion |
Форма настройки одного параметра. Название параметра и его наименование передаются в форму при ее вызове |
FiltForm |
Форма стандартного фильтра. Список полей форма берет из таблицы FieldNam |
GridForm |
Стандартная форма просмотра таблицы в виде списка. Список выводимых полей настраивается в вызывающей форме в виде свойств |
More_Info_Redact |
Форма редактирование дополнительных текстовых неразмерных мемо полей. Название поля и его наименование передаются при вызове |
Таб. 5. Классы универсальной библиотеки sup_tm.
7.7. Для настройки рабочего места подпрограмма config передает управление индивидуальной подпрограмме настройки рабочего места work_sta, которая хранится в директории рабочего места. Подпрограмма work_sta присваивает переменной JOBPLA код рабочего места. В последствии, во время работы приложения, в соответствии со значением этой переменной одни и те же формы и подпрограммы могут работать по-разному для разных рабочих мест.
Далее подпрограмма work_sta подключает индивидуальные подпрограммы и библиотеки классов рабочего места, после чего возвращает управление подпрограмме config.
7.8. Затем подпрограмма config загружает переменные обращаясь к процедуре variabl с параметром "Load". Процедура variabl в зависимости от параметра осуществляет загрузку или сохранение глобальных переменных и настроек. Список переменных и их значений хранится в таблице Config. Отчет системы управления о настройках, доступных администратору баз данных для изменения, приведен на рис. 2,3. Подпрограмма variabl загружает в начале общие переменные по коду "SESSI", а затем переменные рабочего места по коду рабочего места из переменной JOBPLA.
Рис. 2,3. Отчет програмного обеспечения о настроечных параметрах.
7.9. Для проверки наличия вспомогательных файлов подпрограмма config обращается к процедуре suppl_dir_controle. Процедура проверяет наличие вспомогательной директории C:\Suga_Sup на локальном диске пользователя, и, в случае отсутствия, создает ее. Далее процедура suppl_dir_controle проверяет наличие файлов вспомогательных таблиц по списку в таблице Copy_Fil для текущего рабочего места в соответствии с его кодом. В случае отсутствия какого-либо из файлов в директории, программа копирует его во вспомогательную директорию из поддиректории C_Suppl основной директории.
После выполнения проверки вспомогательных файлов подпрограмма config возвращает управление программе main.
7.10. После выполнения всех настроек среды FoxPro и рабочего места программа main переводит систему управления в режим ожидания событий (действий пользователя).
8.1. Интерфейс програмного обеспечения представляет собой меню, которое запускает экранные формы ввода, а также формы настройки и запуска отчетов. Меню - это отдельная программа для каждого рабочего места. Формы работы с базами данных разделяются на формы ввода и коррекции данных в таблицах и формы настройки и запуска отчетов. Все формы системы управления и все элементы в них используемые строятся на основе дерева стандартизованных классов.
Рис. 4. Типы форм интерфейса системы управления базами данных.
8.2. Вид меню на разных рабочих местах стандартизован. В первых режимах меню сгруппированы функции для запуска форм ввода и редактирования информации в справочных таблицах (справочниках). Далее идут режимы которые содержат функции, запускающие формы ввода оперативных данных и формы контрольно-технических отчетов. Затем режимы которые открывают функции для запуска форм оперативно-аналитических отчетов. Предпоследний режим “Опции” предназначен для поддержки стандартных команд работы со строкой в среде Windows. Последний режим “Выход” осуществляет завершение работы пользователя с системой управления и закрытие приложения. Пункт “Опции” не работает в модальных формах, и для поддержки команд работы со строкой в таких формах используется стандартная программа контекстного меню option.
8.3. Пользователь может завершить работу с системой управления, используя пункт меню “Выход” или крестик C в правом верхнем углу окна приложения. При этом управление передается программе exit_app. Эта программа выполняет сохранение переменных и настроек в соответствии со значением поля SAVE таблицы Config (например, это могут быть числовые экспертные оценки каких-либо параметров). Далее программа закрывает все таблицы, базы данных, формы, удаляет все переменные из оперативной памяти. После этого программа закрывает само приложение.
9.1. Построение красивого и удобного графического интерфейса дело очень трудоемкое. Каждая экранная форма, которых в модуле много (в модуле “Производство” порядка 60 форм), набирается из полусотни элементов, в каждом из которых следует настроить порядка ста параметров (свойств), и кодировать сравнимое количество подпрограмм (методов). Значительно сократить работу по созданию экранных форм со множеством встроенных функций позволило разумное использование механизма многоуровневого дерева классов, эффективно реализованного в Visual FoxPro. Такое сокращение возможно за счет стандартизации и вынесения функционально-однотипных программ и функций интерфейса на нижние уровни дерева классов. Такая технология позволяет также эффективно использовать принцип “отложенного программирования” (когда часть функций, предусмотренных техническим заданием вводится уже после начала тестирования и использования программного средства), который значительно упрощает работу в условиях ограниченного ресурса времени на кодирование программ, при необходимости быстрого ввода в эксплуатацию новых модулей.
Рис. 5. Распределение классов по библиотекам. РАЗВЕРНУТЬ РИСУНОК
Инструментальное дерево классов иерархически разбито на несколько уровней по степени абстракции собранных в них классов - элементов. Базовый вариант библиотеки классов, интенсивно используемый при создании всех прикладных программ, может пополняться и совершенствоваться на разных уровнях. При этом используется основное свойство классов - наследование: все классы, построенные на основе класса-родителя наследуют все настройки, кроме указанных, которые определяют специфику класса или элемента потомка. Так, класс верхнего уровня, представляющий из себя полноценную экранную форму ввода данных, использует описания типовых кнопок, рамок, способов перемещения по массиву данных, описания которых содержатся на более низких уровнях. Такой механизм позволяет улучшать функциональные возможности элементов, используемых в экранных формах ввода, не внося изменения в сами формы. Улучшение функций одного класса приводит к улучшению работы всех форм, где используются элементы на основе этого класса. Важно, чтобы при внесении изменений в классы сохранялись их стандартизованные характеристики. В таблице 6 приведен полный список стандартизованных классов по каждому базовому классу, разрешенному в Visual FoxPro 5.0.
FormBa | Экранная форма | |||||||||||||||||
frm_Field | для обновления необязательных полей | |||||||||||||||||
More_Info_Redact | мемо полей | |||||||||||||||||
frmTable | ввода данных (типовая) | |||||||||||||||||
frmTa_Main | главные формы | |||||||||||||||||
Centr_Cost | ЦЕНТРЫ ЗАТРАТ | |||||||||||||||||
Dicti_Form | редактирование словарей | |||||||||||||||||
Contr_Form | работа со табл. Юр. Отдела | |||||||||||||||||
Firms | ФИРМЫ | |||||||||||||||||
Prod_Form | для модуля Производство | |||||||||||||||||
Trans_Form | для модуля Транспортного отдела | |||||||||||||||||
RelForm | дополнительные формы | |||||||||||||||||
ListForm | словари | |||||||||||||||||
Typ_Cont | ТИПЫ ДОГОВОРОВ | |||||||||||||||||
frmOther | другие формы | |||||||||||||||||
FiltForm | СТАНДАРТНЫЙ ФИЛЬТР | |||||||||||||||||
GridForm | СПИСОК ВЫБОРА | |||||||||||||||||
FFBa | фильтры | |||||||||||||||||
frm_Save_Revert | форма с кнопками СОХРАНИТЬ/ОТМЕНИТЬ | |||||||||||||||||
List_Redact | РЕДАКТОР СПИСКОВ | |||||||||||||||||
Tune_Parameter | ИЗМЕНЕНИЕ ПАРАМЕТРА | |||||||||||||||||
Expert_Opinion | ЭКСПЕРТНАЯ ОЦЕНКА | |||||||||||||||||
frmOt_Main | другие главные формы | |||||||||||||||||
Report_Modul | формы отчета | |||||||||||||||||
Report_Groupping | с группировкой | |||||||||||||||||
Rep_Group_Filter | и фильтрацией | |||||||||||||||||
ContainBa | Контейнер (может содержать любые классы) | |||||||||||||||||
LefRig_Btns | Кнопки ЛЕВО, ПРАВО (редактирование формы со списками) | |||||||||||||||||
SavBac_Btns | Кнопки СОХРАНИТЬ, ОТМЕНИТЬ | |||||||||||||||||
txtBtns | кнопки управления (стандартный инструмент форм ввода) | |||||||||||||||||
Basi_Btns | типовой | |||||||||||||||||
Dict_Btns | для словарей | |||||||||||||||||
cntBasic |
|
типовой контейнер | ||||||||||||||||
Date_Interval | диапазон дат | |||||||||||||||||
Date_Interval_Filter | для форм фильтра | |||||||||||||||||
Dubl_Date | дублирование даты в текстовое поле | |||||||||||||||||
Note | ПРИМЕЧАНИЕ | |||||||||||||||||
Note_Memo | ДЛЯ МЕМО ПОЛЕЙ | |||||||||||||||||
Weight | ВЕС | |||||||||||||||||
Big_Filter_Parameter | кнопка запуска формы редактирования фильтров (для форм отчетов) | |||||||||||||||||
rel_Tabl3 | поле связанной таблицы | |||||||||||||||||
rel_Tabl2 | поле связанной таблицы с доп. текстом | |||||||||||||||||
rel_Tabl1 | поле связанной таблицы с темя доп. текстами | |||||||||||||||||
Button | Экранные кнопки | |||||||||||||||||
Butt | с текстом | |||||||||||||||||
Clear_Butt | ОЧИСТИТЬ | |||||||||||||||||
Count_Butt | ПОСЧИТАТЬ | |||||||||||||||||
cmdAddi | ДОБАВИТЬ | |||||||||||||||||
cmdDele | УДАЛИТЬ | |||||||||||||||||
cmdEdit | РЕДАКТИРОВАТЬ | |||||||||||||||||
cmdInse | ВСТАВИТЬ | |||||||||||||||||
PicButt | графическая | |||||||||||||||||
Help_Butt | ПОМОЩЬ | |||||||||||||||||
Revert_Butt | ОТМЕНА | |||||||||||||||||
Print_Butt | ПЕЧАТЬ | |||||||||||||||||
Plus_Butt | + | |||||||||||||||||
Minus_Butt | - | |||||||||||||||||
Exit_Butt | ВЫХОД | |||||||||||||||||
Filter_Butt | ФИЛЬТР | |||||||||||||||||
Find_butt | ПОИСК | |||||||||||||||||
List_Butt | СПИСОК (запустить форму) | |||||||||||||||||
Parameter_Butt | редактировать параметр | |||||||||||||||||
CheBox | Флажок | |||||||||||||||||
ChkBox | типовой | |||||||||||||||||
Chk_Butt | в виде кнопки | |||||||||||||||||
Chk_Invisible | невидимый | |||||||||||||||||
ChkFind | для форм поиска | |||||||||||||||||
Spec_Cond | специальное условия для форм фильтра | |||||||||||||||||
Detay | ДЕТАЛИ (в отчетах) | |||||||||||||||||
ComBox | Список | |||||||||||||||||
cboBox | типовой | |||||||||||||||||
cboFind | для форм поиска | |||||||||||||||||
EdBox | Поле (memo) | |||||||||||||||||
EditBox | типовое | |||||||||||||||||
Big_Memo | большое для мемо в форме | |||||||||||||||||
LineBa | Линия | |||||||||||||||||
ShapeBa | Рамка | |||||||||||||||||
shpRam | типовая | |||||||||||||||||
String | Поле (обычное) | |||||||||||||||||
Txt_String | типовое | |||||||||||||||||
text_Comment | нередактируемое | |||||||||||||||||
text_Date | для ввода даты | |||||||||||||||||
text_Updat | ДАТА ПОСЛЕДНЕГО ОБНОВЛЕНИЯ | |||||||||||||||||
Avto_Space_Num | с авто добавлением пробелов и символов | |||||||||||||||||
Big_String | длинной строки | |||||||||||||||||
Pur100 | проценты | |||||||||||||||||
String_Invisible | невидимое | |||||||||||||||||
Txt_Find | не связанное с полем таблицы (непосредственно) | |||||||||||||||||
txt_Count_Red | связанное формулой | |||||||||||||||||
Text | Текст в форме | |||||||||||||||||
LblText | типовой | |||||||||||||||||
Info_From_Bd | скрытый, осуществляющий выборку из базы данных | |||||||||||||||||
lblCapt | подзаголовок группы | |||||||||||||||||
Logic | КРЕСТИК ФИЛЬТРА | |||||||||||||||||
lblPopup | дополнительные всплывающее сообщение в форме | |||||||||||||||||
lblBasic | основной | |||||||||||||||||
Var_Caption | заголовок изменяемый для форм | |||||||||||||||||
Label_Note | ПРИМЕЧАНИЕ | |||||||||||||||||
txt_Centr | центрированный | |||||||||||||||||
Copy_To_Add_Table | используется как модуль осуществляющий авто. копирование в дополнительные таблицы |
Таб. 6. Базовые классы - инструментарий разработчика.
Для примера рассмотрим построение функционального класса выбора из списка связанной таблицы Rel_Tabl2 рис. 6. Первый уровень дерева классов - базовые классы проекта. В них настраивается типовой внешний вид: шрифты, цветовая палитра, типовые размеры и прочее. Второй уровень дерева классов - основные классы. На этом уровне настраиваются свойства, влияющие на функциональное использование классов контейнеров и элементов. Здесь также добавляются новые свойства и фрагменты программного кода, придающие классам дополнительные функциональные возможности. Третий уровень - классы-заготовки. Сюда входят как заготовки форм, так и заготовки комплексных элементов.
По библиотекам классы разбиты по критерию удобства использования при кодировании экранных форм. Схема разбиения класса на библиотеки приведена на рис. 5.
Рис. 6. Схема создания комплексных элементов типовых полей связанных таблиц. РАЗВЕРНУТЬ РИСУНОК
10.1. При создании форм используется стандартизованный класс формы, в который добавляются элементы простые и комплексные стандартизованных классов. При создании комплексных элементов была использована возможность вставлять в класс-контейнер в качестве элемента другой класс-контейнер с уже добавленными в него элементами. Это дало возможность создать большое количество типовых заготовок, из которых собираются формы. В экранных формах ввода данных в различные таблицы используются одинаковые поля (рис. 7). Для таких полей на базе класса Rel_Tabl3 были созданы типовые классы-контейнеры, которые хранятся в библиотеках com_co и ju_comco, с элементом выбора из списка и другими необходимыми элементами с настроенными в элементах свойствами. Аналогичным образом были созданы и другие заготовки из основных элементов, связанных классом-контейнером, для фильтров экранных форм и для форм подготовки отчетов (для облегчения создания форм подготовки отчетов была создана специальная инструкция, которая приведена в приложении 1), например: диапазон дат, функция подготовки фильтра и др. Таким образом, в примененной схеме каждый типовой элемент подготавливается только один раз, а затем много раз вставляется в заготовки, варианты форм и сами формы.
На рис. 8. показана типичная схема создания конкретной экранной формы для прикладной программы на базе созданных библиотечных классов - “инструментов” и “заготовок”.
10.2.1. Формы ввода данных в таблицы создаются с использование стандартного инструментария на основе класса FrmTable библиотеки com_ob и его потомках, в котором уже предусмотрено поле для автоматического заполнения стандартного поля, присутствующего во всех таблицах - date_updat (дата и время последнего обновления записи). Инструментарий позволяет создать полноценную форму ввода данных с возможностью просмотра таблицы, изменения сортировки по ключу, наложения фильтра без особых трудозатрат. Достаточно добавить нужные поля и настроить несколько свойств. Это значительно ускоряет работу по созданию полноценного приложения по учету коммерческих и производственных операций.
Рис. 7. Использование одинаковых полей из связанных таблиц в базах данных по движению товара. РАЗВЕРНУТЬ РИСУНОК
10.2.2. Форма ввода информации в оперативную таблицу строится на основе класса формы рабочего места, потомка класса FrmTa_Main. Например, для рабочего места производственного отдела - это класс Prod_form, а транспортного отдела Trans_Form.
Первым делом в форму необходимо добавить группу кнопок Basi_Btns библиотеки com_bu, и присвоить ему имя Btns. Весь необходимый инструментарий уже предусмотрен в этой группе, которую следует расположить в нижней части формы. Далее в форму следует добавить редактируемые поля таблицы. Это могут быть как обычные поля на основе классов библиотек com_el и fun_cont, так и типовые поля на основе классов библиотек com_co и ju_comco. Для добавляемых полей можно настроить логические свойства: Primery - обязательное к заполнению, Not_Redact - запрещено редактировать. Также рекомендуется настроить свойство Field_Full_Name - смысловое название поля (по-русски).
В основу построения приложения был положен принцип “типовой операции”. Этот принцип предусматривает создание форм, максимально удобных пользователю при выполнении различных, часто повторяющихся, операций ввода данных. Для этого в классах форм и полей проекта заранее предусмотрено несколько дополнительных возможностей.
Если для выполнения типовой операции нужно, чтобы пользователь, работая с формой, видел не все записи, а только их часть, удовлетворяющую каким-либо определенным условиям (например, в форме “Отгрузка вагонов” пользователь видит только записи таблицы ОТГРУЗКИ о неотгруженных вагонах), следует указать это условие в свойстве FilDev формы. В случае, если нужно, чтобы при добавлении записи значение части полей копировалось из предыдущей записи во вновь созданную, следует свойству Carry формы присвоить значение .T.. При этом в новую запись будут копироваться все поля, если при добавлении они не имеют значение .NULL..
В инструментарии, заложенном в стандартном наборе кнопок, есть следующие функции: движение по таблице, просмотр таблицы, фильтр/поиск записи, добавление/сохранение записи, редактирование/отмена изменений, печать отчета по справочной таблице и выход из формы. Функции: движение по таблице, добавление/сохранение записи, редактирование/отмена изменений и выход из формы задействованы сразу после добавления набора кнопок и не требуют дополнительных настроек. Список свойств, которые надо настроить, что бы задействовать функцию просмотра таблицы в форме приведен в таб. 7.
Grsou | название главного курсора по которому будет вестись просмотр |
NuCol | количество колонок, которое будет в списке просмотра таблицы (от 1 до 4) |
CCapt1, CCapt2, CCapt3, CCapt4 | заголовки колонок с 1 по 4 |
СSou1, СSou2, СSou3, СSou4 | поля, которые будут отображаться во всех четырех колонках. |
CTag1, CTag2, CTag3, CTag4 | ключи индексов, по которым будет сортироваться таблица при нажатии мышкой на заголовке каждой колонке |
CWid1, CWid2, CWid3, CWid4 | ширина каждой колонки (суммарная ширина всех колонок должна быть не больше 479 пикселей) |
Таб. 7.
Для настройки функции фильтр/поиск следует создать класс формы фильтра, и поместить его название в свойство ClsFilt.
10.2.3. Класс формы фильтра создается на основе класса FFBa библиотеки com_ob. В него добавляются необходимые поля таблицы, по которым будет осуществляться фильтрация и поиск. Это могут быть как обычные поля на основе классов библиотеки com_el, так и типовые поля на основе классов библиотеки com_co. Для этих полей должно быть настроено свойство Field_Name - содержащее имя поля таблицы, по которому строится выражение фильтра.
10.2.4. Форма ввода информации в справочную таблицу строится аналогично форме ввода оперативных данных, но на основе класса ListForm. В этом классе уже заранее предусмотрен стандартный набор кнопок Btns и два поля, которые обязательно содержатся во всех справочных таблицах: учетное название и описание. Можно изменить размеры формы, чтобы добавить другие поля, которые есть в справочнике. Важно не забыть настроить свойство Tag_Name - первичный ключ справочника, тогда эта форма может быть вызвана из оперативных форм для внесения изменений в справочную таблицу в процессе заполнения оперативных данных.
11.1. Параметрический отчет состоит из формы настройки параметров и одного или нескольких файлов масок отчетов. Если создается отчет, который позволяет пользователю группировать информацию различными способами, то инструментарий предусматривает наличие управляющих записей о различных вариантах группировки в свободной таблице Param_R. Общая схема создания отчета предусматривает следующие пункты:
11.2.1 Форма редактирования параметров отчета может быть создана на основе классов приведенных в таб. 8. После ее создания в среду данных формы добавляются таблицы, из которых будут выбираться данные для отчета. Далее следует заполнить следующие свойства формы: Report_Name - базовое название файла отчета (первые шесть или меньше букв названия, одинаковые для всех файлов - масок отчета, используемых формой); Cursor_Name (необязательное) - наименование курсора или таблицы в котором будет находится результат произведенной выборки, показываемый в отчете; To_Table (необязательное) - да, если свойство содержит Cursor_Name наименование таблицы; Not_Groupping (необязательное) - номер ячейки в элементе OptionsGroup формы, соответствующей варианту отчета, в котором отсутствует группировка.
Report_Modul | базовый класс отчетной формы |
Report_Groupping | базовый класс отчетной формы с возможностью изменения способа группировки отчетных данных |
Report_Group_Filter | базовый класс отчетной формы с возможностью изменения способа группировки, и с возможностью фильтрации отчетных данных |
Таб. 8. Базовые классы форм параметрических отчетов.
На следующем этапе создания параметрического отчета в форму добавляются нужные элементы. При расположении добавляемых элементов в форме нужно в правом нижнем углу формы оставить место для кнопок запуска отчета и выхода из формы. Эти кнопки будут перемещены в правый нижний угол формы с учетом возможного изменения ее размеров. Это перемещение заложено в событии Init формы.
10.2.2. В форму настройки контрольно-технического отчета добавляются как стандартные элементы библиотек com_el, com_ob, fun_el, и fun_cont, так и элементы специально разработанные для форм отчетов из библиотек tm_rep и rep_co. Для настройки различных параметров отчета были разработаны элементы: группировки отчета, полного фильтра по одному полю, диапазона дат, детализации.
10.2.3. Если в форме необходим элемент вариантов группировки, то ее следует создавать на основе класса формы Report_Groupping или на основе класса формы Report_Group_Filter. В этих классах форм уже предусмотрен объект-контейнер Grouppng на основе базового класса OptionsGroup.
Для объектов Option1, Option2, … находящихся внутри контейнера Grouppng настраивается свойство Caption - название варианта группировки. Для объекта Option1 могут быть также настроены свойства: Left, Top, Height, Width - отвечающие за размеры элемента и его расположение относительно краев контейнера. Эти свойства автоматически будут перенесены в другие элементы в группе при запуске формы в методе Init. Для контейнера Grouppng настраиваются свойства: ButtonCount - количество вариантов (возможных способов) группировки информации; Width - ширина контейнера в соответствии с максимальной длинной названия способа группировки в свойстве Caption элементов контейнера; Height - высота контейнера (в соответствии с количеством и высотой элементов контейнера). Для настройки последнего предусмотрена специальная процедура: в свойство контейнера Info ставится значение 1, тогда при запуске формы вы получите сообщение о требуемой высоте контейнера в пикселях, после чего вы сможете настроить свойство Height.
10.2.4. Составной элемент фильтра по одному полю таблицы представляет собой контейнер, созданный на основе класса Big_Filter_Parameter. Этот класс включает в себя кнопку и надпись, использующуюся в качестве значка, который показывает, - установлен ли фильтр. Кнопка будет вызывать форму выбора одного или нескольких значений для фильтруемого поля из списка возможных. Форму, включающую такие фильтры, следует создавать на основе класса Report_Group_Filter. Один полный фильтр в этом классе уже предусмотрен. В зависимости от того, какое поле нужно фильтровать и из какой таблицы берется список вариантов возможных значений, настраиваются свойства контейнера. Alias - содержит название курсора (таблицы), из которой берется полный список возможных значений поля. Этот курсор должен быть обязательно включен в среду данных формы. Field1 - содержит имя поля курсора, по которому создается список. Field2 (заполнять необязательно) - содержит имя второго поля курсора, по которому создается список выбора значений, в случае если он будет содержать две колонки (в этом случае обычно первое поле содержит полное название или расшифровку второго). Nsym (заполнять необязательно) - содержит ширину первой колонки для списка из двух колонок. В соответствии с этой шириной значение списка, полученное из поля Field1, будет обрезаться. F_Var_Name - содержит название текстовой переменной, которая будет создана в событии Init контейнера и в которой будет храниться список выбранных значений. Значения будут разделены разделителем LIST_SEPARAT. В случае, если фильтр не наложен, переменная будет содержать пустую строку. Filter_Name - содержит заголовок, который будет высвечиваться в форме выбора значений из списка. Обычно это русское название фильтруемого поля во множественном числе. Следует также настроить свойство Caption кнопки контейнера, в которое вноситься название фильтра (обычно это то же значение, что и в свойстве Filter_Name контейнера, но в винительном падеже множественного числа).
Для ряда типовых полей уже существуют заранее подготовленные классы в библиотеке rep_co с уже настроенными свойствами.
10.2.5. Элемент диапазона дат добавляется из класса Date_Interval. Форма может содержать только один такой элемент. В событии Init он создает две переменные DATE_LOWER, DATE_UPPER, которые содержат диапазон дат выбранный пользователем. В свойствах Low_Init_Value и Up_Init_Value можно указать нижнее и верхнее значение диапазона дат соответственно, по умолчанию (которое отобразится в форме при загрузке).
10.2.6. Элемент детализации отчета добавляется из класса Detay. Форма может иметь только один такой элемент. Он позволяет пользователю выводить группированный отчет в двух видах - с детализацией и без детализации. С точки зрения файла маски отчета это будут два разных файла. Для этого элемента следует свойству Name установить значение Detay.
10.2.7. На следующем этапе создания отчета следует кодировать саму программу выборки отчетной информации из баз данных. Специально для этой программы в класс формы отчета встроено два метода, которым передается управление при выполнении команды на запуск отчета - Select и Pre_Select. Дело в том, что часто программа выборки данных для отчета может быть сложной и содержать много операторов. Такая выборка может выполняться в течение нескольких минут (в зависимости как от самой программы, так и от быстродействия компьютера или скорости сети). По этой причине было принято решение разнести программу выборки данных на две части. Программа в методе Pre_Select выполняет предварительную выборку, т.е. самую первую выборку всей программы по которой можно заранее сказать - найдена ли хотя бы одна запись, с учетом наложенных фильтров, и если найдена, то на какую дату приходится первая из найденных (минимальная дата по группе выборки должна находиться в поле MAIN_DATE). Предварительная выборка вызывается функцией “найти первую” элемента диапазона дат. Если в форме элемент диапазон дат отсутствует, то метод Pre_Select можно не использовать. Выборка метода отсеивает лишнюю информацию с учетом всех наложенных пользователем и условиями отчета фильтров. Метод Select формы содержит основную программу выборки. Если форма отчета позволяет группировать информацию (содержит элемент группировки), то этот метод должен содержать следующие команды:
DODEFAULT()
SELECT ...
* Выборка с учетом любых возможных вариантов группировки
* Обращение к подпрограмме предыдущего уровня, которая находит
* нужную (в соответствии с выбранным пунктом в элементе группировки,)
* запись в таблице Param_R и настраивает по ней переменные отчета.
* После чего запускает метод Pre_Select.
WAIT_MESS(“Сообщение в режиме ожидания
выполнения выборки”)
SELECT ...
WAIT_MESS(“Следующее сообщение в режиме ожидания
выполнения выборки”)
SELECT &REPORT_GROUP AS Groupping, SPEC_FIELD AS Group_Name,
другие поля
FROM ... ;
INTO CURSOR Selected ;
ORDER BY &SORT_STRING ;
WHERE ...
Где: REPORT_GROUP - название поля, по которому группируется выбранная информация; SPEC_FIELD - название поля или группы полей, которые будут выводиться в названии группы (например, если данные группируются по месяцу, то REPORT_GROUP будет содержать номер месяца, а SPEC_FIELD - его название); SORT_STRING - порядок сортировки выходных данных отчета.
10.3. Для отчета с возможностью различной группировки данных следует создать записи в таблице Param_R, которая находится в поддиректории Suppl сервера. В этой таблице запись соответствует одному варианту отчета по группировке и детализации (например, если в отчете 3 варианта группировки и есть элемент детализации, то следует создать 6 записей). Следует заполнить следующие поля:
REPORT - базовое название файла отчета. По этому полю фильтруются все записи, относящиеся к данному отчету. У всех записей относящихся к одному параметрическому отчету это поле будет иметь одинаковое значение.
NAME - название отчета. Содержит название варианта отчета, соответствующего выбранному способу группировки и детализации. Значение этого поля попадает в переменную REPORT_NAME, которую следует использовать в маске отчета в качестве его подзаголовка.
NUM - номер выбранного варианта группировки данных в отчете.
FLAG - вид отчета. Определяет, какой из файлов отчета будет запущен. В этом поле первый символ определяет режим детализации. Он должен иметь значение “ ” для варианта отчета без детализации данных (или при отсутствии элемента детализации), или значение “1” с детализацией. Второй символ обычно имеет пустое значение, и только для варианта отчета без группировки данных имеет значение “2”.
GROUP_F - список полей группировки отчета. Значение этого поля попадает в переменную REPORT_GROUP.
GROUP_ NAME - дополнительное. Его значение попадает в переменную GROUP_TITLE.
GROUP_ST (необязательное)- cписок полей группировки запроса. Его значение попадает в переменную SELECT_GROUP.
SORT_ST (необязательное) - список полей сортировки записей. Его значение попадает в переменную SORT_STRING.
FIELD_SPEC - дополнительное. Его значение попадает в переменную SPEC_FIELD.
10.4. На следующем этапе следует создать, средствами FoxPro, маски выводимых на печатающее устройство отчетов. Основным достоинством используемого метода можно считать то, что для получения большого числа вариантов отчета понадобится всего два-три файла маски отчета.
Первый файл соответствует любому отчету без деталей. Его название соответствует базовому названию файла отчета. Второй файл соответствует любому отчету с детализацией. Его название состоит из базового с добавлением символа “1”. Третий файл соответствует варианту отчета без группировки. Его название состоит из базового с добавление символа “2”.
В форме отчет запускается автоматически и выполняется по таблице или курсору, название которого содержится в свойстве формы CursorName.
В маске в качестве подзаголовка отчета следует использовать переменную REPORT_NAME. Подзаголовок отчета, соответствующий режиму группировки отчета. Отчет следует группировать по полю GROUPING.