Автоматический анализ результатов поисковых запросов к базе данных в Hague Express
Изучение правил Гаагского соглашения. Создание программы, выводящей актуальную информацию о текущем статусе выбранной регистрации в договаривающейся стороне. Недостатки и особенности базы данных Hague Express. Составление алгоритма поисковых запросов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 04.12.2019 |
Размер файла | 2,6 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http: //www. allbest. ru/
Оглавление
Аннотация
Annotation
Введение
1. Постановка задачи
2. Составление алгоритмов
2.1 Обзор правил Гаагского соглашения
2.2 Недостатки и особенности базы данных Hague Express
2.3 Составление блок-схемы алгоритма
3 Обзор технологий
4. Реализация
Заключение
Список литературы
Приложения
Аннотация
база данных поисковый алгоритм
Объектом исследования данной работы является изучение методов автоматизации анализа результатов запросов базы данных Hague Express.
Целью работы является создание программы, способной выводить актуальную информацию о текущем статусе выбранной регистрации в заданной Договаривающейся стороне
Предмет исследования -- построение алгоритма на основе недостатков, особенностей и правил базы данных Hague Express
По результату исследования была написана программа на основе изученного алгоритма.
Полученные результаты позволят заинтересованным мелким компаниям и отдельным людям извлекать интересующую их информацию, не вникая в правила соглашения.
Annotation
The object of this research is studying methods to automize analysis of queries` results to database Hague Express.
The purpose of this work is to create a program that can obtain actual information about current status of the chosen registration in a given Contracting Party.
The subject of this research -- to make an algorithm based on disadvantages, features and rules of the database Hague Express.
The result of this work is creation of the program based on the studied algorithm.
These results will allow interested small companies and individuals to extract information of interest to them, without delving into the rules of the agreement.
Введение
В наше время защита интеллектуальной собственности (ИС). В мире, где каждая компания желает выделиться на фоне других должна обладать не только хорошим качеством продукции, но и запоминающейся торговой маркой и выдающимися дизайнами. Более того, защита ИС позволяет исследователям, не волнуясь о возможном воровстве, выкладывать свои прототипы и идеи публично, которые впоследствии могут привести к созданию продукта, что ведёт человечество на путь всеобщего развития.
Самой влиятельной компанией, занимающейся патентами на мировом уровне, является World Intellectual Property Organization(WIPO). Данная организация имеет три разные базы данных: The Patent Cooperation Treaty позволяющая патентовать изобретения международно, The Madrid System, которая предоставляет защиту на торговые марки в 190 разных Договаривающихся сторонах и The Hague Express System, дающая патенты на дизайны, максимальное количество которых, составляет 100 штук в 70 разных Договаривающихся сторонах. В нашей работе мы рассматриваем базу данных The Hague Express System. Преимущества данной базы данных заключаются в том, что, во-первых, для получения патента соблюдается минимальное количество формальностей, во-вторых, можно без усилий изменить имя или адрес владельца и даже передать владение собственностью другому человеку. Но проблемой базы данных Hague Express является то, что для получения информации о степени предоставления защиты в конкретной Договаривающейся стране необходимо просматривать историю регистрационной заявки, которую впоследствии надо анализировать, пользуясь не только правилами Гаагского соглашения, но и порядком подачи уведомлений выбранной Договаривающейся стороны.
Целью работы является создание программы, способной выводить актуальную информацию о текущем статусе выбранной регистрации в заданной Договаривающейся стороне.
Предмет исследования в данной работе -- изучение правил Гаагского соглашения, построение алгоритма на его основе и исследование технологий, необходимых для его построения.
Практическое применение. Данная работа может понадобиться либо отдельным физическим лицам, либо маленьким компаниям, которые не могут позволить себе купить базу данных у WIPO, так как беспокоить может не только стоимость данной базы, но и необходимость разбираться в SQL-запросах для поиска информации в данной базе.
1. Постановка задачи
Основная задача работы заключается в создании программы, которая способна вывести точную информацию о регистрационном номере в отношении выбранной Договаривающейся стороны, без необходимости в проверке истории заданной заявки. Для её реализации в данной выпускной квалификационной работе были поставлены и реализованы следующие подзадачи:
1. Проанализировать правила Гаагского соглашения, на основе которых впоследствии составить алгоритм автоматизации их проверки.
2. Найти возможные недостатки и особенности базы данных Hague Express и имплементировать их в алгоритм, основанный на правилах.
3. Автоматизировать процесс предоставления информации о принятых решениях указанной Договаривающейся стороны в отношении к заданному регистрационному номеру заявки.
4. Найти и выбрать технологии, необходимые для реализации выше поставленных задач.
2. Составление алгоритмов
2.1 Обзор правил Гаагского соглашения
В данном обзоре мы рассматриваем только те правила, которые необходимы для составления алгоритма и нужную для этого информацию, публикующуюся в Международном реестре.
Рассмотрим правило 18 общей инструкции Гаагского соглашения, нас интересуют пункты 1, 2, 4, 5.
В пункте 1 говорится о сроке для уведомления об отказе. Если описать процедуры кратко, то: каждой Договаривающейся стороне предоставляют период в 6 месяцев для того, чтобы уведомить Международное бюро. Данный срок можно заменить на период 12 месяцев, подав заявление Генеральному директору, если это соответствует законодательству стороны. В случае, когда Ведомство по истечению вышесказанных периодов не предоставляет ответа Международному бюро, то дата действия регистрации начинается с момента, когда ей предоставит охрану Договаривающаяся сторона согласно своему законодательству, или дата, указанная в заявлении пункта (b), если таковая имеется. [1]
Однако это распространяется только на Акт 1999 г. Для Акта 1960 г. рассмотрим его статью 8(1).
В случае Акта 1960 г. , если Договаривающаяся сторона предусматривает проведение экспертизы на новизну, тогда дата действия международной регистрации начинается с даты истечения шестимесячного срока или с даты указанной в законодательстве, если такая имеется, в случае если у них таковой процедуры не имеется, то дата регистрации, то дата действия регистрации начинается с даты её регистрации. [2]
В пункте 2 излагается информация об уведомлении об отказе. Здесь нас интересует подпункт a) и подпункт b) (i), (v):
Конкретнее, в подпункте a) нас интересует, что каждый экземпляр уведомления об отказе относится к одной международной регистрации.
В подпункте b) (i), что будет изложена информация Ведомство какой Договаривающейся стороны предоставило данное уведомление, а в b) (v), сведения о том, что отказ может относится не только ко всем образцам, но и к их части.
Пункт 4 содержит в себе информацию об уведомлении об отзыве отказа. Здесь представляют интерес подпункт a) и подпункт b) (i), (iii)
В подпункте a), излагается, что, как и с отказом, отзыв об отказе может относится лишь к одной международной организации.
Подпункт b) (i) аналогично с правилом об отказе b) (i).
b) (iii) же гласит, что отзыв об отказе может быть предоставлен не ко всем образцам, которые были ранее отказаны, а и к отдельным экземплярам.
В пункте 5 говорится, что все уведомления, указанные в пунктах 1(c)(ii), 2 и 4 заносятся в Международный реестр.
Теперь рассмотрим правило 18bis, здесь мы проанализируем пункты 1, 2, 3
В пункте 1 данного правила говорится, что в периоды правила 18 п.1(a, b, c) Ведомство может отправить заявление на предоставление охраны всех или выбранных промышленных образцов. В заявлении также указывается, Ведомство какой договаривающейся стороны отослало уведомление.
В пунктах 2, 3 сообщается, что в случае, когда был подан отказ в сроки правила 18 п.1(a, b, c), то Ведомство в течение этого же срока может отослать уведомление о предоставлении охраны, вместо уведомления об отзыве отказа, на все или выбранные промышленные образцы. А также, что все уведомления заносятся в Международный реестр.
Правило 20 содержит в себе сведения о признании недействительности в какой-либо Договаривающейся стороне. Если международная регистрации была признана недействительной, то Ведомство такой Договаривающейся стороны должно уведомить об этом Международной бюро, а также указать тот факт, что недействительность не может быть обжалована. Более того, необходимо указать в каком объёме была признана недействительность, а точнее, ко всем ли образцам относится данное уведомление или к отдельно выбранным образцам (в этом случае предоставляется список выбранных образцов). Вдобавок в данном правиле говорится, что все уведомления о недействительности вносятся в Международный реестр.
В правиле 21 нас интересуют следующие пункты: 1, 2, 6
В пункте 1 привлекают наше внимание следующие подпункты (a) (i) (ii) (iii). Здесь описаны положения, к которым может быть подано ходатайство об изменении, но нас интересуют часть данных положений. Подпункт (i) рассматривает ситуацию, когда происходит изменение владельца международной регистрации. Подпункт (ii) -- изменение имени или адреса владельца. (iii) -- отказ со стороны владельца ко всем или выбранным Договаривающимся сторонам.
Пункт 2 представляет из себя содержание ходатайства. Потенциальные пункты для алгоритма -- (iii), в котором говорится, что в случае изменения владельца указывается адрес и имя нового владельца.
А в пункте 6 сообщается, что если ходатайство соответствует всем требования, то оно вносится в Международный реестр
Правило 24 пункт 2, подпункты (a) (i), (ii), (d). В пункте 2 (a) рассматриваются случаи, когда продление регистрации осуществляется частично по желанию владельца.
(i) Если владелец не желает продлевать свою регистрацию по отношению к какой-либо Договаривающейся стороне.
(ii) Если владелец не хочет продлевать регистрацию на все свои промышленные образцы.
В пункте (d) описывается ситуация, когда какая-либо из Договаривающихся сторон подавала уведомление о недействительности всех или части образцов регистрации, то в таком случае те образцы, которые были признаны недействительными не подлежат продлению.
Последние интересующее нас правило 25 п.1, в котором говорится, что дата занесения записи о продлении регистрации заносится в Международный реестр в дату необходимости продления. [3]
2.2 Недостатки и особенности базы данных Hague Express
Одним из ключевых недостатков данной базы данных является то, что в ней отсутствует автоматическая проверка истории, из-за чего существуют регистрации, в которых текущий статус может отличаться от действительности в настоящее время. Для таких регистраций ставится предупреждающая табличка о возможных несоответствиях.
Среди особенностей, которые мы будем использовать для построения алгоритма, хотелось бы отметить, что в случае, когда международная регистрация заканчивает своё действие и не была продлена в нужные сроки, текущий статус таких страниц содержит в себе информацию лишь о двух составляющих:
1. Регистрационный номер такой заявки
2. Дата, когда срок действия данной регистрации истёк.
Также было просмотрено более тысячи разных международных регистраций и выявлено, что в случаях уведомлений Ведомств, относящиеся к части промышленных образцов, в Международные реестр заносятся те номера образцов, к которым данное уведомление применимо. Несмотря на то что в правилах явно сказано, что уведомления могут содержать те образцы, к которым оно не относится.
2.3 Составление блок-схемы алгоритма
Рис. 1 Блок-схема алгоритма
Описание рис.1: на начало программы подаётся регистрационный номер, который вводится пользователем. Далее в условии 1 идёт проверка был ли номер введён правильно (т.е. определяется его существование в базе данных). Если такового не существует, то программа говорит нам об этом и заканчивает работу. В условии 2 проверяется, то особое оформление регистраций, срок которых истёк.
В условии 3 идёт проверка на предупреждающую табличку, которая в случае нахождения запускает код, который проверяет целостность действующих Договаривающихся сторон на основе тех правил, что могут убрать их из списка, а именно: если была признана полная недействительность Договаривающейся стороной (правило 20), если владелец захотел отказаться от услуг каких-либо Договаривающихся сторон (правило 21 п.1 (a) (iii)), и если владелец не желает продлевать свою регистрацию по отношению к определённым Договаривающимся сторонам (правило 24 п.2 (a) (i)). На основе этих условий построен алгоритм, который создаёт истинный список Договаривающихся сторон текущего статуса. Также проверяется личность, имя и адрес владельца (правило 21 п. 1 (a) (i), (ii)) и изменяется на правильный, если обнаружены несоответствия.
В условии 4 проверяется был ли произведён полный отказ со стороны владельца или нет. В случае, если отказ произошёл, то программа выводит эту информацию. В ином случае, программа проверяет в соответствии с правилом 24 п.2 (a) (ii), то программа меняет текущее количество дизайнов и фиксирует те дизайны, на которые регистрация была продлена. (Данный пункт алгоритма находится вне положительной проверки условия 3, т.к. извлекаются данные, необходимые для общей работы программы). Затем пользователь вводит из списка Договаривающуюся страну, которая его интересует.
Условие 5 проверяет на наличие введённой Договаривающейся стороны в списке. В отрицательном случае программа выводит, что в списке отсутствует введённая Договаривающаяся сторона.
Условие 6 проверяет все уведомления выбранной Договаривающейся стороны, если таковых не находит, то происходит переход к условию 7, которое проверяет под каким Гаагским соглашением была зарегистрирована данная заявка. В случае Акта 1960 г.: программа берёт сегодняшнюю дату и сравнивает её с датой регистрации, далее поступает в соответствии со статьёй 8 п.1 Акта 1960 г. Если Договаривающаяся страна проводит экспертизу на новизну и имеет в законодательстве период, в который данная экспертиза проводится, то дата действия регистрации определяется по формуле: , где - дата действия регистрации, - дата международной регистрации, зафиксированной в Международном реестре, - словарь законодательств стран и их периода проверки(в случае, если законодательство не предусматривает такой период данный параметр приравнивается к шести месяцам). В случае 1999 г.: если заявление не было отослано Ведомством, то формула аналогична формуле выше, если заявление было отправлено, то в случае, если законодательство не имеет такого периода , так как мы не знаем, какая дата будет указана в заявлении, то заменяется периодом в 12 месяцев.
В условии 8, если страна является Россией, то программа скачивает файл и анализирует его, если страна не Россия, то программа извлекает данную информацию из таблиц в истории регистрационной заявки.
3. Обзор технологий
В качестве языка программирования был выбран Python, так как в нём не только собрано большое количество библиотек, способных решить широкий круг разнообразных задач [4]. Также, так как в нашей работе мы будем заниматься парсингом, нам придется извлекать большое количество текстовой информации, а в Python славится своим разнообразием встроенных методов для работы с таким типом данных. Более того, удобство использование списков для хранения информации о номерах образцов сложно передать словами.
HTML [5] -- также известный, как HyperText Markup Language, а на русском «язык разметки гипертекста». Большинство веб-сайтов, которые находятся в интернете созданы на его основе. Данный инструмент позволяет наделить обычный текст определённой семантикой, используя теги. Теги, это особый инструмент данного языка разметки, совокупность которых позволяет наделить текст структурой, которую даёт браузеру понять, как его визуализировать.
Selenium [6] -- мощная библиотека, которая написана для многих языков программирования таких как: Java, Python, C#. Данная библиотека позволяет эмулировать действия человека в браузере, что позволяет автоматизировать работу программ в случаях, когда на сайте происходит динамическое формирование страниц. В нашей работе мы его используем для решения вышесказанной проблемы.
BeautifulSoup [7] -- специально написанная библиотека для Python, которая была названа в честь поэмы Льюиса Кэролла «Алиса в зазеркалье», оно носит такое символическое название, потому что целью данной библиотеки является «найти смысл в бессмыслице». Плюсом этой библиотеки является её простота использования, а также набор методов, которые обеспечивают лёгкий доступ к любому полю HTML-страницы. В нашей работе мы будем использовать данную библиотеку в совокупности с парсером lxml, так как это обеспечивает наиболее высокую скорость парсинга HTML-страниц.
Requests [8] -- библиотека, написанная на Python, которая заслужила свою популярность в мире из-за автоматизирования многих процессов, вследствие которых людям нет необходимости дальше вручную добавлять строки запроса к URL для отправки HTTP - запросов.
os [9] -- модуль стандартной библиотеки Python, позволяющий использовать функционал операционной системы. В нашей работе этот модуль будет использоваться для создания каталогов.
pdf2image -- модуль, позволяющий каждую страницу pdf файла преобразовать в изображение. В нашей программе данный модуль используется для преобразования pdf файла из базы данных Hague Express. Основания для использования такого метода довольно просты, в базе данных все файлы уведомления представляют из себя сканированные документы.
Pytesseract [10] -- модуль оптического распознавания символов, который распознаёт разные виды языков на изображении, что позволяет считывать такие символы с изображения. В нём реализовано большое количество алгоритмов такие как: line finding and baseline fitting, которые позволяют качественно распознать символы в наклонённых изображениях, в случаях, когда встречается моноширинной шрифт, тессеракт делит его на блоки, которые потом отправляются в классификатор для распознания и т.д.
PIL [11] -- библиотека языка Python, которая имеет высокий уровень обработки изображений, а также поддерживает широкий функционал для манипулирования изображений.
datetime [12] -- модуль стандартной библиотеки Python, предоставляющий класс, в котором реализованы методы для проведения манипуляций над датой и временем.
re [13] -- модуль стандартной библиотеки, который позволяет извлекать из текста, а также строчек байтов, информацию, используя регулярные выражения. В нашей работе данная библиотека использовалась для извлечения чисел из строки.
dateutil -- внешняя библиотека, которая добавляет расширения к стандартной библиотеки datetime. В нашей программе мы будем использовать метод relativedelta для вычисления месяцев.
time -- модуль стандартное библиотеки, который предоставляет доступ к разным функциям для манипуляции временем. В нашей программе нам необходима функция time.sleep() для функции selenium_search_FX(selenium_id), так как поиск по базе данных Hague Express происходит с помощью джава скриптов, бывают ситуации, когда поля найденной регистрации увеличиваются и уменьшаются и Selenium теряет эти поля из виду.
IPython.display [14] -- это публичный API для использования инструментов отображения в IPython. В нашей программе нас интересует класс IPython.display.Image, который позволяет отобразить изображения в выводе.
4. Реализация
В ходе написания программы были реализованы следующие функции:
selenium_search_FX(selenium_id) -- данная функция принимает на вход параметр selenium_id, в котором хранится регистрационный номер, заключенный в двойные кавычки. Функция переходит на сайт WIPO и ищет введённый регистрационный номер через поисковик базы данных Hague Express. А также извлекает информацию из текущего статуса: ссылку на историю регистрации, строку Договаривающихся сторон, Локарно класс регистрации.
check_expired_registration() -- функция проверяет истёк ли срок международной регистрации или нет
check_warning() -- функция проверяет присутствует ли предупреждающая табличка данного регистрационного номера или нет.
check_registration() -- функция проверяет к какому Акту регистрации принадлежит выбранный регистрационный номер.
renewal_list_gen() -- функция, генерирующая список Договаривающихся сторон, в отношении которых владелец продлил регистрацию, а также возвращает дату, когда продление закончится, если таковые отсутствуют, то пустой список и строку.
invalidation_list_gen() -- функция, генерирующая список Договаривающихся сторон, которые признали полную недействительность регистрации, либо пустой список, если таковые отсутствуют
renunciation_list_gen() -- функция, которая создаёт список, в котором хранится либо полный отказ от регистрации со стороны владельца, либо список Договаривающихся сторон, в отношении которых был произведён отказ, либо пустой список.
make_new_contr_p_list(renewal_list, invalidation_list, renunciation_list, contracting_parties) -- функция, которая принимает параметры:
· renewal_list -- список Договаривающихся сторон, в отношении которых регистрация была продлена
· invalidation_list -- список Договаривающихся сторон, которые признали данную регистрацию недействительной
· renunciation_list -- список Договаривающихся сторон, в отношении которых был произведен отказ, либо полный отказ от регистрации.
Функция проверяет был ли проведен полный отказ со стороны владельца, и в случае такового возвращает строку с этой информацией. Если полного отказа не было, то генерируется новый лист Договаривающихся сторон.
check_change_n_and_ownership() -- функция проверяет были ли уведомления об изменении имени/адреса владельца или изменении самого владельца регистрации, находит новейшую из этих 2 записей и возвращает её; при отсутствии таковых возвращает пустую строку.
get_dates_and_name() -- функция парсит информацию с сайта и возвращает дату регистрации, дату истечения регистрации, имя и адрес владельца.
partial_renewal_n_des_check() -- функция, которая проверяет было ли осуществлено продление по отношению не ко всем образцам, а к их части, если такое продление произошло, то возвращает список номеров таких образцов и новое текущее количество образцов, иначе возвращает пустой лист и 0.
find_all_about_country() -- данная функция парсит всю оставшуюся информацию о стране, а именно: отказ и его дату; отзыв отказа(в случае частичного список номеров образцов) и последнюю дату отзыва об отказе(если их было несколько); список номеров образцов и последнюю дату частичных отказов; предоставление охраны и его дату; список номеров образцов и последнюю дату частичной охраны; список номеров образцов и последнюю дату частичной недействительности. Если каких-либо данных не будет найдено, то списки возвращаются пустые, а даты соответствуют дате 01-01-1950. (Все эти данные заносятся в тип tuple, которые затем отправляются в другую функцию)
get_number_designs() -- функция парсит последний номер образца в текущем статусе регистрации и возвращает его.
data_analysis(p_l, p_d, r_l, r_d, pr_l, pr_d, pp_l, pp_d, wr_l, wr_d, pi_l, pi_d, amount_of_designs, n_all_l) -- первые 12 параметров это информация, которую возвращает функция find_all_about_country();
· p_l -- список, хранящий в себе информацию о полной охране
· p_d --дата полной охраны
· r_l -- список, хранящий в себе информацию о полном отказе
· r_d -- дата полного отказа
· pr_l -- список частичного отказа
· pr_d -- последняя дата частичного отказа
· pp_l -- список частичной защиты
· pp_d -- дата частичной защиты
· wr_l -- список, хранящий в себе либо полный отзыв отказа, либо частичный отзыв
· wr_d -- последняя дата отзыва отказа
· pi_l -- список частичной недействительности
· pi_d -- последняя дата частичной недействительности
· amount_of_designs -- номер последнего дизайна текущего статуса
· n_all_l -- если произошло частичное продление по отношению к образцам, то хранит в себе список номеров образцов, на которое данное частичное продление было осуществлено, иначе пустой список
Эта функция анализирует всю полученную информацию и возвращает три новых списка: список защищаемых номеров образцов; список номеров образцов, которым отказали в охране; и список ожидания, в котором хранятся номера тех образцов, которые не были ни отказаны, ни защищены.
search_images() -- функция, которая сохраняет все URL изображений из текущего статуса и возвращает их в виде списка
download_images() -- функция, которая создает папки и пути, куда будут сохраняться изображения, и также скачивает их в них по URL из базы данных. Возвращает список абсолютных путей к изображениям.
download_pdf(id_reg, country) -- функция, которая принимает следующие аргументы:
· id_reg -- номер регистрационного номера
· country -- страну, для которой скачивается файл
Также функция парсит со странички регистрационного номера URLs ко всем файлам, относящимся к стране в аргументе country, создаёт пути, куда затем скачивает файлы. Возвращает список абсолютных путей к файлам
pdf_to_images(pdf_paths) -- функция принимает на вход аргумент pdf_paths -- абсолютные пути к скачанным файлам; преобразует каждый из pdf файлов в набор изображений, под которые создаются пути(папки) и сохраняет их туда. Возвращает список абсолютных путей к этим изображения
images_to_text(pdf_paths_images) -- принимает на вход аргумент, в котором хранится список абсолютных путей к изображениям страниц pdf файлов. Функция проходится по изображениям файлов и считывает с них текст, который после полного считывания pdf файла добавляется в заранее сгенерированный список. На выходе возвращает список, в котором находится текста каждого pdf файла.
file_analysis(pdf_texts, pdf_paths, amount_of_designs, n_all_l) -- функция принимает следующие аргументы:
· pdf_texts -- список текстов pdf файлов
· pdf_paths -- абсолютные пути к pdf файлам
· amount_of_designs -- последний номер образца в регистрации
· n_all_l -- список, в котором содержится информация обо всех текущих действующих номерах образцов, если произошло продление по отношению к части образцов, иначе -- пустой список.
Функция анализирует файлы и создаёт на основе анализа списки тех образцов, которые охраняются и тех образцов, которым отказали в охране. Но так как возможна ситуация, где был в начале отослан отказ, а затем прислана защита, то необходимо сделать проверки данных списков. Алгоритм отсеивает такие номера, а также создает список ожидания, в котором хранятся номера, которых не коснулись уведомления отказа и защиты.
date_of_protection(registration_date, w_l, act_1999) -- функция, которая принимает аргументы:
· registration_date -- дата международной регистрации
· w_l -- список ожидания
· act_1999 -- True, если Акт 1999 г., False, если Акт 1960 г.
Данная функция проверяет содержание списка w_l, если в нём содержатся номера образцов, то анализ идёт для списка, если содержится строчка w_l ==[`reg'], то анализ идёт для регистрации, если пустой, то ничего не выводит. Функция сравнивает текущую дату с датой регистрации и на основе правила 18(1) выдаёт решение.
image_list(p_l, r_l, w_l, images_p) -- эта функция принимает следующие аргументы:
· p_l -- список номеров образцов, которые подлежат охране в выбранной Договаривающейся стороне
· r_l -- список номеров образцов, которые подлежат отказу от охраны в выбранной Договаривающейся стороне
· w_l -- список номеров образцов, на которые не было подано уведомлений от выбранной Договаривающейся стороны
· images_p -- пути к изображения, скачанных с текущего статуса сайта
Функция формирует для каждого списка p_l, r_l, w_l списки с абсолютными путями к изображениям, которые соответствуют номерам образцов в этих списках.
print_function(r_num, reg_date, exp_date, loc, holder, des_n, p_l, p_d, r_l, r_d, w_l, w_d, p_i, r_i, w_i) -- функция принимает на вход аргументы:
· r_num -- регистрационный номер
· reg_date -- дата регистрации
· exp_date -- дата истечения регистрации
· loc -- Локарно класс
· holder -- имя и адрес владельца
· des_n -- текущее количество дизайнов
· p_l -- список номеров образцов на охрану
· p_d -- самая поздняя дата охраны на номера образцов
· r_l -- список номеров образцов на отказ от охраны
· r_d -- самая поздняя дата отказа от охраны на номера образцов
· w_l -- список(ожидания) номеров образцов, на которые не прислали уведомлений
· w_d -- текущий статус этого списка ожидания
· p_i -- список путей к изображениям номеров образцов, на которые распространена охрана
· r_i -- список путей к изображениям номеров образцов, на которые распространён отказ от охраны
· w_i -- список путей к изображениям номеров образцов, на которые не прислали уведомлений
Функция выводит на экран информацию в том порядке, в котором подаются аргументы, если список пустой, то информация о них, их дате и списка изображений не выводится
print_function_date_protection(r_num, reg_date, exp_date, loc, holder, des_n, prot_date, im_path) -- функция принимает на вход следующие аргументы:
· r_num -- регистрационный номер
· reg_date -- дата регистрации
· exp_date -- дата истечения регистрации
· loc -- Локарно класс
· holder -- имя и адрес владельца
· des_n -- текущее количество дизайнов
· prot_date -- результат работы функции date_of_protection(reg_date, [`reg'], act_1999)
· im_path -- путь ко всем номерам изображений
Функция выводит на экран информацию в том порядке, в котором подаются аргументы
print_function_RU(r_num, reg_date, exp_date, loc, holder, des_n, p_l, r_l, ground, w_l, w_d, p_i, r_i, w_i) -- функция принимает аргументы:
· r_num -- регистрационный номер
· reg_date -- дата регистрации
· exp_date -- дата истечения регистрации
· loc -- Локарно класс
· holder -- имя и адрес владельца
· des_n -- текущее количество дизайнов
· p_l -- список номеров образцов на охрану
· r_l -- список номеров образцов на отказ от охраны
· ground -- причина отказа
· w_l -- список(ожидания) номеров образцов, на которые не прислали уведомлений
· w_d -- текущий статус этого списка ожидания
· p_i -- список путей к изображениям номеров образцов, на которые распространена охрана
· r_i -- список путей к изображениям номеров образцов, на которые распространён отказ от охраны
· w_i -- список путей к изображениям номеров образцов, на которые не прислали уведомлений
Функция выводит на экран информацию в том порядке, в котором подаются аргументы, если список пустой, то информация о них, их дате и списка изображений не выводится. Функция выводит информацию на экран только для России
В составлении алгоритма уже указывалось, что анализ файла происходит только в том случае, если страной, введённой пользователем, является Россия. Это происходит по той причине, что все pdf файлы были изъяты из публичного доступа в начале мая. Поэтому была возможность составить алгоритм анализа файла лишь для России, так как шаблоны заявлений имелись только по ней. Поэтому для всех других стран парсится информация из таблиц с сайта. Также хотелось бы отметить, что реализованная программа не охватывает все правила: не были проверены такие случаи, как «заявления о том, что изменение владельца признано недействительным», так как в Международном реестре полностью отсутствуют такие сценарий с начала 2012 года, заканчивая 2018; ещё не был реализован случай, когда изменение владельца происходит частично, так как это тоже встречается очень редко. (Приложение 1 проверка программы)
Заключение
В ходе работы были изучены правила Гаагского соглашения и выявлены недостатки и особенности базы данных Hague Express, на основе которых был разработан алгоритм, позволяющий обрабатывать правильно информацию. По этому алгоритму была написана программа, которая автоматически анализирует запросы, осуществляет проверки и выводит информацию на экран.
Список литературы
1 Общая инструкция к Акту 1999 г. и Акту 1960 г. правило 18 п.1
2 Гаагский акт от 28 ноября 1960 г. статья 8(1).
3 Общая инструкция к Акту 1999 г. и Акту 1960 г. URL: https://www.wipo.int/treaties/ru/text.jsp?file_id=429512 (дата обращения 19.05.2019)
4 Лутц М. Изучаем Python. 4-е изд. СПб: Питер, 2011
5 Прохоренок Н. А. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера. 3-е изд. СПб:Питер, 2012
6 Baiju Muthukadan Selenium with Python. URL: https://selenium-python.readthedocs.io/ (дата обращения 20.05.2019)
7 Ryan Mitchell Web Scraping with Python: Collecting more data from the modern Web. O'Reilly Media, Inc., 2018.
8 Kenneth Reitz Requests: HTTP for Humans. URL: https://2.python-requests.org//en/latest/index.html# (дата обращения 20.05.2019)
9 Python Documentation. URL: https://docs.python.org/3/library/os.html (дата обращения 21.05.2019)
10 Ray Smith An Overview of the Tesseract OCR Engine. Google Inc., 2007
11 Shai Vaingast Beginning Python Visualization: Crafting Visual Transformation Scripts. 2-е изд. Apress, 2014
12 Python Documentation. URL: https://docs.python.org/3/library/datetime.html (дата обращения 21.05.2019)
13 Python Documentation. URL: https://docs.python.org/3/library/re.html (дата обращения 21.05.2019)
14 IPython Interactive Computing Documentation. URL: https://ipython.org/ipython-doc/3/api/generated/Ipython.display.html (дата обращения 22.05.2019)
Приложение 1
Работа программы
Приложение 2
код программы
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
import requests
import os
import pytesseract
from PIL import Image
from pdf2image import convert_from_path
import re
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
import time
from IPython.display import Image
if not os.path.exists("hagueimages"):
os.mkdir("hagueimages")
if not os.path.exists("haguepdf"):
os.mkdir("haguepdf")
print("Input the registration number:")
id_ = input()
if id_.isdigit() is True:
id_ = 'DM/' + id_
selenium_id_ = '"' + id_ + '"'
# noinspection PyBroadException
def selenium_search_FX(selenium_id):
con_parties = None
locarno = None
driver = webdriver.Firefox()
driver.get('https://www.wipo.int/designdb/hague/en/')
search_number_panel = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//li[@aria-controls="number_search"]')))
search_number_panel.click()
search_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//input[@id="RNS_input"]')))
button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,'//div[@id="number_search"]//div[@class="searchButtonContainer bottom right"]//a[@role="button"]')))
search_input.send_keys(id_)
button.click()
try:
time.sleep(2)
locarno = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//td[@aria-describedby="gridForsearch_pane_LC"]'))).text
con_parties = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//td[@aria-describedby="gridForsearch_pane_DS"]'))).text
element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//td[@title=' + selenium_id +']')))
ActionChains(driver).move_to_element(element).click().perform()
link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,'//div[@class="permanentLink docNav"]//a[@title="Direct Link to this record"]')))
link = link.get_attribute('href')
driver.quit()
except:
print("There is no such registration number found")
link = ''
driver.quit()
return link, con_parties, locarno
def check_expired_registration():
text = soup.find('div', id='currentStatus').text
check = 'Expired'
if (check in text) is True:
index = text.find(check)
date_expiration = text[index:]
else:
date_expiration = ''
return date_expiration
def check_warning():
warning = soup.find('div', class_='alert alert--warning')
return warning
def check_registration():
reg_act = soup.find('div', id = "currentStatus").find('div', class_="box split").text
if reg_act == 'Registration under 1999 Act':
check = True
else:
check = False
return check
def renewal_list_gen():
all_tables = soup.find_all('h2', class_='box')
renewal_list = []
expiration_date = None
if all_tables != []:
renewal_table_box = None
renewal_list = []
for table in all_tables:
if ('Renewal' in table.text) is True:
renewal_table_box = table
break
if (renewal_table_box is not None) and (('Renewal' in renewal_table_box.text) is True):
renewal_table = renewal_table_box.findParent()
renewal_date = renewal_table.find_all('div', class_="text")[1].text
renewal_countries = renewal_table.find_all('div', class_="text")[3].text.split('.')[1].strip()
renewal_date_list = re.findall(r'\b\d+\b', renewal_date)
renewal_date = ''
for i in renewal_date_list:
renewal_date += i + ' '
renewal_date = renewal_date[:-1]
renewal_date = datetime.strptime(renewal_date.replace('.', ' '), '%d %m %Y')
expiration_date = (renewal_date + relativedelta(years=+5)).date()
renewal_list = renewal_countries.split(',')
if len(renewal_countries) < 3:
renewal_list.append(renewal_countries)
else:
renewal_list = renewal_countries.split(',')
new_list = []
for i in renewal_list:
new_list.append(i.strip())
renewal_list = new_list
return renewal_list, expiration_date
def invalidation_list_gen():
all_tables = soup.find_all('h2', class_='box')
invalidation_tables_list = []
invalidation_list = []
if all_tables != []:
for table in all_tables:
invalidation_table = table.findParent()
if (('Invalidation' in table.text) is True) and (('Partial Invalidation' in table.text) is False):
invalidation_tables_list.append(invalidation_table)
if invalidation_tables_list != []:
for invalidation_table in invalidation_tables_list:
invalid_country = invalidation_table.find_all('div', class_="text")[2].text.split(';')[0]
invalidation_list.append(invalid_country)
return invalidation_list
def renunciation_list_gen():
all_tables = soup.find_all('h2', class_='box')
renunciation_tables_list = []
if all_tables != []:
for table in all_tables:
renunciation_table = table.findParent()
check_81 = renunciation_table.find_all('div', class_="inid")[-2].find('div', class_="inidCode").text
if (('Renunciation' in table.text) is True) and check_81 == '(81)':
countries = renunciation_table.find_all('div', class_='text')[-2].text.split('.')[1].strip()
if len(countries) < 3 :
renunciation_tables_list.append(countries)
else:
countries = countries.split(',')
new_list = []
for country in countries:
new_list.append(country.strip())
countries = new_list
renunciation_tables_list += countries
elif(('Renunciation' in table.text) is True) and check_81 != '(81)':
renunciation_tables_list = []
canceled_reg = 'This registration was renounced'
renunciation_tables_list.append(canceled_reg)
else:
pass
return renunciation_tables_list
def make_new_contr_p_list(renewal_list, invalidation_list, renunciation_list, contracting_parties):
result_list = []
if 'This registration was renounced' not in renunciation_list:
delete_list = invalidation_list + renunciation_list
if renewal_list != []:
result_list = [result for result in renewal_list if result not in delete_list]
text = ''
for con_party in result_list:
text += con_party + ', '
text = text[:-2]
result_list = text
else:
new_con_parties_list = contracting_parties.split(',')
new_list = []
for con_party in new_con_parties_list:
new_list.append(con_party.strip())
new_con_parties_list = new_list
result_list = [result for result in new_con_parties_list if result not in delete_list]
text = ''
if result_list != '':
for con_party in result_list:
text += con_party + ', '
text = text[:-2]
result_list = text
else:
result_list = 'This registration has no Contracting Parties'
else:
result_list = 'This registration was renounced'
return result_list
def check_change_n_and_ownership():
new_holder = ''
new_holder_own = ''
name_date = datetime.strptime('01 01 1950', '%d %m %Y').date()
owner_date = datetime.strptime('01 01 1950', '%d %m %Y').date()
trans_tables = soup.find_all('div', class_="transaction")
if trans_tables != []:
for trans in trans_tables:
change_name = trans.find('h2', class_="box").text.split(':')[0].strip()
if change_name == 'Change in Name/Address of Holder':
check_78 = trans.find_all('div', class_="inid")[1].find('div', class_="inidCode").text
if check_78 == '(78)':
new_holder = trans.find_all('div', class_="text")[1].text
else:
pass
check_58 = trans.find_all('div', class_="inid")[-1].find('div', class_="inidCode").text
if check_58 == '(58)':
name_date_text = trans.find_all('div', class_="text")[-1].text
name_date = datetime.strptime(name_date_text.replace('.', ' '), '%d %m %Y').date()
else:
pass
own_tables = soup.find_all('div', class_="transaction all_office")
if own_tables != []:
for own_table in own_tables:
change_owner = own_table.find('h2', class_="box").text.split(':')[0].strip()
if change_owner == 'Change in Ownership':
check_78_own = own_table.find_all('div', class_="inid")[2].find('div', class_="inidCode").text
if check_78_own == '(78)':
new_holder_own = own_table.find_all('div', class_="text")[2].text
else:
pass
check_58_own = own_table.find_all('div', class_="inid")[-1].find('div', class_="inidCode").text
if check_58_own == '(58)':
owner_date_text = own_table.find_all('div', class_="text")[-1].text
owner_date = datetime.strptime(owner_date_text.replace('.', ' '), '%d %m %Y').date()
else:
pass
if (new_holder != '') and (new_holder_own != ''):
if name_date > owner_date:
pass
else:
new_holder = new_holder_own
elif (new_holder == '') and (new_holder_own != ''):
new_holder = new_holder_own
else:
pass
return new_holder
def get_dates_and_name():
current_status = soup.find('div', id='currentStatus')
check_15 = current_status.find_all('div', class_="inid")[1].find('div', class_="inidCode").text
check_18 = current_status.find_all('div', class_="inid")[2].find('div', class_="inidCode").text
check_73 = current_status.find_all('div', class_="inid")[4].find('div', class_="inidCode").text
t = current_status.find_all('div', class_='text')
if check_15 == '(15)':
rdate = datetime.strptime(t[1].text.replace('.', ' '), '%d %m %Y')
else:
rdate = ''
if check_18 == '(18)':
edate = datetime.strptime(t[2].text.replace('.', ' '), '%d %m %Y')
else:
edate = ''
if rdate != '':
reg_date = datetime.date(rdate)
else:
reg_date = ''
if edate != '':
expiration_date = datetime.date(edate)
else:
expiration_date = ''
if check_73 == '(73)':
holder_n_and_addr = t[4].text
else:
holder_n_and_addr = ''
return reg_date, expiration_date, holder_n_and_addr
def partial_renewal_n_des_check():
all_tables = soup.find_all('h2', class_='box')
renewed_designs = None
curr_des_number = 0
if all_tables != []:
for table in all_tables:
if ('Partial Renewal' in table.text):
p_renewal_table = table.findParent()
text = p_renewal_table.find_all('div', class_="text")
checks = p_renewal_table.find_all('div', class_="inid")
index = 0
renewed_designs = None
check_53 = False
curr_des_number = 0
for check in checks:
if check.find('div',class_="inidCode").text == '(53)':
check_53 = True
break
index +=1
if check_53:
renewed_designs = text[index].text
renewed_designs = renewed_designs [6:]
renewed_designs = renewed_designs.split(',')
new_list = []
for i in renewed_designs:
new_list.append(i.strip())
renewed_designs = new_list
curr_des_number = len(renewed_designs)
break
else:
pass
else:
pass
return renewed_designs, curr_des_number
def find_all_about_country():
protection_list = []
protection_date = datetime.strptime('01 01 1950', '%d %m %Y').date()
refusal_list = []
refusal_date = datetime.strptime('01 01 1950', '%d %m %Y').date()
partial_refusal_list = []
latest_date_of_partial_refusal = datetime.strptime('01 01 1950', '%d %m %Y').date()
partial_protection_list = []
latest_date_of_partial_protection = datetime.strptime('01 01 1950', '%d %m %Y').date()
withdrawal_of_refusal_list = []
latest_withdrawal_of_refusal_date = datetime.strptime('01 01 1950', '%d %m %Y').date()
partial_invalidation_list = []
latest_partial_invalidation_date = datetime.strptime('01 01 1950', '%d %m %Y').date()
country_tables_ = soup.find_all('div', class_='transaction countrySpecific ' + country_)
if country_tables_ != []:
for country_table in country_tables_:
doc_type = country_table.find('h2').text.split(':')[0]
if doc_type == 'Refusal':
refusal_list.append('all')
check_58 = country_table.find_all('div', class_="inid")[-1].find('div', class_="inidCode").text
if check_58 == '(58)':
refusal_date_text = country_table.find_all('div', class_="text")[-1].text
refusal_date = datetime.strptime(refusal_date_text.replace('.', ' '), '%d %m %Y').date()
elif doc_type == 'Partial Refusal':
partial_refusal = country_table.find_all('div', class_="text")[-2].text
partial_refusal = partial_refusal[6:]
temp_list = partial_refusal.split(',')
new_list = []
for i in temp_list:
new_list.append(i.strip())
partial_refusal_list += new_list
check_58 = country_table.find_all('div', class_="inid")[-1].find('div', class_="inidCode").text
if check_58 == '(58)':
date_of_partial_refusal_text = country_table.find_all('div', class_="text")[-1].text
date_of_partial_refusal = datetime.strptime(date_of_partial_refusal_text.replace('.', ' '),
'%d %m %Y').date()
if date_of_partial_refusal > latest_date_of_partial_refusal:
latest_date_of_partial_refusal = date_of_partial_refusal
elif doc_type == 'Statement of Grant of Protection':
protection_list.append('all')
check_24 = country_table.find_all('div', class_="inid")[-2].find('div', class_="inidCode").text
if check_24 == '(24)':
protection_date_text = country_table.find_all('div', class_="text")[2].text
protection_date = datetime.strptime(protection_date_text.replace('.', ' '), '%d %m %Y').date()
else:
check_58 = country_table.find_all('div', class_="inid")[-1].find('div', class_="inidCode").text
if check_58 == '(58)':
protection_date_text = country_table.find_all('div', class_="text")[-1].text
protection_date = datetime.strptime(protection_date_text.replace('.', ' '), '%d %m %Y').date()
elif doc_type == 'Partial Statement of Grant of Protection':
partial_protection = country_table.find_all('div', class_="text")[-2].text
partial_protection = partial_protection[6:]
temp_list = partial_protection.split(',')
new_list = []
for i in temp_list:
new_list.append(i.strip())
partial_protection_list += new_list
check_24 = country_table.find_all('div', class_="inid")[-3].find('div', class_="inidCode").text
if check_24 == '(24)':
date_of_partial_protection_text = country_table.find_all('div', class_="text")[-3].text
date_of_partial_protection = datetime.strptime(date_of_partial_protection_text.replace('.', ' '),
'%d %m %Y').date()
if date_of_partial_protection > latest_date_of_partial_protection:
latest_date_of_partial_protection = date_of_partial_protection
elif doc_type == 'Withdrawal of refusal':
check_53_or_24 = country_table.find_all('div', class_="inid")[-2].find('div', class_="inidCode").text
if check_53_or_24 == '(53)':
withdrawal_of_refusal = country_table.find_all('div', class_="text")[-2].text
withdrawal_of_refusal = withdrawal_of_refusal[6:]
temp_list = withdrawal_of_refusal.split(',')
new_list = []
for i in temp_list:
new_list.append(i.strip())
withdrawal_of_refusal_list += new_list
check_24 = country_table.find_all('div', class_="inid")[-3].find('div', class_="inidCode").text
if check_24 == '(24)':
withdrawal_of_refusal_date_text = country_table.find_all('div', class_="text")[-3].text
withdrawal_of_refusal_date = datetime.strptime(
withdrawal_of_refusal_date_text.replace('.', ' '), '%d %m %Y').date()
if withdrawal_of_refusal_date > latest_withdrawal_of_refusal_date:
latest_withdrawal_of_refusal_date = withdrawal_of_refusal_date
else:
pass
elif check_53_or_24 == '(24)':
withdrawal_of_refusal_date_text = country_table.find_all('div', class_="text")[-2].text
withdrawal_of_refusal_date = datetime.strptime(withdrawal_of_refusal_date_text.replace('.', ' '),
'%d %m %Y').date()
if withdrawal_of_refusal_date > latest_withdrawal_of_refusal_date:
latest_withdrawal_of_refusal_date = withdrawal_of_refusal_date
withdrawal_of_refusal = 'all'
withdrawal_of_refusal_list.append(withdrawal_of_refusal)
else:
pass
elif doc_type == 'Partial Invalidation':
check_53 = country_table.find_all('div', class_="inid")[-2].find('div', class_="inidCode").text
if check_53 == '(53)':
partial_invalidation = country_table.find_all('div', class_="text")[-2].text
partial_invalidation = partial_invalidation[6:]
temp_list = partial_invalidation.split(',')
new_list = []
for i in temp_list:
new_list.append(i.strip())
partial_invalidation_list += new_list
check_81 = country_table.find_all('div', class_="inid")[-3].find('div', class_="inidCode").text
if check_81 == '(81)':
partial_invalidation_date_text = country_table.find_all('div', class_="text")[-3].text.split(';')[
1].strip()
partial_invalidation_date = datetime.strptime(partial_invalidation_date_text.replace('.', ' '),
'%d %m %Y').date()
if partial_invalidation_date > latest_partial_invalidation_date:
latest_partial_invalidation_date = partial_invalidation_date
to_return = protection_list, protection_date, refusal_list, refusal_date, partial_refusal_list, latest_date_of_partial_refusal, partial_protection_list, latest_date_of_partial_protection, withdrawal_of_refusal_list, latest_withdrawal_of_refusal_date, partial_invalidation_list, latest_partial_invalidation_date
return to_return
def get_number_designs():
image_bar_n = soup.find('div', class_='text imageContainer')
images_n = image_bar_n.find_all('div', class_='imageBox')
design_number = images_n[-1].find('img')['src'].split('/')[-1].split('.')[0].split('_')[0][1:]
flag = False
number_designs = ''
for number in design_number:
if number != '0':
flag = True
if flag:
number_designs += number
return number_designs
def data_analysis(p_l, p_d, r_l, r_d, pr_l, pr_d, pp_l, pp_d, wr_l, wr_d, pi_l, pi_d, amount_of_designs, n_all_l):
all_list = []
if (n_all_l is not None):
all_list = n_all_l
else:
count = int(amount_of_designs)
for i in range(count):
all_list.append(str(i + 1))
prot_date_list = [p_d, pp_d, wr_d]
ref_date_list = [r_d, pr_d, pi_d]
prot_date = max(prot_date_list)
ref_date = max(ref_date_list)
prot_list = p_l + pp_l + wr_l
ref_list = r_l + pr_l
if prot_list != []:
if ('all' in prot_list):
prot_list = all_list[:]
if ref_list != []:
if ('all' in ref_list):
ref_list = all_list[:]
prot_list = [x for x in prot_list if x in all_list]
ref_list = [x for x in ref_list if x in all_list]
if pi_l != []:
if prot_list != []:
prot_list = [x for x in prot_list if x not in pi_l]
ref_list += pi_l
ref_list = [x for x in ref_list if x not in prot_list]
mix_list = prot_list + ref_list
...Подобные документы
Регистрация и вход в Oracle Application Express, структура и взаимосвязь элементов базы данных. Создание запросов, основы для приложения, отчетов, диаграммы, главной страницы. Формирование руководства пользователя и листинг разработанной программы.
курсовая работа [2,8 M], добавлен 18.11.2013Особенности проектирования программы на языке С++ для обработки данных из таблиц базы данных. Основные функции программы, создание концептуальной модели базы данных и диаграммы классов, разработка интерфейса пользователя и запросов к базе данных.
курсовая работа [2,1 M], добавлен 08.06.2012Сущность базы данных. Процесс построения концептуальной модели. Построение реляционной модели, создание ключевого поля. Процесс нормализации. Проектирование базы данных в ACCESS. Порядок создание базы данных. Создание SQL запросов и работа в базе данных.
курсовая работа [185,6 K], добавлен 08.11.2008Разработка базы данных, содержащей информацию, необходимую Государственной инспекции по маломерным судам для выдачи билетов владельцам судов. Особенности создания файла и диаграмм базы данных, SQL-запросов. Объекты информационной модели и их свойства.
курсовая работа [1,3 M], добавлен 24.10.2012Рассмотрение основных этапов проектирования базы данных "Расписание": создание информационных таблиц, определение схем для связи данных в реестрах. Изучение методов организации форм (режимы автоматический, Мастер, конструктор), запросов и отчетов.
курсовая работа [1,7 M], добавлен 06.02.2010Создание базы данных по теме "Склад фруктов" в СУБД Microsoft Access. Проектирование запросов по числовым, символьным, логическим критериям и сложных запросов, состоящих из комбинаций приведенных типов данных. Создание форм и таблиц, конструктор отчетов.
курсовая работа [869,2 K], добавлен 04.11.2014Общая характеристика и состав информационных запросов к проектируемой базе данных, требования к ней и внутренняя структура, принципы нормализации и разработка логической модели. Создание таблиц и связей между ними. Язык структурированных запросов.
курсовая работа [985,6 K], добавлен 22.05.2014Изучение классификации поисковых средств по В.В. Дудихину. Поиск информации с помощью поисковых ресурсов. Формирование запросов. Использование ключевых слов. Индексация документов, размещенных на различных серверах. Зарубежные лидеры поисковых систем.
презентация [775,3 K], добавлен 10.03.2015Формирование основных таблиц базы данных деканата и устанавливание к ним ключей. Заполнение баз необходимыми сведениями. Формулировка схем данных форм и запросов. Настройка некоторых запросов по своим свойствам. Создание форм через "мастера форм".
контрольная работа [1,0 M], добавлен 07.01.2011Структура модели на языке Express. Правила записи супертипов и подтипов. Разработка информационных моделей в рамках концепции CALS. Типы данных в языке Express. Структура портативного зарядного устройства ЗарядON. Изображение сущности на языке Express-G.
курсовая работа [487,9 K], добавлен 18.01.2013Проектирование базы данных, содержащей информацию, которая всесторонне характеризует российский рынок медицинского оборудования. Описание атрибутов сущностей и связей, отраженных в разработанной ER-модели. Разработка отчетов, форм, запросов в базе данных.
курсовая работа [3,2 M], добавлен 19.06.2015Авторизация с каталогами проектирования базы данных магазина. Задачи базы данных: учет всех товаров, поиск и выдача данных о клиентах, адрес, телефоны, цена и наличие товара. Этапы проектирования базы данных. Схема данных, создание запросов и их формы.
реферат [1,6 M], добавлен 22.10.2009Компоненты реляционной базы данных Microsoft Access. Создание структуры таблиц и определение связей между ними. Проектирование форм для сводных таблиц и запросов с помощью конструктора окон. Разработка и создание автоотчетов и запросов на выборку данных.
реферат [3,3 M], добавлен 29.01.2011Создание программ, позволяющих создавать базы данных. Создание таблицы базы данных. Создание схемы данных. Создание форм, отчетов, запросов. Увеличение объема и структурной сложности хранимых данных. Характеристика системы управления базой данных Access.
курсовая работа [2,1 M], добавлен 17.06.2013Концептуальная модель, спецификация атрибутов. Диаграмма "сущность-связь". Пакет Sybase PowerDesigner. Разработка SQL-скрипта создания разрабатываемой базы данных. Создание и заполнение базы данных. Выполнение запросов на чтение, модификацию и удаление.
курсовая работа [2,3 M], добавлен 24.02.2014Разработка структуры базы данных в приложении Access. Создание запросов. Создание отчета для эффективного представления данных в печатном формате. Панель элементов, используемых при создании формы. Обработка данных с помощью языка запросов в SQL.
курсовая работа [1,7 M], добавлен 09.05.2012Изучение реляционной модели данных. Выявление потребности задач в данных и определение состава и структуры информационных объектов. Построение концептуальной модели предметной области. Создание форм, запросов и отчетов с помощью конструктора запросов.
курсовая работа [6,3 M], добавлен 09.10.2021Базы данных и системы управления базами данных. Физическое размещение и сортировка записей. Основные виды баз данных. Создание базы данных "Домашняя библиотека" в приложении Microsoft Access. Создание в базе данных запросов и скорость выбора информации.
курсовая работа [3,2 M], добавлен 07.05.2013Системный анализ и анализ требований к базе данных. Особенности создания отчетов, запросов и форм в Visual Studio 2012. Программная реализация ER-диаграммы. Создание инфологической, логической и физической модели базы данных. Генерация ее в SQL Server.
курсовая работа [1,0 M], добавлен 22.11.2012Понятие и классификация поисковых систем, история их развития и структурные элементы. Характеристика существующих моделей поиска, анализ его качества. Особенности обработки запроса поисковой системой, подготовки базы данных и процесса выдачи результатов.
курсовая работа [2,6 M], добавлен 15.04.2014