Фрилансеры предложат решение вашей задачи уже через несколько минут!
Публикация заказа не займет много времени.
13 лет назад
Алексей Смирнов
45 лет, Россия
14 лет в сервисе
Был онлайн 11 лет назад
13 лет назад

ПОСТАНОВКА ЗАДАЧИ

Написать дополнительный модуль для программы, работающей с базой данных mdb (формат Microsoft Access 97).
Задача модуля: сделать копию файла базы данных в другой каталог (это будет архив), а из оригинала файла базы данных удалить старую информацию. Перед удалением старой информации нужно будет выполнить пересчёт остатков. Пересчётом остатков и удалением старой информации будет заниматься внешняя программа, вызывающая ваш модуль, поэтому в вашу задачу пересчёт остатков и удаление информации не входит. В момент копирования и пересчёта на экране должно присутствовать окно, отображающее ход выполнения пересчёта. Создание такого окна в вашу задачу входит. Ещё вам потребуеются навыки работы с библиотекой DAO и с языком SQL. Справочную информацию по объектам, методам и свойствам библотеки DAO, а также описание языка SQL можно найти в файле помощи к Microsoft Office.

Модуль может быть написан на любом языке программирования и должен быть выполнен в виде библиотеки DLL (не ActiveX), имя файла arhive.dll.
Arhive.dll должен быть таким, чтобы файл программы exe, использующей arhive.dll, не зависел от версии arhive.dll. Другими словами - чтобы при изменении версии arhive.dll не потребовалась перекомпиляция файла exe. Сам файл exe написан на языке VB5. К проекту модуль arhive.dll будет прикрепляться не через технологию ActiveX, а с помощью оператора Declare. Этот момент очень важен, потому что сам файл exe очень большой (больше 7Мб) и довольно обременительно при каждом изменении любой маленькой библиотеки проекта передавать заказчику весь exe-файл по Интернет. Подходит созданный вами модуль arhive.dll или нет - выяснится сразу после выполнения двух первых этапов технического задания. Чем размер модуля меньше, тем лучше.

Для модуля arhive.dll нужно будет написать файл помощи arhive.hlp. В файле помощи - весь список функций, методов и свойств модуля на первой странице; а на остальных страницах описание каждой функции, метода или свойства (каждая на отдельной странице).

Написаный модуль вместе с его исходным кодом и файлом помощи будет считаться собсвенностью заказчика, т.е. моей собственностью.
Работа будет считаться выполненной, если модуль arhive.dll и файл помощи arhive.hlp будут соответствовать техническому заданию и исходный код модуля arhive.dll будет передан заказчику, т.е. мне.

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

Для работы с базой данных модуль arhive.dll должен использовать библиотеку dao350.dll (если нужно, я её вышлю по E-Mail). Открытая база данных (объект DataBase) будет передана в модуль arhive.dll по ссылке. Для передачи ссылки на базу данных вам нужно написать специальную функцию инициализации.
Задание будет разбито на этапы, каждый этап будем отлаживать отдельно. Во время выполнения этапов никакой "отсебятины", всё строго по заданию.

ЭТАП 1. Создание библиотеки arhive.dll

Создайте библиотеку arhive.dll с одной единственной функцией инициализации. Функция инициализации должна принять из exe-программы ссылку на объект базы данных (DataBase). Объект как раз и будет открытой базой данных. Функция инициализации должна вернуть имя переданной ей базы данных (свойство Name объекта DataBase). Созданный модуль arhive.dll вышлите по E-Mail. Название функции инициализации: Initialize

ЭТАП 2. Проверка ссылки базы данных и самого модуля.

Добавьте в библиотеку arhive.dll функцию, которая вернёт дату начала ведения учёта. Дата начала ведения учёта находится в первой записи таблицы [Options] в поле [IntBegin]. Тип данных поля dbDate. Для получения даты используйте язык SQL: "SELECT [IntBegin] FROM [Options];". Созданный модуль arhive.dll вышлите по E-Mail. Название функции: GetDateBegin

При выполнении остальных этапов задания при обращении к базе данных всегда используйте язык SQL. Это необходимое условие задания. Т.е. нельзя использовать для просмотра или изменения данных и структуры базы данных методы DAO (кроме методов OpenRecordset и Execute). Для получения информации из базы данных используйте метод OpenRecordset, а для изменения данных или структуры используйте метод Execute. Кроме того, в методе OpenRecordset нельзя использовать тип объекта dbOpenTable.

ЭТАП 3. Доработка функции инициализации, создание файла помощи.

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

Создайте файл помощи arhive.hlp. На первой странице список, содержащий названия двух созданных нами функций. На второй странице - описание функции инициализации (т.е. название, описание входных и выходного параметры), на третьей странице - описание функции определения даты начала ведения учёта.
Созданный модуль arhive.dll и файл помощи arhive.hlp отправьте по E-Mail для тестирования.

ЭТАП 4. Создание метода перемещения данных в архив.

Этот метод как раз и будет выполнять основную задачу. Название метода: MoveToArhive
Первым делом нужно определить необходимость перемещения данных в архив.
Данные необходимо переместить в архив, если в базе данных присутствуют данные, введённые раньше позапредыдущего года.
Т.е., если сейчас 2005 год, то в базе данных должен остаться 2004 и 2005 года. Данные, введённые раньше 2004 года нужно переместить в архив.
Т.е., если год даты начала ведения учёта меньше, чем предыдущий год, то данные перемещать надо.
Дата начала ведения учёта определяется функцией GetDateBegin, а текущая дата задаётся в функции Initialize.
Итак, первым действием функции MoveToArhive будет это условие.
Если необходиомсти перемещать данные в архив нет, то функция должна на экране выдать сообщение:
"Нет необходимости перемещать данные в архив, т.к. нет данных, введённых раньше такого-то года".
Заголовок окна этого сообщения: "Перемещение данных в архив". В окне одна кнопка - "Продолжить".
После выдачи окна сообщения нужно сделать выход из подпрограммы MoveToArhive.

Окно сообщения должно быть модальным по отношению к вызывающему окну, которое находится в файле exe. Из-за этого в функции Initialize сделайте ещё один входящий параметр - дисктиптор вызывающего окна. Функция Initialize должна сохранить этот дискриптор где-то внутри модуля для дальнейшего использования. Добавьте описание нового параметра в файл помощи arhive.hlp на страницу с описанием функции Initialize.

Ещё один очень важный момент: размер окна сообщения должен зависеть от разрешения экрана. Например:
Экран: 640х480 - размер шрифта 8, размер окна 4320х1890 твипов, размер кнопки 1065х375 твипов
Экран: 800х600 - размер шрифта 10, размер окна 5400х2363 твипов, размер кнопки 1331х469 твипов
Экран 1024х768 - и т.д.

Чтобы пересчитать размеры элементов управления окна разделите текущую ширину экрана на 640. Получится коэффициент пересчёта размеров. Например:
Экран: 640х480 - коэффициент равен 1
Экран: 800х600 - коэффициент равен 800/640 = 1.25
Экран: 1024х768 - коэффициент равен 1024/640 = 1.6
и т.д.

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

Для пересчёта размеров элементов управления окна создаёте метод FormResize, этот метод должен будет пересчитать размеры окна и расположенных на нём элементов управления. Метод FormResize вы будете использовать потом при пересчёте размеров у остальных окон. Добавьте описание метода FormResize в файл помощи. Входящим парметром этого метода будет дискриптор окна, у которого нужно пересчитать размеры.

Создайте модуль arhive.dll и отправьте его вместе с файлом arhive.hlp по E-Mail для тестирования.

ЭТАП 5. Создание функции для определения количества подключенных пользователей.

Создадим следующую функцию GetCountUsers, которая определяет количество пользователей, подключенных к базе данных. Для этого вам понадобится использовать библиотеку MSLDBUSR.DLL (я её вышлю по E-Mail вместе с описанием её использования). Из неё нужно использовать функцию LDBUser_GetUsers.

Вот пример использования функции на VB5 (переделайте на свой язык, если поймёте что-то из примера). Если не поймёте из примера - воспользуйтесь описанием Msldbusr.doc или задавайте вопросы мне на E-Mail.

' КОНСТАНТА: для функции LDBUser_GetUsers
Private Const OptLDBLoggedUsers = &H2 ' получить список подключенных в текущий момент

' ДЕКЛАРАЦИЯ: определение списка подключенных пользователей
Private Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

' ФУНКЦИЯ: возвращает количество пользователей, подключенных к базе данных
' strDataBase - путь к файлу базы данных
Public Function GetCountUsers(strDataBase As String) As Integer
' Переменные
Dim strUsers() As String ' динамический массив строк
Dim intCount as Integer ' количество подключенных пользователей
' Код
' формирование в массиве одного пустого элемента
ReDim strUsers(1) As String
' определение количества пользователей
intCount = LDBUser_GetUsers(strUsers(), strDataBase, OptLDBLoggedUsers)
' исключение отрицательных значений
If intCount<0 Then
intCount = 0
End If
' определение результата
GetCountUsers = intCount
End Function

Добавьте описание функции в arihive.hlp (в дальнейшем и все остальные изменения в модуле arhive.dll отражайте в arihive.hlp). Создайте модуль arhive.dll и отправьте его вместе с файлом arhive.hlp по E-Mail для тестирования.

ЭТАП 6. Проверка подключения других пользователей.

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

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

Если другие пользователи подключены - выдайте сообщение в окне "База данных открыта другим пользователем!", заголовок окна "Перемещение остановлено". После этого нужно сделать выход из подпрограммы MoveToArhive.

Внестите изменения в модуль. В файле arihive.hlp добавьте список действий функций MoveToArhive. Список действий для остальных функций модуля в arhive.hlp добавлять не нужно.

Отправьте arhive.hlp и arhive.dll для тестирования. В дальнейшем - отправляйте выполненное задание после выполнения каждого этапа. Вы можете проходить этапы выполнения не дожидаясь результатов тестирования, но обязательно отправляйте для тестирования выполенную работу после каждого этапа.

ЭТАП 7. Выполнение резервного копирования.

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

Следующее действие функции MoveToArhive - вызов из внешней программы функции выполнения резервного копирования. Чтобы вызвать функцию, внешняя программа через фукцию инициализации Initialize должна передать в модуль ссылку на функцию резервного копирования, находящуюся во внешней программе. Функция резервного копирования вернёт True, если резервное копирование выполнено успешно или False - если резервное копирование не выполнено.

Если резервное копирование не выполнено, то нужно сделать выход из подпрограммы MoveToArhive.

ЭТАП 8. Выполнение проверки пароля для входа в базу данных.

Проверка пароля выполняется срествами внешней программы, поэтому добавьте следующее действие в MoveToArhive по аналогии с действием этапа 7.

ЭТАП 9. Создание функции "Открытие базы данных в монопольном режиме".

Открытие базы данных в монопольном режиме необходимо для того, чтобы в процессе архивации ни один пользователь не смог бы подключиться к базе данных.
Создайте функцию OpenDataBaseMono, которая должна вернуть признак успешного завершения.
Входным параметром функции OpenDataBaseMono будет strName - полный путь к файлу базы данных.
В функции OpenDataBaseMono первым действием - закройте базу данных: CurrentDb.Close
Вторым действие - откройте базу данных в монопольном режиме: Set CurrentDb = wkWorkSpace.OpenDataBase(strName, True, False).
В функции OpenDataBaseMono сделайте перехватчик ошибок для определения результата выполнения функции.
Ещё вам понадобится ссылка на рабочую область wkWorkSpace. Ссылку на рабочую область внешняя программа должна передать в модуль через функцию инициализации Initialize.
Функция OpenDataBaseMono - глобальная (т.е. видна из внешней программы).

ЭТАП 10. Создание функции "Открытие базы данных в обычном режиме".

Создайте глобальную функцию OpenDataBaseShare. Параметр функции strName - полный путь к файлу базы данных. Функция должна вернуть признак нормального завершения. Для открытия используйте срества DAO: Set CurrentDb = wkWorkspace.OpenDataBase(strName, False, False).

ЭТАП 11. Открытие базы данных в монопольном режиме.

Следующее действие функции MoveToArhive - открытие базы данных в монопольном режиме. Если в момент открытия базы данных в монопольном режиме произошла ошибка, то нужно выдать сообщение "Произошёл сбой во время открытия базы данных в монопольном режиме!" (заголовок окна "Перемещение остановлено"), восстановить подключение с помощью функции OpenDataBaseShare и выйти из подпрограммы MoveToArhive.
Если подключение восстановить не удалось - ничего страшного, внешняя программа после вызова метода MoveToArhive ещё раз проверит состояние подключения к базе данных.

ЭТАП 12. Открытие окна для отображения процесса перемещения.

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

ЭТАП 13. Создание рабочей копии файла базы данных.

Следующий этап метода MoveToArhive - создание рабочей копии файла базы данных. Имя и путь к файлу базы данных вам известны. Копию базы данных нужно создать в рабочем каталоге внешней программы. Путь к рабочему каталогу определяется самой внешней программой и передаётся в модуль через функцию инициализации Initialize. Расширение рабочей копии базы данных ARH. Копирование файла нужно показать в окне отображения процесса.

ЭТАП 14. Открытие рабочей копии файла базы данных.

Следующий этап метода MoveToArhive - открытие рабочей копии файла базы данных. Текущю базу данных пока закройте, чтобы не забивать оперативную память компьютера. Открытие рабочей базы данных выполните с помощью функции OpenDataBaseMono. Не забывайте про перехват ошибок и про окно отображения процесса.

ЭТАП 15. Создание каталога для хранения архива.

В том же каталоге, где хранится база данных, создайте каталог для хранения архива. Имя каталога определяется по позапрошлому году. Например, если сейчас 2005 год, то именем каталога будет 2003. Но, если такой каталог уже существует, то к имени создаваемого каталога нужно добавить число, например 2003_1. Если и такой каталог существует, то добавить следующее число (например 2003_2) и т.д.
Теперь нужно создать этот каталог.

ЭТАП 16. Копирование в каталог для хранения архива.

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

ЭТАП 17. Создание функции для удаления временных файлов.

Создадим глобальную функцию для удаления временных файлов DeleteTempFile. Эта функция будет использоваться потом в конце всех действий или в случае возникновения ошибки перемещения в архив.
Функция должна выполнить следующие действия:
1) отключение от рабочей копии базы данных (файл с раширением ARH), если подключение всё ещё установлено;
1) удаление рабочей копии базы данных.

ЭТАП 18. Заходим в саму базу данных.

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

Перед чистой данных нужно выполнить проверку наличия в архивируемом периоде резервных накладных. Я знаю - для вас не понятно, чот это такое. Но вам в подробности вникать и не нужно, я просто опишу это техническим языком, вам только нужно будет сделать несколько запросов к базе данных к определённым таблицам.

Структура запроса: "SELECT TOP 1 [NumRec] FROM [TableName] WHERE (Not [IsDelete]) AND [IsRes];"
TableName - вместо этого вы подставите имя таблицы

Если запрос хотя бы к одной таблице вернёт хотя бы одну запись - значит в таблице имеются резервные накладные, а это для перемещения в архив недопустимо. Т.е. если имеются резервные накладные, метод MoveToArhive должен выдать сообщение "В архивируемом периоде имеются резервные накладные! Уберите резервные накладные и повторите перемещение в архив." (заголовок окна сообщения "Перемещение остановлено"). После выдачи сообщения нужно удалить временные файлы с помощью функции DeleteTempFile, восстановить подключение с помощью функции OpenDataBaseShare и

Чтобы определить имена таблиц, к которым нужно выполнить запрос, воспользуйтесь следующими правилами:
1) имя таблицы начинается так: StoreExp;
2) таблицы c именами StoreExp и StoreExpGoods нужно пропустить, они всё-равно пустые;
3) последний символ в имени таблицы может быть только "0" или "1";
4) девятый и десятый символы в имени таблицы обозначают год (например таблица с именем StoreExp031 хранит данные за 2003 год).
5) год таблицы должен быть меньше предыдущего (например, если сейчас 2005 год, то год таблицы должен быть меньше 2004-го).

ЭТАП 19. Чистка базы данных.

Следующим действием метода MoveToArhive будет вызов внешней функции RemoveData. Сама функция будет расположена во внешней программе. Входящим параметром функции RemoveData бдет ссылка на открытую рабочую базу данных. Функция будет возвращать признак нормального завершения. Ссылка на функцию должна передаваться из внешней программы через функцию инициализации Initialize.

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

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

ЭТАП 20. Завершение работы метода MoveToArhive.

Последние действия метода MoveToArhive:
1) закрытие открытой базы данных;
2) перемещение рабочего файла из рабочего каталога программы в каталог с базой данных;
3) восстановление подключения;
4) закрытие окна отображения процесса.

Выбранный исполнитель

13 лет назад
Юрий Б.
Юрий Б. 
42 года, Россия
15 лет в сервисе
Был онлайн 4 года назад

$5

2 дня

Заявки фрилансеров

13 лет назад
Юрий Б.
Юрий Б. 
42 года, Россия
15 лет в сервисе
Был онлайн 4 года назад

Похожие заказы

Система управления сайтом на текстовых базах

Система управления сайтом на бесплатном хостинге вебсервис. На PHP или Perl без использования MySQL. Базой данных используется текстовые файлы txt или db. В системе должны присутствовать модули: - фотогалерея - чат - форум - гостевая и т.д.

База данных предприятия (система учота)

База данных предприятия (система учота)

Модуль на C++

Создание модулей на С++ для программы на Fortrane. 4 модуля.

Проект по созданию корпоративного програмного комплекса для производственно

Российская не-IT компания приглашает разработчика программного обеспечения (программиста) или сложившуюся группу разработчиков для работы над заказным проектом по созданию корпоративного программного комплекса. Сфера деятельности компании - промышлен...

Создание программы обработки данных

Требуется написать программу на любом из языков. Если коротко, то набор объектов описывается неким числом параметров, которые должны заноситься и извлекаться из базы данных (лучше, если MS Access, но варианты рассматриваются). Сопоставляя эти парамет...

Написание производственного процесса предприятия

Требуется программист для написания производственного процесса предприятия Требования: - проживание в Омске Использование только открытого ПО. Реализация базы данных в PostgreSQL. Кроссплатформенность проекта. (Win32, Linux) Опыт по созданию под

Нужно доработать БД и создать к ней интерфейс в Delphi

Есть база данных. Нужен интерфейс красивый и удобный. Срок неделя.

Автоматизация делопроизводства

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

Электронная платежная система - автоматический киоск по приёму платежей

Требуется написание программного обеспечения для приёма платежей в пользу операторов связи через автоматические платёжные киоски. Необходимые разделы софта: 1) Терминальная часть. Работа с сенсорными экранами, термопринтером (фискальным регистратором...

Создание браузера для просмотра текстов

Ищу программиста для написания программы - просмотрщика текстов. Специфические моменты: 1) в тексте необходимо сделать - гиперссылки (т.е. переходы по примечаниям); сноски; всплывающие подсказки (текст содержит непонятные современному человеку сл