Разработка информационно-справочной системы Аптека

Министерство образования Российской Федерации

Дагестанский Государственный Технический Университет

















Кафедра ПОВТ





Курсовая работа



по дисциплине

«Технология разработки программ»

«Автоматизированная система «Аптека»»





















Выполнили: студенты 

4-го курса гр. 3042

Исаев А.

Проверила: Джанмурзаева .























Махачкала  2004 г.



Аннотация.



В данной курсовой работе рассматривается программа автоматизированного ведения продажи, завоза и учета медикаментов в аптеке. Прилагаются описания структуры и каждой таблицы (вплоть до каждого поля) созданной базы данных, каждой формы программы, поясняется назначение каждого элемента формы.







































































Содержание.



1. Задание.

4

Введение.

5

Описание базы данных.

7

Описание структуры базы данных.

7

Описание таблиц и полей таблиц.

8

Описание программы.

8

Главная форма.



8

4.2. Завоз медикаментов.

9

4.3. Продажа медикаментов.

9

4.4. Смена режима работы.

10

4.5. Выборка записей.

10

4.6. смена паролей.

10

4.7. Отчеты.

11

Заключение.

12

Список литературы.

13

Приложение 

14























1. Задание.



Разработать структурную схему автоматизированной, информационно-справочной системы «Аптека». По схеме разработать программный комплекс, реализующий АС. Программа должна выполнять все функции аптеки – продажу, завоз медикаментов, ведение отчетов, поиск информации и т д.















































































2. Введение.



В последние годы торговая система нашей страны переживает бурное развитие. Несмотря на все препятствия (высокие налоговые ставки, несовершенные законы и прочее), ситуация неуклонно меняется к лучшему. Прошли времена, когда можно было легко зарабатывать на спекулятивных операциях с валютой и мошенничестве. Сегодня все больше торговых предприятий делает ставку на профессионализм своих сотрудников и новые технологии.

Трудно представить себе более благодатную почву для внедрения новых компьютерных технологий, чем торговля. Многие задачи, которые возникают в ходе работы торговых предприятий,  достаточно легко поддаются автоматизации. Быстрая и бесперебойная обработка потоков информации является одной из главных задач любой крупной финансовой организации. Кроме того, необходимо обеспечить простоту доступа к любой информации, удобство пользования, понятность конечному пользователю, которые, как правило, не имеют большого опыта работы с компьютерами и оргтехникой. Все эти, а также многие другие причины стали причиной появления большого ряда программ и средств и инструментов их создания. 

На сегодня язык программирования Object Pascal вместе с интегрированной средой разработки Delphi являются одним из лучших и распространенных средств создания приложений и баз данных для корпоративных применений. Простота и естественность языка, ориентация системы на разработку именно такого рода приложений, наконец эффективность (большая производительность и относительно небольшие размеры) создаваемых с ее помощью программ сделали Delphi незаменимым средством разработки различного рода клиентских мест, то есть программ для доступа к базам данных. А если прибавить к этому встроенную поддержку в виде компонентов (вкладки палитры компонентов Data Access, Data Controls, InterBase, ADO, QReport, а также компоненты для работы с трехзвенной архитектурой, с серверами COM и COBRA), специализированных объектов и даже программ таких, как Borland Database Desktop (создание, редактирование баз данных Paradox), Borland Database  Engine Administrator (администрирование всех баз данных, имеющихся на компьютере), SQL Builder (очень эффективный построитель SQL-запросов к БД), с помощью которых можно легко и просто работать со всеми существующими типами базами данных  (Paradox, InterBase, Oracle  и др.), то выбор инструмента разработки можно считать практически решенным.

Появление инструментов разработки приложений, таких как Borland Delphi, Borland C++Builder привело к появлению множества программ для работы с базами данных  профессиональных и полупрофессиональных, обеспечивающих (в большей или меньшей мере) автоматизацию работы торгового предприятия. 

Прилагаемая программа не является исключением. Быстрый и авторизованный доступ к данным обеспечивается благодаря таблицам, представленным на главной форме, удобство работы с данными обеспечивается функциями выборки и сортировки данных во всех таблицах, а стандартный интерфейс форм под «Windows 9x» делает программу понятной даже начинающему пользователю.















































































































3. Описание базы данных.



Полезность программного обеспечения, связанного с базами данных, а большинство современных программ, так или иначе, с ними связаны, во многом зависят от корректности базы. Неправильно спроектированная база может впоследствии  не только усложнить задачу программирования, но и оказаться бесполезной в деле. Поэтому, при разработке программных комплексов большое значение уделяется на создание структуры БД.

Во избежание ошибок проектирования применяют так называемую нормализацию базы данных. Процесс нормализации БД имеет своей целью устранение избыточности данных и заключается в привидении всех ее таблиц к третьей нормальной форме. 

Первая нормальная форма требует, чтобы каждое поле таблицы было неделимым и не содержало повторяющихся групп. В данном случае привидение не требуется, так как база не содержит сложных полей, таких как, например, адрес (где можно выделить город, улицу, номер дома и т. д.).

Вторая нормальная форма требует, чтобы все поля таблицы зависели от первичного ключа, то есть чтобы первичный ключ однозначно определял запись. Поля «Код медикаментов», «Номер накладной» и «Код медикаментов» и есть первичные ключи.

Третья нормальная форма требует, чтобы в таблице не было связей между не ключевыми полями. Связи в приведенной БД осуществляются только через ключевые поля.

































































Описание структуры базы данных.



База данных состоит из трех таблиц: «Медикаменты», «Накладные», «Поставщики».

В таблицу «Медикаменты» введено «искусственное» поле – код медикаментов, которое является ключевым. Это сделано по ряду причин. Во-первых, значения поля типа AutoIncrement уникальны для каждой записи, что необходимо при построении ключевого поля. Во-вторых, Тип AutoIncrement занимает меньше памяти, чем строковое поле «Наименование медикаментов», длина которого 30 байт. Через это поле осуществляется связь с таблицей «Накладные»

В таблице ключевым является поле «Номер накладной». Накладная – документ содержащий информацию о привозимом или продаваемом товаре. Для каждой операции заводится новая накладная, т.е. номер накладной уникален для каждой записи. Для связи с двумя другими таблицами в таблице «Накладные» имеются поля «Код медикаментов» и «Код поставщика» (см. ниже). Причем одной записи в одной из таблиц соответствует одна запись в другой, т.е. тип связей между таблицами – один-к-одному.

«Код поставщика» - также «искусственное» поле, созданное по тем же причинам, что и «Код медикаментов», а именно простое уникальное значение.



































































	Описание таблиц и полей таблиц.

	

Таблица «Медикаменты» предназначена для продажи товаров и показывает что и в каком количестве имеется на складе. Изменение происходит при поступлении и  продаже медикаментов. Таблица содержит 5 полей о товаре. Поле TovarCode – автоинкрементное, содержит код медикаментов. Через это поле имеется связь с таблицей «Накладные». Поле TovarName – строковый тип до 30 символов – содержит наименование продукта. Поле EdIzm – строковый тип до 10 символов – содержит единицу измерения продукта (Ящик или Мешок). Поле Price - цена за единицу измерения в рублях – тип money, 2 цифры после запятой. Поле Col – длинное целое – содержит имеющееся количество медикаментов.

Таблица «Накладные» содержит информацию из накладных. Ее дополнение происходит при новых поступлениях товаров. Таблица содержит Поле NaklNum – автоинкрементное – содержит номер накладной. Поле TovarCode – короткое целое – содержит код медикаментов. Поле Date – дата – в нем хранится дата поступления медикаментов. Поле Recieved – длинное целое – содержит количество полученного медикаментов. Поле Sum – длинное целое – содержит сумму, уплаченную за полученный товар. Поле PostCode – короткое целое – содержит код поставщика. Через это поле осуществляется связь с таблицей «Поставщики».

Таблица «Поставщики» предназначена для хранения данных о поставщиках товаров. Дополнение происходит при новых поставках медикаментов. Поле PostCode – автоинкрементное – хранит код поставщика. Поле PostName – строковое до 40 символов - содержит имя поставщика. Поле PostPhone – длинное целое – хранит телефон поставщика.

Каждый из предусмотренных режимов работы автоматизированной системы имеет права на определенный ряд операций (в том числе обновление таблиц).







































Описание программы.



Для правильного функционирования программы необходимы следующие файлы: Main.exe – собственно программа, файлы базы данных, названия которых есть названия таблиц БД (Tovar, Nakladnie, Postavschik). Кроме этого необходимо, чтобы носитель не был защищен от записи. Это необходимо для создания файла отчета report.txt. Перед запуском программы необходимо создать алиас с помощью встроенной утилиты BDE Administrator, указав в строке path путь к каталогу с файлами БД. 

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	4.1. Главная форма.

	

	Внешний вид главной формы может быть разным в зависимости от режима работы АС. На рисунке представлен полный ее вид. Во всех других режимах видна только верхняя таблица и доступны не все кнопки и некоторые пункты меню. Функциональное назначение пунктов меню и кнопок одинаково.: Пароль (Главное->Пароль) смена режима работы АС; Продать (Операции->Продажа) – продажа медикаментов; Завоз (Операции->Завоз) – завоз медикаментов; Отчеты (Главное->Отчеты) – просмотр отчетов; Выборка/Отмена выборки (Операции->Выборка/Отмен выборки) – выборка (сортировка) записей и ее отмена; Настройки (Главное->Настройки) – смена паролей на режимы работы АС. Сохранить – сохранение изменений в таблице. Выход – завершение программы.

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

			Завоз медикаментов.

	

	При поступлении медикаментов необходимо нажать кнопку «Завоз» или выбрать пункт меню Операции->Завоз. После этот появляется форма завоза. На форме необходимо заполнить предлагаемые поля. Если завезенный товар уже имеется на складе, то есть происходит пополнение запаса, то надо выбрать его наименование из списка, указать количество, общую стоимость и дату завоза (по умолчанию выбрана текущая дата). Если товар новый, то есть в таблице Tovar отсутствует, то надо поставить галочку в поле «Новый товар». Теперь список выбора наименования не доступен. Его надо указать в открывшемся текстовом поле. Также предлагается выбрать единицу измерения (мешок или ящик) и стоимость за единицу измерения. В нижней половине формы выбирается или вводится поставщик продукта и указать его телефон (если поставщик новый, необходимо выбрать галочку «Новый поставщик»). После заполнения всех полей можно нажимать кнопку «Добавить», после чего добавляются новые записи или обновляются старые во всех таблицах. Кнопка «Выход» закрывает форму завоза.    

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	4.3. Продажа медикаментов.

	

	Прежде чем нажимать кнопку «Продать» (Операции->Продажа) необходимо навести указатель в таблице на продаваемый товар. Выбранный товар предлагается продать. На форме цифровое поле для выбора количества продаваемого медикаментов (по умолчанию весь товар) и три кнопки: «Да» - для продажи указанного количества, «Выход» - для закрытия формы и «Накладная» для распечатки накладной документации о проданном товаре.

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

		4.4. Смена режима работы.

	

	В программе предусмотрены несколько режимов работы для разных целей. В режиме работы «Просмотр» доступна одна таблица «Медикаменты», операции смены режимы и выборки. Изменение информации не возможно. Этот режим загружается по умолчанию и для перехода в него не нужен пароль. Режим «Продажа» дополняется возможностью продажи медикаментов. В режиме «Завоз» есть возможность завоза продуктов. Наибольший приоритет у режима «Администрирование». В этом режиме доступны все кнопки и пункты меню. Имеется возможность смены паролей для всех режимов. Таблицы могут редактироваться напрямую через сетку. Это предусмотрено на случай опечатки или ошибки. Пароли режимов хранятся в реестре Windows.

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

		4.5. Выборка записей.

		

	Назначение этой операции – удобство представления информации. Здесь возможны два действия – выборка и сортировка. Выборка – это выделение записей из все таблицы, удовлетворяющих определенному условию. Для ее осуществления необходимо указать таблицу и условие, по которому проводится поиск. Список полей меняется динамически с выбором таблицы. Также меняются и операции в соответствии с типом выбранного поля (операции сравнения для численных значений и функции вхождения и совпадения для строковых типов). В поле «Значение» вводится образец. Для сортировки достаточно указать имя таблицы и имя поля. Заполнение остальных полей не требуется. После нажатия соответствующей кнопки в сетке отображается выборочные данные. Отмена выборки (вывод всех записей таблицы) выполняется нажатием кнопки «Отмена выборки». Необходимые данные – название таблицы.

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

	

		4.6. Смена паролей.

		

		Эта опция доступна только для администратора. Достаточно выбрать режим работы, и два раза (для исключения опечатки) набрать новый пароль. Значения в реестре будут изменены.

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		4.7. Отчеты.

		

	Форма показывает содержимое файла report.txt, куда ежемесячно программа записывает отчеты по купле продаже товаров. Если файл по какой-либо причине не существует он будет создан заново.

	

	

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		Заключение.

		

	Как уже отмечалось ранее, эта программа не является уникальной или особенной, хотя и реализует многие потребности средних и мелких торговых организаций. Подобных программ, в том числе и более совершенных, очень много. Но спрос есть, а значит будет и предложение. Отсюда и такое количество. Понятно, что пользоваться, в конце концов будут только лучшими. Дальнейшая разработка программного продукта может резко увеличить шансы на «жизнь». Так возможен переход на другой, основанный полностью на SQL сервер (например, Interbase, MS SQL, Oracle). Это даст приложению больше скорости в работе с данными и больше гибкости, так как язык SQL специально для этого предназначен. Также хорошим плюсом был бы переход от использования локальных, файл-серверных к клиент серверным приложениям. Такие комплексы программ вполне «тянут» на коммерческие.

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		Список литературы.

		П. В. Шумаков, В. В. Фаронов. Delphi 7 для руководство разработчика баз данных. Нолидж, М. 1999г.

		Delphi 5 и базы данных. Питер СПб. 2000г.

		Интернет-сайт Delphi.mastak.ru/

		Лекции по дисциплине «ТРП».

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		

		7.Приложение 

		program Main;

		uses  Forms,

		  MainUnit in 'MainUnit.pas' {MainForm},

		  PassUnit in 'PassUnit.pas' {PassForm},

		  SaleUnit in 'SaleUnit.pas' {SaleForm},

		  RecieveUnit in 'RecieveUnit.pas' {RecieveForm},

		  reportUnit in 'reportUnit.pas' {ReportForm},

		  PropUnit in 'PropUnit.pas' {PropForm},

		  FindUnit in 'FindUnit.pas' {SelectForm};

		{$R *.RES}

		begin

		  Application.Initialize;

		  Application.CreateForm(TMainForm, MainForm);

		  Application.CreateForm(TPassForm, PassForm);

		  Application.CreateForm(TSaleForm, SaleForm);

		  Application.CreateForm(TRecieveForm, RecieveForm);

		  Application.CreateForm(TReportForm, ReportForm);

		  Application.CreateForm(TPropForm, PropForm);

		  Application.CreateForm(TSelectForm, SelectForm);

		  Application.Run;

		end.

		

		unit MainUnit;

		interface

		uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables,  PropUnit, ReportUnit, RecieveUnit, PassUnit, SaleUnit, Menus;

		type  TMainForm = class(TForm)

		    PassButton: TButton;

		    DataSourceTov: TDataSource;

		    TableTov: TTable;

		    DBGrid1: TDBGrid;

		    Label1: TLabel;

		    ExitButton: TButton;

		    SaleButton: TButton;

		    RecieveButton: TButton;

		    TableNakl: TTable;

		    DataSourceNakl: TDataSource;

		    TablePost: TTable;

		    DataSourcePost: TDataSource;

		    DBGrid3: TDBGrid;

		    DBGrid4: TDBGrid;

		    Label3: TLabel;

		    Label4: TLabel;

		    PropButton: TButton;

		    ReportButton: TButton;

		    SelectButton: TButton;

		    QueryTov: TQuery;

		    QueryNakl: TQuery;

		    QueryPost: TQuery;

		    SaveButton: TButton;

		    CancelSelectButton: TButton;

		    QueryPostPostCode: TIntegerField;

		    QueryPostPostName: TStringField;

		    QueryPostPostPhone: TIntegerField;

		    QueryNaklNaklNum: TIntegerField;

		    QueryNaklTovarCode: TSmallintField;

		    QueryNaklPostCode: TSmallintField;

		    QueryNaklDate: TDateField;

		    QueryNaklRecieved: TIntegerField;

		    QueryNaklSum: TIntegerField;

		    QueryTovTovarCode: TIntegerField;

		    QueryTovTovarName: TStringField;

		    QueryTovEdIzm: TStringField;

		    QueryTovPrice: TCurrencyField;

		    QueryTovCol: TIntegerField;

		    TableNaklNaklNum: TAutoIncField;

		    TableNaklTovarCode: TSmallintField;

		    TableNaklPostCode: TSmallintField;

		    TableNaklDate: TDateField;

		    TableNaklRecieved: TIntegerField;

		    TableNaklSum: TIntegerField;

		    TableTovTovarCode: TAutoIncField;

		    TableTovTovarName: TStringField;

		    TableTovEdIzm: TStringField;

		    TableTovPrice: TCurrencyField;

		    TableTovCol: TIntegerField;

		    TablePostPostCode: TAutoIncField;

		    TablePostPostName: TStringField;

		    TablePostPostPhone: TIntegerField;

		    MainMenu1: TMainMenu;

		    N1: TMenuItem;

		    N2: TMenuItem;

		    N3: TMenuItem;

		    N4: TMenuItem;

		    N5: TMenuItem;

		    N6: TMenuItem;

		    N7: TMenuItem;

		    N8: TMenuItem;

		    N9: TMenuItem;

		    N10: TMenuItem;

		    procedure PassButtonClick(Sender: TObject);

		    procedure ExitButtonClick(Sender: TObject);

		    procedure FormCreate(Sender: TObject);

		    procedure SaleButtonClick(Sender: TObject);

		    procedure Rights;

		    procedure RecieveButtonClick(Sender: TObject);

		    procedure ReportButtonClick(Sender: TObject);

		    procedure PropButtonClick(Sender: TObject);

		    procedure SelectButtonClick(Sender: TObject);

		    procedure SaveButtonClick(Sender: TObject);

		    procedure CancelSelectButtonClick(Sender: TObject);

		    procedure FormDestroy(Sender: TObject);

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  MainForm: TMainForm;

		implementation

		uses FindUnit;

		{$R *.DFM}

		procedure TMainForm.Rights;

		 var i:byte;

		begin

		for i:=0 to ComponentCount-1 do begin

		 If (Components[i] is TButton) then (Components[i] as TButton).enabled:=false;

		 If (Components[i] is TLabel) and ((Components[i] as TLabel).Caption<>'Медикаменты') then (Components[i] as TLabel).visible:=false;

		 If (Components[i] is TDBGrid) then

		  begin

		    If (Components[i] as TDBGrid).Name='DBGrid1' then (Components[i] as TDBGrid).ReadOnly:=true

		    else (Components[i] as TDBGrid).visible:=false;

		  end; end;

		 ExitButton.Enabled:=true;

		 SelectButton.Enabled:=true;

		 CancelSelectButton.Enabled:=true;

		 PassButton.Enabled:=true;

		 N3.enabled:=false;

		 N5.enabled:=false;

		 N7.enabled:=false;

		 N8.enabled:=false;

		 If Mode='Завоз' then

		  begin

		   RecieveButton.Enabled:=true;

		   N7.enabled:=true;

		  end

		 else If Mode='Продажа' then

		  begin

		   SaleButton.enabled:=true;

		   N8.enabled:=true;

		  end

		  else If Mode='Администрирование' then

		  begin

		  for i:=0 to ComponentCount-1 do begin

		 If (Components[i] is TButton) then (Components[i] as TButton).enabled:=true;

		 If (Components[i] is TMenuItem) then (Components[i] as TMenuItem).enabled:=true;

		 If (Components[i] is TLabel) then (Components[i] as TLabel).visible:=true;

		 If (Components[i] is TDBGrid) then

		   begin

		    (Components[i] as TDBGrid).ReadOnly:=false;

		    (Components[i] as TDBGrid).visible:=true;

		   end; end; end;end;

		procedure TMainForm.PassButtonClick(Sender: TObject);

		begin

		 PassForm.Edit1.text:='';

		 PassForm.ShowModal;

		 Rights;

		end;

		procedure TMainForm.ExitButtonClick(Sender: TObject);

		begin

		Close;

		end;

		procedure TMainForm.FormCreate(Sender: TObject);

		 Var curday,curmonth,curyear,

		 day,month,year:word;

		 f:textfile;

		 rash,doh:longint;

		 num:word;

		Procedure GenerateReport;

		begin

		    rash:=0;

		    doh:=0;

		    num:=0;

		    TableNakl.First;

		    while not TableNakl.Eof do begin

		      DecodeDate(TableNakl.FieldByName('Date').AsDateTime,Year,month,day);

		      if (year=curyear) and (month=curmonth-1) then begin;

		        inc(num);

		        rash:=rash+TableNakl.FieldByName('sum').AsInteger;

		        doh:=doh+TableNakl.FieldByName('col').AsInteger*

		        TableTov.FieldByName('Price').AsInteger;

		       end;

		       TableNakl.Next;

		       end;

		    assignfile(f,'report.txt');

		    If Fileexists('report.txt') then append(f)

		    else rewrite(f);

		    Writeln(f);

		    Writeln(f,'==== Отчет за ',curmonth-1,'/',curyear,'г ====');

		    Writeln(f);

		    Writeln(f,'Совершено ',num,' сделок на общую сумму ',rash,' рублей.');

		    Writeln(f,'Ожидаемая выручка от реализации ',doh-rash);

		    closefile(f);

		end;

		 begin

		 If not PassForm.regexists then begin

		  ShowMessage('Ключи паролей не найдены и будут воссозданы');

		  PropForm.writereg('Продажа','1');

		  PropForm.writereg('Завоз','2');

		  PropForm.writereg('Администрирование','3');

		  end;

		Mode:='Просмотр';

		 Rights;

		 DecodeDate(Date,curyear,curmonth,curday);

		 if curday=1 then GenerateReport;

		end;

		procedure TMainForm.SaleButtonClick(Sender: TObject);

		begin

		with SaleForm do begin

		SpinEdit1.MaxValue:=TableTov.Fields[4].AsInteger;

		SpinEdit1.Value:=TableTov.Fields[4].AsInteger;

		ShowModal;

		end;

		end;

		procedure TMainForm.RecieveButtonClick(Sender: TObject);

		begin

		  RecieveForm.ShowModal;

		end;

		procedure TMainForm.ReportButtonClick(Sender: TObject);

		begin

		 ReportForm.ShowModal;

		end;

		procedure TMainForm.PropButtonClick(Sender: TObject);

		begin

		 PropForm.ShowModal;

		end;

		procedure TMainForm.SelectButtonClick(Sender: TObject);

		begin

		 SelectForm.SortButton.Visible:=true;

		 SelectForm.SelectButton.Caption:='Выборка';

		 SelectForm.Caption:='Найти все';

		 SelectForm.Height:=260;

		 SelectForm.Panel1.Visible:=true;

		 CancelSelection:=false;

		 SelectForm.Show;

		end;

		procedure TMainForm.SaveButtonClick(Sender: TObject);

		begin

		 If TableTov.State in [dsInsert,dsEdit] then TableTov.Post;

		 If TableNakl.State in [dsInsert,dsEdit] then TableNakl.Post;

		 If TablePost.State in [dsInsert,dsEdit] then TablePost.Post;

		end;

		procedure TMainForm.CancelSelectButtonClick(Sender: TObject);

		begin

		 SelectForm.SortButton.Visible:=false;

		 SelectForm.Caption:='Отменить выборку';

		 SelectForm.SelectButton.Caption:='Отменить';

		 SelectForm.Height:=140;

		 SelectForm.Panel1.Visible:=false;

		 SelectForm.Show;

		 CancelSelection:=true;

		end;

		procedure TMainForm.FormDestroy(Sender: TObject);

		begin

		QueryTov.Active:=false;

		QueryNakl.Active:=false;

		QueryPost.Active:=false;

		end;

		end.

		

		unit FindUnit;

		interface

		uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

		  Dialogs, StdCtrls, ExtCtrls, DBCtrls;

		type  TSelectForm = class(TForm)

		    RadioGroup1: TRadioGroup;

		    SelectButton: TButton;

		    ExitButton: TButton;

		    Panel1: TPanel;

		    ComboBox1: TComboBox;

		    Label1: TLabel;

		    Label2: TLabel;

		    ComboBox2: TComboBox;

		    Label3: TLabel;

		    Edit1: TEdit;

		    SortButton: TButton;

		    procedure ExitClick(Sender: TObject);

		    procedure SelectButtonClick(Sender: TObject);

		    procedure SortClick(Sender: TObject);

		    procedure RadioGroup1Click(Sender: TObject);

		    procedure ComboBox1Change(Sender: TObject);

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  SelectForm: TSelectForm;

		  Selecttype:boolean;

		  CancelSelection:boolean;

		  implementation

		uses MainUnit;

		{$R *.dfm}

		procedure TSelectForm.ExitClick(Sender: TObject);

		begin

		 Close;

		end;

		procedure TSelectForm.SelectButtonClick(Sender: TObject);

		begin

		With MainForm do

		 case RadioGroup1.ItemIndex of

		 0: begin

		     QueryTov.Active:=false;

		     QueryTov.SQL.Clear;

		     If CancelSelection Then begin

		                              QueryTov.SQL.Add('Select * From Tovar');

		                              DataSourceTov.DataSet:=TableTov;

		                             end

		     else begin

		           DataSourceTov.DataSet:=QueryTov;

		           QueryTov.SQL.Add('Select * From Tovar where '+ComboBox1.Text);

		           If SelectType then QueryTov.SQL.Add(ComboBox2.Text+Edit1.text)

		           else    QueryTov.SQL.Add(' Like "'+Edit1.text+'"');

		          end;

		     QueryTov.Active:=true;

		    end;

		 1: begin

		     QueryNakl.Active:=false;

		     QueryNakl.SQL.Clear;

		     If CancelSelection Then begin

		                              QueryNakl.SQL.Add('Select * From Nakladnie');

		                              DataSourceNakl.DataSet:=TableNakl;

		                             end

		     else begin

		           DataSourceNakl.DataSet:=QueryNakl;

		           QueryNakl.SQL.Add('Select * From Nakladnie where '+ComboBox1.Text);

		           If SelectType then

		           QueryNakl.SQL.Add(' '+ComboBox2.Text+' '+Edit1.text)

		           else  QueryNakl.SQL.Add(' Like "'+Edit1.text+'"');

		          end;

		     QueryNakl.Active:=true;

		    end;

		 2: begin

		     QueryPost.Active:=false;

		     QueryPost.SQL.Clear;

		     If CancelSelection Then begin

		                              QueryPost.SQL.Add('Select * From Postavschik');

		                              DataSourcePost.DataSet:=TablePost;

		                             end

		     else begin

		           DataSourcePost.DataSet:=QueryPost;

		           QueryPost.SQL.Add('Select * From Postavschik where '+ComboBox1.Text);

		           If SelectType then

		           QueryPost.SQL.Add(' '+ComboBox2.Text+' '+Edit1.text)

		           else  QueryPost.SQL.Add(' Like "'+Edit1.text+'"');

		          end;

		     QueryPost.Active:=true;

		    end;

		end;

		Close;

		end;

		procedure TSelectForm.RadioGroup1Click(Sender: TObject);

		begin

		 case RadioGroup1.ItemIndex of

		 0:begin ComboBox1.Items:=MainForm.TableTov.FieldList; end;

		 1:begin ComboBox1.Items:=MainForm.TableNakl.FieldList; end;

		 2:begin ComboBox1.Items:=MainForm.TablePost.FieldList;end;

		end;

		end;

		procedure TSelectForm.ComboBox1Change(Sender: TObject);

		begin

		Combobox2.Items.Clear;

		 If (ComboBox1.Text='Price')  or

		    (ComboBox1.Text='Col')  or

		    (ComboBox1.Text='Recieved')  or

		    (ComboBox1.Text='Sum')

		then begin

		      Combobox2.Items.Add('=');

		      Combobox2.Items.Add('>');

		      Combobox2.Items.Add('<');

		      Combobox2.Items.Add('>=');

		      Combobox2.Items.Add('<=');

		      Combobox2.Items.Add('<>');

		      Selecttype:=true;

		      end

		else If (ComboBox1.Text='TovarCode')  or

		        (ComboBox1.Text='NaklNum')  or

		        (ComboBox1.Text='PostCode')

		then begin

		      Combobox2.Items.Add('=');

		      Combobox2.ItemIndex:=0;

		      Selecttype:=true;

		     end

		else If (ComboBox1.Text='TovarName')  or

		        (ComboBox1.Text='PostName')

		then begin

		      Combobox2.Items.Add('ёютярфрхЄ');

		      Combobox2.ItemIndex:=0;

		      Selecttype:=false;

		     end;

		end;

		procedure TSelectForm.SortClick(Sender: TObject);

		  Var txt:string;

		begin

		txt:=ComboBox1.Text;

		With MainForm do

		case RadioGroup1.ItemIndex of

		0:begin

		   QueryTov.Active:=false;

		   QueryTov.SQL.Clear;

		   DataSourceTov.DataSet:=QueryTov;

		   QueryTov.SQL.Add('Select * From Tovar where '+txt+'='+Txt+' order by '+txt);

		   QueryTov.Active:=true;

		  end;

		1:begin

		   QueryNakl.Active:=false;

		   QueryNakl.SQL.Clear;

		   DataSourceNakl.DataSet:=QueryNakl;

		   QueryNakl.SQL.Add('Select * From Nakladnie where '+Txt+'='+txt+' order by '+Txt);

		   QueryNakl.Active:=true;

		  end;

		2:begin

		   QueryPost.Active:=false;

		   QueryPost.SQL.Clear;

		   DataSourcePost.DataSet:=QueryPost;

		   QueryPost.SQL.Add('Select * From Postavschik where '+Txt+'='+Txt+' order by '+Txt);

		   QueryPost.Active:=true;

		  end;

		end;

		Close;

		end;end.

		

		unit PassUnit;

		interface

		uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

		  StdCtrls, Registry;

		type  TPassForm = class(TForm)

		    ComboBox1: TComboBox;

		    Label1: TLabel;

		    Label2: TLabel;

		    Edit1: TEdit;

		    PassButton: TButton;

		    CancelButton: TButton;

		    procedure ComboBoxChange(Sender: TObject);

		    procedure FormCreate(Sender: TObject);

		    procedure ChMode;

		    procedure PassButtonClick(Sender: TObject);

		    procedure CancelButtonClick(Sender: TObject);

		    function regexists:boolean;

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  PassForm: TPassForm;

		  Mode:string[20];

		 SalerPwd, RecieverPwd, AdminPwd:string[10];

		implementation

		uses mainunit;

		{$R *.DFM}

		Function TPassForm.regexists:boolean;

		 Var reg:tregistry;

		begin

		regexists:=true;

		Reg:=TRegistry.Create;

		 Reg.RootKey:=HKEY_CURRENT_USER;

		 If REG.OpenKey('Software\OM',true) then begin

		  if REG.ValueExists('Продажа') then  SalerPwd:=REG.ReadString('Продажа')

		  else regexists:=false;

		  if REG.ValueExists('Завоз') then   RecieverPwd:=REG.ReadString('Завоз')

		    else regexists:=false;

		  if REG.ValueExists('Администрирование') then   AdminPwd:=REG.ReadString('Администрирование')

		    else regexists:=false;

		    end

		 else ShowMessage('Ошибка работы с реестром');

		 REG.CloseKey;

		 Reg.Destroy;

		end;

		Procedure TPassForm.ChMode;

		begin

		If ComboBox1.Text='Просмотр' then begin

		                                Label2.enabled:=false;

		                                Edit1.enabled:=false;

		                                Edit1.text:='';

		                               end

		else begin

		      Label2.enabled:=true;

		      edit1.enabled:=true;

		    end;

		end;

		procedure TPassForm.ComboBoxChange(Sender: TObject);

		begin

		ChMode;

		end;

		procedure TPassForm.FormCreate(Sender: TObject);

		 var Reg:TRegistry;

		begin

		ChMode;

		end;

		procedure TPassForm.PassButtonClick(Sender: TObject);

		 var modestr,pwd:shortstring;

		begin

		 modestr:=AnsiUppercase(Combobox1.text);

		 pwd:=Edit1.text;

		 If (modestr='ПРОСМОТР') or

		    ((modestr='АДМИНИСТРИРОВАНИЕ') and (pwd=AdminPwd)) or

		    ((modestr='ПРОДАЖА')           and (pwd=SalerPwd)) or

		    ((modestr='ЗАВОЗ')             and (pwd=RecieverPwd))

		     then Mode:=Combobox1.text

		     else ShowMessage('Не верно задан режим '+modestr+#13+'или неверно введен пароль для режима '+modestr);

		 Close;

		end;

		procedure TPassForm.CancelButtonClick(Sender: TObject);

		begin

		 Close;

		end;end.

		

		unit PropUnit;

		interface

		uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

		  StdCtrls, Registry;

		type  TPropForm = class(TForm)

		    ChPassButton: TButton;

		    ExitButton: TButton;

		    ComboBox1: TComboBox;

		    Label1: TLabel;

		    Label2: TLabel;

		    Edit1: TEdit;

		    Label3: TLabel;

		    Edit2: TEdit;

		    procedure ExitButtonClick(Sender: TObject);

		    procedure ChPassButtonClick(Sender: TObject);

		    Procedure writereg(name,value:string);

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  PropForm: TPropForm;

		implementation

		{$R *.DFM}

		Procedure TPropForm.writereg(name,value:string);

		 var Reg:TRegistry;

		begin

		  Reg:=Tregistry.Create;

		  Reg.Rootkey:=HKEY_CURRENT_USER;

		  Reg.OpenKey('Software\OM',true);

		  Reg.WriteString(name,value);

		  Reg.CloseKey;

		  Reg.Destroy;

		end;

		procedure TPropForm.ExitButtonClick(Sender: TObject);

		begin

		 Close;

		end;

		procedure TPropForm.ChPassButtonClick(Sender: TObject);

		begin

		 If Edit1.text<>Edit2.text then ShowMessage('Пароли не совппадают')

		 else if length(Edit1.text)>10 then Showmessage('Пароль должен быть не более 10 символов')

		 else writereg(ComboBox1.text,Edit1.text);

		end;

		end.

		

		unit RecieveUnit;

		interface

		uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

		  StdCtrls, DBCtrls, Spin, ExtCtrls, ComCtrls;

		type  TRecieveForm = class(TForm)

		    AddButton: TButton;

		    CancelButton: TButton;

		    DBLookupComboBox1: TDBLookupComboBox;

		    SpinEdit2: TSpinEdit;

		    SpinEdit3: TSpinEdit;

		    Label1: TLabel;

		    Label3: TLabel;

		    Label4: TLabel;

		    Label6: TLabel;

		    Bevel1: TBevel;

		    Bevel2: TBevel;

		    DateTimePicker1: TDateTimePicker;

		    Label7: TLabel;

		    DBLookupComboBox2: TDBLookupComboBox;

		    Label8: TLabel;

		    CheckBox1: TCheckBox;

		    Edit1: TEdit;

		    ComboBox1: TComboBox;

		    Label9: TLabel;

		    Label10: TLabel;

		    CheckBox2: TCheckBox;

		    Edit2: TEdit;

		    Edit3: TEdit;

		    Label11: TLabel;

		    Edit4: TEdit;

		    procedure CancelButtonClick(Sender: TObject);

		    procedure NewPostButtonClick(Sender: TObject);

		    procedure AddButtonClick(Sender: TObject);

		    procedure CheckBox1Click(Sender: TObject);

		    procedure FormCreate(Sender: TObject);

		    procedure CheckBox2Click(Sender: TObject);

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  RecieveForm: TRecieveForm;

		implementation

		uses mainunit;

		{$R *.DFM}

		procedure TRecieveForm.CancelButtonClick(Sender: TObject);

		begin

		 Close;

		end;

		procedure TRecieveForm.AddButtonClick(Sender: TObject);

		begin

		 with MainForm do begin

		 If CheckBox1.checked then

		   begin

		     TableTov.Insert;

		     TableTov.FieldByName('TovarName').AsString:=Edit1.Text;

		     TableTov.FieldByName('EdIzm').AsString:=ComboBox1.Text;

		     TableTov.FieldByName('Price').AsFloat:=strtofloat(Edit4.Text);

		     TableTov.FieldByName('Col').AsInteger:=SpinEdit2.Value;

		     TableTov.Post;

		   end

		 //Увеличиваем количество в таблице "медикаменты"

		else begin

		 TableTov.edit;

		 TableTov.FieldByName('Col').AsInteger:= TableTov.FieldByName('Col').AsInteger+SpinEdit2.Value;

		 TableTov.post;

		 end;

		  //Дополняем таблицу "Накладные"

		 TableNakl.Insert;

		 If not (CheckBox1.checked) then TableNakl.FieldByName('TovarCode').AsInteger:=strtoint(DBLookUpComboBox1.text)

		                           else  TableNakl.FieldByName('TovarCode').AsInteger:=TableTov.FieldByName('TovarCode').AsInteger;

		 TableNakl.FieldByName('Date').AsDateTime:=DateTimePicker1.Date;

		 TableNakl.FieldByName('Sum').AsInteger:=SpinEdit3.Value;

		 TableNakl.FieldByName('Recieved').AsInteger:=Spinedit2.Value;

		 If CheckBox2.checked then

		  begin

		   TablePost.Insert;

		   TablePost.FieldByName('PostName').AsString:=Edit2.text;

		   TablePost.FieldByName('PostPhone').AsInteger:=strtoint(Edit3.text);

		   TablePost.Post;

		   TableNakl.FieldByName('PostCode').AsInteger:=TablePost.FieldByName('PostCode').AsInteger;

		  end

		  else  TableNakl.FieldByName('PostCode').AsInteger:=strtoint(DBLookUpComboBox2.Text);

		 TableNakl.Post;

		 end;

		end;

		procedure TRecieveForm.CheckBox1Click(Sender: TObject);

		begin

		 DBLookupComboBox1.enabled:=not(DBLookupComboBox1.enabled);

		 edit1.enabled:=not(edit1.enabled);

		 ComboBox1.enabled:=not(ComboBox1.enabled);

		 Edit4.enabled:=not(Edit4.enabled);

		end;

		procedure TRecieveForm.FormCreate(Sender: TObject);

		begin

		Edit1.enabled:=false;

		ComboBox1.enabled:=false;

		Edit4.enabled:=false;

		Edit2.enabled:=false;

		Edit3.enabled:=false;

		end;

		procedure TRecieveForm.CheckBox2Click(Sender: TObject);

		begin

		 DBLookupComboBox2.enabled:=not(DBLookupComboBox2.enabled);

		 Edit2.enabled:=not(Edit2.enabled);

		 Edit3.enabled:=not(Edit3.enabled);

		end;

		end.

		

		unit reportUnit;

		interface

		uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

		  StdCtrls;

		type  TReportForm = class(TForm)

		    Memo1: TMemo;

		    Button1: TButton;

		    procedure Button1Click(Sender: TObject);

		    procedure FormCreate(Sender: TObject);

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  ReportForm: TReportForm;

		implementation

		{$R *.DFM}

		procedure TReportForm.Button1Click(Sender: TObject);

		begin

		 Close;

		end;

		procedure TReportForm.FormCreate(Sender: TObject);

		begin

		 if fileexists('report.txt') then Memo1.Lines.LoadFromFile('report.txt')

		 else ShowMessage('Файл report.txt в текущем каталоге не найден');

		end;end.

		

		unit SaleUnit;

		interface

		uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

		  DBCtrls, StdCtrls, Db, DBTables, Mask, Spin, Printers;

		type  TSaleForm = class(TForm)

		    Label1: TLabel;

		    SaleYesButton: TButton;

		    SailCancelButton: TButton;

		    SpinEdit1: TSpinEdit;

		    NaklButton: TButton;

		    procedure SailCancelButtonClick(Sender: TObject);

		    procedure SaleYesButtonClick(Sender: TObject);

		    procedure NaklButtonClick(Sender: TObject);

		  private    { Private declarations }

		  public    { Public declarations }

		  end;

		var  SaleForm: TSaleForm;

		implementation

		uses mainunit;

		{$R *.DFM}

		procedure TSaleForm.SailCancelButtonClick(Sender: TObject);

		begin

		Close;

		end;

		procedure TSaleForm.SaleYesButtonClick(Sender: TObject);

		begin

		with MainForm do begin

		TableTov.Edit;

		TableTov.Fields[4].AsInteger:=TableTov.Fields[4].AsInteger - SaleForm.SpinEdit1.Value;

		TableTov.Post;

		end;

		end;

		procedure TSaleForm.NaklButtonClick(Sender: TObject);

		begin

		 printer.begindoc;

		with printer.canvas do begin

		 textout(200,80,'Накладная №______');

		 textout(80,100,'Дата');

		 textout(280,100,'Продавец');

		 textout(480,100,'Адрес');

		 DateSeparator := '.';

		 textout(80,120,DateToStr(Date));

		 textout(280,120,'АО АРГО');

		 textout(480,120,'Махачкала, пр. Шамиля 1');

		 textout(80,220,'Товар');

		 textout(280,220,'Количество');

		 textout(480,220,'Общая стоимость');

		 textout(80,240,MainForm.TableTov.Fields[1].AsString);

		 textout(280,240,inttostr(SpinEdit1.value));

		 textout(480,240,inttostr(SpinEdit1.value*MainForm.TableTov.Fields[3].AsInteger));

		 end;

		 printer.enddoc;

		end;

		end.