Автоматический анализ результатов поисковых запросов к базе данных в 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.