Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ
Курсовая работа по дисциплине
на тему: «Определение стоимости поставок товара на склад»
Выполнил студент 3 курса |
Кондаков Сергей Сергеевич |
Шифр 0515-п/ЭИ-1132 |
Москва, 2008
[0.1] ВЫСОКОУРОВНЕВЫЕ МЕТОДЫ ИНФОРМАТИКИ [0.2] И ПРОГРАММИРОВАНИЯ [1] Содержание [2] 1. Экономико-организационная постановка задачи. [3] 2. Структура проектируемой базы данных. [4] 3. Описание технических и программных средств [5] 4. Архитектура проекта [5.1] 4.1. Основные понятия и принципы системы Delphi 7. [5.1.1] 4.1.1 Среда Delphi 7 и ее составляющие. [5.1.2] 4.1.2. Компонентный подход. [6] 4.2 Описание модулей проекта [7] 5.1. Создание базы данных программными средствами. [7.1] 5.1.1. Создание базы данных [7.2] 5.1.2. Программа SQL Explorer [7.3] 5.1.3. Программа Database Desktop [8] 5.2. Создание программы в системе Delphi 7 [8.1] 5.2.1 Создание модуля данных [8.2] 5.2.2 Создание SQL-запросов к базе данных [8.3] 5.2.3. Создание основного модуля [8.4] 5.2.4. Создание модуля редактирования таблиц [8.5] 5.2.5. Создание модуля стоимости поставок и предварительного просмотра [9] 6.1. Листинг текста программы и формы модулей [10] 6.2. Результат работы программы [11] Используемая литература |
Целью работы является создание программного проекта, моделирующего работу реального объекта - склада товаров.
На складе магазина хранятся товары, из различных фирм, так что один и тот же товар может иметь различную оптовую цену, определяемую фирмой. Товары со склада отпускаются по розничной цене фирмам-клиентам, так что одна и та же фирма может быть и поставщиком (по одному виду товаров) и клиентом (по другому виду товаров). Необходимо вести учет поставки товаров на склад и определять стоимость поставки товаров в разрезе поставщиков и дат поставки. Период полученных показателей равен кварталу. Показатели выдаются в виде отчета в табличной форме.
База данных задачи представляет собой четыре входных таблицы, связанных между собой по внешним ключам (табл. 1-4). Структура и описание таблиц базы данных представлены ниже (рис. 1).
Таблица 1. Postavka
Имя поля |
Тип данных |
Длина поля |
Примечание |
Tip |
N |
1-приход, 0-расход |
|
Ntovar |
N |
Код товара |
|
Kol |
N |
Количество товара |
|
Nfirm |
N |
Код фирмы |
|
Dat |
D |
8 |
Дата поставки/отправки |
Таблица 2. Reestr
Имя поля |
Тип данных |
Длина поля |
Примечание |
Nfirm |
N |
Код фирмы |
|
Ntovar |
N |
Код товара |
|
Opt |
N |
Оптовая цена за ед. измерения |
|
Rozn |
N |
Розничная цена за ед. измерения |
Таблица 3. Tovar
Имя поля |
Тип данных |
Длина поля |
Примечание |
Ntovar |
N |
Код товара |
|
Tovar |
A |
15 |
Наименование товара |
Таблица 4. Firma
Имя поля |
Тип данных |
Длина поля |
Примечание |
Nfirm |
N |
Код фирмы |
|
Firma |
A |
8 |
Наименование фирмы |
Adres |
A |
12 |
Адрес фирмы |
В таблице Postavka храниться информация о факте поставки/отправки товара. Таблица Reestr содержит информацию об оптовой и розничной цене товаров поступающих от различных фирм. Списки всех товаров и фирм хранятся соответственно в таблицах Tovar и Firma. Ключевые поля таблиц выделены в схеме данных жирным цветом.
Tovar |
Postavka |
Reestr |
Firma |
|
Рис. 1 Схема данных
Результативная информация представляет собой таблицу StPost (таб. 5), получаемую в результате SQL-запроса к входным таблицам. В таблице содержится информация о стоимости поставок товаров за 1-й квартал 2008 года.
Таблица 5. StPost
Имя поля |
Тип данных |
Длина поля |
Примечание |
Tovar |
A |
15 |
Наименование товара |
Firma |
A |
8 |
Наименование фирмы поставщика |
Dat |
D |
8 |
Дата поставки |
Summa |
N |
Стоимость товара |
В качестве программной среды разработки выбрана объектно-ориентированная среда Delphi 7. Таблицы базы данных хранятся в формате Paradox, доступ к которым осуществляется с использованием технологии BDE.
Минимальные системные требования для компьютера, на котором может быть решена задача:
- Операционная система Windows 98, 2000, XP;
- Процессор с частотой 166 МГц, 32 разрядный, x86-совместимый;
- Оперативная память объемом 128 Мб;
- VGA совместимый монитор;
- Мышь или другое указывающее устройство.
Среда Delphi 7 представляет собой интегрированную оболочку разработчика, в которую входи набор специальных программ, ответственных за разные этапы создания готового приложения (рис. 2).
Исходный текст программы готовиться в среде Delphi 7 с помощью встроенного редактора исходных текстов. Этот редактор специализирован. Он отличается гибкими возможностями цветового выделения различных элементов текста программы (ключевых слов, названий, операций, чисел и строк) и предоставляет возможность быстрого ввода часто встречающихся конструкций.
Левая панель редактора представляет собой Проводник, позволяющий быстро перемещаться между частями исходного текста и по структуре создаваемой программы.
Важнейшая характеристика разрабатываемой программы удобство ее пользовательского интерфейса, наличие и доступность необходимых элементов управления. В среде Delphi 7 имеется специальный проектировщик форм, с помощью которого окна бедующей программы подготавливаются в виде форм. Проектировщик позволяет подобрать оптимальные размеры окон, разместить и настроить всевозможные элементы управления и меню, добавить готовые изображения, указать заголовки, подсказки, подписи и так далее.
Рис. 2. Основные окна системы Delphi 7
На этапе проектирования форм программа как бы составляется из готовых компонентов частей машинного кода, которые можно добавлять к ней с помощью всего нескольких щелчков мыши. Компоненты располагаются на палитре компонентов, разделенной на несколько самостоятельных панелей (рис. 3).
Рис. 3. Палитра компонентов
Компоненты обладают наборами свойств, характеризующими их отличительные особенности. Некоторые свойства имеются практически у всех компонентов таково например свойство Name (Имя). Другие свойства, например Caption (Заголовок) имеются у большинства компонентов ведь заголовок необходим и для окна, и для кнопки. Некоторые свойства уникальны для конкретных компонентов, например SimpleText (Простой текст), содержащее текст для компонента Строка состояния.
Свойства компонентов в процессе проектирования форм настраиваются с помощью Инспектора объектов. Это специальная программа, показывающая список всех свойств данного компонента, отсортированных по категориям или в алфавитном порядке.
Значение любого свойства можно изменить, введя в соответствующее поле Инспектора объектов новую строку или выбрав нужное значение в раскрывающемся списке доступных значений. Некоторые свойства содержат вложенные подсвойства, например свойство Font (Шрифт) характеризуется размером, стилем, цветом, гарнитурой. Такие свойства удобнее редактировать с помощью специальных редакторов, как стандартных (шрифт), так и специально разработанных для конкретного компонента.
Помимо свойств, компоненты содержат методы программный код, обрабатывающий значения свойств (например, устанавливающий переключатель в нужное положение), а также события сообщения, которые компонент принимает от приложения, если во время работы программы выполняется определенное действие (например, изменяется состояние флажка). Программист может самостоятельно формировать реакции программы на любые события каждого компонента.
Правильно подбирая компоненты и настраивая их совместную работу путем использования свойств, предназначенных для связи компонентов друг с другом, нередко удается создать приложение, не написав вручную ни сточки исходного текста. В системе Delphi 7 существуют сотни готовых компонентов, и при решении многих задач бывает полезно предварительно поискать нужный компонент (например, в Интернете) вместо того, чтобы выполнить работу по программированию, возможно, уже сделанную другими людьми. Компонентный подход к созданию программ позволяет повторно использовать готовые разработки и во многих случаях значительно повышает эффективность труда.
Потребность в ручном программировании возникает, только когда обойтись готовыми компонентами не удается. В вышеприведенном примере поля ввода А1, А2 и поле для вывода итогового результата А3 можно представить в виде стандартных компонентов Delphi 7, но чтобы сложение введенных чисел, необходим соответствующий оператор в тексте программы, срабатывающий, например, по щелчку на компоненте-кнопке.
Проект составлен из шести модулей и форм.
1. Основной модуль
Основной модуль реализует возможность просмотра и редактирования таблицы Postavka. На форме основного модуля (рис. 4) находится компонент, позволяющий отображать и редактировать таблицу DBGrid1 (TDBGrid) и компонент для редактирования DBNavigator1 (TDBNavigator). В верхней части формы находиться главное меню, компонент MainMenu1 (TMainMenu).
Рис. 4. Форма основного модуля
Главное меню формы содержит следующие пункты:
Файл->Выход выход из программы;
Таблицы->Реестр открытие формы для просмотра таблицы Reestr;
Таблицы->Товары открытие формы для просмотра таблицы Tovar;
Таблицы->Фирмы открытие формы для просмотра таблицы Firm;
Отчет->Поставка товаров открытие формы для просмотра и вывода на печать результирующей таблицы StPost.
2. Модуль данных
Рис. 5. Модуль данных
Модуль данных необходим для компактного размещения компонентов для доступа к таблицам базы данных, он содержит следующие компоненты:
Database (TDatabase) реализует доступ к файлам базы данных через метку в системе BDE;
tFirm, tPostavka, tReestr, tTovar (TTable) компоненты для доступа к таблицам базы данных: Firm, Postavka, Reestr, Tovar.
qStPost, qSumPost (TQuery) компоненты формирующие запрос к базе данных для результирующего отчета.
dsFirma, dsPostavka, dsReestr, dsTovar, dsStPost, dsSumPost (TDataSource) реализуют интерфейс источника данных, необходимый для связи визуальных компонентов позволяющих отображать и редактировать таблицы базы данных с компонентами доступа к базе данных - TTable.
3. Модуль редактирования таблиц
Модуль редактирования таблиц реализует возможность просмотра и редактирования таблиц Firma, Tovar и Reestr. На форме модуля редактирования таблиц (рис. 6) находится компонент, позволяющий отображать и редактировать таблицы dbgTable (TDBGrid) и компонент для редактирования dbnTable (TDBNavigator). Кнопка ОК компонент Button1 (TButton), позволяет закрыть форму модуля редактирования таблиц.
Рис. 6. Форма модуля редактирования таблиц
4. Модуль стоимости поставок
Модуль стоимости поставок (Рис. 7) реализует возможность просмотра результирующей таблицы StPost.
Рис. 7. Модуль стоимости поставок
На форме модуля стоимости поставок (рис. 7) находится компонент, позволяющий отображать результирующую таблицу DBGrid1 (TDBGrid) и компонент для перемещения по таблице DBNavigator1 (TDBNavigator). Кнопка ОК компонент Button1 (TButton), позволяет закрыть форму модуля стоимости поставок. При щелчке на Печать компонент Button2 (TButton), открывается форма модуля предварительного просмотра. В компоненте DBText1 (TDBText) выводятся результаты запроса компонента qSumPost в модуле данных.
5. Модуль предварительного просмотра
На форме модуля предварительного просмотра (рис. 8) находятся компоненты реализующие возможность предварительного просмотра результирующей таблицы StPost:
qrPreview (TQuickRep) виртуальный образ бумажного листа, который в дальнейшем воспроизводится на принтере.
QRLabel1 QRLabel6 предназначен для создания в отчете всевозможных текстовых подписей. Компонент QRLabel1 отображает заголовок печатного листа. QRLabel2 QRLabel5 отображают заголовки столбцов результирующей таблицы. QRLabel6 выводит на печать надпись «Итого:».
qrdbTovar, qrdbFirma, qrdbDat, qrdbSumma выводят на печать занчения полей результирующей таблицы.
qreSumma выводят на печать результат запроса компонента qSumPost, сумма поставок товаров за 1-й квартал 2008-го года.
QRBand1 QRBand4 реализуют группировку в отчете элементов оформления.
Рис. 8. Форма модуля предварительного просмотра
5. Алгоритм и технология решения задачи
В качестве базы данных используем локальную базу данных в Paradox. Для создания базы данных воспользуемся программами SQL Explorer и Database Desktop.
Создадим на локальном диске папку, где будет располагаться наша база. Зададим метку базы (Alias). Для этого войдем в меню Database системы Delphi 7 и выберем пункт Explor.
В запущенной программе SQL Explorer выберем пункт меню Object->New и выберем тип базы данных STANDART. На вкладке Databases в дереве меток появится новая метка STANDART1. Зададим её новое имя в SKLAD. В окне свойств метки (рис. 9), в свойстве PATH зададим путь к созданной папке базы. Для сохранения метки выберем пункт меню Object->Apply и в появившемся диалоговом окне нажмем кнопку OK.
Рис. 9. Программа SQL Explorer
После создания метки базы данных можно с помощью программы Database Desktop описать таблицы базы данных. Для запуска программы в меню системы Delphi 7 выберем пункт Tools->Database Desktop.
В меню File программы Desktop выберем опцию Working Directory (рабочая директория) и назначим ей путь к папке базы. Зададим метку нашей базы Aliases: SKLAD и нажмем кнопку OK. В меню File выберем пункт New->Table. В появившемся диалоговом окне выберем тип базы данных Paradox 7 и нажмем кнопку OK. В появившемся диалоговом окне опишем таблицу Tovar согласно проекту. Пометим ключевое поле Ntovar звездочкой в столбце Key. После описания структуры таблицы сохраним её, нажав кнопку «Save As» и задав имя таблицы Tovar. Таким же образом создадим таблицы Firma, Postavka и Reestr.
Далее необходимо занести данные, в каждую таблицу выбрав пункт меню File->Open->Table. В открытой таблице необходимо включить режим редактирования, выбрав в меню Table опцию Edit Data. После занесения данных таблицу необходимо закрыть пунктом меню File->Close. Ниже приведены таблицы с данными, которые необходимо занести в базу данных.
Таблица 6. Postavka
№ п/п |
Ntovar |
Tip |
Kol |
Nfirm |
Dat |
1 |
10 |
1 |
100,00 |
1 |
01.01.08 |
2 |
11 |
0 |
212,00 |
2 |
05.01.08 |
3 |
12 |
1 |
178,00 |
1 |
12.01.08 |
4 |
13 |
0 |
213,00 |
3 |
23.01.08 |
5 |
14 |
0 |
145,00 |
2 |
30.01.08 |
6 |
15 |
1 |
189,00 |
1 |
02.02.08 |
7 |
16 |
0 |
165,00 |
2 |
07.02.08 |
8 |
17 |
0 |
231,00 |
4 |
11.02.08 |
9 |
18 |
1 |
432,00 |
3 |
15.03.08 |
10 |
19 |
1 |
256,00 |
2 |
23.03.08 |
11 |
20 |
1 |
300,00 |
4 |
19.02.08 |
12 |
21 |
1 |
232,00 |
5 |
21.02.08 |
13 |
22 |
1 |
144,00 |
6 |
23.02.08 |
Таблица 7. Reestr
№ п/п |
Nfirm |
Ntovar |
Opt |
Rozn |
1 |
1 |
10 |
120,00 |
140,00 |
2 |
2 |
11 |
128,00 |
136,00 |
3 |
1 |
12 |
100,00 |
123,00 |
4 |
3 |
13 |
98,00 |
104,00 |
5 |
2 |
14 |
120,00 |
130,00 |
6 |
1 |
15 |
200,00 |
240,00 |
7 |
2 |
16 |
220,00 |
250,00 |
8 |
4 |
17 |
180,00 |
210,00 |
9 |
3 |
18 |
90,00 |
100,00 |
10 |
2 |
19 |
160,00 |
180,00 |
11 |
4 |
20 |
222,00 |
233,00 |
12 |
5 |
21 |
333,00 |
344,00 |
13 |
6 |
22 |
444,00 |
455,00 |
Таблица 8. Firma
№ п/п |
Nfirm |
Firma |
Adres |
1 |
1 |
VENUS |
Moskva |
2 |
2 |
ALFA |
Minsk |
3 |
3 |
COBRA |
Moskva |
4 |
4 |
BARRO |
Riga |
5 |
5 |
CODAK |
Rgev |
6 |
6 |
DELTA |
Kiev |
7 |
7 |
GAMMA |
Moskva |
8 |
8 |
BETA |
Kiev |
9 |
9 |
ARGO |
Riga |
10 |
10 |
BRIGET |
Minsk |
Таблица 9. Tovar
№ п/п |
Ntovar |
Name |
1 |
10 |
brus1 |
2 |
11 |
brus2 |
3 |
12 |
doska1 |
4 |
13 |
brus3 |
5 |
14 |
doska2 |
6 |
15 |
vagonka1 |
7 |
16 |
vagonka2 |
8 |
17 |
vagonka4 |
9 |
18 |
doska3 |
10 |
19 |
rama2 |
11 |
20 |
okno1 |
12 |
21 |
okno2 |
13 |
22 |
okno3 |
Для создания модуля данных выберем пункт меню File->New->Data Module. Зададим имя модуля данных (свойство Name) DataUnit.
В палитре компонентов перейдем на закладку BDE и поместим на форму модуля данных компонент TDatabase, зададим ему значения свойств как в таблице 10.
Таблица 10. Компонент TDatabase
Свойства компонента |
Присваиваемое значение |
AliasName |
SKLAD |
Connected |
True |
DatabaseName |
SKLAD |
Name |
Database |
Поместим на форму модуля данных четыре компонента TTable, по одному на каждую таблицу базы, и заполним их свойства в соответствии с таблицей 11.
Таблица 11. Компонент TTable
Имя компонента |
Свойство компонента |
Присваимое значение |
tFirma |
Active |
True |
DatabaseName |
SKLAD |
|
TableName |
Firma.DB |
|
tPostavka |
Active |
True |
DatabaseName |
SKLAD |
|
TableName |
Postavka.DB |
|
tReestr |
Active |
True |
DatabaseName |
SKLAD |
|
TableName |
Reestr.DB |
|
tTovar |
Active |
True |
DatabaseName |
SKLAD |
|
TableName |
Tovar.DB |
Для реализации запроса к базе, поместим на форму модуля данных два компонента TQuery. Зададим им следующие имена: qStPost, qSumPost. Установим свойство DatabaseName этих компонент значением SKLAD.
Для связи визуальных компонент с таблицами базы и компонентами формирующими запросы необходимо реализовать интерфейс источника данных, поместив на форму модуля данных 6 компонентов типа TDataSource. Зададим имена и значения свойства DataSet в соответствии с таблицей 12.
Таблица 12. Компонент TDataSource
Имя компонента |
Значение свойства DataSet |
dsFirma |
tFirma |
dsPostavka |
tPostavka |
dsReestr |
tReestr |
dsTovar |
tTovar |
dsStPost |
qStPost |
dsSumPost |
qSumPost |
Рост количества данных, необходимость их хранения и обработки привели к тому, что возникла потребность в создании стандартного языка баз данных, который мог бы функционировать в многочисленных компьютерных системах различных видов. Действительно, с его помощью пользователи могут манипулировать данными независимо от того, работают ли они на персональном компьютере, сетевой рабочей станции или универсальной ЭВМ.
Одним из языков, появившихся в результате разработки реляционной модели данных, является язык SQL (Structured Query Language), который в настоящее время получил очень широкое распространение и фактически превратился в стандартный язык реляционных баз данных. Стандарт на язык SQL был выпущен Американским национальным институтом стандартов (ANSI) в 1986 г., а в 1987 г. Международная организация стандартов (ISO) приняла его в качестве международного. Нынешний стандарт SQL известен под названием SQL/92.
С использованием любых стандартов связаны не только многочисленные и вполне очевидные преимущества, но и определенные недостатки. Прежде всего, стандарты направляют в определенное русло развитие соответствующей индустрии; в случае языка SQL наличие твердых основополагающих принципов приводит, в конечном счете, к совместимости его различных реализаций и способствует как повышению переносимости программного обеспечения и баз данных в целом, так и универсальности работы администраторов баз данных. С другой стороны, стандарты ограничивают гибкость и функциональные возможности конкретной реализации. Под реализацией языка SQL понимается программный продукт SQL соответствующего производителя. Для расширения функциональных возможностей многие разработчики, придерживающиеся принятых стандартов, добавляют к стандартному языку SQL различные расширения. Следует отметить, что стандарты требуют от любой законченной реализации языка SQL наличия определенных характеристик и в общих чертах отражают основные тенденции, которые не только приводят к совместимости между всеми конкурирующими реализациями, но и способствуют повышению значимости программистов SQL и пользователей реляционных баз данных на современном рынке программного обеспечения.
Все конкретные реализации языка несколько отличаются друг от друга. В интересах самих же производителей гарантировать, чтобы их реализация соответствовала современным стандартам ANSI в части переносимости и удобства работы пользователей. Тем не менее каждая реализация SQL содержит усовершенствования, отвечающие требованиям того или иного сервера баз данных. Эти усовершенствования или расширения языка SQL представляют собой дополнительные команды и опции, являющиеся добавлениями к стандартному пакету и доступные в данной конкретной реализации.
В настоящее время язык SQL поддерживается многими десятками СУБД различных типов, разработанных для самых разнообразных вычислительных платформ, начиная от персональных компьютеров и заканчивая мейнфреймами.
Все языки манипулирования данными, созданные для многих СУБД до появления реляционных баз данных, были ориентированы на операции с данными, представленными в виде логических записей файлов. Разумеется, это требовало от пользователя детального знания организации хранения данных и серьезных усилий для указания того, какие данные необходимы, где они размещаются и как их получить.
Язык SQL ориентирован на операции с данными, представленными в виде логически взаимосвязанных совокупностей таблиц-отношений. Важнейшая особенность его структур ориентация на конечный результат обработки данных, а не на процедуру этой обработки. Язык SQL сам определяет, где находятся данные, индексы и даже какие наиболее эффективные последовательности операций следует использовать для получения результата, а потому указывать эти детали в запросе к базе данных не требуется.
Для получения результирующей таблицы StPost на основе входных, создадим запрос к базе данных, для этого выберем свойство SQL компонента qStPost и введем следующий текст:
SELECT Tovar.Tovar, Firma.Firma, Postavka.Dat, Postavka.Kol * Reestr.Opt AS Summa
FROM "Firma.DB" Firma
INNER JOIN "Postavka.DB" Postavka
ON (Firma.Nfirm = Postavka.Nfirm)
INNER JOIN "Tovar.DB" Tovar
ON (Tovar.Ntovar = Postavka.Ntovar)
INNER JOIN "Reestr.DB" Reestr
ON (Reestr.Ntovar = Postavka.Ntovar)
AND (Reestr.Nfirm = Postavka.Nfirm)
WHERE (Postavka.Tip = 1)
AND (Postavka.Dat >= '01/01/2008')
AND (Postavka.Dat < '04/01/2008')
После внесения текста запроса установим свойство Active компонента qStPost значение True.
В компонент qSumPost внесем текст запроса необходимый для вычисления общей суммы поставки товаров за 1-й квартал 2008-го года:
SELECT SUM( Postavka.Kol * Reestr.Opt ) Summa
FROM "Reestr.DB" Reestr
INNER JOIN "Postavka.DB" Postavka
ON (Reestr.Ntovar = Postavka.Ntovar)
AND (Reestr.Nfirm = Postavka.Nfirm)
WHERE (Postavka.Dat >= '01/01/2008')
AND (Postavka.Dat < '04/01/2008')
AND (Postavka.Tip = 1)
Форма основного модуля по умолчанию создается вместе с проектом. Поместим на него компоненты, необходимые для отображения и редактирования таблицы Postavka: TDBGrid, TDBNavigator,- и настроим их в окне инспектора объектов согласно приведенной ниже таблице.
Талица 13.
Имя и класс компонента |
Свойство компонента |
Присваиваемое значение |
DBGrid1: TDBGrid |
DataSource |
DataUnit.dsPostavka |
DBNavigator1: TDBNavigator |
DataSource |
DataUnit.dsPostavka |
Далее поместим на форму компонент TMainMenu, необходимого для создания главного меню формы.
В редакторе меню создадим пункт Файл->Выход и введем в обработчик событий текст, закрывающий программу, при выборе пункта меню:
procedure TfmPostavka.N2Click(Sender: TObject);
begin
if CloseQuery then Application.Terminate;
end;
Для отображения формы редактирования таблиц создадим пункты меню: Таблицы->Реестр, Таблицы->Поставка и Таблицы->Товары,- и для каждого из них зададим обработчик настраивающий форму на соответствующую таблицы:
procedure TfmPostavka.N4Click(Sender: TObject);
begin
fmEditTable.Caption := 'Таблица Tovar';
fmEditTable.dbgTable.DataSource := DataUnit.dsTovar;
fmEditTable.dbnTable.DataSource := DataUnit.dsTovar;
fmEditTable.ShowModal;
end;
procedure TfmPostavka.N5Click(Sender: TObject);
begin
fmEditTable.Caption := 'Таблица Firma';
fmEditTable.dbgTable.DataSource := DataUnit.dsFirma;
fmEditTable.dbnTable.DataSource := DataUnit.dsFirma;
fmEditTable.ShowModal;
end;
procedure TfmPostavka.N8Click(Sender: TObject);
begin
fmEditTable.Caption := 'Таблица Reestr';
fmEditTable.dbgTable.DataSource := DataUnit.dsReestr;
fmEditTable.dbnTable.DataSource := DataUnit.dsReestr;
fmEditTable.ShowModal;
end;
Для просмотра и редактирования таблиц Tovar, Firma, Reestr создадим форму редактирования таблиц выбрав пункт меню: File->New->Form. Зададим имя формы fmEditTable и поместим на форму компоненты для доступа к таблицам базы данных: dbgTable (TDBGrig) и dbnTable (TDBNavigator).
Установим в правом нижнем углу кнопку Button1 (TButton) с заголовком OK и свойством ModalResult mrOK. При щелчке на кнопке будет происходить закрытие формы редактирования таблиц.
Выберем пункт меню File->New->Form и зададим имя новой формы fmStForm. Создадим в форме основного модуля пункт меню Отчеты->Поставка товаров и зададим обработчик для открытия созданной формы:
procedure TfmPostavka.N10Click(Sender: TObject);
begin
fmStForm.ShowModal;
end;
На форму поместим компоненты указанные в таблице 14 и зададим им соответствующие свойства.
Таблица 14.
Имя и класс компонента |
Свойство компонента |
Присваиваемое значение |
DBGrid1: TDBGrid |
DataSource |
DataUnit.dsStPost |
DBNavigator1: TDBNavigator |
DataSource |
DataUnit.dsStPost |
Label1: TLabel |
Caption |
Итого: |
DBText1: TDBText |
DataField |
Summa |
DataSource |
DataUnit.dsSumPost |
|
Button1: TButton |
Caption |
OK |
ModalResult |
mrOK |
|
Button2: TButton |
Caption |
Печать |
Для кнопки Печать зададим обработчик вызывающий форму предварительного просмотра:
procedure TfmStForm.Button2Click(Sender: TObject);
begin
fmPreviewReport.qrPreview.Preview;
end;
Для размещения компонентов необходимых для предварительного просмотра печатного листа создадим новую форму и разместим на ней компонент генератра отчетов TQuickRep и настроим его, задав имя qrPreview и установив свойство DataSet значением DataUnit.qStPost. Настроим свойство Font на русский язык, нажав TFont и выбрав кириллицу и нужный размер шрифта.
Перейдем на форму разместим на ней компонент TQRBand (в виде полосы) из вкладки QReport. Настроим его задав тип полосы в свойстве BandTitle: rbTitle (заголовок) и настроив свойтво Font на русский язык как написано выше. Щелкнем мышью на полосе заголовка и разместим на ней компонент метки (TQRLabel) и зададим ему заголовок «Поставка товаров» через свойства Caption и Font.
Щелкнем мышью под полосой заголовка в области отчета и поместим там еще один компонент TQRBand, которому определим свойство BandType: rbColumnHeader (заголовок столбцов). Поместим на этой полосе метки заголовков столбцов (TQRLabel) и дадим им имена аналогично настройке метки заголовка отчета.
Опять щелкнем ниже этой полосы в области отчета и поместим там еще один компонент TQRBand со свойством BandType: rbDetail (это полоса строки таблицы). На этой полосе разместим компоненты QRDBText по числу выводимых полей и настроим в каждом компоненте свойства: источник данных DataSet: DataUnit. qStPost, имя поля DataField (для каждого компонента свое имя) и Font с кириллицей.
Щелкнем опять в области отчета и разместим последнюю полосу TQRBand со свойством BandType: rbSummary для печати итогов. На этой полосе разместим компонент метки (TQRLabel) с заголовком «Итого:» и еще один компонент TQRExpr со свойством агрегатной функции Expression: Sum(DataUnit.qStPost.Summa).
6. Результаты проекта
Модуль проекта программы
program KURS;
uses
Forms,
fmMain in 'fmMain.pas' {fmPostavka},
duMain in 'duMain.pas' {DataUnit: TDataModule},
fmTable in 'fmTable.pas' {fmEditTable},
fmAbout in 'fmAbout.pas' {fmAboutProg},
fmPreview in 'fmPreview.pas' {fmPreviewReport},
fmStPost in 'fmStPost.pas' {fmStForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfmPostavka, fmPostavka);
Application.CreateForm(TDataUnit, DataUnit);
Application.CreateForm(TfmEditTable, fmEditTable);
Application.CreateForm(TfmAboutProg, fmAboutProg);
Application.CreateForm(TfmPreviewReport, fmPreviewReport);
Application.CreateForm(TfmStForm, fmStForm);
Application.Run;
end.
Основной модуль
unit fmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, Menus, ExtCtrls, DBCtrls;
type
TfmPostavka = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N10Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmPostavka: TfmPostavka;
implementation
uses duMain, fmTable, fmAbout, fmStPost;
{$R *.dfm}
procedure TfmPostavka.N2Click(Sender: TObject);
begin
if CloseQuery then Application.Terminate;
end;
procedure TfmPostavka.N4Click(Sender: TObject);
begin
fmEditTable.Caption := 'Таблица Tovar';
fmEditTable.dbgTable.DataSource := DataUnit.dsTovar;
fmEditTable.dbnTable.DataSource := DataUnit.dsTovar;
fmEditTable.ShowModal;
end;
procedure TfmPostavka.N5Click(Sender: TObject);
begin
fmEditTable.Caption := 'Таблица Firma';
fmEditTable.dbgTable.DataSource := DataUnit.dsFirma;
fmEditTable.dbnTable.DataSource := DataUnit.dsFirma;
fmEditTable.ShowModal;
end;
procedure TfmPostavka.N7Click(Sender: TObject);
begin
fmAboutProg.ShowModal();
end;
procedure TfmPostavka.N8Click(Sender: TObject);
begin
fmEditTable.Caption := 'Таблица Reestr';
fmEditTable.dbgTable.DataSource := DataUnit.dsReestr;
fmEditTable.dbnTable.DataSource := DataUnit.dsReestr;
fmEditTable.ShowModal;
end;
procedure TfmPostavka.N10Click(Sender: TObject);
begin
fmStForm.ShowModal;
end;
end.
Рис 10. Форма основного модуля
Модуль редактирования таблиц
unit fmTable;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids;
type
TfmEditTable = class(TForm)
dbgTable: TDBGrid;
dbnTable: TDBNavigator;
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmEditTable: TfmEditTable;
implementation
uses duMain;
{$R *.dfm}
end.
Рис 11. Таблица Reestr
Рис 12. Таблица Tovar
Рис 13. Таблица Firma
Модуль стоимости поставок
unit fmStPost;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;
type
TfmStForm = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Label1: TLabel;
Button1: TButton;
DBText1: TDBText;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmStForm: TfmStForm;
implementation
uses duMain, fmPreview;
{$R *.dfm}
procedure TfmStForm.Button2Click(Sender: TObject);
begin
fmPreviewReport.qrPreview.Preview;
end;
end.
Рис 14. Форма модуля стоимости поставок
Модуль предварительного просмотра
unit fmPreview;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, QuickRpt, QRCtrls, DB, DBTables;
type
TfmPreviewReport = class(TForm)
qrPreview: TQuickRep;
QRBand1: TQRBand;
QRLabel1: TQRLabel;
QRBand2: TQRBand;
QRLabel2: TQRLabel;
QRLabel3: TQRLabel;
QRLabel4: TQRLabel;
QRLabel5: TQRLabel;
QRBand3: TQRBand;
qrdbTovar: TQRDBText;
qrdbFirma: TQRDBText;
qrdbData: TQRDBText;
qrdbSumma: TQRDBText;
QRBand4: TQRBand;
QRLabel6: TQRLabel;
qreSumma: TQRExpr;
qStPost: TQuery;
qStPostTovar: TStringField;
qStPostFirma: TStringField;
qStPostDat: TDateField;
qStPostSumma: TFloatField;
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmPreviewReport: TfmPreviewReport;
implementation
uses duMain;
{$R *.dfm}
end.
Модуль данных
unit duMain;
interface
uses
SysUtils, Classes, DB, DBTables, DBClient;
type
TDataUnit = class(TDataModule)
Database: TDatabase;
tFirma: TTable;
tPostavka: TTable;
tReestr: TTable;
tTovar: TTable;
dsFirma: TDataSource;
dsPostavka: TDataSource;
dsReestr: TDataSource;
dsTovar: TDataSource;
tFirmaNfirm: TIntegerField;
tFirmaFirma: TStringField;
tFirmaAdres: TStringField;
tPostavkaTip: TIntegerField;
tPostavkaNtovar: TIntegerField;
tPostavkaKol: TFloatField;
tPostavkaNfirm: TIntegerField;
tPostavkaDat: TDateField;
tReestrNfirm: TIntegerField;
tReestrNtovar: TIntegerField;
tReestrOpt: TFloatField;
tReestrRozn: TFloatField;
tTovarNtovar: TIntegerField;
tTovarTovar: TStringField;
qStPost: TQuery;
qStPostTovar: TStringField;
qStPostFirma: TStringField;
qStPostDat: TDateField;
qStPostSumma: TFloatField;
dsStPost: TDataSource;
qSumPost: TQuery;
qSumPostSumma: TFloatField;
dsSumPost: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataUnit: TDataUnit;
implementation
{$R *.dfm}
end.
Рис 15. Форма модуля предварительного просмотра