Период года
|
Параметры воздушной среды
на постоянных рабочих местах
|
|
Оптимальные
|
Допустимые
|
|
температура, С
|
влажность, %
|
Скорость движения, м/с
|
температура, С
|
Влажность, %
|
скорость движения, м/с
|
Холодный период
|
20 - 25
|
40 - 60
|
0.2
|
18 - 22
|
не более 70
|
0.3
|
Теплый период
|
20 - 25
|
40 - 60
|
0.5
|
28
|
24 - 70 25 - 65
|
0.3
|
Для поддержания необходимого уровня влажности и температуры в помещении
вычислительного центра установлены 2 кондиционера типа КСН - 12 А. Они
размещены в верхней части оконного проема лаборатории для быстрого охлаждения
помещения, особенно в летний период. Кондиционеры могут работать как в режиме
кондиционирования воздуха (т.е поддержание в рабочей зоне помещения постоянных
параметров микроклимата, осуществляемое автоматически), так и вентиляции
воздуха (т.е. обеспечивают поддержание постоянного воздухообмена).
Психофизиологические факторы
Для создания наиболее благоприятных условий труда в компьютерной лаборатории
учитываются психофизиологические особенности человека, а также общая
гигиеническая обстановка. Большое значение в создании оптимальных условий труда
имеют складывающиеся в коллективе взаимоотношения между работающими, которые
принято называть социальным климатом. Работник, находящийся в состоянии
нервного возбуждения, допускает большое количество ошибок, и, вообще,
эффективность его работы снижается в несколько раз.
Для снижения действия психологических факторов предусматривается комната
отдыха, а также периодические перерывы в работе с ЭВМ, но не более 20 - ти
минут;
Электромагнитное излучение
Важное место в организации занимают работы по снижению воздействия на
людей электромагнитного излучения. Основным источником электромагнитного
излучения является дисплей. Для снижения дозы облучения от экрана используются
мониторы с пометкой "LOW RADIATION", в которых встроены защитные
фильтры Применение защитных фильтров позволяет снизить нагрузку на глаза, а
значит уменьшить утомляемость сотрудника, за счёт снятия статического
напряжения и бликов на экране; Сотрудники одеты в белые халаты, которые служат
защитой от статического электричества. Кроме того, в местах, где используются
радиоактивные элементы сделаны покрытия свинца толщиной не менее 30 см. или
бетонные перегородки. Компьютеры размещены таким образом, чтобы излучение с
задней части дисплея не попадало на людей, по периметру комнаты, причем задняя
часть дисплея направлена в стену.
Сотрудники, сидящие за ЭВМ, располагаются не ближе 50 см от монитора и 122
см от соседних ЭВМ
Освещенность
Свет играет большую роль в создании нормальных условий работы. В большей
степени это относится к работе, связанной с вычислительной техникой. Данный
параграф посвящён расчёту естественного освещения для помещений вычислительного
центра.
Информация, которую человек получает с дисплея компьютера, поступает
через зрительный канал. Качество информации, получаемой посредством зрения, во
многом зависит от освещения. Неудовлетворительное освещение может исказить
информацию, кроме того, оно утомляет не только зрение, но и вызывает утомление
организма в целом.
Производственное освещение по виду источника делится на естественное и
искусственное.
Естественное освещение характеризуется коэффициентом естественной
освещённости (КЕО).
При боковом естественном освещении рассчитывается минимальное значение
ширины светового проёма (lmin).
Нормированные значения КЕО приводятся для третьего пояса светового
климата бывшего СССР, для остальных поясов (1,2,4,5) светового климата
нормированные значения КЕО определяются по формуле:
ен(1,2,4,5)= ен (3)*M*C,
где:
ен (3) - значение КЕО для третьего пояса;
М - коэффициент светового климата;- коэффициент солнечного климата.
Значение Ен(3) находим из таблицы "Нормы освещённости при
искусственном освещении и КЕО при естественном и совмещённом освещении".
Характеристика зрительной работы для компьютерной лаборатории - средней
точности, т. е.
наименьший размер объекта различения - 0.5 - 1 мм;
разряд зрительной работы - 4,
подразряд зрительной работы - в;
характеристика фона - средний.
Исходя из этих данных по таблице находим:
КЕО=1.2%
Значения для коэффициентов М и С выбираем из таблицы "Значения
коэффициентов М и С (СНиП - 2-4-79). Для этого нужно определить следующие
параметры:
пояс светового климата - 4.50 градусов северной широты и южнее, поэтому
М=0.9;
коэффициент С при световых проемах в наружных стенах зданий равен 0.75.
Отсюда, Ен(4)=1.2*0.9*0.75=0.81%
Расчёт естественного освещения заключается в определении площади световых
проёмов. При боковом освещении определяют площадь окон S0, обеспечивающую
нормированные значения КЕО, по формуле:
100*S0/Sn=( ен *n0)/(т0*r1)*Kзд*Кз;=(Sn* ен *n0)/(100*т0*r1)*Кзд*Кз,
где:- площадь пола помещения, м2;
=L*B;
- длина, L=12 м; B - ширина, В=4.5 м;=12*4.5=54 м2;
ен - нормированное значение КЕО, Ен=0.81 %;
Кз - коэффициент запаса,
по таблице "Значение коэффициентов запаса Кз" для бокового
естественного освещения находим:
Кз=1.2;
т0 - общий коэффициент светопропускания;
т0=т1*т2*т3*т4;
по таблице "Значения коэффициентов светопропускания" находим:
вид светопропускающего материала - стекло оконное листовое двойное
т1=0.8,
вид переплёта - переплёты для окон деревянные двойные раздельные -
т2=0.6,
вид несущих конструкций покрытий - железобетонные фермы и арки
т3=0.8,
солнцезащитные устройства, изделия и материалы - вертикальные
т4=0.75,
т0=0.8*0.6*0.8*0.75=0.288;- коэффициент, учитывающий повышение КЕО при
боковом освещении благодаря свету, отражённому от поверхностей помещения и
подстилающего слоя, прилегающего к зданию;
по таблице "Значения коэффициентов r1" находим, используя
следующие данные:
В - ширина помещения, В=4.5,
=L-(L10+L20),
где:- высота помещения, L=3.5 м,- расстояние от верха окна до потолка,
L10=0.3 м,- уровень условной рабочей поверхности, L20=1 м,=3.5-(0.3+1)=2.2 м,
В/L1=4.5/2.2=2.045,- расстояние расчётной точки до наружной
стены,=4.5-0.7=3.8,/B=3.8/4.5=0.84,
отношение длины к глубине, 12/4.5=2.67,
отсюда r1=1.7;- световая характеристика окон,
по таблице "Значения световой характеристики световых проёмов"
находим:/B=12/4.5=2.67,/L1=4.5/2.2=2.045,
отсюда n0=9;
КЭД выбираем из следующих соображений: так как противостоящие здания
находятся довольно далеко, так что не затемняют окна, но существует затемнение
бетонными балками, выбираем Кзд=1.7.
Определяем площадь световых
проёмов:=(54*0.81*9)/(100*0.288*1.7)*1.7*1.2=16.87 м2
Так как высота оконных проёмов 2.2 м, то следовательно длина их составит
7.7 м.
11.2.3
Техника безопасности
Для обеспечения электробезопасности работы проведены общепринятые
мероприятия:
нейтраль источника питания заземлена с помощью заземляющего устройства с
сопротивлением заземления не более 600 мкОм;
корпуса всех устройств оснащены надежным электрическим соединением с
шиной заземления. Переходное сопротивление при заземлении аппаратуры через перемычки,
шины (суммарное) и т.д. не превышает 2000 мкОм;
проложены шины защитного заземления сечением не менее 120 мм;
соединены шина защитного заземления и заземление первичного источника
питания - трехфазной сети 220В, 50Гц.
Одной из основных мер, обеспечивающих защиту от поражения электрическим
током, является защитное заземление. Помещение машинного зала организации
оборудовано контуром-шиной защитного заземления, электрически соединенной с
заземлением. Контур-шина уложена в виде сетки и располагается под всей
площадью, занимаемой компьютером. Все элементы компьютера, подлежащие
заземлению, соединены с контур-шиной отдельными заземляющими проводниками.
Зануление организовано за счет соединения контур-шины с нулевым
проводником в распределительном силовом щите. Блокировка самопроизвольного или
ошибочного включения частей под напряжением осуществлена переключением тумблера
распределительного щита в состояние “Выключен”.
К работе на ЭВМ разрешен допуск прошедшим инструктаж по технике
безопасности, изучивших правила и приемы освобождения человека, попавшего под
напряжение, приемы и правила оказания первой медицинской помощи пострадавшему,
способы тушения пожара в электроустановках.
11.2.4
Пожарная безопасность
Пожары в вычислительных центрах представляют особую опасность, так как
сопряжены с большими материальными и человеческими потерями. Характерная
особенность компьютерных лабораторий - небольшие площади помещений. Как
известно, пожар может возникнуть при взаимодействии горючих веществ, окислителя
и источников зажигания. В помещениях вычислительных центров присутствуют все
три вышеперечисленных фактора, поэтому вероятность возникновения пожаров в
вычислительных центрах велика.
Категория производства по пожарной опасности -В.
Огнестойкость здания - II
Помещения вычислительного центра располагают таким образом, что
расстояние от лаборатории до выхода из здания составляет 150 м.. Кроме того,
периодически должны проводится инструктажи среди работников о мерах пожарной
безопасности. В вычислительном центре назначен ответственный по пожарной
безопасности для того, чтобы следить за соблюдением правил пожарной
безопасности, за исправностью аппаратуры, за приобретением, комплектностью и
исправностью средств тушения пожара. Пожарная безопасность в первую очередь обеспечивается
выполнением требований пожарной безопасности систем электропитания и её
соблюдением при проведении профилактических, ремонтных и иных работ.
В целях пожарной профилактики в помещении машинного зала
предусматриваются пожарные извещатели, автоматические системы тушения пожара
(спринклерные или дренчерные), расположенные на потолке, а также первичные
средства пожаротушения: огнетушители ручные ОХП - 10, ОХВП - 10, ОУ - 5.
Оборудование должно располагаться так, чтобы оно не мешало эвакуации людей из здания
при пожаре.
12. СОЗДАНИЕ СУБД В DELPHI ДЛЯ МЕНЕДЖЕРА
12.1. Определение состава СУБД
СУБД состоит из совокупности экранных и отчетных форм и процедур
обработки данных вводимых в БД и выводимых из БД. При программировании СБД в
среде Windows СУБД называют приложением.
Чтобы определить перечень экранных форм рассмотрим порядок работы
пользователя, т.е. задаем поведение пользователя нашей системы.
Пусть порядок работы пользователя задается следующей схемой.
Схема работы пользователя.
Интерфейс пользователя происходит через главное меню. Поэтому система
должна имеет главное меню.
Для ввода информации в базу необходима отдельная экранная форма. Базу
следует просматривать на отдельной экранной форме.
Кроме того, пользователю необходимо получить данные из базы в печатной
форме, причем различные данные в различных формах. Все эти выходные данные
называются отчетами или отчетными формами. Поэтому пользователю необходимо
получать отчетные формы.
Таким образом, для получения отчетов необходимо предусмотреть несколько
отчетных форм, сколько требуется для полноценной работы пользователя.
При запуске системы на экране должно отображается главное меню системы. В
меню отражен перечень команд-действий, которые может выполнить система. Если
пользователь планирует ввод данных о поступивших материалах, то он из меню
вызывает форму для ввода информации.
Для того чтобы просмотреть базу он может из меню вызвать форму просмотра
базы. Для вывода данных в отчет для пользователя можно предусмотреть различные
варианты. Пользователь из главного меню может вызвать форму просмотра базы и
оттуда он может выбирать данные и форму отчета. Далее сгенерированный вариант
отчета выдается на печатное устройство. Для того чтобы достичь гибкости можно
предусмотреть варианты формирование отчета в режиме (с формы) ввода информации
и в режиме (с формы) просмотра базы.
Таким образом, из описанной выше схемы работы системы “пользователь -
система” видно, что для работы системы необходимо следующие формы:
·
Форма для меню;
·
Форма для ввода
данных в базу;
·
Форма для
просмотра БД;
·
Форма для отчета
№1;
·
Форма для отчета
№2;
·
Форма для отчета
№3.
Выше было указано внешняя форма проявления СБД. Для того чтобы обеспечить
работоспособность СБД необходимо обеспечить связь форм с БД: обработку данных
БД из экранной формы. Что и будет сделано в следующих пунктах.
12.2 Проект и план создания компонентов
СУБД
Кроме внешних форм проявления, СУБД еще должна иметь процедуры обработки
и средства обеспечения доступа к БД. Вся эта совокупность компонентов,
составляющие СУБД, должна быть создана и сохранена.
Следует отметить, что основой для проектирования СУБД является форма.
Являясь основой и носителем всех остальных компонентов, форма служит
фундаментом для процессов обработки данных. Теоретической основой такой схемы
является объектно-ориентированная технология проектирования и программирования.
Однако на теоретических вопросах объектно-ориентированной технологии
проектирования и программирования не будем специально останавливаться.
Теперь составим проект СУБД, т.е. установим состав, назначения и связь
между компонентами СУБД. При этом будем исходить из указанной выше схемы работы
пользователя.
Будем считать, что для работы пользователя достаточно трех отчетных форм.
Поэтому для каждой экранной и отчетной формы должна быть выделена отдельная
форма.
В Delphi информационная связь форм СУБД с БД осуществляется через
определенные невизуальные компоненты. Поэтому для обеспечения связи экранных
форм с БД в проекте используется специальный невизуальный компонент (контейнер)
TDataModule, который также должен создаваться отдельно.
Таким образом, исходя из описанных эвристических предпосылок, установим
перечень необходимых для нашей задачи форм:
· Форма для меню;
· Форма для ввода данных в базу;
· Форма для просмотра БД;
· Форма для отчета №1.
· Форма для отчета №2.
· Форма для отчета №3.
· Компонента TDataModule
Опыт подсказывает, что одним из наиболее удобных для разработчика порядка
формирования форм и их компонентов является следующий.
1) Компонента TDataModule
2) Форма для меню;
3) Форма для просмотра БД;
4) Форма для ввода данных в базу;
5) Форма для отчета №1.
6) Форма для отчета №2.
7) Форма для отчета №3.
Формы, необходимые для создания СУБД можно задать двумя способами:
. Если заранее известно их количество, то на экране монитора и
соответственно в хранилище (repository) проекта IDE Delphi заранее можно
вывести нужное количество визуальных и невизуальных форм, т.е. в проект можно
добавить столько форм, сколько требуется. С помощью команды File|New
Form добавляются визуальные формы, а командой File|New Data Module - невизуальная. Отметим, что для
нашей системы требуется всего шесть визуальных форм и одна компонента TDataModule.
. Если заранее количество нужных форм для проекта не известно, то на
экране монитора и соответственно в хранилище (repository) проекта IDE Delphi
добавляется та форма, которая нужна для проекта на текущем этапе создания СУБД.
Установление форм на экране осуществляется через команды File|New
Form или File|New Data Module. Другими словами каждая форма в проект добавляется по
мере необходимости.
В данном случае добавление новых форм в хранилище проекта происходить с
помощью команды добавления (File|Add to Project).
Таким образом, исходя из проекта, представим план работы по созданию СУБД
для поставленной выше задачи автоматизации из экранных и отчетных форм и
процедур обработки данных.
Сначала будем считать, что на экране выведено столько форм, сколько
требуется для создания всех форм СУБД. Если форм не хватает, то доводим их до
необходимого количества. Это делается путем повторение действия (File|New
Form) столько раз, сколько требуется количеств форм и один контейнер
командой File|New Data Module.
Теперь определим последовательность проектирования (конструирования)
форм. Последовательность создание форм в общем случае произвольный, но мы все
таки выбираем вышеизложенную последовательность.
Данная последовательность оформления и создания форм упрощает процесс
создания СУБД.
Создание СУБД начнем с построения контейнера TDataModule для связи с БД. Проектирование форм СУБД начнем с
экранной формы, на которой будет отображено содержимое БД.
Проектирование СУБД происходит по каждой форме по отдельности путем
установления связи с БД (т.е. с компонентом TdataModule) и созданием процедур обработки данных, вводимые с
экранной формы или получаемые из БД.
Кроме того, требуется установление связи между компонентами различных
форм. В одной из экранных форм следует предусмотреть команду завершения работы
системы.
После определения набора компонентов и их размещения на форме,
устанавливается их доступ к БД и создается процедура обработки данных для
каждого компонента формы.
Из вышеприведенного определения видно, что СУБД также как БД состоит из
множества компонентов. Все эти компоненты СУБД требуют формирования и
программирования и их файлы также как и файлы БД следует хранить в определенном
месте. Для этой цели можно использовать тот же каталог, что и для БД, т.е.
C:\PRIMER, либо создадим в каталоге C:\PRIMER подкаталог АРР и в нем храним
разработанные приложения.
В общем случае приложение можно хранить в любом месте, однако, хранение
его вместе с БД в одной папке, но все же в отельной поддиректории удобно для
работы разработчика. Так и будем делать.
12.3 Создание СУБД
12.3.1 Способы организаций доступа экранных форм и отчетных
форм к базе данных
В данном пункте описывается вопросы организация доступа экранных форм
(ЭФ) и отчетных форм (ОФ) к базе данных путем создания контейнера TDataModule
Связь экранной формы с БД обеспечивается специальными компонентами,
которые называются невизуальными компонентами. Эти элементы видны только в
режиме конструирования, а в режиме работы системы эти элементы станет на экране
невидимы.
Если СУБД состоит из одной экранной формы, то не нужно специального
хранилища в виде контейнера для хранения невизуальных компонентов. В этом
случае невизуальные компоненты можно расположить на той же экранной форме,
которая является единственной.
В случае, когда СУБД имеет несколько экранных форм, то их доступ следует
осуществить двумя способами:
. Доступ каждой формы (и ее компонентов) к БД можно осуществить
автономно, независимо от остальных форм.
. Второй способ предполагает не повторять для каждой формы организацию
доступа к БД, а для всех экранных и отчетных форм организовать единый доступ
через специальный компонент типа TDataModule. Компонент типа TDataModule представляет собой контейнер, в
который можно помещать все невизуальные компоненты TTable, TQuery, DataSource,
которые необходимы для доступа к БД и т.д. Тогда все те формы, для которых
потребуется доступ к БД, доступ получат через компонент TdataModule. Для этого
для каждой экранной формы необходимо установить связь с данным компонентом,
т.е. с TdataModule.
Таким образом, в случае множества ЭФ и ОФ для работы СУБД удобно создать
компонент типа TDataModule,
который является контейнером для невизуальных компонентов, обеспечивающих
доступ к базами данных.
Создание экземпляра TDataModule в среде Delphi осуществляется через пункт
меню File|New Data Module. После чего, в палитре компонентов
Delphi на странице Data Access выберем мышью невизуальный компонент
ТТаblе (рис. 12.1), щелкнем на нем мышью и затем
щелкнем мышью в контейнере. После этого, изображение компоненты останется в
контейнере.
Рис. 12.1. Палитра компонентов Delphi
Невизуальным компонент TTable (как и другие компоненты, например, TQuery,
TDataSource) называется потому, что он применяется для хранения и доступа к данным,
а не для их визуализации - для этой цели применяются визуальные компоненты
(TDBGrid, TEdit и другие).
После того, как мы разместили компонент TTable, установим его свойства.
Для этой цели воспользуемся инспектором объектов (Object Inspector),
который обычно помещается слева от формы. Если он не видим, его можно вызвать,
нажав кнопку F11. Инспектор объектов позволяет устанавливать свойства
того компонента, который выделен при помощи мыши. Выделим мышью компонент
TTable.
Установим значение свойства DatabaseName в PRIMER (это является
псевдоним БД)при помощи выпадающего списка или введя его вручную. Установим
значение свойства TableName (имя таблицы БД) в Materialy.DB при помощи
выпадающего списка. После этого установим значение свойства Active в
True. После этого произойдет реальное связывание компонента TTable (он по
умолчанию имеет имя Table1) с реально существующей таблицей Materialy.DB.
Компонент TTable и компонент TQuery служат для хранения наборов данных.
Понятие набора данных несколько шире, чем понятие таблицы БД, поскольку набор
данных может содержать:
· подмножество записей или полей таблицы БД (компоненты TTable,
TQuery);
· записи, сформированные из нескольких таблиц БД (компонент
TQuery).
Расположим в контейнере DataModule компонент TDataSource. Он служит в
качестве связующего звена между невизуальными компонентами (в данном случае
Table1) и визуальными компонентами, которые мы добавим в форму №3 позднее.
Поэтому компоненты TDataSource часто называют источниками данных. Установим
свойство DataSet (имя набора данных) компонента TDataSource в значение
Table1 путем выбора из выпадающего списка.нужно сохранить под каким-либо именем
(по умолчанию Unit5.pas). Имя модуля Unit, в котором описан TDataModule,
добавляется в текст модулей unit всех иных форм приложения, которые будут
использовать БД и TDataSource, расположенные в этом TDataModule. Это
производится в главном меню среды Delphi, в элементе меню File|Use
Unit.
В дальнейшем визуальные компоненты, работающие с данными набора данных
(НД), должны в своем свойстве DataSource содержать имя соответствующего
компонента TDataSource из TDataModule. При этом имя является составным: сначала
идет имя компонента TDataModule и затем через точку - имя компонента
TDataSource, например, в нашем случае - DataModule5.DataSource1.
12.3.2. Создание простых экранных форм
В данном пункте описывается вопросы создание простых вариантов экранных
форм и установление их доступа к БД, а также организация процессов обработки
данных.
Создание экранной формы для меню СУБД
Перейдем в форму №1 (элемент меню View|Forms), выбрав из
диалогового окна Form1 нажмем на кнопку Ok. Расположим в форме
компонент MainMenu из страницы Standard палитры компонентов. Затем
вызовем средства разработки меню (это можно сделать двумя способами):
· Двойное нажатие на компонент MainMenu внутри формы №1
· Переходим в
окно Object Inspector при выделенном компоненте на форме. Щелкнем на свойстве
Items и нажмем кнопку .
Находясь в Конструкторе меню Form1.MainMenu1 (это имя, присвоенное Delphi
по умолчанию созданному нами перед этим компоненту TMainMenu), дадим названия
пунктам меню (свойства Caption в Object Inspector)
“Файл/Ввод/Просмотр/Отчет/Выход”. Для перехода на следующий уровень нажимаем на
<Enter>. Для визуального разделения пунктов меню на отдельные
группы после Отчет используем несколько символов минус (-), назначать
имя разделителю необязательно. Для пункта меню “Ввод” создадим подменю
“Название материала/Поступление материала”. Для этого выделим его и щелкнем
правой кнопкой мыши, в появившемся окне выберем пункт Create Submenu.
Теперь, когда меню создано, можно связать с каждым пунктом меню код,
который будет выполняться при выборе данного пункта пользователем. Для создания
процедуры обработки этого события - OnClick, находясь в Конструкторе
меню, дважды щелкнем мышью на пункте меню. В появившемся окне Редактора кода
процедуре обработки события OnClick напишем код, который будет
выполняться при выборе этого пункта меню. Такого же результата можно достичь
при помощи двойного щелчка мышью на имени процедуры обработки, которое
находится на странице Events окна Object Inspector.
Например, в пункт Просмотр введем следующий код:
Form1.Visible := False;.Visible := True;
элемент меню Поступление материала:
Form1.Visible := False;
Form2.Visible := True;
элемент меню Выход: Сlose;
Выберем элемент меню File|Save Project As и сохраним
проект. Сначала запрашивается имя формы проекта (у нас пять форм, с именами Form1
… Form4, DataModule5). Сохраним формы под именами 'Unit*.pas'. Затем
запрашивается имя проекта. Сохраним проект под именем 'appl.dpr'.
Добавим имена модулей Unit2 и Unit3 в текст модулей unit формы №1.
После этого выполним приложение. (Чтобы выполнить приложение не выходя из
среды Delphi, достаточно нажать кнопку F9. Чтобы создать приложение и запустить
его вне среды Delphi, следует нажать комбинацию кнопок Ctrl+F9 и затем
запустить созданный файл с расширением .ехе и именем, совпадающим с именем
проекта. В нашем случае следует запускать файл 'appl.exe'.
Остановить работающее приложение можно командой Run|Program Reset.
Создание экранной формы для представления содержания БД
1. Представление содержания одной таблицы БД на экранной форме.
Сначала построим простую экранную форму, которая имеет доступ только к
одной таблице БД.
Перейдем в форму №3 путем выбора элемента (или команды) меню View|Forms,
нажмем на кнопку Ok выбрав из диалогового окна Form3. Расположим в форме
компонент TDBGrid, взяв его из палитры компонентов (страница Data Controls).
Установим свойство DataSource компонента TDBGrid в значение DataSource1
(это имя созданного нами выше компонента TDataSource, присвоенное Delphi по
умолчанию) предварительно добавив имя модуля Unit5, в котором описан
TDataModule, в текст модулей unit формы №3. Компонент TDBGrid служит для
отображения записей набора данных в табличной форме.
Добавим в форму компонент кнопки TButton (страница Standard
палитры компонентов), дадим имя этому компоненту (свойство Name),
используя инспектор объектов, CancelButton. Изменим заголовок кнопки
(свойство Caption) на Отмена.
Вид разрабатываемой формы представлен на рис. 12.2.
Рис.
12.2. Вид формы на этапе разработки
Свяжем с кнопкой код, который будет выполняться при нажатии на кнопку
пользователем. Для создания процедуры обработки этого события - OnClick,
находясь в форме, дважды щелкнем мышью на кнопку Отмена. В появившемся окне
Редактора кода процедуре обработки события OnClick напишем код
Сlose;
Form1.Visible := True;
Запустим приложение на выполнение из Delphi, выбрав команду Run из меню Run (или F9).
Из меню Файл/Ввод приложения выберем команду Просмотр.
Вид работающего приложения показан на рис.12.3.
Рис. 12.3. Вид формы №3 во время выполнения
Добавлять записи в набор данных (и, следовательно, в таблицу
Materialy.DB) можно прямо из компонента TDBGrid.
Для добавления записи нужно нажать на клавиатуре кнопку Insert
или, находясь на последней записи набора данных, кнопку "стрелка
вниз". Набор данных автоматически перейдет в режим добавления новой
записи. После ввода значений в поля записи запомнить запись в наборе данных
можно, перейдя на другую запись при помощи клавиш управления курсором.
Отказаться от запоминания записи можно, нажав кнопку Esc.
Для изменения записи следует переместить указатель текущей записи в
нужное место и изменить значения там, где это необходимо. Набор данных
автоматически перейдет в режим редактирования.
Для удаления записи следует установить на нее указатель текущей записи и
нажать комбинацию кнопок Ctrl+Del.
2. Представление содержания двух таблиц БД
Теперь работу усложним. Представим содержание двух таблиц БД. Причем в
двух вариантах:
а) без установления связи между таблицами на экранной форме;
б) отобразим данные таблицы с учетом связи между таблицами.
.1. Отображение данных таблиц БД на экранной форме без установления связи
между ними
Покажем, как в одной форме можно связать два набора данных (родительский
и подчиненный) так, чтобы в подчиненном наборе данных всегда показывались
записи, соответствующие текущей записи в родительском НД.
Добавим в контейнер DataModule5 компонент ТТаblе (с именем Таblе2) для
работы с таблицей Prihod базы данных PRIMER (значения свойств такие же, как у
компонента Table1, но свойство TableName ссылается на имя таблицы
Prihod.DB). Добавим в форму компонент TDataSource (имя по умолчанию
DataSource2). Установим свойство DataSet этого компонента в значение
Таblе2. Разместим в форме №3 компонент TDBGrid (имя по умолчанию DBGrid2) и
установим его свойство DataSowce в значение DataSource2. Установим
свойство Таbl2.Аvtive в True. После этого произойдет реальное связывание
компонентов TTable с реально существующими таблицами Materialy.DB и Prihod.DB.
Рис. 12.4. Форма с родительским и дочерними
наборами данных во время разработки
Чтобы при просмотре нельзя было изменять данные о материалах (таблица
Materialy.DB), установим свойства ReadOnly компонента DBGrid1 в
положение True.
Запустим приложение на выполнение. Добавим несколько записей в таблицу
Prihod.DB из компонента TDBGrid2. Обратите внимание, значение поля N_Prih
формируется автоматически.
Рис. 12.5. В подчиненном наборе данных показываются записи, связанные с
текущей записью в родительском НД
2.2. Отображение данных таблиц БД на экранной форме с учетом связи между
ними
Нам известно, что таблицы базы данных Materialy.DB и Prihod.DB находятся
в отношении "один-ко-многим". Поскольку мы определили ссылочную целостность
между этими таблицами, можно сделать так, чтобы при установке указателя на
запись в наборе данных Table1 (ассоциированном с Materialy.DB) в наборе данных
Таblе2 (ассоциированном с Prihod.DB) показывались только записи прихода
текущего материала в Table1. Это реализуется через механизм связи наборов
данных Master-Detail.
В
инспекторе объектов для компонента Таblе2 установим значение свойства Master
Source в DataSource1. Переместимся на значение свойства Master Fields
и нажмем кнопку . В появившемся окне Field Link Designer
установим параметры связи. В поле Available Indexes выберем в качестве
текущего индекса по полю 'Material'. В списке Detail Fields выберем поле
Material, в списке Master Fields выберем поле Material и нажмем кнопку Add.
В поле Joined Fields будет сформировано выражение 'Material ® Material'). Нажмем кнопку Ok.
Рис.
12.6. Окно установки значения свойства MasterFields
Как
можно заметить, в компоненте Таblе2 текущий индекс (свойство FieldIndexNames)
заменен на индекс, построенный по полю 'Material'.
Теперь
в наборе данных Table2 показываются только записи по приходу материала,
текущего в наборе данных Table1 (рис. 12.7).
Рис.
12.7. Связь Master-Detail - в дочернем наборе данных показываются только
подчиненные записи
Создание экранной формы для ввода данных в базе данных
Для дальнейшей работы подготовим контейнер DataModule5. Из палитры компонентов
Delphi на странице Data Access добавим невизуальный компонента TTаblе, установим значения свойств DatabaseName
(псевдоним БД) в PRIMER при помощи выпадающего списка или введя его вручную. В Tаblе3 установим значение свойства TableName
(имя таблицы БД) в PRIHOD.DB. После этого установим значение
свойства Active в True. Расположим компонента TDataSource, установим
свойство DataSet (имя набора данных) компонента DataSource3 в значение
Table3. Добавление невизуальных компонентов для связи с таблицей PRIHOD.DB в контейнер обязательно, т.к. аналогичные компоненты в
контейнере DataModule взаимно связаны и в дальнейшем может произойти
циклическое обращение.
Добавим в форму №2 компонент TDBGrid из палитры компонентов Data
Controls. Установим свойство DataSource компонента TDBGrid в
значение DataSource3, предварительно добавив имя модуля Unit5 в текст модулей
unit формы №2.
Теперь сделаем так, чтобы к полям записи в наборе данных Table3 можно
было обращаться не только из сетки компонента DBGrid1, а из отдельных
визуальных компонентов, позволяющих осуществлять доступ к отдельным полям
записи набора данных.
Добавим в форму №2 два компонента TDBEdit (палитра компонентов Data
Controls). Определим поле, к которому можно иметь доступ через компонент
DBEdit1. Для этого установим значение его свойств - DataSource в
DataSource3 и DataField в DatPrih. Определим поле, к которому можно
иметь доступ через компонент DBEdit2. Для этого установим значение его свойств
- DataSource в DataSource3 и DataField в Kolvo.
Для доступа к полю Material нам нужен более сложный компонент, который
позволял бы вводить в поле Material таблицы Prihod.DB значения полей Material
из таблицы Materialy.DB, и никакие другие значения. Для этой цели разместим
компонент TDBLookupComboBox с именем по умолчанию DBLookupComboBox1. Установим
свойства этого компонента:
·
DataSource
- в значение DataModule5.DataSource3;
·
DataFiled - в значение Material;
·
List
Source - в значение DataModule5.DataSource1
·
ListField - в значение Material;
·
KeyField - в значение Material.
Добавление кнопок управления данными базы данных на экранной
форме
Далее на экранной форме можно создать набор кнопок, которые позволят
проводить навигацию по таблицам БД и управлять ее состоянием, т.е. ее записями.
Для этого в приложение добавим пять компонентов кнопок TButton (страница Standard
палитры компонентов). Изменим имена этих компонентов (свойство Name), используя
инспектор объектов, соответственно на InsertButton, EditButton,
DeleteButton, PostButton, CancelButton. Изменим заголовки этих кнопок (свойство
Caption), используя инспектор объектов, соответственно на
"Добавить", "Изменить", "Удалить",
"Запомнить", "Закрыть" (рис. 12.8).
Рис. 12.8. Форма с визуальными компонентами
для работы с полями текущей записи набора данных
Выберем при помощи мыши кнопку InsertButton и два раза щелкнем на ней.
После этого мы перейдем в редактор кода и определим для кнопки InsertButton
обработчик события нажатия кнопки, OnClick:
procedure TForm2.InsertButtonClick(Sender:
TObject);.Table3.Insert;;
Метод Insert переводит набор данных Table1 в состояние добавления
записи dsInsert. Ввод значений полей осуществляется в компонентах
DBEdit1, DBLookupComboBox1, DBEdit2. Для этого необходимо, чтобы набор данных
находился в режиме просмотра dsBrowse.
Определим обработчик нажатия кнопки EditButton:
procedure TForm2.EditButtonClick(Sender:
TObject);.Table3.Edit;;
Метод Edit переводит набор данных Table1 в состояние добавления
записи dsEdit. Редактирование значений полей осуществляется в
компонентах DBEdit1,, DBEdit2. Для этого необходимо, чтобы набор данных
находился в режиме просмотра dsBrowse.
Определим обработчик нажатия кнопки DeleteButton:
procedure TForm2.DeleteButtonClick(Sender: TObject);
beginMessageDlg('Подтвердите удаление записи',
mtConfirmation,[mbYes, mbNo],0) = mrYes
THEN.Table3.Delete;
end;
Если набор данных Table1 находится в режиме просмотра записей dsBrowse,
вызывается окно диалога (при выполнении функции MessageDlg);
если пользователь нажимает кнопку Yes, происходит удаление текущей записи в
наборе данных Table1.
Определим обработчик нажатия кнопки PostButton:
procedure TForm2.PostButtonClick(Sender:
TObject);.Table3.Post;;
Если набор данных находится в режиме добавления новой записи или
редактирования, происходит выполнение метода набора данных Post, который
запоминает текущее состояние записи в таблице БД. После запоминания набор
данных переводится в режим просмотра dsBrowse.
Определим обработчик нажатия кнопки CancelButton:
procedure TForm2.CancelButtonClick(Sender:
TObject);;.Visible:=true;
end;
Если набор данных находится в режиме добавления новой записи или
редактирования, происходит выполнение метода набора данных Cancel, который
отменяет запоминание записи в таблице БД и переводит набор данных в режим
просмотра и переходит на форму меню.
Для того чтобы набор данных нельзя было переводить в состояние добавления
и изменения данных, а также удалять записи непосредственно из компонента
DBGrid1, установим свойство DBGrid1.ReadOnly в значение True. После
этого запустим приложение на выполнение. При добавлении новой записи или при
корректировке существующей в поля можно заносить значения, используя ввод в
компоненты DBEdit1, DBEdit2 и путем выбора из списка значений в компоненте
DBLookupComboBox1 (рис. 12.10).
То же происходит при изменении записи.
Рис. 12.9. Добавление новой записи
При удалении записи выдается окно диалога (рис. 4.11).
Рис. 12.10. Окно подтверждения удаления
записи
12.3.3 Создание сложных экранных форм
В данном пункте описывается вопросы создание более сложных вариантов
экранных форм и установление их доступа к БД, а также организация процессов
обработки данных.
Варианты модификации TDBGrid на экранной форме
Как можно заметить, значение поля N_Prih необходимо для обеспечения
уникальности в таблице Prihod и не несет никакой иной нагрузки. Поэтому данное
поле лучше не показывать в составе столбцов DBGrid2. Для этой цели сформируем
список полей таблицы Prihod. В Delphi имеются две возможности указать, какие из
полей таблицы БД следует использовать в приложении для набора данных.
Первый способ состоит в использовании по умолчанию всех полей из
таблицы БД, с которой ассоциирован этот набор данных. Этот способ всегда используется
по умолчанию и, следовательно, был неявно использован и нами при создании
наборов данных Table1 и Table2.
Второй способ состоит в использовании подмножества полей таблицы
БД, с которой ассоциирован набор данных. Для этой цели используется редактор
полей набора данных, который позволяет включить в состав обрабатываемых для
набора данных полей все поля или подмножество полей таблицы БД.
Выберем в контейнере DataModule5 при помощи мыши компонент Таblе2 и
нажмем правую кнопку мыши. В появившемся на экране всплывающем меню выберем
элемент Fields Editor. В появившемся списке редактора полей нажмем
правую кнопку мыши и во всплывающем меню выберем элемент меню Add Fields. Будет
показан список всех полей таблицы БД Prihod.DB. Отметим (при помощи мыши и
кнопки Shift) все поля, кроме N_Prih и нажмем кнопку Add. Теперь список
редактора полей будет включать все отмеченные поля.
а) б) в)
Рис. 12.11. Работа с редактором полей:
а) пустой список редактора полей
б) добавление полей
в) заполненный список редактора полей.
Как можно заметить, в составе столбцов в компоненте DBGrid2 на форме №3
теперь присутствуют только те поля, которые добавлены для набора данных Table2
в редакторе полей (рис. 12.13).
Рис. 12.12. Состав полей DBGrid2
определяется списком редактора полей
Определение для набора данных списка полей в редакторе полей (нажатие
правой кнопки мыши по компоненту Таblе2) приводит к тому, что для каждого
добавленного таким образом поля в приложении Delphi автоматически создает
компонент TField (поле набора данных). Каждый такой компонент по умолчанию
именуется уникальным именем - в качестве первой составляющей имени поля берется
имя набора данных (Таblе2), а в качестве второй составляющей - имя поля в
таблице БД. Так, компонент TField соответствующий полю Material, будет
поименован как Table2Material. Если в редакторе полей щелкнуть по имени
соответствующего поля, в инспекторе объектов можно установить или изменить
свойства поля, а также определить обработчики события для конкретного поля.
Изменим параметры компонента DBGrid2 так, чтобы названия его столбцов
содержали русские наименования. Для этого нажмем правой кнопкой мыши на
компоненте DBGrid2, и во всплывающем меню выделим элемент Columns Editor.
На экране появится окно редактора столбцов компонента . Для того чтобы изменить
характеристики столбцов в TDBGrid, нужно перейти от неявно определяемых
столбцов к определяемым. Для этого нужно щелкнуть по кнопке Add All Fields,
в результате чего будут добавлены столбцы, каждый из которых соответствует
полю, определенному в редакторе полей компонента Table2. Что бы изменить
заголовок каждого столбца, следует выбрать при помощи мыши имя столбца в
редакторе столбцов, и в инспекторе объектов раскрыть список свойства Title
(для чего следует щелкнуть мышью по крестику рядом с именем свойства). В
элементе Caption этого списка содержится заголовок столбца; изменим
соответствующим образом заголовки и затем выйдем из редактора столбцов DBGrid2.
Рис. 12.13.
а) пустой список столбцов DBGrid2
б) заполненный список столбцов
То же проделаем для набора данных Table1 (рис. 12.14).
Рис. 12.14. Установка заголовков столбцов
DBGrid1 и 2
Аналогичные изменения проделаем и в форме №2.
Изменим также порядок сортировки записей в наборе данных Таblе3 в форме
№2. Для этого в инспекторе объектов компонента Table3 (в DataModule5)
установим свойство IndexFieldNames в значение
"DatPrih;Material" путем выбора из выпадающего списка, содержащего
названия индексных полей, определенных для каждого существующего индекса
таблицы Prihod.DB. После этого войдем еще раз в редактор колонок DBGrid и при помощи
мыши "перетащим" столбец DatPrih так, чтобы он предшествовал столбцу
Material. Откомпилируем приложение и запустим его на выполнение. Как видно из
рис. 4.16, набор данных Table2, ассоциированный с таблицей БД Prihod.DB, в
приложении отсортирован по дате прихода, а внутри каждой даты прихода - по
наименованию материала.
Рис. 12.15. Материалы отсортированы по дате
поступления
Создание вычисляемых полей на экранной форме
Создание вычисляемых полей - одно из наиболее ценных свойств редактора
полей. Это свойство можно использовать для различных целей, в нашем примере
рассмотрим случай вычисления по двум или более полям с отображением результата
вычислений в третьем поле.
В экранной форме № 3 создадим новое вычисляемое поле в DBGrid2, значение которого вычисляется по
значениям других полей, для этого выполним следующие действия:
1. Перейдем в DataModule5, при помощи
мыши сделаем текущим необходимый набор данных (в нашем примере Table2), нажав
на правую кнопку мыши, выберем в меню пункт Field Editor (редактор полей)
и снова нажав на правую кнопку мыши и выберем в меню пункт New Field.
2. Затем в диалоговом окне (рис.124.17) необходимо указать имя поля (в
поле Name введем “vychisl”), его тип (в поле Type выберем “String”) и длину (в поле Size
введем “3”). Помечаем поле как вычисляемое (Calculated). Нажимаем Ok и закрываем редактор полей.
Рис. 12.16. Окно определения свойств нового поля
Таким образом, для нового поля “vychisl” создан компонент TField, доступ к которому можно
осуществлять в редакторе полей.
Процесс, описанный выше, показывает как создать вычисляемое поле. Если
посмотреть на DBGrid2, то можно видеть, что там теперь
еще одно пустое поле. Для того, чтобы поместить значение в это поле необходимо
выполнить следующий шаг.
3. Для компонента набора данных Table2,
к которому принадлежит вычисляемое поле, необходимо определить обработчик
события OnCalcFields.
Например, нам необходимо знать наличие на складе товаров более 100
единиц. Для этого будем заносить в созданное вычисляемое поле Table2Vychisl
набора данных Table2, ассоциированному с таблицей БД “Приход”, значение “Да”,
если в поле Table2Kolvo этой записи содержится значение больше 100. В противном
случае в поле Table2Vychisl будем заносить пустое значение.
В окне Редактора кода процедуры обработки события OnCalcFields
напишем следующий код:
procedure TDataModule5.Table2CalcFields(DataSet:
TDataSet);Table2Kolvo.Value > 100 ThenVychisl.AsString := 'Да'Vychisl.AsString := ' ';
end;
Если свойство набора данных AutoCalcFields установлено в True, событие
OnCalcFields наступает и при модификации значений невычисляемых полей в режимах
dsInsert и dsEdit данного набора данных или набора данных, реляционно с ним
связанного (когда установлены ограничения целостности в самой таблице БД, а не
тогда, когда они подразумеваются).
Процедура-обработчик события OnCalcFields содержит реализацию алгоритма
вычисления значения вычисляемого поля или группы полей. Необходимо помнить, что
в этом обработчике значение может быть присвоено только вычисляемому полю и не
может - полю, определенному в структуре БД (приложение показано на рис. 12.17).
Рис. 12.17. Вид запущенного приложения
Использования SQL-запроса для отображения данных из разных
таблиц на экранной форме
Создадим форму для отображения данных из нескольких таблиц. Для этого в
контейнере TDataModule5 расположим компонент TQuery (страница Data Access
палитра компонентов). По умолчанию его имя Query1. Установим его свойство DatabaseName
в PRIMER. Расположим компонент TDataSource (имя DataSource4). Установим его
свойство DataSet в значение Query1.
Расположим в форме №4 компонент TDBGrid. Установим его свойство DataSource
в значение DataSource4.
В
инспекторе объектов для компонента Query1 найдем свойство SQL и
нажмем кнопку . Затем в появившемся окне редактора наберем текст
SQL-запроса
SELECT
P.DatPrih, P.Material, P.Kolvo,Т.Zena,
(P.Kolvo * T.Zena) As StoimMaterialy T, Prihod
PT.Material = P.MaterialBY P.DatPrih, P.Material
и
нажмем кнопку Ok.
После
этого установим свойство Query1.Active в значение True. Набор данных
Query1 содержит сведения о приходе материала на склад. В составе записи этого
набора присутствуют поля DatPrih (дата прихода), Material (название материала),
Kolvo (количество прихода), Zena (цена за ед. измерения данного материала),
Stoim (стоимость прихода материала). Как видно из текста запроса в свойстве SQL,
набор данных "собирается" из двух таблиц БД PRIMER, Materialy.DB и
Prihod.DB. При этом соединяются записи из этих таблиц БД, имеющие одинаковое
значение поля Material.
Рис.
12.18. Соединение данных из разных таблиц в одном наборе данных
В
форме №1 в пункт Отчет введем следующий код:
Form1.Visible := False;.Visible := True;
Заметим,
что в набор данных Query1 нельзя добавить новые записи и нельзя изменить или
удалить существующие записи в наборе данных. Это происходит потому, что тип
набора данных, "собираемого" более чем из одной таблицы БД, является
доступным только для чтения.
12.3.4 Создание отчетных форм
В данном пункте описывается вопросы создание отчетных форм и установление
их доступа к БД и организация обработки данных
Создание отчетных форм можно представить как всякая форма и рассмотреть в
данной главе вместе с экранными формами. Однако формирование отчета имеет свои
особенности. Кроме того, процесс формирование отчетов можно рассмотреть
отдельно от вопросов СУБД. Формирование отчетных форм более или менее отдельный
вопрос из-за того, что отчет включает три вида компонентов. Это экранная форма
отчета в виде текста и таблицы, форма отчета выводимые на бумажные носители,
графические материалы и материалы, формируемые в виде электронных файлов.
Поэтому все эти вопросы вынесем в отдельную главу и в ней рассмотрим
вопросы формирования отчетов различного вида.
12.3.5 Запуск и проверка работы системы
Разрабатываемую систему время от времени следует запускать на исполнение
и проверять ее работоспособность. Причем проверка работоспособности системы
можно проводить на любой стадии создания, не обязательно полностью завершать ее
создание, достаточно получить минимальную конфигурацию. Минимальную
конфигурацию составляет БД и одна экранная форма, которая обращается к БД.
Для запуска системы предварительно следует запомнить все созданные
компоненты.
Запуск системы осуществляется по команде: Rиn|Rиn. Запуск
системы можно осуществить и с помощью горячей клавиши F9.
В случае зависания системы или при отсутствии выхода из системы
прерывание работы осуществляется по команде Rиn|Program Reset.
После прерывания работы системы можно продолжать ее разработку или
отладку.
Работа полного варианта системы, без отчетной части системы, начинается с
отображения на экране формы меню. Далее пользователь системы может с помощью
меню переходить на любую другую экранную форму и вернуться на главное меню
системы.
Если порядок отображения экранных форм не соответствует желаемому
варианту, то его можно менять в поле Main Form с помощью элемента меню Proect|Options закладка Forms.
12.4 Вычисляемые поля
Для того, чтобы дать более полное представление о создания вычисляемых
полей и об организации процессов вычисления в данном пункте подробно раскроим
эти вопросы.
Создание вычисляемых полей - одно из наиболее ценных свойств Редактора
DataSet. Вы можете использовать эти поля для различных целей, но два случая
выделяются особо:
· выполнение вычислений по двум или более полям в DataSet, и отображение
результата вычислений в третьем поле.
· имитация соединения двух таблиц с возможностью редактировать
результат соединения.
Программа CALC_SUM.DPR из примеров к данному уроку иллюстрирует первый
случай использования вычисляемых полей.
Эта программа связывает три таблицы в отношении один ко многим. В
частности, ORDERS и ITEMS связаны по полю OrderNo, а ITEMS и PARTS связаны по
полю PartNo. (В таблице ORDERS хранятся все заказы; в таблице ITEMS - предметы,
указанные в заказах; PARTS - справочник предметов). В программе можно
перемещаться по таблице ORDERS и видеть связанный с текущим заказом список
включенных в него предметов. Программа CALC_SUM достаточно сложная, но хорошо
иллюстрирует мощность вычисляемых полей.
Последовательность создания проекта CALC_SUM:
1. Создайте новый проект (File|New Project) и удалите из него форму (в
Менеджере Проекта View|Project Manager)
2. Выберите эксперта форм БД из меню Help.
. На первом экране,
выберите "Create a
master/detail form" и "Create a form using
TQuery Objects".
4. Нажмите кнопку Next и выберите таблицу ORDERS.DB из псевдонима БД DBDEMOS.
5. Нажмите Next и выберите поля OrderNo, CustNo,
SaleDate, ShipDate и ItemsTotal из таблицы ORDERS.DB.
6. Нажмите Next и выберите "Horizontal" из расстановки
компонентов dbEdit на форме.
. Нажмите Next и выберите таблицу ITEMS.DB.
. В двух следующих экранах выберите все поля из таблицы и
поместите их в grid.
. Нажмите Next и выберите поле OrderNo из Master и Detail
ListBoxes, и Нажмите кнопку Add.
. Нажмите Next и сгенерируйте форму.
Требуется много слов для того, чтобы описать процесс показанный выше, но,
фактически, выполнение команд в Эксперте форм БД легко и интуитивно.
Выделите первый из двух объектов TQuery и установят свойство Active в
True. Для Query2 в свойстве SQL напишите текст запроса:
* from Items I, Parts P
where (I.OrderNo =:OrderNo) and
(I.PartNo=P.PartNo)
Активизируйте объект Query2 (Active установите в True) и вызовите
редактор DataSet (Fields Editor) для него. Вызовите диалог Add Fields и
добавьте поля OrderNo, PartNo, Qty и ListPrice.
Нажмите Define и ведите слово Total в поле FieldName. Установите Field Type в CurrencyField. Проверьте что Calculated CheckBox отмечен. Нажмите Ok и закройте редактор DataSet.
Простой процесс описанный в предыдущем абзаце, показывает как создать
вычисляемое поле. Если посмотреть в DBGrid, то можно видеть, что там теперь
есть еще одно пустое поле. Для того, чтобы поместить значение в это поле,
откройте в Инспекторе Объектов страницу событий для объекта Query2 и сделайте
двойной щелчок на OnCalcFields. Заполните созданный метод так:
TForm2.Query2CalcFields(DataSet:
TDataSet);NewTotalInvoice.Value := 23.0;;
После запуска программы поле Total будет содержит строку $23.00.
Это показывает, насколько просто создать вычисляемое поле, которое
показывает правильно сформатированные данные. На самом деле это поле должно
показывать нечто другое - произведение полей Qty (количество) и ListPrice
(цена). Для этого вышеприведенный код для события OnCalcFields нужно изменить
следующим образом:
procedure TForm1.Query2CalcFields(DataSet:
TDataset);Total.Value:=Query2Qty.Value*Query2ListPrice.Value;
end;
Если теперь запустить программу, то поле Total будет содержать требуемое
значение.
В обработчике события OnCalcFields можно выполнять и более сложные
вычисления (это будет показано позже), однако следует помнить, что это вызывает
соответствующее замедление скорости работы программы.
Теперь давайте добавим вычисляемое поле для первой таблицы (Query1,
ORDERS), которое будет отображать сумму значений из поля Total второй таблицы
(Query2) для данного заказа. Вызовите редактор DataSet для объекта Query1 и
добавьте вычисляемое поле NewItemsTotal типа CurrencyField. В обработчике
события OnCalcFields для Query1 нужно подсчитать сумму и присвоить ее полю NewItemsTotal:
TForm1.Query1CalcFields(DataSet: TDataset);R :
Double;:=0;Query2 do
begin;;;:=R+Query2Total.Value;;EOF;;;;NewItemsTotal.Value:=R;;
В данном примере сумма подсчитывается с помощью простого перебора
записей, это не самый оптимальный вариант - можно, например, для подсчета суммы
использовать дополнительный объект типа TQuery. Метод DisableControls
вызывается для того, чтобы отменить перерисовку DBGrid при сканировании
таблицы. Запрос Query2 переоткрывается для уверенности в том, что его текущий
набор записей соответствует текущему заказу.
Поместите на форму еще один элемент DBEdit и привяжите его к Query1, полю
NewItemsTotal. Запустите программу, ее примерный вид показан на рис.12.19.
Рис. 12.19. Программа CALC_SUM
Как видно из программы, наличие поля ItemsTotal в таблице ORDERS для
данного примера необязательно и его можно было бы удалить (однако, оно
необходимо в других случаях).
Управление TDBGrid во время выполнения
Объект DBGrid может быть полностью реконфигурирован во время выполнения
программы. Вы можете прятать и показывать колонки, изменять порядок показа
колонок и их ширину.
Вы можете использовать свойство Options объекта DBGrid, чтобы изменить ее
представление. Свойство Options может принимать следующие возможные значения: Установлен
по-умолчанию в true, позволяет пользователю редактировать grid. Вы можете также
установить свойство ReadOnly grid в True или False. Будут ли видны названия
колонок. Будут ли видны небольшие иконки слева. Может ли
пользователь менять размер колонки. Показывать ли линии между колонками. Показывать
ли линии между строками. Может ли пользователь использовать tab и shift-tab для
переключения между колонками.
Как объявлено в этой структуре:
TDBGridOption = (dgEditing, gdAlwaysShowEditor, dgTitles,,
dgColumnResize, dgColLines,
dgRowLines, dgTabs);
Например, Вы можете установить опции в Runtime написав такой код:
.Options := [dgTitles, dgIndicator];
Если Вы хотите включать и выключать опции, это можно сделать с помощью
логических операций. Например, следующий код будет добавлять dgTitles к
текущему набору параметров:
DBGrid1.Options := DBGrid1.Options + [dgTitles];
Пусть есть переменная ShowTitles типа Boolean, тогда следующий код
позволяют включать и выключать параметр одной кнопкой:
procedure TForm1.Button3Click(Sender: TObject);ShowTitles
then.Options := DBGrid1.Options + [dgTitles].Options := DBGrid1.Options -
[dgTitles];
ShowTitles := not ShowTitles;;
Если Вы хотите скрыть поле в run-time, то можете установить свойство
visible в false:
Query1.FieldByName(‘CustNo’).Visible := False;
Query1CustNo.Visible := False;
Обе строки кода выполняют идентичную задачу. Чтобы показать поле снова,
установите видимый в true:
Query1.FieldByName(‘CustNo’).Visible := True;
Query1CustNo.Visible := True;
Если Вы хотите изменить положение колонки в Runtime, можете просто
изменить индекс, (первое поле в записи имеет индекс нуль):
Query1.FieldByName(‘CustNo’).Index := 1;CustNo.Index := 2;
По-умолчанию, поле CustNo в таблице Customer является первым. Код в
первой строке перемещает это поле во вторую позицию, а следующая строка
перемещает его в третью позицию. Помните, что нумерация полей начинается с
нуля, так присвоение свойству Index 1 делает поле вторым в записи. Первое поле
имеет Index 0.
Когда Вы изменяете индекс поля, индексы других полей в записи изменяются
автоматически.
Если Вы хотите изменить ширину колонки в Runtime, только измените
свойство DisplayWidth соответствующего TField.
Query1.FieldByName(‘CustNo’).DisplayWidth :=
12;CustNo.DisplayWidth := 12;
Величина 12 относится к числу символов, которые могут быть показаны в
видимом элементе.
Программа DBGR_RT показывает как работать с DBGrid в Runtime. Программа
достаточно проста, кроме двух небольших частей, которые описаны ниже. Первая
часть показывает, как создать check box в Runtime, а вторая показывает, как
изменить порядок пунктов в listbox в Runtime.
При создании формы (событие OnCreate) ListBox заполняется именами полей,
далее создается массив объектов CheckBox, соответствующий полям в таблице.
Сперва все CheckBox’ы выбраны и все поля в таблице видимы. Программа узнает
через TTable1 имена полей и присваивает их свойству Caption соответствующего
CheckBox. Кроме того, обработчику события OnClick всех CheckBox’ов
присваивается процедура ChBClick, которая и включает/выключает поля в DBGrid.
procedure TForm1.FormCreate(Sender: TObject);i : Word;:
Array[0..49] of TCheckBox;
{Fill ListBox}.Clear;i:=0 to Table1.FieldCount-1
do.Items.Add(Table1.Fields[i].FieldName);
{Make CheckBoxes}i:=0 to Table1.FieldCount-1 do begin[I] :=
TCheckBox.Create(Self);[I].Parent := ScrollBox1;[I].Caption :=
Table1.Fields[i].FieldName;[I].Left := 10;[I].Top := I * CheckBox1.Height +
5;[I].Width := 200;[I].Checked := True;[I].OnClick := ChBClick;;
end;
Большая часть кода в этом примере выполняет относительно простые задачи,
типа назначения имен и положений check boxes. Вот две ключевых строки:
[I] := TCheckBox.Create(Self);[I].Parent := ScrollBox1;
Первая строки создает CheckBox с заданным Owner (Владельцем). Вторая строки
назначает Parent (Родителя) для CheckBox. Чтобы понять различия между Родителем
и Владельцем, посмотрите соответствующие свойства в online-help.
Программа содержит ListBox, который показывает текущий порядок полей в
DataSet. Для изменения порядка полей в DataSet (а, следовательно, в DBGrid)
используются две кнопки. При нажатии на одну из кнопок, выбранное в ListBox’е
поле перемещается на одну позицию вверх или вниз. Синхронно с этим меняется и
порядок полей в DBGrid. Код, показанный ниже, изменяет Index поля для Table1,
изменяя, таким образом, позицию поля в DBGrid. Эти изменения касаются только
визуального представления DataSet. Физически данные на диске не изменяются.
procedure TForm1.downButtonClick(Sender: TObject);i :
Integer;ListBox1 do(ItemIndex<Items.Count-1)and(ItemIndex<>-1) then
begin:= ItemIndex;
{move ListBox item}.Move(i, i+1);:= i+1;
{move Field}.Fields[i].Index:=i+1;
end;;
Последняя строка в примере как раз та, которая фактически изменяет индекс
колонки, которую пользователь хочет переместить. Две строки кода
непосредственно перед ней перемещают текущую строку в ListBox на новую позицию.
Внешний вид программы DBGR_RT показан на рис.12.20.
Рис. 12.20. Программа DBGR_RT
Заключение по разделу
Создание СУБД для решения поставленной задачи сводится к следующему:
. Формирование экранной формы для меню.
. Формирование экранной формы для отображения БД. Причем:
· формирование экранной формы для отображения данных одной таблицы;
· формирование экранной формы для отображения 2-х таблиц
(отображение данных двух таблиц без учета связи между ними; отображение данных
таблиц с учетом связи между таблицами);
· включение в состав экранной формы вычисляемого поля;
· создание экранной формы с использованием SQL-запроса.
. Формирования экранной формы для ввода данных в БД с кнопками навигации
и управления состоянием БД.
12.5 Техническое задание
А.1 Основание для разработки
Основанием для разработки является приказ ректора Казахского
национального технического университета на дипломное проектирование.
А.2 Назначение разработки
Функциональное назначение подсистемы состоит в автоматизации функций
работы с базами данных (сбора, обработки, хранения информации) и вывода
необходимой информации.
Эксплуатационное назначение заключается в ее использовании для
автоматизации работы менеджера книжного магазина.
А.3 Требования к программному обеспечению
А.3.1 Требования к функциональным характеристикам ПО;
Подсистема «Автоматизированное рабочее место менеджера книжного магазина»
должна реализовывать функции:
1) Прием прайсов издательств,
обновляемых в среднем каждую неделю;
2) Оповещение потенциальных клиентов об
изменениях в прайсе книжного магазина;
3) Прием и оформление заказов клиентов;
4) Отправление накопившихся заказов
издательствам - поставщикам;
5) Печать необходимой сопровождающей
документации;
A.3.1.1 Входные данные
Входными данными для подсистемы «Автоматизация рабочего места менеджера
книжного магазина» являются все данные, уже имеющиеся в базах данных и тот
набор новых данных, которые требуют ввода.
A.3.1.2 Выходные данные
Выходными данными являются входные данные, но представленные отдельными
группами в виде удобочитаемых форм, а также печатные сопровождающие документы.
А.3.2 Требования к надежности ПО;
Требование устойчивости подсистемы «Автоматизированное рабочее место
менеджера книжного магазина» к неправильному вводу данных и предоставление
возможности корректировки ошибочно введенных данных.
Подсистема «Автоматизированное рабочее место менеджера книжного магазина»
должна обеспечить:
1) защиту от ошибок, которые может
допустить пользователь при работе с программой. Предотвращение совершения
ошибок пользователем организовано посредством простого и понятного интерфейса с
множеством подсказок, что поможет пользователю правильно работать с программой.
2) восстановление информации после
возможного аппаратного или программного сбоя.
А.3.3 Условия эксплуатации
Система «Автоматизированное рабочее место менеджера книжного магазина»
предназначена для широкого круга пользователей.
Для успешной работы с системой «Автоматизированное рабочее место
менеджера книжного магазина» необходимо соблюдение требований к составу и
параметрам технических средств.
А.3.4 Требования к составу и параметрам технических средств
Подсистема «Автоматизированное рабочее место менеджера книжного магазина»
должна устойчиво работать при следующих минимальных параметрах аппаратных
средств: IBM-совместимый компьютер, процессор Intel Pentium с тактовой частотой 300 МГц, 24 Мб оперативной
памяти, монитор VGA, манипулятор “мышь”.
Рекомендуемые параметры аппаратных средств: IBM-совместимый компьютер,
процессор Intel Pentium с тактовой частотой 500 МГц, 128 Мб оперативной памяти,
монитор SVGA, манипулятор “мышь”.
А.3.5 Требования к информационной совместимости ПО
Подсистема «Автоматизированное рабочее место менеджера книжного магазина»
должна быть написана в среде визуального программирования Delphi 5.0 и успешно
работать в любой из операционных систем: Windows 95, Windows 98, Windows NT,
Windows 2000.
А.4 Требования к программной документации
В дипломный проект должны быть включены следующие документы:
Текст программы;
Описание применения;
Руководство системного программиста;
Руководство оператора (пользователя).
А.5 Технико-экономические показатели
При разработке и введении в эксплуатацию подсистемы «Автоматизированное
рабочее место менеджера книжного магазина» необходимо руководствоваться
стоимостными и временными характеристиками и на их основе рассчитать
экономическую эффективность программы.
А.5.1 Годовая потребность в программе
При оценке эффективности функционирования подсистемы «Автоматизированное
рабочее место менеджера книжного магазина» необходимо учитывать то
обстоятельство, что данная разработка должна обеспечить возможность оперативной
и эффективной работы с информацией. Данная система позволит значительно
сократить время, необходимое на обновление и регистрацию данных, которое
затрачивалось при ручном выполнении данных видов работ.
Точная количественная оценка эффективности применения подсистемы
«Автоматизированное рабочее место менеджера книжного магазина» приведена в
разделе «ОЦЕНКА ЭКОНОМИЧЕСКОЙ ЭФФЕКТИВНОСТИ ПРОЕКТА».
А.5.2 Годовая потребность в программе
Подсистема «Автоматизированное рабочее место менеджера книжного магазина»
предназначена для постоянной каждодневной работы.
12.6 Результаты тестирования
При запуске программы происходит запрос коэффициентов:
Рис. 12.21. Программа DB
Затем выводится список книг, составленный из данных прайсов, присылаемых
поставщиками:
Рис. 12.22. База данных
Выбор меню “Файл” - “Заказ…” приводит к появлению окна оформления заказа
клиента:
Рис. 12.23. Заказ клиента
Окно выбора клиента, который делает заказ:
Рис. 12.24. Результатзаказа
Результат заказа - вывод на монитор и на принтер счет-фактуры:
Рис. 12.25. Счет фактура
ЗАКЛЮЧЕНИЕ
При проектировании, написании и отладке программного обеспечения
подсистемы «Автоматизированное рабочее место менеджера книжного магазина» были
реализованы и учтены требования, описанные в основной части пояснительной
записки и технического задания, представленного в приложении А, были
автоматизированы функции сбора, обработки, хранения и выдачи информации по
широкому кругу запросов, которые могут возникнуть при функционировании
делопроизводства.
Достоинства внедрения в эксплуатацию подсистемы «Автоматизированное
рабочее место менеджера книжного магазина» заключаются:
а) в предоставлении возможностей оперативной работы с информацией;
б) в представлении выходных форм ответов на запросы пользователя в наглядном,
удобочитаемом виде;
в) в реализации простого, удобного и в то же время многофункционального
интерфейса со множеством подсказок в помощь оператору;
г) в освобождении менеджера книжного магазина от каждодневной рутинной
работы;
д) в защите информации от потери;
е) в достигаемом годовом экономическом эффекте, рассчитанном в разделе.
Подсистема может быть подвержена дальнейшей разработке при возникновении
необходимости добавления каких-либо функций или для организации еще более
удобного интерфейса пользователя.
СПИСОК ЛИТЕРАТУРЫ
1. Коннолли Т., Бен К. Базы данных:
проектирование, реализация и сопровождение. Теория и практика. - К.; М.; СПб:
Издательский дом «Вильямс», 2000.
2. СНиП II-4-87. Естественное и
искусственное освещение. - Светотехника, № 10, 1987, с. 1-29.
3. ГОСТ 12.1.003-89. ССБТ. Шум. Общие
требования безопасности. - М.: Стандарт, 1989.
4. ГОСТ 12.1.006-89. Электромагнитные
поля радиочастот. Допустимые уровни на рабочих местах и требования к проведению
контроля. - М.: Стандарт, 1989.
5. ГОСТ 12.1.005-91. Микроклимат
производственных помещений. - М.: Стандарт, 1989.
6. СН-4088-86. Санитарные нормы
проектирования промышленных учреждений. - М.: Стройиздат, 1991.
7. ГОСТ 12.1.004-91. Пожарная
безопасность. Общие требования. - М.: Стандарт, 1989.
8. С.Тейксейра, К.Паченко. Borland Delphi 5. Руководство разработчика. - К.; М.; СПб.:
Издательский дом «Вильямс», 2000.
9. Кэнту М. Delphi 4 для профессионалов - СПб: Питер, 1999.