Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Проектирование реализации операций бизнес- процесса «Движение библиотечного фонда»

Содержание:

Введение

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

Автоматизация библиотек позволила работникам библиотечной сферы избавиться от многих сложных процессов, что обеспечило наиболее быстрое, полное и качественное обслуживание пользователей информацией.

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

Объектом исследования является деятельность библиотекаря. Предметом исследования являются оптимизация работы библиотекаря.

Работа состоит из введения, трех глав, заключения и списка использованной литературы.

АНАЛИТИЧЕСКАЯ ЧАСТЬ

1. Характеристика комплекса задач

1.1. Выбор комплекса задач автоматизации

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

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

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

Цели у процесса автоматизации библиотечной деятельности самые различные, а именно:

- сокращение трудозатрат на выполнение технологических операций, связанных с комплектованием, организацией и использованием фондов и БД, справочно – информационном информационным обслуживанием и информационным обеспечением пользователей системы;

- расширение состава оказываемых пользователям услуг, в частности, путем включения в работу библиотек нетрадиционных для них услуг информационного обеспечения и справочного обслуживания, связанных с подготовкой, ведением и оперативным предоставлением фактографической информации;

- повышение комфортности работы пользователей, персонала библиотеки;

- расширение возможностей библиотечного и библиографического обслуживания;

- совокупность всех указанных целей.

Исходя из целей автоматизации библиотечной деятельности, можно заключить, что автоматизировать можно несколько направлений деятельности, а именно:

  • Работу бухгалтерии;
  • Автоматизировать процесс приема – выдачи книг;
  • Межбиблиотечный обмен;
  • регистрация периодических изданий и ведение соответствующего ЭК.

В данном курсовом проекте разработаем программу для автоматизации процесса приема – выдачи книг читателям. Автоматизировать процесс поиска книг для библиотекаря и для читателя в режиме онлайн.

Процесс автоматизации работы библиотеки, а именно работы библиотекаря подразумевает:

  • Поиск книг с помощью электронного каталога, то есть с помощью программы;
  • Поиск книг по разным критериям;
  • Выдача книг с помощью программы;
  • Автоматический вывод должников.

Таким образом, автором будет создана программа поиска книг, то есть электронный каталог.

1.2. Характеристика существующих бизнес –процессов

Далее рассмотрим бизнес-процессы которые имеют место в библиотеке, а точнее бизнес-процессы, которые происходят в деятельности библиотекаря.

  1. Заявка клиента на литературу.
  2. Поиск литературы по каталогу (используется обычный каталог);
  3. Взятие книги с полки (согласно данным из каталога);
  4. Если книга есть в библиотеке:
    1. Книга берется с полки;
    2. Берется карточка читателя для заполнения;
    3. Заполнение карточки читателя;
    4. Выдача книги;
  5. Если книги нет – другой заказ.

В курсовом проекте будет автоматизировано направление поиску книги и выдаче его читателю. То есть, программа позволить показать, есть книга в наличие или нет. А затем если есть книга, то оформить ее выдачу читателю.

1.3. Характеристика документооборота, возникающего при решении задачи

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

Рисунок 1 - Схема документооборота в деятельности библиотекаря

1.4. Обоснование проектных решений

Обоснование проектных решений по информационному обеспечению

Информационное обеспечение программы – это совокупность информации, которая необходима для проектирования системы. Информационное обеспечения программы состоит из следующих компонентов:

внемашинное информационное обеспечение - входные и выходные документы;

внутримашинное информационное обеспечение – вся обрабатываемая информацию;

внутримашинное информационное обеспечение - условно-постоянную информации (таблицы БД, которые будем называть справочниками).

В разрабатываемой программе внемашинное информационное обеспечение вводится менеджером – библиотекарем. К входным данным относится информация:

  • О книгах;
  • О пользователям.

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

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

  • Реляционная модель самая простая;
  • В основе реляционной модели лежат связи между данными;
  • В ней используется привычное представление данных, то есть с помощью таблиц;
  • Просто систематизировать данные в таблицах.

Из существующих моделей разработки программного обеспечения была выбрана каскадная модель, так как она позволяет:

  • Полное документирование каждого проекта (в данном случае закись в работу);
  • Планирование времени окончания работ (в зависимости от свободного времени);
  • Возможность возращения к предыдущим этапам разработки программы.

1.5. Обоснование проектных решений по программному обеспечению

Так как программа создается для работников библиотеки, а как правило в любой библиотеке работают работники возрастной категории 35-55 лет, следовательно им не нужны сложные инструментальные средства, как языки программирования, специализированные библиотеки, системы автоматизированного проектирования, системы класса CASE. Поэтому в данном случае оптимальным вариантом является база данных.

Для разработки программы использовалась среда программирования Delhi.

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

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

В результате к базовым преимуществами Delphi относятся следующие:

  1. программа компилирует намного быстрее в Delphi чем С++. Крупный проект, включающий 30-50 модулей, каждый из которых содержит от одной до 4-х тысяч строк, компилируется за 5-15 секунд на 300 Mhz 64Mb Ram. С такой же скоростью что нельзя сделать на С++.
  2. Большое число готовых функций, причем аналогов данных функции на С++ не разработано на данный момент.
  3. Встроенная обработка исключений (Raise Exception.Create(‘Exception’); более логичная система исключений, базовый класс Exception;
  4. Debug и Run – одно и тоже.
  5. Дружественный и быстрый интерфейс
  6. Файл справки весит намного меньше 2гб, и идет в комплекте вместе с программой.
  7. Удачная реализация структура окна.
  8. Низкие системные требования.
  9. Удобные строки, позволяющие легко организовать дебаг: FDebug(Format(‘Error %s with message %d’,[E.ClassName, E.Message]));
  10. Не требует .lib файлов для статического подключения .dll –файлов
  11. Unit объединяет в себе файлы *.h, *.cpp, являясь при этом namespace’ом
  12. Файл программы разработанной на Delphi, включающий в себя полную информацию для дебага, весит намного меньше файла программы из С++.
  13. Среда разработки не имеет привычки при поиске декларации переменной перебирать все файлы на диске - поиск точки определения переменной происходит за доли секунды.
  14. Есть возможность работать только клавиатурой, без мыши. Так же есть и возможность работать с горячими клавишами, которые позволяют быстро переключаться между телом функции.
  15. Не требует стражей включения (#ifndef MY_COOL_HEADER_H #define MY_COOL_HEADER_H #endif)
  16. Не заполняет свободное место на диске большим количеством различных файлов, предназначенных для внутреннего использования.(*.opt, *.pch, *.idb, *.sbr, *.pdb). То есть приложение во время разработки занимает 1-2 Mb вместо 30-40.
  17. Возможность писать вложенные функции.
  18. Переменная Result
  19. Динамические методы
  20. Property – на нем построен весь VCL.
  21. Возможность взятия указателя на метод объекта, класс которого неизвестен на этапе разработки.

2 глава. ПРОЕКТНАЯ ЧАСТЬ Информационное обеспечение задачи

2.1. Информационная модель и её описание

Информационная модель — представляет собой модель объекта, которая представлена в виде информации. Эта информация описывает существенные для данного рассмотрения параметры и переменные величины объекта, связи между ними, входы и выходы объекта и позволяющая путем подачи на модель информации об изменениях входных величин моделировать возможные состояния объекта.

Информационная модель показана на рисунке 2:

Рисунок 2 – Информационная модель

Исходя из данных рисунка 2, информационную модель может заполнять менеджер, в данном случае работник библиотеки, то есть заполняются справочники: Books, Readers, Out.. А затем на основании введенных в справочник данных выполняется поиск необходимой информации и составление списка должников книг.

2.2. Характеристика нормативно-справочной, входной и оперативной информации

В программе используются справочники, представленные в Таблице 1.

Таблица 1 - Перечень применяемых справочников в БД

Название справочника

Ответственный за ведение справочника

Средний объем справочника в записях

Средняя частота актуализации

Books

Библиотекарь

Readers

Библиотекарь

Out

Библиотекарь

Реквизитный состав каждого справочника БД представлен в Таблице 2

Таблица 2 – Реквизитный состав справочников

Название справочника

Перечень реквизитов (поля справочника)

Books

Номер, название, автор, издательство, год издательства

Readers

Номер, ФИО, Адрес, телефон

Out

Номер книги, название, дата выдачи, дата возврата, штраф

Результирующая информация – это данные, которые получаются в результате запросов. Результирующие данные это список должников, который формируется на основании таблицы Out, и выводится на экран.

2.3. Характеристика результатной информации

Результирующей информацией являются следующие данные:

1. Вывод должников.

2. Вывод читателей.

3. Вывод поиска по имени автора.

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

2.4. Программное обеспечение задачи

Общие положения (дерево функций и сценарий диалога)

Программа разработана для одного пользователя – библиотекаря. Функции используемые в программе делятся на

  • служебные функции;
  • основные функции (ведение таблиц БД, ответы на запросы и др.).

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

Характеристика базы данных

Файлы базы данных, в которых хранится вся информация, должны находятся в поддиректории «DB», рабочей директории программы.

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

1. DB_Books.db – база книг. Эта таблица содержит следующие поля: Number (тип LongInteger) – номер книги в каталоге, Title (Alpha) – название книги, Writer (Alpha) - автор, Publish (Alpha) - издательство, Year (LongInteger) – год издания.

2. DB_Readers.db – база читателей. Поля: Number (LongInteger) – номер билета, FNP (Alpha) – Ф.И.О, Adress (Alpha) – адрес, Phone (LongInteger) – телефон.

3. DB_Out.db – база выданных книг. Поля: Number (LongInteger) – номер книги, Number_R (LongInteger) – номер билета, вспомогательное поле, введено для организации связи данной таблицы с таблицей DB_Readers.db (отношение много-к-одному), Title (Alpha) - название, Date_out (Date) – дата выдачи, Date_return (Date) – дата возврата, Fine (LongInteger) – сумма штрафа.

Структурная схема пакета (дерево вызова программных модулей)

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

Структурная схема показана на рисунке ?.

Главная форма состоит из кнопок, которые связаны с БД, по определенному алгоритму.

Файл

Файл

Открытие БД

Выход

Удаление, добавление, редактирование справочников

Отчеты

Помощь

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

Рисунок 3 – Структурная схема

Информационная система включает в себя модуль, осуществляющий все необходимые операции над данными. Данный модуль содержит формы, производящие добавление и редактирование информации. Кроме того, данный модуль выполняет функции удаления информации и формирования отчётов.

Взаимодействие пользователя и программы осуществляется при помощи диалогов.

При нажатии кнопки «Помощь» происходит вызов справки.

При нажатии кнопки «Файл – Открыть БД», попадаем на форму где можем добавлять, удалять, редактировать сведения в таблицах.

При нажатии кнопки «Отчеты», открывается отчет соответствующий данному запросу.

Описание программных модулей

Программа состоит из четырех модулей: Unit1, Unit2, Unit3, Unit4.

Основная часть алгоритма содержится в первом модуле, модуле главной формы (Form1) - Unit1. Unit2, Unit3 – обеспечивают в основном, работу временных форм (Form2, Form3), появляющихся только когда необходимо ввести и обработать некоторую информацию.

Unit4 – описание формы Form4, предназначенной для вывода рекламной заставки, отражающей суть и возможности программного средства, а также сведения об авторе.

Unit1 – краткое описание процедур и функций:

1. functionReadIni(ASection, AString : String) : String; - Функциячтенияданныхиз INI файла. Файл Options.ini должен находится в рабочей директории программы. В случае его отсутствия программа запросит необходимые данные и создаст его.

2. procedureWriteIni(ASection, AString, AValue : String); - Процедуразаписиданныхв INI файл.

3. procedure TForm1.FormCreate(Sender: TObject); - процедуразапускающаясяприсозданииглавнойформы. Содержит основные установки для визуальных компонентов, подключает и активизирует таблицы базы данных.

4. procedure TForm1.Button1Click(Sender: TObject); - УдалениезаписейизтаблицыDB_Books.db (Table1).

5. procedure TForm1.Button2Click(Sender: TObject); - Вызовформы Form2 длязаполненияданныхоновойкниге.

6. procedure TForm1.Button4Click(Sender: TObject); - Добавлениевтаблицу Table2 (DB_Readers) данныхоновомчитателе.

7. procedureTForm1.Button3Click(Sender:TObject); - Поиск читателя по введенным данным. По полю FNP (Ф.И.О) производится фильтрация (на частичное совпадение), по остальным полям – поиск (так же по неполному совпадению).

8. procedureTForm1.Button5Click(Sender:TObject); - Удаление записи о читателе (Table2) и каскадное удаление всех подчиненных записей из Table3.

9. procedure TForm1.RadioButton1Click(Sender: TObject); - Показтаблицы "Списокчитателей".

10. procedure TForm1.RadioButton2Click(Sender: TObject); - Показспискакнигвзятыхуказаннымчитателем.

11. procedure TForm1.Button6Click(Sender: TObject); - Показ Form3 длязаполненияее

полей редактирования.

12. procedureTForm1.Button8Click(Sender:TObject); - Удаление книги из списка книг, взятых указанным читателем.

13. procedureTForm1.Button7Click(Sender:TObject); - Вызов формы Form2 для поиска книг по имени автора.

14. procedureTForm1.N1Click(Sender:TObject); - Первая строчка, первого пункта главного меню. Вывод на экран списка должников и суммы штрафа из предварительно сформированного и сохраненного файла. Файл сохраняется вподдиректорию /Temp рабочей директории программы. Формат – HTML.

15. procedureTForm1.N2Click(Sender:TObject); - Вторая строчка, первого пункта главного меню. Вызов второй формы для поиска читателей, которые должны сдать книги в определенную дату.

16. procedureTForm1.N3Click(Sender:TObject); - Третья строчка, первого пункта главного меню. Вызов второй формы для поиска всех книг определенного автора.

17. procedureTForm1.Button9Click(Sender:TObject); - Пересчет суммы штрафа для всех должников на сегодняшний день.

18. procedureTForm1.N5Click(Sender:TObject); - Изменение размера штрафа (запись в INI файл Options.ini). Второй пункт меню, первая строчка.

Unit2:

1. procedureTForm2.Button1Click(Sender:TObject); - Добавление новой (записи) книги в базу данных Table1.

2. procedure TForm2.Button2Click(Sender: TObject); - Фильтрацияпоимениавтора.

3. procedureTForm2.Button3Click(Sender:TObject); - Сохранение в файл и вывод на экран списка всех книг указанного автора.

Unit3:

1. procedureTForm3.Button1Click(Sender:TObject); - Добавление еще одной взятой книги к списку взятых ранее.

2. procedureTForm3.Button2Click(Sender:TObject); - Сохранение в файл и вывод на экран

всех читателей которые должны сдать книги в определенную дату.

2.5. Контрольный пример реализации проекта и его описание

В качестве тестирования было решено просто поработать с программой, так как это будет делать любой пользователь, столкнувшийся с данной программой.

Первое замечание появилось еще до запуска программы: было бы хорошо, если бы программа имела свою собственную иконку, а не стандартную, присваиваемую любой программе скомпилированной на Дельфи. Запускаем исполняемый файл Library.exe. Сразу после запуска программы появляется заставка, содержащая название программы, ее краткое описание, а также имя автора. Заставка держится на экране три секунды, однако есть подозрение, что при увеличении объема баз данных будет происходить следующее: заставка после трех секунд показа исчезнет с экрана, а основная форма еще не появиться, поскольку будет осуществляться подключение баз данных. Впрочем, скорее всего, эта проблема решается простым перемещением строк кода, ответственных за задержку в другое место алгоритма - сразу после команд подключения баз данных.

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

Рисунок 4 – Форма программы

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

Рисунок 5- Форма «Добавление книги в каталог»

Удаление записи из таблицы тоже организовано с помощью кнопки, после нажатия на которую, программа запрашивает подтверждение на удаление и только после утвердительного ответа выделенная запись удаляется.

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

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

1) Нужно было организовать ввод даты возврата таким образом, чтобы нельзя было ввести дату более раннюю, чем дата выдачи, хотя это и не критично.

2) В первой таблице можно было ввести цветовое обозначение записей, чтобы отмечать книги уже выданные на руки, допустим, красным цветом.

3) Заполнение полей «Номер книги» («Название») можно было организовать по клику мышки на какой-либо записи в первой таблице.

Рассмотрим теперь главное меню:

«Вывод» - состоит из трех пунктов

1. Вывод должников.

2. Вывод читателей.

3. Поиск по имени автора.

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

Замечания: вывод в формат HTML это хорошо, но у этого способа есть и недостатки (зависимость от внешнего приложения, правка текста довольно затруднительна).

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

Заключение

В заключении можно сказать, что созданная программа - проста, удобна в применении, так как данные отображаются в таблице, экономит большое количество времени. Эта программа доступна для любого человека, работающего в библиотеке и обладающего простыми навыками пользования компьютером.

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

Библиография

Занимательное программирование VisualBasic С. Симанович, Г. Евсеев АСТ-ПРЕСС КНИГА 2002

Язык программирования C++ С.В Глушаков, А.В Коваль, С.ВСмирнов Фолио Аст 2001

Культин, Н.Б. Программирование на Object Pascal в Delphi. Н.Б. Культин. М.:BHV - СПБ. 2008г. - 340 с.

Приложение 1

unit Unit1;

interface

uses

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

Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables, StdCtrls, Mask,

ComCtrls, Menus,ShellAPI,DateUtils,IniFiles;

type

TForm1 = class(TForm)

DBGrid1: TDBGrid;

DataSource1: TDataSource;

Table1: TTable;

Button1: TButton;

Button2: TButton;

Edit2: TEdit;

Edit3: TEdit;

Button3: TButton;

Button4: TButton;

Button5: TButton;

DataSource2: TDataSource;

Table2: TTable;

DBGrid2: TDBGrid;

Button6: TButton;

MaskEdit3: TMaskEdit;

MaskEdit4: TMaskEdit;

Button7: TButton;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

DataSource3: TDataSource;

Table3: TTable;

Button8: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

DBGrid3: TDBGrid;

MainMenu1: TMainMenu;

Options1: TMenuItem;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

Button9: TButton;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

procedure RadioButton2Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N8Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

i:integer;

implementation

uses Unit2, Unit3;

{$R *.dfm}

function ReadIni(ASection, AString : String) : String;

var //Функция чтения данных из INI файла

sIniFile: TIniFile;

sPath : String[60];

const

S = 'xyz'; { стандартная строка для выдачи ошибок чтения }

begin

sPath:={'c:\Library_DB'}ExtractFileDir(Application.ExeName);

sIniFile := TIniFile.Create(sPath + '\Options.INI');

Result := sIniFile.ReadString(ASection, AString, S); { [Section] String=Value }

sIniFile.Free;

end;

procedure WriteIni(ASection, AString, AValue : String);

var //Процедура записи данных в INI файл

sIniFile: TIniFile;

sPath : String[60];

begin

sPath:={'c:\Library_DB'}ExtractFileDir(Application.ExeName);

sIniFile := TIniFile.Create(sPath + '\Options.INI');

sIniFile.WriteString(ASection, AString, AValue);; { [Section] String=Value }

sIniFile.Free;

end;

procedure TForm1.FormCreate(Sender: TObject);

var t3:Longint;

begin

t3:=GetTickCount div 1000; //Вркмя показа заставки

while (GetTickCount div 1000)<t3+3 do;

//Подключение таблиц и их активизация

Table1.DatabaseName:=ExtractFileDir(Application.ExeName){'c:\Library_DB'}+'\DB\';

Table1.TableName:='DB_Books.db';

Table2.DatabaseName:=ExtractFileDir(Application.ExeName){'c:\Library_DB'}+'\DB\';

Table2.TableName:='DB_Readers.db';

Table3.DatabaseName:=ExtractFileDir(Application.ExeName){'c:\Library_DB'}+'\DB\';

Table3.TableName:='DB_Out.db';

Table1.Active:=true;

Table2.Active:=true;

Table3.IndexName:='qqq'; //Связывание таблиц

Table3.IndexFieldNames:='Number_R';

Table3.MasterFields:='Number';

Table3.Active:=true;

RadioButton1.Checked:=true;

//Установки для отображения таблиц

DBGrid1.Columns.Items[1].Width:=200;

DBGrid1.Columns.Items[2].Width:=200;

DBGrid1.Columns.Items[3].Width:=200;

DBGrid1.Columns.Items[4].Width:=70;

DBGrid2.Columns.Items[1].Width:=200;

DBGrid2.Columns.Items[2].Width:=200;

DBGrid3.Columns.Items[0].Width:=75;

DBGrid3.Columns.Items[1].Visible:=false;

DBGrid3.Columns.Items[2].Width:=200;

DBGrid3.Columns.Items[3].Width:=80;

DBGrid3.Columns.Items[4].Width:=85;

DBGrid3.Columns.Items[5].Width:=85;

DBGrid1.Columns[0].Title.Caption:='Номер';

DBGrid1.Columns[1].Title.Caption:='Название';

DBGrid1.Columns[2].Title.Caption:='Автор';

DBGrid1.Columns[3].Title.Caption:='Издательство';

DBGrid1.Columns[4].Title.Caption:='Год издания';

DBGrid2.Columns[0].Title.Caption:='Номер';

DBGrid2.Columns[1].Title.Caption:='Ф.И.О';

DBGrid2.Columns[2].Title.Caption:='Адрес';

DBGrid2.Columns[3].Title.Caption:='Телефон';

DBGrid3.Columns[0].Title.Caption:='Номер книги';

DBGrid3.Columns[2].Title.Caption:='Название';

DBGrid3.Columns[3].Title.Caption:='Дата выдачи';

DBGrid3.Columns[4].Title.Caption:='Дата возврата';

DBGrid3.Columns[5].Title.Caption:='Сумма штрафа';

Button9.Click; //Пересчет и заполнение поля Fine

CreateDir(ExtractFileDir(Application.ExeName)+'\Temp');

end;

procedure TForm1.Button1Click(Sender: TObject);

begin //Удаление записей из таблицы DB_Books.db (Table1)

if Table1.RecordCount>0 then

if MessageDlg('Удалить запись о данной книге?',mtWarning,[mbYes,mbNo],0)= mrYes then

Table1.Delete

else Abort;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin//Вызов формы для заполнения данных о новой книге

Form2.WindowState:=wsNormal;

Form2.Show;

Form2.Button2.Visible:=false;

Form2.Button1.Visible:=true;

Form2.Button3.Visible:=false;

Form2.Caption:='Добавление книги в каталог';

end;

procedure TForm1.Button4Click(Sender: TObject);

begin //Дабавление данных о новом читателе

if RadioButton2.Checked=true then Abort;

if (trim(MaskEdit3.Text)<>'') and (trim(Edit2.Text)<>'') and (trim(Edit3.Text)<>'') then

begin

if Form1.Table2.Locate('Number',trim(MaskEdit3.Text),[])=true then

begin

MessageDlg('Билет с таким номером уже существует!',mtError,[mbOK],0);

Abort;

end;

if Form1.Table2.Locate('FNP',trim(MaskEdit3.Text),[])=true then

begin

MessageDlg('Читатель с такой фамилией уже зарегестрироан',mtInformation,[mbOK],0);

Abort;

end;

Form1.Table2.Insert;

Form1.Table2.FieldByName('Number').AsInteger:=strtoint(trim(MaskEdit3.Text));

Form1.Table2.FieldByName('FNP').AsString:=trim(Edit2.Text);

Form1.Table2.FieldByName('Adress').AsString:=trim(Edit3.Text);

if trim(MaskEdit4.Text)<>'' then Form1.Table2.FieldByName('Phone').AsInteger:=strtoint(trim(MaskEdit4.Text));

Form1.Table2.Post;

end

else MessageDlg('Заполните необходимые поля!',mtInformation,[mbOK],0);

end;

procedure TForm1.Button3Click(Sender: TObject);

begin //Поиск читателя по введенным реквизитам

if trim(MaskEdit3.Text)<>'' then

begin

Form1.Table2.Locate('Number',trim(MaskEdit3.Text),[loPartialKey]);

Abort;

end;

if trim(Edit2.Text)<>'' then

begin

Form1.Table2.FilterOptions:=[foCaseInsensitive];

Form1.Table2.Filter:='FNP = '''+trim(Edit2.Text)+'*''';

Form1.Table2.Filtered:=true;

end;

if trim(Edit2.Text)='' then Form1.Table2.Filtered:=false;

if trim(Edit3.Text)<>'' then

begin

Form1.Table2.Locate('Adress',trim(Edit3.Text),[loPartialKey,loCaseInsensitive ]);

Abort;

end;

if trim(MaskEdit4.Text)<>'' then

begin

Form1.Table2.Locate('Phone',trim(MaskEdit4.Text),[loPartialKey]);

Abort;

end;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin //Удаление записи о читателе (Table2) и

//каскадное удаление всех подчиненных записей из Table3

if (RadioButton1.Checked=true) and (Table2.RecordCount>0) then

if MessageDlg('Удалить запись о данном читателе?',mtWarning,[mbYes,mbNo],0)= mrYes then

begin

Table3.First;

for i:=1 to Table3.RecordCount do

begin

Table3.Delete;

Table3.Next;

end;

Table2.Delete

end

else Abort;

end;

procedure TForm1.RadioButton1Click(Sender: TObject);

begin//Показ таблицы "Список читателей"

DBGrid2.Visible:=true;

DBGrid3.Visible:=false;

Label5.Caption:='Список читателей';

end;

procedure TForm1.RadioButton2Click(Sender: TObject);

begin//Показ списка книг взятых указанным читателем

DBGrid2.Visible:=false;

DBGrid3.Visible:=true;

Label5.Caption:='Читатель: '+Form1.Table2.FieldByName('FNP').AsString+'. Список взятых книг:';

end;

procedure TForm1.Button6Click(Sender: TObject);

begin//Показ Form3 для заполнения ее

//полей редактирования

if RadioButton2.Checked=true then

begin

Form3.WindowState:=wsNormal;

Form3.Show;

Form3.Button1.Visible:=true;

Form3.Button2.Visible:=false;

Form3.Caption:='Заполнение карточки читателя';

end;

end;

procedure TForm1.Button8Click(Sender: TObject);

begin //Удаление книги из списка книг взятых

//указанным читателем

if (RadioButton2.Checked=true) and (Table3.RecordCount>0) then

if MessageDlg('Удалить эти данные?',mtWarning,[mbYes,mbNo],0)= mrYes then

Table3.Delete

else Abort;

end;

procedure TForm1.Button7Click(Sender: TObject);

begin //Вызов формы Form2 для поиска книг по имени автора

Form2.WindowState:=wsNormal;

Form2.Show;

Form2.Button2.Visible:=true;

Form2.Button1.Visible:=false;

Form2.Button3.Visible:=false;

Form2.Caption:='Поиск книг';

end;

procedure TForm1.N1Click(Sender: TObject);

var i2,t,i3:integer;HTMLStr: TStringList;

n_r,sh: array [1..100000] of integer;

path:string;

begin

t:=-10; //Первая строчка, первого пункта главного меню

i3:=1; //Вывод на экран списка должников и суммы штрафа

for i2:=1 to i3 do

sh[i2]:=0;

Form1.Table3.IndexName:=''; //Удаление связи таблиц

Form1.Table3.IndexFieldNames:='';

Form1.Table3.MasterFields:='';

Form1.Table3.FilterOptions:=[foCaseInsensitive];

Form1.Table3.Filter:='Fine > 0'; //Установка фильтра

Form1.Table3.Filtered:=true; //Долг>0

Form1.Table3.IndexFieldNames:='Number_r';

Form1.Table3.First;//Просмотр всех записей отфильтрованной

//таблицы и запоминание номеров должников в массив

for i2:=1 to Form1.Table3.RecordCount do

begin

if Form1.Table3.FieldByName('Number_r').AsInteger<>t then

begin

n_r[i3]:=Form1.Table3.FieldByName('Number_r').AsInteger;

t:=n_r[i3]; //Добавление должника в массив

i3:=i3+1;

end;

sh[i3-1]:=sh[i3-1]+Form1.Table3.FieldByName('Fine').AsInteger;

//Сумма штрафа для данного должника

Form1.Table3.Next;

end;

Form1.Table3.Filtered:=false; //Отмена фильтрации

Form1.Table3.IndexName:='qqq'; //и востановление связи таблиц

Form1.Table3.IndexFieldNames:='Number_R';

Form1.Table3.MasterFields:='Number';

HTMLStr:=TStringList.Create;//Создание файла отчета

HTMLStr.Clear; //формат:HTML

HTMLStr.Add('<HTML>');

HTMLStr.Add('<HEAD>');

HTMLStr.Add('<TITLE>'+''+'</TITLE>');

HTMLStr.Add('</HEAD>');

HTMLStr.Add('<H1 align=center> Должники и сумма штрафа на '+datetostr(Date)+'</H1>');

HTMLStr.Add('<table border=1 cellspacing=0 cellpadding=0 width=100%>');

HTMLStr.Add('<tr>');

HTMLStr.Add('<td width=10%>'+'<b>Номер</b>'+'</td>');

HTMLStr.Add('<td width=70%>'+'<b>Ф.И.О</b>'+'</td>');

HTMLStr.Add('<td width=20%>'+'<b>Сумма штрафа</b>'+'</td>');

HTMLStr.Add('</tr>');

for i2:=1 to i3-1 do

begin

Form1.Table2.Locate('Number',n_r[i2],[]);

HTMLStr.Add('<tr>');

HTMLStr.Add('<td>'+inttostr(i2)+'</td>');

HTMLStr.Add('<td>'+Table2.Fields[1].DisplayText+'</td>');

HTMLStr.Add('<td>'+inttostr(sh[i2])+'</td>');

HTMLStr.Add('</tr>');

end;

HTMLStr.Add('</table>');

HTMLStr.Add('</BODY>');

HTMLStr.Add('</HTML>');

path:=ExtractFileDir(Application.ExeName)+'\Temp\Fine.html';

HTMLStr.SaveToFile({'c:\1.html'}path); //Сохранение на жесткий диск

HTMLStr.Free;

ShellExecute(Application.MainForm.Handle,PChar('open'),PChar({'c:\1.html'}path),nil,nil,SW_SHOWNORMAL);

//и вывод на экран

end;

procedure TForm1.N2Click(Sender: TObject);

begin //Вторая строчка, первого пункта главного меню

//Вызов второй формы для поиска читателей, которые

//должны сдать книги в определенную дату

Form3.WindowState:=wsNormal;

Form3.Show;

Form3.Button1.Visible:=false;

Form3.Button2.Visible:=true;

Form3.Caption:='Поиск читателей, которые должны сдать книги в определенную дату';

end;

procedure TForm1.N3Click(Sender: TObject);

begin //Третья строчка, первого пункта главного меню

//Вызов второй формы для

//поиска всех книг определенного автора

Form2.WindowState:=wsNormal;

Form2.Show;

Form2.Button3.Visible:=true;

Form2.Button1.Visible:=false;

Form2.Button2.Visible:=false;

Form2.Caption:='Поиск всех книг определенного автора';

end;

procedure TForm1.Button9Click(Sender: TObject);

var nd,f,i2:integer;

begin //Пересчет суммы штрафа для всех должников

//на сегодняшний день

try

f:=strtoint(ReadIni('Fine','Fine'));

except

MessageDlg('Файл Options.ini не найден',mtError,[mbOK],0);

WriteIni('Fine','Fine',InputBox('Размер штрафа','Введите штраф, взимаемый за один день пользования книгой дольше установленного срока','10'));

end;

Form1.Table3.IndexName:=''; //

Form1.Table3.IndexFieldNames:='';

Form1.Table3.MasterFields:='';

Form1.Table3.First;

for i2:=1 to Form1.Table3.RecordCount do

begin

if strtodate(Form1.Table3.FieldByName('Date_return').AsString)<Date then

begin

nd:=DaysBetween(strtodate(Form1.Table3.FieldByName('Date_return').AsString),Date);

Form1.Table3.Edit;

Form1.Table3.FieldByName('Fine').AsInteger:=nd*f;

Form1.Table3.Post;

end;

Form1.Table3.Next;

end;

Form1.Table3.IndexName:='qqq'; //

Form1.Table3.IndexFieldNames:='Number_R';

Form1.Table3.MasterFields:='Number';

end;

procedure TForm1.N5Click(Sender: TObject);

begin //Изменение размера штрафа

//(запись в INI файл Options.ini)

WriteIni('Fine','Fine',InputBox('Размер штрафа','Введите штраф, взимаемый за один день пользования книгой дольше установленного срока',ReadIni('Fine','Fine')));

end;

procedure TForm1.N7Click(Sender: TObject);

begin

Application.HelpFile:={'c:\Library_DB\'}ExtractFileDir(Application.ExeName)+'\Help_User';

Application.HelpCommand(Help_Contents,0);

end;

procedure TForm1.N8Click(Sender: TObject);

begin

Application.HelpFile:={'c:\Library_DB\'}ExtractFileDir(Application.ExeName)+'\Help_Prog';

Application.HelpCommand(Help_Contents,0);

end;

end.

unit Unit2;

interface

uses

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

Dialogs, Mask, StdCtrls,unit1, DB, DBTables,Printers,ShellAPI;

type

TForm2 = class(TForm)

Edit3: TEdit;

Edit4: TEdit;

MaskEdit1: TMaskEdit;

Edit1: TEdit;

MaskEdit2: TMaskEdit;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Button2: TButton;

Button3: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);

begin//Добавление новой (записи) книги в базу данных Table1

if (trim(MaskEdit1.Text)<>'') and (trim(Edit1.Text)<>'')

{and (trim(Edit3.Text)<>'') and (trim(Edit4.Text)<>'') and

(trim(MaskEdit2.Text)<>'')} then

begin

if Form1.Table1.Locate('Number',trim(MaskEdit1.Text),[])=true then

begin

MessageDlg('Книга с таким номером уже существует!',mtError,[mbOK],0);

Abort;

end;

Form1.Table1.Insert;

Form1.Table1.FieldByName('Number').AsInteger:=strtoint(trim(MaskEdit1.Text));

Form1.Table1.FieldByName('Title').AsString:=trim(Edit1.Text);

Form1.Table1.FieldByName('Writer').AsString:=trim(Edit3.Text);

Form1.Table1.FieldByName('Publish').AsString:=trim(Edit4.Text);

if (trim(MaskEdit2.Text)<>'') then Form1.Table1.FieldByName('Year').AsInteger:=strtoint(trim(MaskEdit2.Text));

Form1.Table1.Post;

end

else MessageDlg('Заполните необходимые поля!',mtInformation,[mbOK],0);

end;

procedure TForm2.Button2Click(Sender: TObject);

begin //Фильтрация по имени автора

if trim(Edit3.Text)<>'' then

begin

Form1.Table1.FilterOptions:=[foCaseInsensitive];

Form1.Table1.Filter:='Writer = '''+trim(Edit3.Text)+'*''';

Form1.Table1.Filtered:=true;

end;

if trim(Edit3.Text)='' then Form1.Table1.Filtered:=false;

end;

procedure TForm2.Button3Click(Sender: TObject);

var i2:integer;HTMLStr: TStringList;

path:string;

begin //Сохранение в файл и вывод на экран списка всех книг

//указанного автора

if trim(Edit3.Text)='' then

begin

MessageDlg('Введите имя автора!',mtInformation,[mbOK],0);

Abort;

end;

Form1.Table1.FilterOptions:=[foCaseInsensitive];

Form1.Table1.Filter:='Writer = '''+trim(Edit3.Text)+'''' ;

Form1.Table1.Filtered:=true;

if Form1.Table1.RecordCount=0 then

begin

MessageDlg('Не найдена ни одна книга данного автора!',mtInformation,[mbOK],0);

Form1.Table1.Filtered:=false;

Abort;

end;

HTMLStr:=TStringList.Create;//

HTMLStr.Clear;

HTMLStr.Add('<HTML>');

HTMLStr.Add('<HEAD>');

HTMLStr.Add('<TITLE>'+''+'</TITLE>');

HTMLStr.Add('</HEAD>');

HTMLStr.Add('<H1 align=center> Автор: '+ Edit3.Text+'. Cписок книг:'+'</H1>');

HTMLStr.Add('<table border=1 cellspacing=0 cellpadding=0 width=100%>');

HTMLStr.Add('<tr>');

HTMLStr.Add('<td width=10%>'+'<b>Номер</b>'+'</td>');

HTMLStr.Add('<td width=70%>'+'<b>Название</b>'+'</td>');

HTMLStr.Add('</tr>');

for i2:=1 to Form1.Table1.RecordCount do

begin

HTMLStr.Add('<tr>');

HTMLStr.Add('<td>'+inttostr(i2)+'</td>');

HTMLStr.Add('<td>'+Form1.Table1.Fields[1].DisplayText+'</td>');

HTMLStr.Add('</tr>');

Form1.Table1.Next;

end;

HTMLStr.Add('</table>');

HTMLStr.Add('</BODY>');

HTMLStr.Add('</HTML>');

path:=ExtractFileDir(Application.ExeName)+'\Temp\list.html';

HTMLStr.SaveToFile({'c:\1.html'}path);

HTMLStr.Free;

Form1.Table1.Filtered:=false;

ShellExecute(Application.MainForm.Handle,PChar('open'),PChar({'c:\1.html'}path),nil,nil,SW_SHOWNORMAL);

end;

end.

unit Unit3;

interface

uses

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

Dialogs, StdCtrls,unit1, Mask,DB, DBTables, ComCtrls,ShellAPI;

type

TForm3 = class(TForm)

Button1: TButton;

MaskEdit1: TMaskEdit;

Edit1: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

MaskEdit3: TMaskEdit;

MaskEdit2: TMaskEdit;

Label5: TLabel;

MaskEdit4: TMaskEdit;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);

begin //Добавление еще одной взятой книги к списку

//взятых ранее

if (trim(Edit1.Text)<>'') and (trim(MaskEdit1.Text)='') then

begin

if Form1.Table1.Locate('Title',trim(Edit1.Text),[])=true then

MaskEdit1.Text:=trim(Form1.Table1.FieldByName('Number').AsString)

else MessageDlg('Книга с таким названием не существует!',mtError,[mbOK],0);

end;

if trim(MaskEdit1.Text)='' then Abort;

if Form1.Table1.Locate('Number',trim(MaskEdit1.Text),[])=false then

begin

MessageDlg('Книга с таким номером не существует!',mtError,[mbOK],0);

Abort;

end;

Form1.Table3.IndexName:='';

Form1.Table3.IndexFieldNames:='';

Form1.Table3.MasterFields:='';

Form1.Table3.First;

if Form1.Table3.Locate('Number',trim(MaskEdit1.Text),[])=true then

begin

MessageDlg('Книга с таким номером уже внесена!',mtError,[mbOK],0);

Form1.Table3.IndexName:='qqq';

Form1.Table3.IndexFieldNames:='Number_R';

Form1.Table3.MasterFields:='Number';

Abort;

end;

Form1.Table3.IndexName:='qqq';

Form1.Table3.IndexFieldNames:='Number_R';

Form1.Table3.MasterFields:='Number';

if {(MaskEdit3.Text=' . . ') or} (MaskEdit2.Text=' . . ') then

begin

MessageDlg('Введите дату!',mtError,[mbOK],0);

Abort;

end;

{if MaskEdit3.Text=' . . ' then} MaskEdit3.Text:=datetostr(Date);

try

{strtodate(trim(MaskEdit3.Text));}

strtodate(trim(MaskEdit2.Text));

except

MessageDlg('Неверный ввод даты!',mtError,[mbOK],0);

Abort;

end;

Form1.Table1.Locate('Number',trim(MaskEdit1.Text),[]);

Edit1.Text:=Form1.Table1.FieldByName('Title').AsString;

Form1.Table3.Insert;

Form1.Table3.FieldByName('Number').AsInteger:=strtoint(trim(MaskEdit1.Text));

Form1.Table3.FieldByName('Title').AsString:=trim(Edit1.Text);

Form1.Table3.FieldByName('Date_out').AsString :=trim(MaskEdit3.Text);

Form1.Table3.FieldByName('Date_return').AsString:=trim(MaskEdit2.Text);

{Form1.Table3.FieldByName('Fine').AsInteger:=strtoint(trim(MaskEdit4.Text));}

Form1.Table3.Post;

end;

procedure TForm3.Button2Click(Sender: TObject);

var i2,t,i3:integer;HTMLStr: TStringList;

n_r: array [1..100000] of integer;

path:string;

begin //Сохранение в файл и вывод на экран

//всех читателей которые должны сдать книги в

//определенную дату

t:=-10;

i3:=1;

if (MaskEdit2.Text=' . . ') then

begin

MessageDlg('Введите дату!',mtError,[mbOK],0);

Abort;

end;

try

strtodate(trim(MaskEdit2.Text));

except

MessageDlg('Неверный ввод даты!',mtError,[mbOK],0);

Abort;

end;

Form1.Table3.IndexName:=''; //

Form1.Table3.IndexFieldNames:='';

Form1.Table3.MasterFields:='';

{Form1.Table3.FilterOptions:=[foCaseInsensitive];}

Form1.Table3.Filter:='Date_return='''+{QuotedStr(MaskEdit2.Text)}MaskEdit2.Text+'''';

Form1.Table3.Filtered:=true;

Form1.Table3.First;

for i2:=1 to Form1.Table3.RecordCount do

begin

if Form1.Table3.FieldByName('Number_r').AsInteger<>t then

begin

n_r[i3]:=Form1.Table3.FieldByName('Number_r').AsInteger;

t:=n_r[i3];

i3:=i3+1;

end;

Form1.Table3.Next;

end;

Form1.Table3.Filtered:=false;

Form1.Table3.IndexName:='qqq'; //

Form1.Table3.IndexFieldNames:='Number_R';

Form1.Table3.MasterFields:='Number';

HTMLStr:=TStringList.Create;//

HTMLStr.Clear;

HTMLStr.Add('<HTML>');

HTMLStr.Add('<HEAD>');

HTMLStr.Add('<TITLE>'+''+'</TITLE>');

HTMLStr.Add('</HEAD>');

HTMLStr.Add('<H1 align=center>Читатели которые должны сдать книги '+ MaskEdit2.Text+'</H1>');

HTMLStr.Add('<table border=1 cellspacing=0 cellpadding=0 width=100%>');

HTMLStr.Add('<tr>');

HTMLStr.Add('<td width=10%>'+'<b>Номер</b>'+'</td>');

HTMLStr.Add('<td width=70%>'+'<b>Ф.И.О</b>'+'</td>');

HTMLStr.Add('</tr>');

for i2:=1 to i3-1 do

begin

Form1.Table2.Locate('Number',n_r[i2],[]);

HTMLStr.Add('<tr>');

HTMLStr.Add('<td>'+inttostr(i2)+'</td>');

HTMLStr.Add('<td>'+Form1.Table2.Fields[1].DisplayText+'</td>');

HTMLStr.Add('</tr>');

end;

HTMLStr.Add('</table>');

HTMLStr.Add('</BODY>');

HTMLStr.Add('</HTML>');

path:=ExtractFileDir(Application.ExeName)+'\Temp\Debtors.html';

HTMLStr.SaveToFile({'c:\1.html'}path);

HTMLStr.Free;

ShellExecute(Application.MainForm.Handle,PChar('open'),PChar({'c:\1.html'}path),nil,nil,SW_SHOWNORMAL);

end;

end.

unit Unit4;

interface

uses

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

Dialogs, ExtCtrls;

type

TForm4 = class(TForm)

Image1: TImage;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form4: TForm4;

implementation

{$R *.dfm}

end.