Информационная система 'Учет товаров на складе'
Введение
Информационная система (ИС) «Учет товаров на
складе» предназначена для автоматизации деятельности зав. складом по учету
товаров на складе. Система ориентирована на применение на оптово-розничных
складах и позволяет учитывать наличие товара на складе, его поступление, расход
и общую стоимость с учетом закупочной и отпускной цены.
В ИС предусмотрены следующие функции:
ведение базы данных (БД);
формирование отчетов;
формирование справок.
Соответственно ИС состоит из БД и следующих
подсистем:
управления БД;
ведения БД;
формирования справок;
формирования отчетов по продаже и поступлению
товаров.
Информационная система реализована в среде
визуального программирования Delphi 6.0 с применением БД в формате Paradox 7.0,
которая имеет формат .db и разработана с помощью утилиты Database Desktop.
БД состоит из 3 взаимосвязанных таблиц: «Товар»,
«Поступление товара», «Продажа товара».
Подсистема формирования справок позволяет
формировать справки в реальном масштабе времени.
Подсистема отчетов позволяет вывести данные о
поступлении и продаже товара в документ Microsoft Word в виде таблицы.
Подсистема ведения БД предназначена для ввода и
редактирования данных в таблицах «Товар», «Поступление товара», «Продажа
товара».
1. База
данных
.1 Проектирование базы данных
Проектирование БД «учет товаров на складе»
состоит из следующих шагов.
Анализ предметной области.
Концептуальное проектирование
Логическое проектирование
Физическое проектирование
Анализ предметной области включает в себя:
идентификацию функциональной деятельности Вашей
предметной области.
идентификацию объектов, которые осуществляют эту
функциональную деятельность, и формирование из их операций последовательности
событий, которые помогут Вам идентифицировать все сущности и взаимосвязи между
ними. Например, процесс «учета товара на складе» идентифицируют такие сущности
как ТОВАР, КОНТРАГЕНТ, ПРАЙС.
идентификацию характеристик этих сущностей.
Например, сущность КОНТРАГЕНТ может включать такие характеристики как ИНН,
Телефон, Расчетный Счет, Банк и т.п.
иерархию между объектами.
Проанализировав данную предметную область,
выявили необходимость учета поступления расхода и наличия товара на складе. В
результате получили следующий набор данных:
Наименование
товара
|
Цена
|
Количество
|
Дата
поступления
|
Сумма
|
|
|
|
|
|
Далее определяются атрибуты, которые уникальным
образом идентифицируют каждый объект. Это необходимо для того, чтобы система
могла получить любую единичную строку таблицы. Вы должны определить первичный
ключ для каждого из отношений. Если нет возможности идентифицировать кортеж с
помощью одного атрибута, то первичный ключ нужно сделать составным - из
нескольких атрибутов. Первичный ключ гарантирует, что в таблице не будет
содержаться двух одинаковых строк. Во многих СУБД имеется возможность помимо
первичного определять еще ряд уникальных ключей. Отличие уникального ключа от
первичного состоит в том, что уникальный ключ не является главным
идентифицирующим фактором записи и на него не может ссылаться внешний ключ
другой таблицы. Его главная задача - гарантировать уникальность значения поля.
Для этого необходимо разбить данные на 3 таблицы: товар, поступление товара,
продажа товара и добавить них ключевые поля соответственно «код товара», «код
поступления», «код продажи».
В концептуальном проектировании - основной целью
является установка связи между объектами (таблицами и столбцами) и производится
очень важная операция для исключения избыточности данных - нормализация таблиц.
Каждый из различных типов связей должен быть
смоделирован в БД. Существуют несколько типов связей:
связь «один - к - одному »;
связь «один - ко - многим»;
связь «многие - ко - многим»;
Связь «один - к - одному» представляет собой
простейший вид связи данных, когда первичный ключ таблицы является в то же
время внешним ключом, ссылающимся на первичный ключ другой таблицы. Такую связь
бывает удобно устанавливать тогда, когда невыгодно держать разные по размеру
(или по другим критериям) данные в одной таблице. Например, можно выделить
данные с подробным описанием изделия в отдельную таблицу с установлением связи
«один - к - одному» для того чтобы не занимать оперативную память, если эти
данные используются сравнительно редко.
Связь «один - ко - многим» в большинстве случаев
отражает реальную взаимосвязь сущностей в предметной области. Она реализуется
уже описанной парой «внешний ключ - первичный ключ», т.е. когда определен
внешний ключ, ссылающийся на первичный ключ другой таблицы. Именно эта связь
описывает широко распространенный механизм классификаторов. Имеется справочная
таблица, содержащая названия, имена и т.п. и некие коды, причем, первичным
ключом является код. В таблице, собирающей информацию - назовем ее
информационной таблицей - определяется внешний ключ, ссылающийся на первичный
ключ классификатора. После этого в нее заносится не название из классификатора,
а код. Такая система становится устойчивой от изменения названия в
классификаторах. Имеются способы быстрой «подмены» в отображаемой таблице кодов
на их названия как на уровне сервера БД (для клиент - серверных СУБД), так и на
уровне пользовательского приложения.
Связь «многие - ко - многим» в явном виде в
реляционных БД не поддерживаются. Однако имеется ряд способов косвенной
реализации такой связи, которые с успехом возмещают ее отсутствие. Один из
наиболее распространенных способов заключается во введении дополнительной
таблицы, строки которой состоят из внешних ключей, ссылающихся на первичные
ключи двух таблиц.
Логическое проектирование
Итак, после определения таблиц, полей, индексов
и связей между таблицами следует посмотреть на проектируемую БД в целом и
проанализировать ее, используя правила нормализации, с целью устранения
логических ошибок. Важность нормализации состоит в том, что она позволяет
разбить большие отношения, как правило, содержащие большую избыточность
информации, на более мелкие логические единицы, группирующие только данные,
объединенные «по природе». Таким образом, идея нормализации заключается в
следующем. Каждая таблица в реляционной БД удовлетворяет условию, в
соответствии с которым в позиции на пересечении каждой строки и столбца таблицы
всегда находятся единственное значение, и никогда не может быть множества таких
значений.
После применения правил нормализации логические
группы данных располагаются не более чем в одной таблице. Это дает следующие
преимущества:
данные легко обновлять и удалять;
исключительно возможность рассогласования копий
данных;
уменьшаться возможность введения некорректных
данных.
Процесс нормализации заключается в приведении
таблиц в так называемые нормальные формы. Существует несколько видов нормальных
форма: первая нормальная форма (1НФ), вторая нормальная форма (2НФ), третья
нормальная форма (3НФ), нормальная форма Бойса-Кодда (НФБК), четвертая
нормальная форма (4НФ), пятая нормальная форма (5НФ). С практической точки
зрения, достаточно трех первых форм - следует учитывать время, необходимое
системе для «соединения» таблиц при отображении их на экране. Этот процесс
включает:
устранение повторяющихся групп (приведение к
1НФ);
удаление частично зависимых атрибутов
(приведение к 2НФ);
удаление транзитивно зависимых атрибутов
(приведение к 3 НФ).
В результате получили следующую структуру БД:
Рис. 1
.2 Реализация базы данных на
компьютере
Для создания таблицы автономной базы имеется
приложение Database Desktop, которое вызывается командой Tools/Database
Desktop. Оно имеет собственное окно, меню и кнопки.
Новая таблица создается построителем таблиц,
который вызывается командой File/New/ТаЫе. На запрос тип СУБД выберем Рагаdох
7.0.
Рис. 2
Рассмотрим основные колонки и поля окна
конструктора таблиц. Field Name - идентификаторы полей (не более 25 латинских
букв и цифр для совместимости с другими СУБД).
Туре - тип поля (указывается выбором из
контекстного меню):
А1рhа (А - строка из не более чем 255,
символов),(N - число с плавающей точкой),
Моnеу ($ - аналогичен типу Number, но
добавляется денежный знак),(S - целое число в диапазоне -32768..32767),(I целое
число в диапазоне-2147483.. 2147483647), ВСD (# - число в двоично-десятичном
формате),е (D - дата).(Т - время),(@ - дата и время),
Меmо (М - строка любой длины),Memo (F -
аналогичен Меmо, но может содержать форматированный текст),(G -изображение ВМР,
РСХ, ТIF, СИР, ЕРS), ОLЕ (О - объект ОLЕ),(L логическое - Т, F),(+ - при
добавлении записи, автоматически формируется уникальное значение),
Вinary (В - последовательность байтов любой
длины), Вуtes ( последовательность не более, чем 255 байтов).размер поля в
байтах.
Кеу - признак первичного ключевого поля (двойной
щелчок по колонке). Таbles properties - дополнительные свойства таблицы:Index
(задание вторичных индексов),Checks (ограничения на ввод значений полей).
Рassword Security (определение пароля),Intergity
(определение ссылочной целостности между таблицами),
Таblе Language(задание языка),
Мiniтит..., Махiпит... - начало и конец
диапазона допустимых значений.vа1ие - значение по умолчанию при добавлении
пустой записи.
Р1сture,Assist - шаблон и построитель шаблона
значения поля.
Вторичные ключи (индексы) создаются путем выбора
из списка свойств таблицы строки Secondary Indexes, и после нажатия кнопки
Define выводится окно Define Secondary Indexes. Используя кнопки со стрелками
или двойными щелчками, перенесем нужное поле или несколько полей, если ключ
составной, в список индексов. Имеются переключатели: Unique (уникальный
индекс), Саse sensitive (учет регистров строковых полей), Descending
(сортировка по возрастанию). Кнопкой ОК. производится выход с указанием имени
индекса. Поле, которое является первичным ключом другой родительской таблицы,
называют внешним ключом. Для связи таблиц обычно создают индексы по внешним
ключам. После формирования таблицы она сохраняется, если нажать кнопку Save As,
под указанным именем; при этом в поле имени файла можно указать как полное имя
с каталогами, так и псевдоним базы (Аlias). Псевдоним позволяет не
привязываться к каталогу, который может меняться в дальнейшем.
Для корректировки и просмотра открытой таблицы
имеются команды ТаЫе/Restructure (кнопка Restructure) и ТаЫе/Into Structure.
Для переименования таблицы следует сохранить ее под новым именем. Для
заполнения и редактирования таблицы, после ее связывания с другими таблицами,
используется кнопка Edit Data и меню Record приложения Database Desktop
(кириллицу при вводе использовать нельзя).
С помощью данного приложения создали таблицы,
имеющие следующий вид и структуру: Таблица (справочник) «Товар»
база данная товар paradox
Рис. 3
Таблица «Продажа товара»
Рис. 4
Таблица «Поступление товара»
Рис. 5
2. Программа ведения базы данных
Модуль Proect1 содержит информацию о всех 2
Формах.
Форма 1 (Unit1)-содержит главное меню, которое
имеет следующие пункты:
Данные.
Справки.
Справка.
Отчет.
Отчет по продажам.
Отчет по поступлениям.
Выход.
Для создания меню на форму установим компонент
MainMenu, который имеет следующие свойства:- будут ли создаваться автоматически
клавиши быстрого вызова. Если выберать maAutomatic, то Delphi будет
автоматически создавать клавиши. При maManual это делается вручную.-
автоматическое слияние с дочерними окнами.- подключение списка картинок,
которые могут отображаться на пунктах меню.- описываются пункты меню.
Для редактирования меню дважды щёлкаем по
свойству Items после чего откроется редактор меню. Этот же редактор можно
вызвать, если дважды щёлкнуть по компоненту MainMenu1. В объектном инспекторе
набераем в свойстве Caption слово «Данные». По нажатию кнопки Enter, будет
создано меню «Данные». Создание остальных пунктов меню происходит по аналогии.
Создание подпункта для меню «Отчет». Щёлкнем в
рамке чуть ниже меню «Отчет», и в свойстве Caption мы вводим слово «Отчет о
продаже товара». Создание остальных подпунктов меню происходит по аналогии.
Для создания обработчика события нажатия пункта
меню необходимо выбрать в дизайнере меню пункт «Выход» и щёлкнуть по нему
дважды или перейди на закладку Events и дважды щёлкнуть по событию OnClick. Эти
действия заставят Delphi создать обработчик события по нажатию меню. В этом
обработчике напишем следующее:;;
Здесь мы используем метод формы Close. этот
метод закрывает форму. Если мы закрываем главную форму, то закроется всё
приложение.
Для пункта меню «Данные» назначаем обработчик
событий:.Visible:=True;;
Данный метод делает видимым объект GroupBox1 и
расположенные на нем объекты, которые служат для ввода и редактирования данных
в таблицах: «Товар», «Поступление товара», «Продажа товара».
Организация подключения БД к программе
выполняется через следующие компоненты:
Table1:TTable;:TDataSource;:TDBGrid.
Поместим объект DBGrid1 из палитры компонентов
DataControls Form1. Активируем данный объект путем выделения его мышью.
Перейдем на его свойство DataSource. Из выпадающего списка выберем DataSource1.
Поместим невизуальный объект DataSource1 из
палитры компонентов DataAccess на Form1. Активируем данный объект. Перейдем на
его свойство DataSet и их выпадающего списка выберем Table1.
Выберем невизуальный Table1:TTable из группы
компонентов BDE. Поместим его на любое место Form1. Активируем данный объект
путем выделения его мышью. Перейдем на его свойство TableName. Из ниспадающего
списка выберем таблицу «Tovar». Перейдем на свойство Active. Сделаем его равным
True. После этого в DBGrid отобразиться выбранная таблица.
Для управления данной таблицой (добавление,
удаление записей, сохранение или отмена изменений) поместим на Form1 под
таблицей объект DBNavigator. Для этого выберем его в палитре компонентов
DataControls. Активируем его и перейдем на свойство DataSource, из ниспадающего
списка выберем DataSource1.
По аналогии создаем остальные 2 таблицы для
таблиц «Postup» и «Rashod».
Для создания надписи над таблицей поместим на
нашу форму объект DataSource из палитры компонентов Standart. Активируем его.
Перейдем на его свойство Caption. Введем текст «Товар».
По аналогии создаются надписи для других таблиц:
«Postup» и «Rashod».
Для создания кнопки с рисунком перейдем к группе
компонентов Additional. Выберем объект BitBtn. Поместим его на на объект
GroupBox1. Активируем его. Перейдем на его свойство Kind. Из ниспадающего
списка выберем bkCancel. Далее перейдем на свойство Caption. Напишем слово
«Выход». Встанем на свойство Kind и сделаем его равным bkCustom. Создадим для
данной кнопки обработчик событий:.Visible:=False;;
Чтобы создать подстановочное поле нужно активировать
объект Table2. Дважды щелкнем по данному объекту. Откроется окно редактора
полей. В контекстном окне редактора полей выберем команду NewFields. Присвоим
новому полю имя «tov» и тип String. Установим переключатель в группе FieldType
в положение lookup. В списке Dataset этого диалогового окна выберем значение
Table1 - именно этот набор данных необходимо просматривать. В обоих списках
KeyFields и LookupFields этого диалогового окна выберем значение kod - это то
общее поле, по значению которого будет выполняться поиск. В списке Result
выберем значение NaimT - именно это необходимо отображать в нашем наборе
данных.
Рис. 6
Аналогично создаем подстановочные поля для
таблицы Table3.
Рис. 7
Для пункта подменю «Отчет по продажам» и «Отчет
по поступлениям» создадим обработчик событий с изменением названием таблиц и
полей соответственно, который выполняет выгрузку данных таблиц в документ
Microsoft Word:Str1,Str2,Str3,Str4:String; {объявляет переменные типа String
},mark:Variant; {объявляет переменные типа Variant }
begin:=CreateOleObject('Word.Application.8');{Создает
Ole-объект}.Documents.Open('D:\institut\Nort\spisok0.doc');
{загружает
шаблон
документа}.ActiveDocument.SaveAs('D:\institut\Nort\spisok1.doc');
{сохраняет
шаблон
в
рабочий
документ}.Visible:=True;
{делает
окно
Word видимым}:=VSpisok.ActiveDocument.Bookmarks;
{в
переменную
mark записывает
закладку
}.Item('N1').Select; {помещает
курсор
на
закладку
N1}
Table3.First; {становится на первую запись
таблицы}
While Not Table3.Eof do begin {в
цикле
заполняет
таблицу}:=Table3['KodR'];
{присваивает
Str1 значение
поля
Table3 }:=Table3['tovar']; {присваивает
Str2 значение
поля
Table3 }:=FloatToStr(Table3['kol']); {переводит
значение
поля
Table3[‘kol’] из типа
Number в
тип
String и
присваивает
данное
значение
переменной
Str3}:=DateToStr(Table3['DataR']); {переводит
значение
поля
Table3[‘DataR’] из типа
Date в
тип
String и
присваивает
данное
значение
переменной
Str4 }.Selection.InsertBefore(Str1); {запись
Str1 в
текущую
позицию}
VSpisok.Selection.MoveRight(12); {перемещение на
следующее поле таблицы документа}.Selection.InsertBefore(Str2); {запись Str2 в
текущую позицию}.Selection.MoveRight(12); {перемещение на следующее поле
таблицы документа}.Selection.InsertBefore(Str3); {запись Str3 в текущую
позицию}.Selection.MoveRight(12); {перемещение на следующее поле таблицы
документа}.Selection.InsertBefore(Str4); {запись Str4 в текущую
позицию}.Selection.MoveRight(12); {перемещение на следующее поле таблицы
документа}
Table3.Next;;;
Для подменю
«Справка
1» создадим обработчик событий:.ShowModal;;
Метод ShowModal открывает Form2 (поверх всех
остальных окон).
Рис. 8
Данная Форма предназначена для отображения
данных по продаже и поступлении товара. Выбор товара осуществляется двойным
щелчком по записи необходимого товара в таблице «Товар».
Чтобы создать данную форму необходимо выполнить
следующую последовательность в основном меню Delphi File - New - Form.
Сохранить ее в тот директорий, где сохранена наша БД. В подключаемых модулях
Uses, в редакторе кода, напишем Unit1.
Теперь создадим таблицу, откуда будет браться
информация для выборки. Для этого выберем объект DBGrid1 из палитры компонентов
DataControls и объект DataSource1 из палитры компонентов DataAccess. Поместим
данные объекты на нашу экранную форму. Активируем объект DataSource1. Перейдем
к его свойству DataSet. Из выпадающего списка выберем Form1.Table1
Активируем объект DBGrid1. Перейдем на его
событие OnDblClick. Создадим для этого события процедуру
обработки:Str1:String;:=Form1.Table1['kod'];
Label2.Caption:='Продажа
по
'+Form1.Table1['naimT'];.Caption:='Поступление
по
'+Form1.Table1['NaimT'];.SQL.Clear;.SQL.Add('Select * from rashod where
KodR='+''''+Str1+'''');.Open;.SQL.Clear;.SQL.Add('Select * from postup where
KodP='+''''+Str1+'''');
Query2.Open;;
Для создания таблицы, которая будет отображать
информацию о данном товаре необходимо создать объекты DBGrid2 из палитры
компонентов DataControls, объект Query1 из палитры компонентов BDE, а также
объект DataSource2 из палитры компонентов DataAccess. Активируем объект
DataSource2 и выберем его свойство DataSet. Из выпадающего списка выберем
Query1.
Активируем объект DBGrid2, встанем на его
свойство DataSource и из выпадающего списка выберем DataSource2. Активируем
объект Query1, перейдем на его свойство SQL и в редакторе кода напишем select *
from rashod.
По аналогии создается другая таблица для выборки
из таблицы «Postup».
Заключение
Таким образом, в данной работе разработана
информационная система «Учет товаров на складе». Данная ИС предназначена для
автоматизации деятельности зав. складом по учету товаров на складе.
ИС состоит из программной и информационной
части. Программная подсистема состоит из:
управляющей подсистемы;
подсистемы отчетов;
подсистемы справок.
Информационная часть включает базу данных,
состоящую из трех взаимосвязанных таблиц («Товар», «Поступление товара»,
«Реализация товара»), реализованных в формате «Paradox 7.0». В БД содержатся
данные о наличии товара, его поступлении и реализации, поставщиках,
покупателях.
Информационная система разработана средствами
Delphi 6.0 с использованием стандартных компонентов.
ИС позволяет редактировать информацию в БД, а
также в реальном масштабе времени (РМВ) формировать справки и отчеты. Справки
формируются путем выборки отдельных записей по наименованию товара. Отчеты
формируются в виде таблиц путем создания из шаблонов документов MS-Word через
СОМ - технологии.
Общий объем разработанной ИС составляет 974Kb.
ИС может функционировать в любой Windows совместимой ОС.