DIPLOM (716574), страница 8
Текст из файла (страница 8)
Read(DataFile,Data); {Считываем данные}
val(Data.ProductOst,tempccc,code);
Str(Data1^.Count+1,Numm);
if tempccc=0 then goto ccc; { Если нулевая позиция, то не вносить в коллекцию }
o[0]:=chr(57);
FillChar(o[1],57,' ');
with data do
begin {Создание строки типа : Номер, Наименование, Расфасовка}
move(Numm[1],o[2],Length(Numm));
move(ProductName[1],o[succ(lpnum-1)+4],Length(Data.ProductName));
move(ProductRasf[1],o[succ(lpnum+lpname)+5],Length(Data.ProductRasf));
move(ProductNumber[1],o[50],Length(Data.ProductNumber));
end;
Data1^.Insert(NewStr(o)); {Помещаю ее в коллекцию строк}
ccc:
end; {1}
Для реализации списка строк в Turbo Vision предусмотрен объект TListBox. Это объект создает специальное окно скроллера с указателем на текущий элемент. Наименования я поместил в вышеописанную коллекцию строк, указатель на которую передал объекту с помощью метода TListBox.NewList.
Var
SCR : PScrollBar ;
LIST : PLitstBox;
.....
Begin
.....
RR.Assign(50,05,51,17); {Координаты скроллера}
Scr:=New(PscrollBar,Init(RR)); {Указатель на полосу скроллера}
Insert(Scr); {Создаем скроллер}
R.Assign(03,05,50,17); {Координаты окна со списком}
List:=New(PMyListBox,Init(R,1,scr)); {Указатель на окно со списком}
List^.NewList(Data1); {Связывание окна со коллекцией строк}
Insert(list); {Создаем окно со списком }
....
End;
Диалоговое окно выбора наименований выглядит следующим образом :
Перейду теперь к описанию процедуры Данные-Сделки. При выборе соответствующего пункта меню на экране почвляется диалоговое окно выбора периода для просмотра сделок. В нем нужно ввести нижнюю и верхнюю границы периода.
После ввода при нажатии на кнопку ПОКАЗАТЬ ЗА ПЕРИОД разворачивается окно со списком сделок (накладных) относящихся к введенному периоду. Это реализованно следующим образом. При соэдании коллекции строк с накладными сравниваютя дата сделки, нижняя и верхняя границы периода при помощи написанной прцедуоы DATECOMP из модуля DATES.PAS. Но для того, чтобы накладные распологались по порядку (по дате) мне пришлось перекрыть метод сортировки коллекции (см. модуль SKLSTR.PAS). После того, как создано диалоговое окно, пользователю предоставляется возможность распечатать выбранную накладную, соответствующую накладную по себестоимости и если накладная оплачена, то и приходный кассовый ордер.
2.6.4.5 ПРЕОБРАЗОВАНИЕ ДАННЫХ ПРИ ВЫВОДЕ ДОКУМЕНТОВ НА ПЕЧАТАЮЩЕЕ УСТРОЙСТВО.
В основном, вывод осуществляется стандартными процедурами Borland Pascal. Но например для печати приходного кассового ордера мне пришлось создать функцию для перевода суммы в слова (123 рубля в сто двадцать три рубля). Эта функция находится в модуле NUMSTR.PAS. Или для большей читабельности документов написал функцию для преобразования строки типа 1000000.00 в строку типа 1,000,000.00. Эта функция так же находится в модуле NUMSTR.PAS.
2.6.4.6 АРХИВИРОВАНИЕ ДАННЫХ.
Для того, чтобы в списке сделок не появлялись уже не нужные данные я написал подпрограмму для архивирования данных. При выборе команды меню АРХИВ-РАБОТА С АРХИВОМ на экране появляется диалоговое окно с двумя списками строк. В первом списке (СКЛАД) распологаются периоды сделок (месяц, год), которые доступны пользователю для просмотра, а во втором смиске (АРХИВ) сделки которые находятся в АРХИВЕ. Для архивации периода сделок использовал следующий алгоритм: При выборе периода для архивации, программа проверяет каждую сделку на принадлежность к этому периоду. Ecли сделка попадает а него, то поле SDELKA.ARCHIVE устанавливается в TRUE. При выборе периода для деархивации прграмма устанавливает поля SDELKA.ARCHIVE соответствующих сделок в FALSE. Подпрограмма архивации также увеличивает быстродействие программмы за счет уменьшения количества выводимых сделок.
2.6.4.7 ВВОД УСТАНОВОК.
Для того, чтобы предотвратить использование данной программы лицами не имеющим разрешения ее использование был создана подпрограммы для ввода пароля. Пароль (и все установки) хранится в конфигурационном файле FIRMA.DAT, который имеет следующую структуру :
Type {Структура данных для конфигурационного файла}
ConfigFileStructure = record
CassName : String[22]; { ФИО Кассира}
BuhName : String[30]; { ФИО бухгалтера}
GenName : String[30]; { ФИО коммерческого директора}
UserName : String[30]; { ФИО пользователя}
Signature : String[10]; { Сюда пишется дата BIOS'а }
Reserved1 : String[10]; { }
Reserved2 : String[10]; {Зарезервировано }
Reserved3 : String[20]; { }
Password : String[10]; {Пароль}
FirmName : String[60]; {Реквизиты фирмы}
Kurs : Real; {Курс доллара}
end;
При начальном запуске пароль не установлен. При необходимости из меню УСТАНОВКИ-ПАРОЛЬ можно установить пароль. Опишу реальзацию подпрограмму для его установки. Создается диалоговое окно со строкой ввода. Для того, чтобы привводе пароля на экране не отображались вводимые символы, был перекрыт метод TInputLine.HandelEvent так, что бы каждый введенный символ помещался в отдельную строку, а отображался ‘*’ (звездочкой). Для детального просмотра алгоритма см. модуль PASSWORD.PAS. После введения пароля и нажатия на кнопку OK появляется диалоговое окно для проверки введенного пароля. Если оба введеных пароля совпадают, то он записывается в файл FIRMA.DAT в поле Password. Если они не совпадают, то пароль не устанавливается.
Анологично реализованы подпрограммы для ввода реквизитов и курса доллара.
2.6.4.8. ПАРОЛИРОВАНИЕ.
Для того, чтобы предотвратить доступ к данным я решил создать пароль, который запрашивался бы каждый раз при запуске программы. Для этого в записи ConfigFileStructure и добавил поле PassWord типа String[10];
Type
ConfigFileStructure = record
....
Password : String[10];
....
End;
Затем в меню УСТАНОВКИ добавил подменю УСТАНОВКИ-ПАРОЛЬ и связал
с ним комманду cmDostup, которая вызывает процедуру ввода пароля Dostup
из модуля SETUP.PAS. Эта процедура реализована так: На экране появляется
диалоговое окно со строкой ввода :
Введите пароль . В ней вводится пароль и при нажатии на кнопку OK
появляется следующее окно для проверки введенного пароля. Если во втором
окне введенный пароль соответствует введенному паролю в первом окне, то
этот пароль кодируется и записывается в файл FIRMA.DAT. Кодирование
происходит следующим образом. Каждый символ пароля умножается на число
(58+номер символа)*2. При запуске программы появляется диалоговое окно со
сторокой ввода Введите пароль . Если введенный пароль в закодированном
виде соответствует установленному закодированному паролю, то программа
продолжает функционировать , а если не соответсвуют, то выводится
сообщение о не правильно введенном пароле и программа прекращает
функционировать.
2.6.4.9. СТРУКТУРА БАЗ ДАННЫХ (БД).
Теперь рассмотрю структуру баз данных. Структура не является сложной, однако
она может содержать все данные, необходимые для данной системой и связь между разными БД осуществляется довольно простым путем.
Основной БД является БД, которая содержит информацию о наименованиях, имеющихся на складе (о количестве, о стоимости и т.д.). Она имеет следующую структуру :
Type
DataType = record { Структура складских данных}
ProductNumber : String[5]; {Номер}
ProductName : String[22]; {Наименование}
ProductRasf : String[10]; {Расфасовка}
PieceInBox : String[5]; {Кол-во штук в упаковке}
ProductPrice : String[12]; { Себестоимость }
ProductKol : String[12]; {Поставленное количество}
ProductFirm : String[22]; {Фирма поставщик}
ProductDate : String[l10]; {Дата прихода}
ProductOST : String[12]; {Осталось на складе}
ProductKurs : Real; { Курс прихода }
ProductSellPrice : Real; { Стоимость }
ProductVozvrat : LongInt; {Возврат}
end;
Var
Data : DataType;
DataFile : File of DataType; {Файл SKLAD.001}
Для записи (считывания) данных в (из) нее используется следующий алгоритм:
-
Открыть файл данных.
-
Поместить указатель положения в файле на нужную запись.
-
Для записи данных - каждому полю записи Data присвоить соответствующие данные, затем их записать в файл данных Write(DataFile,Data). Для считывания данных - Считать данные из файла Read(DataFile,Data);
-
Закрыть файл данных.
Более интересной структурой является структура сделок. :
Type {Заголовок сделки}
SdelkaInfo = record
SdelkaNumber : LongInt; {Номер сделки }
Reserved : Word;
Archive : Boolean; {Флаг архива}
ItemIndex : LongInt; {Индекс в наименованиях}
ItemsTaken : LongInt; {Всего наименований}
FirmName : String[22]; {Фирма}
Date : String[10]; {Дата выписки накладной}
OplataDate : String[10]; {Дата полной оплаты}
Summa : Real; {Сумма}
Kurs : Real; {Курс доллара}
SummaSkidka : Real; {Сумма со скидкой}
Oplata : Boolean; {TRUE - если оплачено полностью}
End;
Type
OneItemInfo = record { Наименования}
Number : LongInt;
SdelkaNumber : LongInt;
SklNum : LongInt;
Name : String[22];
Rasf : String[10];
Box : Integer;
KolVo : LongInt;
SBPrice : Real;
Price : Real;
Vozvrat : LongInt;
End;
Var
Sdelka : SdelkaInfo;
SdelkaFile : File of SdelkaInfo; {Файл SDELKA.001}
Item : OneitemInfo;
ItemsFile : File of OneItemInfo; {Файл SDELKA.002}
Структура состоит из заголовка и собстенно наименований. В заголовке содержатся следующие данные : Фирма покупатель, Дата накладной, Дата оплаты, Сумма накладной в долларах США , Сумма накладной со скидкой (в рублях), Курс доллара на момент ваписки накладной, Флаг архива, Количество проданных наименований, Индекс в БД с наименованиями.
В БД наименований находится информация о каждом наименовании, относящегося к соответствующей сделки.
Например, если нужно считать сделку, то надо:
-
Открыть файлы данных SdelkaFile и ItemsFile;;
-
Поместить указатель на нужную сделку в файле SdelkaFile (Seek(SdelkaFile,n));
-
Считать сделку из файла (Read(SdelkaFile,Sdelka);
-
Поместить указтель на наименование, численно равный Sdelka.ItemIndex в файл ItemsFile и для каждого наименования (от Sdelka.ItemsIndex до Sdelka.ItemsIndex+Sdelka.ItemsTaken) считывать данные. (Read(ItemsFile,Item);
-
Закрыть файлы данных SdelkaFile и ItemsFile;
На Borland Pascal это выглядит следующим образом:
OpenSdelkaFile;
OpenItemsFile; {Открытие файлов: процедуры находятся в модуле SKLFILES.PAS}
Seek(SdelkaFile,нужная сделка); {Указываю на нужную сделку}
Read(SdelkaFile,Sdelka); {и считываю ее заголовок}
for n:=Sdelka.ItemIndex to Sdelka.ItemsTaken do {Считывание инф-ции о наименованиях}
Begin
Seek(ItemsFile,n);
Read(ItemsFile,Items);
...... операции над считанными данными (вставка в коллекцию строк) .....
End;
CloseItemsFile;
CloseSdelkaFile {Закратие файлов};
Структура приходов описана также , как и структура сделок.
2.6.5. ЗАКЛЮЧЕНИЕ
Используя мощные возможности компилятора BORLAND PASCAL 7.0 и объектно-ориентированной библиотеки TURBO VISION для написания системы управления работой коммерческой компании мне удалось за очень сжатые сроки создать довольно гибкую программу с пользовательским интерфейсом очень высокого класса.
2.7 Безопасность информации в ЛВС
2.7.1. Общая характеристика угроз, служб и механизмов безопасности
Комплексное рассмотрение вопросов обеспечения безопасности ЛВС нашло свое отражение в так называемой архитектуре безопасности, в рамках которой различают угрозы безопасности, а также услуги (службы) и механизмы ее обеспечения.
Под угрозой безопасности понимается действие или событие, которое может привести к разрушению, искажению или несанкционированному использованию ресурсов сети, включая хранимую, передаваемую и обрабатываемую информацию, а также программные и аппаратные средства.
Угрозы принято делить на случайные, или непреднамеренные, и умышленные. Источником первых могут быть ошибки в программном обеспечении, выходы из строя аппаратных средств, неправильные действия пользователей или администрации ЛВС и т.д.. Умышленные угрозы, в отличие от случайных, преследуют цель нанесения ущерба пользователям (абонентам) ЛВС и, в свою очередь подразделяются на активные и пассивные.
Пассивные угрозы, как правило, направлены на несанкционированное использование информационных ресурсов ЛВС, не оказывая при этом влияния на ее функционирование. Пассивной угрозой является, например, попытка получения информации, циркулирующей в каналах передачи данной ЛВС, посредством прослушивания последних.